Patch ID: 3260500 - Query extension string only once

This commit is contained in:
Nigel Stewart 2011-03-30 11:38:25 -05:00
parent 4a9b2a7b42
commit 1b38b41837
5 changed files with 71 additions and 48 deletions

View File

@ -46,7 +46,7 @@ if (@ARGV)
if (length($extstring)) if (length($extstring))
{ {
print " CONST_CAST(" . $extvar . ") = " . $extpre . "GetExtension(\"$extstring\");\n"; print " CONST_CAST(" . $extvar . ") = _glewSearchExtension(\"$extstring\", start, end);\n";
} }
if (keys %$functions) if (keys %$functions)

View File

@ -217,3 +217,23 @@ static GLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuin
} }
return GL_FALSE; return GL_FALSE;
} }
/*
* Search for name in the extensions string. Use of strstr()
* is not sufficient because extension names can be prefixes of
* other extension names. Could use strtok() but the constant
* string returned by glGetString might be in read-only memory.
*/
static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end)
{
const GLubyte* p;
GLuint len = _glewStrLen((const GLubyte*)name);
p = start;
while (p < end)
{
GLuint n = _glewStrCLen(p, ' ');
if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;
p += n+1;
}
return GL_FALSE;
}

View File

@ -1,26 +1,14 @@
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/*
* Search for name in the extensions string. Use of strstr()
* is not sufficient because extension names can be prefixes of
* other extension names. Could use strtok() but the constant
* string returned by glGetString might be in read-only memory.
*/
GLboolean glewGetExtension (const char* name) GLboolean glewGetExtension (const char* name)
{ {
GLubyte* p; const GLubyte* start;
GLubyte* end; const GLubyte* end;
GLuint len = _glewStrLen((const GLubyte*)name); start = (const GLubyte*)glGetString(GL_EXTENSIONS);
p = (GLubyte*)glGetString(GL_EXTENSIONS); if (start == 0)
if (0 == p) return GL_FALSE; return GL_FALSE;
end = p + _glewStrLen(p); end = start + _glewStrLen(start);
while (p < end) return _glewSearchExtension(name, start, end);
{
GLuint n = _glewStrCLen(p, ' ');
if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;
p += n+1;
}
return GL_FALSE;
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
@ -33,6 +21,8 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
const GLubyte* s; const GLubyte* s;
GLuint dot; GLuint dot;
GLint major, minor; GLint major, minor;
const GLubyte* start;
const GLubyte* end;
/* query opengl version */ /* query opengl version */
s = glGetString(GL_VERSION); s = glGetString(GL_VERSION);
dot = _glewStrCLen(s, '.'); dot = _glewStrCLen(s, '.');
@ -69,4 +59,11 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
} }
/* query opengl extensions string */
start = glGetString(GL_EXTENSIONS);
if (start == 0)
start = (const GLubyte*)"";
end = start + _glewStrLen(start);
/* initialize extensions */ /* initialize extensions */

View File

@ -2,27 +2,21 @@
GLboolean glxewGetExtension (const char* name) GLboolean glxewGetExtension (const char* name)
{ {
GLubyte* p; const GLubyte* start;
GLubyte* end; const GLubyte* end;
GLuint len;
if (glXGetCurrentDisplay == NULL) return GL_FALSE; if (glXGetCurrentDisplay == NULL) return GL_FALSE;
len = _glewStrLen((const GLubyte*)name); start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);
p = (GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); if (0 == start) return GL_FALSE;
if (0 == p) return GL_FALSE; end = start + _glewStrLen(start);
end = p + _glewStrLen(p); return _glewSearchExtension(name, start, end);
while (p < end)
{
GLuint n = _glewStrCLen(p, ' ');
if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;
p += n+1;
}
return GL_FALSE;
} }
GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
{ {
int major, minor; int major, minor;
const GLubyte* start;
const GLubyte* end;
/* initialize core GLX 1.2 */ /* initialize core GLX 1.2 */
if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY;
/* initialize flags */ /* initialize flags */
@ -49,4 +43,11 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
break; break;
} }
} }
/* query GLX extension string */
start = 0;
if (glXGetCurrentDisplay != NULL)
start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);
if (start == 0)
start = (const GLubyte *)"";
end = start + _glewStrLen(start);
/* initialize extensions */ /* initialize extensions */

View File

@ -5,32 +5,37 @@ static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL;
GLboolean wglewGetExtension (const char* name) GLboolean wglewGetExtension (const char* name)
{ {
GLubyte* p; const GLubyte* start;
GLubyte* end; const GLubyte* end;
GLuint len = _glewStrLen((const GLubyte*)name);
if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringARB == NULL)
if (_wglewGetExtensionsStringEXT == NULL) if (_wglewGetExtensionsStringEXT == NULL)
return GL_FALSE; return GL_FALSE;
else else
p = (GLubyte*)_wglewGetExtensionsStringEXT(); start = (const GLubyte*)_wglewGetExtensionsStringEXT();
else else
p = (GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());
if (0 == p) return GL_FALSE; if (start == 0)
end = p + _glewStrLen(p); return GL_FALSE;
while (p < end) end = start + _glewStrLen(start);
{ return _glewSearchExtension(name, start, end);
GLuint n = _glewStrCLen(p, ' ');
if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE;
p += n+1;
}
return GL_FALSE;
} }
GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
{ {
GLboolean crippled; GLboolean crippled;
const GLubyte* start;
const GLubyte* end;
/* find wgl extension string query functions */ /* find wgl extension string query functions */
_wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB");
_wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT");
/* query wgl extension string */
if (_wglewGetExtensionsStringARB == NULL)
if (_wglewGetExtensionsStringEXT == NULL)
start = (const GLubyte*)"";
else
start = (const GLubyte*)_wglewGetExtensionsStringEXT();
else
start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());
end = start + _glewStrLen(start);
/* initialize extensions */ /* initialize extensions */
crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL;