From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/wgl.c | 53 +++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 23 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 49f1e4700b4..03117847b9a 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -803,57 +803,45 @@ static int compar(const void *elt_a, const void *elt_b) { }
/* Check if a GL extension is supported */ -static BOOL is_extension_supported(const char* extension) +static BOOL check_extension_support( const char *extension, const char *available_extensions ) { - enum wgl_handle_type type = get_current_context_type(); const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; - const char *gl_ext_string = NULL; size_t len;
TRACE("Checking for extension '%s'\n", extension);
- if (type == HANDLE_CONTEXT) - { - gl_ext_string = (const char*)glGetString(GL_EXTENSIONS); - if (!gl_ext_string) - { - ERR("No OpenGL extensions found, check if your OpenGL setup is correct!\n"); - return FALSE; - } - } - /* We use the GetProcAddress function from the display driver to retrieve function pointers * for OpenGL and WGL extensions. In case of winex11.drv the OpenGL extension lookup is done * using glXGetProcAddress. This function is quite unreliable in the sense that its specs don't * 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. */
- while ((len = strcspn(extension, " ")) != 0) + while ((len = strcspn( extension, " " ))) { /* 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; + if (has_extension( available_extensions, 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) + if (!strncmp( extension, "GL_VERSION_", 11 )) { 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"); + 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]); + 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] ); }
if (extension[len] == ' ') len++; @@ -863,6 +851,25 @@ static BOOL is_extension_supported(const char* extension) return FALSE; }
+/* Check if a GL extension is supported */ +static BOOL is_extension_supported( const char *extension ) +{ + enum wgl_handle_type type = get_current_context_type(); + const char *gl_ext_string = NULL; + + if (type == HANDLE_CONTEXT) + { + gl_ext_string = (const char *)glGetString( GL_EXTENSIONS ); + if (!gl_ext_string) + { + ERR( "No OpenGL extensions found, check if your OpenGL setup is correct!\n" ); + return FALSE; + } + } + + return check_extension_support( extension, gl_ext_string ); +} + /*********************************************************************** * wglGetProcAddress (OPENGL32.@) */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/wgl.c | 66 ++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 27 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 03117847b9a..c05f70dea3f 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -772,22 +772,6 @@ const GLubyte * WINAPI glGetStringi(GLenum name, GLuint index) /* check if the extension is present in the list */ static BOOL has_extension( const char *list, const char *ext, size_t len ) { - if (!list) - { - const char *gl_ext; - unsigned int i; - GLint extensions_count; - - glGetIntegerv(GL_NUM_EXTENSIONS, &extensions_count); - for (i = 0; i < extensions_count; ++i) - { - gl_ext = (const char *)glGetStringi(GL_EXTENSIONS, i); - if (!strncmp(gl_ext, ext, len) && !gl_ext[len]) - return TRUE; - } - return FALSE; - } - while (list) { while (*list == ' ') list++; @@ -851,23 +835,51 @@ static BOOL check_extension_support( const char *extension, const char *availabl return FALSE; }
+static char *build_extension_list(void) +{ + GLint len = 0, capacity, i, extensions_count; + char *extension, *tmp, *available_extensions; + + glGetIntegerv( GL_NUM_EXTENSIONS, &extensions_count ); + capacity = 128 * extensions_count; + + if (!(available_extensions = HeapAlloc( GetProcessHeap(), 0, capacity ))) return NULL; + for (i = 0; i < extensions_count; ++i) + { + extension = (char *)glGetStringi( GL_EXTENSIONS, i ); + capacity = max( capacity, len + strlen( extension ) + 2 ); + if (!(tmp = HeapReAlloc( GetProcessHeap(), 0, available_extensions, capacity ))) break; + available_extensions = tmp; + len += sprintf( available_extensions + len, "%s ", extension ); + } + if (len) available_extensions[len - 1] = 0; + + return available_extensions; +} + +static char *heap_strdup( const char *str ) +{ + int len = strlen( str ) + 1; + char *ret = HeapAlloc( GetProcessHeap(), 0, len ); + memcpy( ret, str, len ); + return ret; +} + /* Check if a GL extension is supported */ static BOOL is_extension_supported( const char *extension ) { enum wgl_handle_type type = get_current_context_type(); - const char *gl_ext_string = NULL; + char *available_extensions = NULL; + BOOL ret = FALSE;
- if (type == HANDLE_CONTEXT) - { - gl_ext_string = (const char *)glGetString( GL_EXTENSIONS ); - if (!gl_ext_string) - { - ERR( "No OpenGL extensions found, check if your OpenGL setup is correct!\n" ); - return FALSE; - } - } + if (type == HANDLE_CONTEXT) available_extensions = heap_strdup( (const char *)glGetString( GL_EXTENSIONS ) ); + if (!available_extensions) available_extensions = build_extension_list(); + + if (!available_extensions) ERR( "No OpenGL extensions found, check if your OpenGL setup is correct!\n" ); + else ret = check_extension_support( extension, available_extensions );
- return check_extension_support( extension, gl_ext_string ); + HeapFree( GetProcessHeap(), 0, available_extensions ); + return ret; }
/***********************************************************************
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/wgl.c | 301 +++++++++++++++++++++----------------------- 1 file changed, 144 insertions(+), 157 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index c05f70dea3f..cf9dc4e0207 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -712,7 +712,150 @@ int WINAPI wglGetLayerPaletteEntries(HDC hdc, return 0; }
-static BOOL filter_extensions(const char *extensions, GLubyte **exts_list, GLuint **disabled_exts); +/* check if the extension is present in the list */ +static BOOL has_extension( const char *list, const char *ext, size_t len ) +{ + while (list) + { + while (*list == ' ') list++; + if (!strncmp( list, ext, len ) && (!list[len] || list[len] == ' ')) return TRUE; + list = strchr( list, ' ' ); + } + return FALSE; +} + +static GLubyte *filter_extensions_list( const char *extensions, const char *disabled ) +{ + const char *end; + char *p, *str; + + p = str = HeapAlloc( GetProcessHeap(), 0, strlen( extensions ) + 2 ); + if (!str) return NULL; + + TRACE( "GL_EXTENSIONS:\n" ); + + for (;;) + { + while (*extensions == ' ') extensions++; + if (!*extensions) break; + + if (!(end = strchr( extensions, ' ' ))) end = extensions + strlen( extensions ); + memcpy( p, extensions, end - extensions ); + p[end - extensions] = 0; + + if (!has_extension( disabled, p, strlen( p ) )) + { + TRACE( "++ %s\n", p ); + p += end - extensions; + *p++ = ' '; + } + else + { + TRACE( "-- %s (disabled by config)\n", p ); + } + extensions = end; + } + *p = 0; + return (GLubyte *)str; +} + +static GLuint *filter_extensions_index( const char *disabled ) +{ + const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; + unsigned int i = 0, j, disabled_size; + const char *ext, *end, *gl_ext; + GLuint *disabled_exts, *tmp; + GLint extensions_count; + + if (!funcs->ext.p_glGetStringi) + { + void **func_ptr = (void **)&funcs->ext.p_glGetStringi; + *func_ptr = funcs->wgl.p_wglGetProcAddress( "glGetStringi" ); + if (!funcs->ext.p_glGetStringi) return NULL; + } + + funcs->gl.p_glGetIntegerv( GL_NUM_EXTENSIONS, &extensions_count ); + disabled_size = 2; + disabled_exts = HeapAlloc( GetProcessHeap(), 0, disabled_size * sizeof(*disabled_exts) ); + if (!disabled_exts) return NULL; + + TRACE( "GL_EXTENSIONS:\n" ); + + for (j = 0; j < extensions_count; ++j) + { + gl_ext = (const char *)funcs->ext.p_glGetStringi( GL_EXTENSIONS, j ); + ext = disabled; + + for (;;) + { + while (*ext == ' ') ext++; + if (!*ext) + { + TRACE( "++ %s\n", gl_ext ); + break; + } + if (!(end = strchr( ext, ' ' ))) end = ext + strlen( ext ); + + if (!strncmp( gl_ext, ext, end - ext ) && !gl_ext[end - ext]) + { + if (i + 1 == disabled_size) + { + disabled_size *= 2; + if (!(tmp = HeapReAlloc( GetProcessHeap(), 0, disabled_exts, disabled_size * sizeof(*disabled_exts) ))) + { + disabled_exts[i] = ~0u; + return disabled_exts; + } + disabled_exts = tmp; + } + + TRACE( "-- %s (disabled by config)\n", gl_ext ); + disabled_exts[i++] = j; + break; + } + + ext = end; + } + } + + disabled_exts[i] = ~0u; + return disabled_exts; +} + +/* build the extension string by filtering out the disabled extensions */ +static BOOL filter_extensions( const char *extensions, GLubyte **exts_list, GLuint **disabled_exts ) +{ + static const char *disabled; + + if (!disabled) + { + HKEY hkey; + DWORD size; + char *str = NULL; + + /* @@ Wine registry key: HKCU\Software\Wine\OpenGL */ + if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\Wine\OpenGL", &hkey )) + { + if (!RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, NULL, &size )) + { + str = HeapAlloc( GetProcessHeap(), 0, size ); + if (RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, (BYTE *)str, &size )) *str = 0; + } + RegCloseKey( hkey ); + } + if (str) + { + if (InterlockedCompareExchangePointer( (void **)&disabled, str, NULL )) + HeapFree( GetProcessHeap(), 0, str ); + } + else disabled = ""; + } + + if (!disabled[0]) return FALSE; + if (extensions && !*exts_list) *exts_list = filter_extensions_list( extensions, disabled ); + if (!*disabled_exts) *disabled_exts = filter_extensions_index( disabled ); + return (exts_list && *exts_list) || *disabled_exts; +}
void WINAPI glGetIntegerv(GLenum pname, GLint *data) { @@ -769,18 +912,6 @@ const GLubyte * WINAPI glGetStringi(GLenum name, GLuint index) return funcs->ext.p_glGetStringi(name, index); }
-/* check if the extension is present in the list */ -static BOOL has_extension( const char *list, const char *ext, size_t len ) -{ - while (list) - { - while (*list == ' ') list++; - if (!strncmp( list, ext, len ) && (!list[len] || list[len] == ' ')) return TRUE; - list = strchr( list, ' ' ); - } - return FALSE; -} - static int compar(const void *elt_a, const void *elt_b) { return strcmp(((const OpenGL_extension *) elt_a)->name, ((const OpenGL_extension *) elt_b)->name); @@ -1627,150 +1758,6 @@ GLint WINAPI glDebugEntry( GLint unknown1, GLint unknown2 ) return 0; }
-static GLubyte *filter_extensions_list(const char *extensions, const char *disabled) -{ - char *p, *str; - const char *end; - - p = str = HeapAlloc(GetProcessHeap(), 0, strlen(extensions) + 2); - if (!str) - return NULL; - - TRACE( "GL_EXTENSIONS:\n" ); - - for (;;) - { - while (*extensions == ' ') - extensions++; - if (!*extensions) - break; - if (!(end = strchr(extensions, ' '))) - end = extensions + strlen(extensions); - memcpy(p, extensions, end - extensions); - p[end - extensions] = 0; - if (!has_extension(disabled, p, strlen(p))) - { - TRACE("++ %s\n", p); - p += end - extensions; - *p++ = ' '; - } - else - { - TRACE("-- %s (disabled by config)\n", p); - } - extensions = end; - } - *p = 0; - return (GLubyte *)str; -} - -static GLuint *filter_extensions_index(const char *disabled) -{ - const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; - const char *ext, *end, *gl_ext; - GLuint *disabled_exts, *new_disabled_exts; - unsigned int i = 0, j, disabled_size; - GLint extensions_count; - - if (!funcs->ext.p_glGetStringi) - { - void **func_ptr = (void **)&funcs->ext.p_glGetStringi; - - *func_ptr = funcs->wgl.p_wglGetProcAddress("glGetStringi"); - if (!funcs->ext.p_glGetStringi) - return NULL; - } - - funcs->gl.p_glGetIntegerv(GL_NUM_EXTENSIONS, &extensions_count); - disabled_size = 2; - disabled_exts = HeapAlloc(GetProcessHeap(), 0, disabled_size * sizeof(*disabled_exts)); - if (!disabled_exts) - return NULL; - - TRACE( "GL_EXTENSIONS:\n" ); - - for (j = 0; j < extensions_count; ++j) - { - gl_ext = (const char *)funcs->ext.p_glGetStringi(GL_EXTENSIONS, j); - ext = disabled; - for (;;) - { - while (*ext == ' ') - ext++; - if (!*ext) - { - TRACE("++ %s\n", gl_ext); - break; - } - if (!(end = strchr(ext, ' '))) - end = ext + strlen(ext); - - if (!strncmp(gl_ext, ext, end - ext) && !gl_ext[end - ext]) - { - if (i + 1 == disabled_size) - { - disabled_size *= 2; - new_disabled_exts = HeapReAlloc(GetProcessHeap(), 0, disabled_exts, - disabled_size * sizeof(*disabled_exts)); - if (!new_disabled_exts) - { - disabled_exts[i] = ~0u; - return disabled_exts; - } - disabled_exts = new_disabled_exts; - } - TRACE("-- %s (disabled by config)\n", gl_ext); - disabled_exts[i++] = j; - break; - } - ext = end; - } - } - disabled_exts[i] = ~0u; - return disabled_exts; -} - -/* build the extension string by filtering out the disabled extensions */ -static BOOL filter_extensions(const char *extensions, GLubyte **exts_list, GLuint **disabled_exts) -{ - static const char *disabled; - - if (!disabled) - { - HKEY hkey; - DWORD size; - char *str = NULL; - - /* @@ Wine registry key: HKCU\Software\Wine\OpenGL */ - if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\Wine\OpenGL", &hkey )) - { - if (!RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, NULL, &size )) - { - str = HeapAlloc( GetProcessHeap(), 0, size ); - if (RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, (BYTE *)str, &size )) *str = 0; - } - RegCloseKey( hkey ); - } - if (str) - { - if (InterlockedCompareExchangePointer( (void **)&disabled, str, NULL )) - HeapFree( GetProcessHeap(), 0, str ); - } - else disabled = ""; - } - - if (!disabled[0]) - return FALSE; - - if (extensions && !*exts_list) - *exts_list = filter_extensions_list(extensions, disabled); - - if (!*disabled_exts) - *disabled_exts = filter_extensions_index(disabled); - - return (exts_list && *exts_list) || *disabled_exts; -} - /*********************************************************************** * glGetString (OPENGL32.@) */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/wgl.c | 54 +++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 39 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index cf9dc4e0207..c7058322b8c 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -762,10 +762,10 @@ static GLubyte *filter_extensions_list( const char *extensions, const char *disa static GLuint *filter_extensions_index( const char *disabled ) { const struct opengl_funcs *funcs = NtCurrentTeb()->glTable; - unsigned int i = 0, j, disabled_size; - const char *ext, *end, *gl_ext; - GLuint *disabled_exts, *tmp; + GLuint *disabled_index; GLint extensions_count; + unsigned int i = 0, j; + const char *ext;
if (!funcs->ext.p_glGetStringi) { @@ -775,51 +775,27 @@ static GLuint *filter_extensions_index( const char *disabled ) }
funcs->gl.p_glGetIntegerv( GL_NUM_EXTENSIONS, &extensions_count ); - disabled_size = 2; - disabled_exts = HeapAlloc( GetProcessHeap(), 0, disabled_size * sizeof(*disabled_exts) ); - if (!disabled_exts) return NULL; + disabled_index = HeapAlloc( GetProcessHeap(), 0, extensions_count * sizeof(*disabled_index) ); + if (!disabled_index) return NULL;
TRACE( "GL_EXTENSIONS:\n" );
for (j = 0; j < extensions_count; ++j) { - gl_ext = (const char *)funcs->ext.p_glGetStringi( GL_EXTENSIONS, j ); - ext = disabled; - - for (;;) + ext = (const char *)funcs->ext.p_glGetStringi( GL_EXTENSIONS, j ); + if (!has_extension( disabled, ext, strlen( ext ) )) { - while (*ext == ' ') ext++; - if (!*ext) - { - TRACE( "++ %s\n", gl_ext ); - break; - } - if (!(end = strchr( ext, ' ' ))) end = ext + strlen( ext ); - - if (!strncmp( gl_ext, ext, end - ext ) && !gl_ext[end - ext]) - { - if (i + 1 == disabled_size) - { - disabled_size *= 2; - if (!(tmp = HeapReAlloc( GetProcessHeap(), 0, disabled_exts, disabled_size * sizeof(*disabled_exts) ))) - { - disabled_exts[i] = ~0u; - return disabled_exts; - } - disabled_exts = tmp; - } - - TRACE( "-- %s (disabled by config)\n", gl_ext ); - disabled_exts[i++] = j; - break; - } - - ext = end; + TRACE( "++ %s\n", ext ); + } + else + { + TRACE( "-- %s (disabled by config)\n", ext ); + disabled_index[i++] = j; } }
- disabled_exts[i] = ~0u; - return disabled_exts; + disabled_index[i] = ~0u; + return disabled_index; }
/* build the extension string by filtering out the disabled extensions */
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=125039
Your paranoid android.
=== debian11 (32 bit report) ===
d3d8: device.c:3365: Test failed: Expected message 0x1c for window 0x1, but didn't receive it
ddraw: ddraw7.c:15663: Test failed: Expected unsynchronised map for flags 0x1000. ddraw7.c:15663: Test failed: Expected unsynchronised map for flags 0x3000.
=== debian11 (build log) ===
Use of uninitialized value $Flaky in addition (+) at /home/testbot/lib/WineTestBot/LogUtils.pm line 720, <$LogFile> line 24885. Use of uninitialized value $Flaky in addition (+) at /home/testbot/lib/WineTestBot/LogUtils.pm line 720, <$LogFile> line 24885. Use of uninitialized value $Flaky in addition (+) at /home/testbot/lib/WineTestBot/LogUtils.pm line 720, <$LogFile> line 24885.