opengl32: Allow multiple extensions to support the same function.

This allows that gl functions are available for different extensions,
e.g. "glVertexP2ui" which is new GL_ARB_vertex_type_2_10_10_10_rev and
also in GL_VERSION_3_3. It is valid to get that function for each gl
version when GL_ARB_vertex_type_2_10_10_10_rev is in the extension list.
On the other hand that function is available, when the gl version is >= 3.3.
This commit is contained in:
Rico Schüller 2013-11-01 18:18:19 +01:00 committed by Alexandre Julliard
parent 465673a3d6
commit 8a23fbf56f
1 changed files with 30 additions and 25 deletions

View File

@ -665,10 +665,8 @@ int WINAPI wglGetLayerPaletteEntries(HDC hdc,
}
/* check if the extension is present in the list */
static BOOL has_extension( const char *list, const char *ext )
static BOOL has_extension( const char *list, const char *ext, size_t len )
{
size_t len = strlen( ext );
while (list)
{
while (*list == ' ') list++;
@ -688,6 +686,7 @@ static BOOL is_extension_supported(const char* extension)
{
const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
const char *gl_ext_string = (const char*)glGetString(GL_EXTENSIONS);
size_t len;
TRACE("Checking for extension '%s'\n", extension);
@ -702,30 +701,36 @@ static BOOL is_extension_supported(const char* extension)
* require the function to return NULL when an extension isn't found. For this reason we check
* if the OpenGL extension required for the function we are looking up is supported. */
/* Check if the extension is part of the GL extension string to see if it is supported. */
if (has_extension(gl_ext_string, extension))
return TRUE;
/* In general an OpenGL function starts as an ARB/EXT extension and at some stage
* it becomes part of the core OpenGL library and can be reached without the ARB/EXT
* suffix as well. In the extension table, these functions contain GL_VERSION_major_minor.
* Check if we are searching for a core GL function */
if(strncmp(extension, "GL_VERSION_", 11) == 0)
while ((len = strcspn(extension, " ")) != 0)
{
const GLubyte *gl_version = funcs->gl.p_glGetString(GL_VERSION);
const char *version = extension + 11; /* Move past 'GL_VERSION_' */
if(!gl_version) {
ERR("No OpenGL version found!\n");
return FALSE;
}
/* Compare the major/minor version numbers of the native OpenGL library and what is required by the function.
* The gl_version string is guaranteed to have at least a major/minor and sometimes it has a release number as well. */
if( (gl_version[0] >= version[0]) || ((gl_version[0] == version[0]) && (gl_version[2] >= version[2])) ) {
/* Check if the extension is part of the GL extension string to see if it is supported. */
if (has_extension(gl_ext_string, extension, len))
return TRUE;
/* In general an OpenGL function starts as an ARB/EXT extension and at some stage
* it becomes part of the core OpenGL library and can be reached without the ARB/EXT
* suffix as well. In the extension table, these functions contain GL_VERSION_major_minor.
* Check if we are searching for a core GL function */
if(strncmp(extension, "GL_VERSION_", 11) == 0)
{
const GLubyte *gl_version = funcs->gl.p_glGetString(GL_VERSION);
const char *version = extension + 11; /* Move past 'GL_VERSION_' */
if(!gl_version) {
ERR("No OpenGL version found!\n");
return FALSE;
}
/* Compare the major/minor version numbers of the native OpenGL library and what is required by the function.
* The gl_version string is guaranteed to have at least a major/minor and sometimes it has a release number as well. */
if( (gl_version[0] >= version[0]) || ((gl_version[0] == version[0]) && (gl_version[2] >= version[2])) ) {
return TRUE;
}
WARN("The function requires OpenGL version '%c.%c' while your drivers only provide '%c.%c'\n", version[0], version[2], gl_version[0], gl_version[2]);
}
WARN("The function requires OpenGL version '%c.%c' while your drivers only provide '%c.%c'\n", version[0], version[2], gl_version[0], gl_version[2]);
if (extension[len] == ' ') len++;
extension += len;
}
return FALSE;
@ -1681,7 +1686,7 @@ static GLubyte *filter_extensions( const char *extensions )
if (!(end = strchr( extensions, ' ' ))) end = extensions + strlen( extensions );
memcpy( p, extensions, end - extensions );
p[end - extensions] = 0;
if (!has_extension( disabled, p ))
if (!has_extension( disabled, p , strlen( p )))
{
TRACE("++ %s\n", p );
p += end - extensions;