From: Rémi Bernon rbernon@codeweavers.com
--- dlls/opengl32/unix_wgl.c | 40 ++++++++++++++++++++++++++++++--------- dlls/winex11.drv/opengl.c | 21 ++------------------ 2 files changed, 33 insertions(+), 28 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 920ecd47578..f143eb3cd07 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -176,20 +176,29 @@ static BOOL has_extension( const char *list, const char *ext, size_t len ) return FALSE; }
+static const char *legacy_extensions[] = +{ + "WGL_EXT_extensions_string", + "WGL_EXT_swap_control", + NULL, +}; + static GLubyte *filter_extensions_list( const char *extensions, const char *disabled ) { - const char *end; + const char *end, **extra; char *p, *str; + size_t size;
- p = str = malloc( strlen( extensions ) + 2 ); - if (!str) return NULL; + size = strlen( extensions ) + 2; + for (extra = legacy_extensions; *extra; extra++) size += strlen( *extra ) + 1; + if (!(p = str = malloc( size ))) return NULL;
TRACE( "GL_EXTENSIONS:\n" );
- for (;;) + for (extra = legacy_extensions;;) { while (*extensions == ' ') extensions++; - if (!*extensions) break; + if (!*extensions && !(extensions = *extra++)) break;
if (!(end = strchr( extensions, ' ' ))) end = extensions + strlen( extensions ); memcpy( p, extensions, end - extensions ); @@ -463,8 +472,12 @@ static void wrap_glGetIntegerv( TEB *teb, GLenum pname, GLint *data )
funcs->p_glGetIntegerv( pname, data );
- if (pname == GL_NUM_EXTENSIONS && (disabled = disabled_extensions_index( teb ))) - while (*disabled++ != ~0u) (*data)--; + if (pname == GL_NUM_EXTENSIONS) + { + if ((disabled = disabled_extensions_index( teb ))) + while (*disabled++ != ~0u) (*data)--; + *data += ARRAY_SIZE(legacy_extensions) - 1; + }
if (is_win64 && is_wow64()) { @@ -521,6 +534,7 @@ static const GLubyte *wrap_glGetStringi( TEB *teb, GLenum name, GLuint index ) { const struct opengl_funcs *funcs = teb->glTable; const GLuint *disabled; + GLint count;
if (!funcs->p_glGetStringi) { @@ -528,8 +542,16 @@ static const GLubyte *wrap_glGetStringi( TEB *teb, GLenum name, GLuint index ) *func_ptr = funcs->p_wglGetProcAddress( "glGetStringi" ); }
- if (name == GL_EXTENSIONS && (disabled = disabled_extensions_index( teb ))) - while (index >= *disabled++) index++; + if (name == GL_EXTENSIONS) + { + funcs->p_glGetIntegerv( GL_NUM_EXTENSIONS, &count ); + + if ((disabled = disabled_extensions_index( teb ))) + while (index >= *disabled++) index++; + + if (index >= count && index - count < ARRAY_SIZE(legacy_extensions)) + return (const GLubyte *)legacy_extensions[index - count]; + }
return funcs->p_glGetStringi( name, index ); } diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 1f42ebbd6f4..caef83002b8 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -179,7 +179,7 @@ typedef XID GLXPbuffer; #define GLX_FLOAT_COMPONENTS_NV 0x20B0
-static char *glExtensions; +static const char *glExtensions; static const char *glxExtensions; static char wglExtensions[4096]; static int glxVersion[2]; @@ -356,7 +356,6 @@ static INT64 (*pglXSwapBuffersMscOML)( Display *dpy, GLXDrawable drawable, static void (*pglFinish)(void); static void (*pglFlush)(void); static const GLubyte *(*pglGetString)(GLenum name); -static const GLubyte *wglGetString(GLenum name);
/* check if the extension is present in the list */ static BOOL has_extension( const char *list, const char *ext ) @@ -382,13 +381,10 @@ static int GLXErrorHandler(Display *dpy, XErrorEvent *event, void *arg)
static BOOL X11DRV_WineGL_InitOpenglInfo(void) { - static const char legacy_extensions[] = " WGL_EXT_extensions_string WGL_EXT_swap_control"; - int screen = DefaultScreen(gdi_display); Window win = 0, root = 0; const char *gl_version; const char *gl_renderer; - const char* str; BOOL glx_direct; XVisualInfo *vis; GLXContext ctx = NULL; @@ -438,10 +434,7 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) } gl_renderer = (const char *)pglGetString(GL_RENDERER); gl_version = (const char *)pglGetString(GL_VERSION); - str = (const char *) pglGetString(GL_EXTENSIONS); - glExtensions = malloc( strlen(str) + sizeof(legacy_extensions) ); - strcpy(glExtensions, str); - strcat(glExtensions, legacy_extensions); + glExtensions = (const char *) pglGetString(GL_EXTENSIONS);
/* Get the common GLX version supported by GLX client and server ( major/minor) */ pglXQueryVersion(gdi_display, &glxVersion[0], &glxVersion[1]); @@ -1558,10 +1551,6 @@ static BOOL x11drv_context_destroy(void *private) static void *x11drv_get_proc_address( const char *name ) { void *ptr; - - /* redirect some standard OpenGL functions */ - if (!strcmp( name, "glGetString" )) return wglGetString; - if ((ptr = dlsym( opengl_handle, name ))) return ptr; return pglXGetProcAddressARB( (const GLubyte *)name ); } @@ -1734,12 +1723,6 @@ static BOOL x11drv_context_flush( void *private, HWND hwnd, HDC hdc, int interva return TRUE; }
-static const GLubyte *wglGetString(GLenum name) -{ - if (name == GL_EXTENSIONS && glExtensions) return (const GLubyte *)glExtensions; - return pglGetString(name); -} - /*********************************************************************** * X11DRV_wglCreateContextAttribsARB */