From: Jacek Caban <jacek@codeweavers.com> --- dlls/opengl32/unix_wgl.c | 71 +++++++++++----------------------------- 1 file changed, 20 insertions(+), 51 deletions(-) diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index b489fec8edf..c14eb7c548c 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -516,13 +516,6 @@ static enum opengl_extension map_host_extension( enum opengl_extension ext ) } } -static const char *legacy_extensions[] = -{ - "WGL_EXT_extensions_string", - "WGL_EXT_swap_control", - NULL, -}; - static const char *parse_gl_version( const char *gl_version, int *major, int *minor ) { const char *ptr = gl_version; @@ -701,15 +694,6 @@ static BOOL is_extension_supported( struct context *ctx, const char *extension ) return ext != GL_EXTENSION_COUNT && client->extensions[ext]; } -static char *append_extension( char *ptr, const char *name ) -{ - size_t size = strlen( name ); - memcpy( ptr, name, size ); - ptr += size; - *ptr++ = ' '; - return ptr; -} - static size_t parse_extensions( const char *name, enum opengl_extension extensions[GL_EXTENSION_COUNT] ) { size_t count = 0; @@ -727,49 +711,34 @@ static size_t parse_extensions( const char *name, enum opengl_extension extensio } /* build the extension string by filtering out the disabled extensions */ -static GLubyte *filter_extensions( struct context *ctx, const char *extensions, const struct opengl_funcs *funcs ) +static GLubyte *filter_extensions( struct context *ctx, const char *str, const struct opengl_funcs *funcs ) { - const char *end, **extra; - size_t size; - char *p, *str; - - size = strlen( extensions ) + 2; - if (funcs->p_glImportMemoryWin32HandleEXT) size += strlen( "GL_EXT_memory_object_win32" ) + 1; - if (funcs->p_glImportSemaphoreWin32HandleEXT) size += strlen( "GL_EXT_semaphore_win32" ) + 1; - for (extra = legacy_extensions; *extra; extra++) size += strlen( *extra ) + 1; - if (!(p = str = malloc( size ))) return NULL; + struct opengl_client_context *client = opengl_client_context_from_client( ctx->base.client_context ); + enum opengl_extension extensions[GL_EXTENSION_COUNT]; + size_t count, i, size = 1; + char *ret, *p; - TRACE( "GL_EXTENSIONS:\n" ); + if (!(count = parse_extensions( str, extensions ))) return NULL; + extensions[count++] = WGL_EXT_extensions_string; + extensions[count++] = WGL_EXT_swap_control; - for (;;) + for (i = 0; i < count; i++) { - while (*extensions == ' ') extensions++; - if (!*extensions) break; + if (!client->extensions[extensions[i]]) continue; + size += all_extensions[extensions[i]].len + 1; + } - if (!(end = strchr( extensions, ' ' ))) end = extensions + strlen( extensions ); - memcpy( p, extensions, end - extensions ); - p[end - extensions] = 0; + if (!(p = ret = malloc( size ))) return NULL; - if (is_extension_supported( ctx, p )) - { - TRACE( "++ %s\n", p ); - p += end - extensions; - *p++ = ' '; - } - else - { - TRACE( "-- %s (disabled in context)\n", p ); - } - extensions = end; + for (i = 0; i < count; i++) + { + if (!client->extensions[extensions[i]]) continue; + memcpy( p, all_extensions[extensions[i]].name, all_extensions[extensions[i]].len ); + p += all_extensions[extensions[i]].len; + *p++ = ' '; } - if (funcs->p_glImportMemoryWin32HandleEXT) p = append_extension( p, "GL_EXT_memory_object_win32" ); - if (funcs->p_glImportSemaphoreWin32HandleEXT) p = append_extension( p, "GL_EXT_semaphore_win32" ); - for (extra = legacy_extensions; *extra; extra++) p = append_extension( p, *extra ); - - if (p != str) --p; - *p = 0; - return (GLubyte *)str; + return (GLubyte *)ret; } /* Check if any GL extension from the list is supported */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10349