Get GL extension strings via glGetStringi() if GL version is >= 3.0.

This commit is contained in:
Matthias Bentrup 2015-02-04 15:44:01 +01:00
parent f64f38f5bb
commit a862219acb
2 changed files with 87 additions and 31 deletions

View File

@ -1,14 +1,57 @@
/* ------------------------------------------------------------------------- */
static
GLboolean glewGetVersion(GLint *major, GLint *minor)
{
const GLubyte* s;
GLuint dot;
s = glGetString(GL_VERSION);
dot = _glewStrCLen(s, '.');
if (dot == 0)
return GL_FALSE;
*major = s[dot-1]-'0';
*minor = s[dot+1]-'0';
if (*minor < 0 || *minor > 9)
*minor = 0;
if (*major<0 || *major>9)
return GL_FALSE;
return GL_TRUE;
}
GLboolean GLEWAPIENTRY glewGetExtension (const char* name)
{
GLint major, minor;
const GLubyte* start;
const GLubyte* end;
start = (const GLubyte*)glGetString(GL_EXTENSIONS);
if (start == 0)
GLint numExts, ext;
if (!glewGetVersion(&major, &minor))
return GL_FALSE;
end = start + _glewStrLen(start);
return _glewSearchExtension(name, start, end);
if (major < 3)
{
start = (const GLubyte*)glGetString(GL_EXTENSIONS);
if (start == 0)
return GL_FALSE;
end = start + _glewStrLen(start);
return _glewSearchExtension(name, start, end);
}
else
{
glGetIntegerv(GL_NUM_EXTENSIONS, &numExts);
for (ext = 0; ext < numExts; ext++)
{
start = (const GLubyte *)glGetStringi(GL_EXTENSIONS, ext);
end = start + _glewStrLen(start);
if (_glewSearchExtension(name, start, end))
return GL_TRUE;
}
return GL_FALSE;
}
}
/* ------------------------------------------------------------------------- */
@ -18,27 +61,15 @@ static
#endif
GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
{
const GLubyte* s;
GLuint dot;
GLint major, minor;
const GLubyte* extStart;
const GLubyte* extEnd;
GLint numExts, ext;
/* query opengl version */
s = glGetString(GL_VERSION);
dot = _glewStrCLen(s, '.');
if (dot == 0)
if (!glewGetVersion(&major, &minor))
return GLEW_ERROR_NO_GL_VERSION;
major = s[dot-1]-'0';
minor = s[dot+1]-'0';
if (minor < 0 || minor > 9)
minor = 0;
if (major<0 || major>9)
return GLEW_ERROR_NO_GL_VERSION;
if (major == 1 && minor == 0)
{
return GLEW_ERROR_GL_VERSION_10_ONLY;

View File

@ -1,23 +1,48 @@
/* query opengl extensions string */
extStart = glGetString(GL_EXTENSIONS);
if (extStart == 0)
extStart = (const GLubyte*)"";
extEnd = extStart + _glewStrLen(extStart);
while (extStart < extEnd)
/* query opengl extensions string(s) */
if(GLEW_VERSION_3_0)
{
GLuint len = _glewStrCLen(extStart, ' ');
struct initflag *ptr = in_word_set(extStart, len);
GLuint len;
struct initflag *ptr;
if (ptr != NULL && ptr->flag != NULL) {
glGetIntegerv(GL_NUM_EXTENSIONS, &numExts);
for (ext = 0; ext < numExts; ext++)
{
extStart = glGetStringi(GL_EXTENSIONS, ext);
len = _glewStrLen(extStart);
ptr = in_word_set(extStart, len);
if (ptr != NULL && ptr->flag != NULL) {
#ifdef GLEW_MX
*(GLboolean *)((char *)ctx + (size_t)(ptr->flag)) = GL_TRUE;
*(GLboolean *)((char *)ctx + (size_t)(ptr->flag)) = GL_TRUE;
#else
*ptr->flag = GL_TRUE;
*ptr->flag = GL_TRUE;
#endif
}
extStart += len + 1;
}
}
else
{
extStart = glGetString(GL_EXTENSIONS);
if (extStart == 0)
extStart = (const GLubyte*)"";
extEnd = extStart + _glewStrLen(extStart);
while (extStart < extEnd)
{
GLuint len = _glewStrCLen(extStart, ' ');
struct initflag *ptr = in_word_set(extStart, len);
if (ptr != NULL && ptr->flag != NULL) {
#ifdef GLEW_MX
*(GLboolean *)((char *)ctx + (size_t)(ptr->flag)) = GL_TRUE;
#else
*ptr->flag = GL_TRUE;
#endif
}
extStart += len + 1;
}
extStart += len + 1;
}
/* initialize extensions */