Alexandre Julliard : opengl32: Store the modified extension string in the context.
Alexandre Julliard
julliard at winehq.org
Wed Jul 25 16:06:53 CDT 2012
Module: wine
Branch: master
Commit: 5923e32ef1b10f741e20d2feba1a1a60d67fa6b7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5923e32ef1b10f741e20d2feba1a1a60d67fa6b7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jul 25 14:49:02 2012 +0200
opengl32: Store the modified extension string in the context.
---
dlls/opengl32/wgl.c | 75 ++++++++++++++++++++++++++++----------------------
1 files changed, 42 insertions(+), 33 deletions(-)
diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index 84b37c8..162f132 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -67,10 +67,11 @@ enum wgl_handle_type
struct opengl_context
{
- DWORD tid; /* thread that the context is current in */
- HDC draw_dc; /* current drawing DC */
- HDC read_dc; /* current reading DC */
- struct wgl_context *drv_ctx; /* driver context */
+ DWORD tid; /* thread that the context is current in */
+ HDC draw_dc; /* current drawing DC */
+ HDC read_dc; /* current reading DC */
+ GLubyte *extensions; /* extension string */
+ struct wgl_context *drv_ctx; /* driver context */
};
struct wgl_handle
@@ -215,6 +216,7 @@ BOOL WINAPI wglDeleteContext(HGLRC hglrc)
}
if (hglrc == NtCurrentTeb()->glCurrentRC) wglMakeCurrent( 0, 0 );
ptr->funcs->wgl.p_wglDeleteContext( ptr->u.context->drv_ctx );
+ HeapFree( GetProcessHeap(), 0, ptr->u.context->extensions );
HeapFree( GetProcessHeap(), 0, ptr->u.context );
free_handle_ptr( ptr );
return TRUE;
@@ -1480,26 +1482,41 @@ GLint WINAPI wine_glDebugEntry( GLint unknown1, GLint unknown2 )
}
/* build the extension string by filtering out the disabled extensions */
-static char *build_gl_extensions( const char *extensions )
+static GLubyte *filter_extensions( const char *extensions )
{
- char *p, *str, *disabled = NULL;
+ static const char *disabled;
+ char *p, *str;
const char *end;
- HKEY hkey;
TRACE( "GL_EXTENSIONS:\n" );
if (!extensions) extensions = "";
- /* @@ Wine registry key: HKCU\Software\Wine\OpenGL */
- if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\OpenGL", &hkey ))
+ if (!disabled)
{
- DWORD size, ret = RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, NULL, &size );
- if (!ret && (disabled = HeapAlloc( GetProcessHeap(), 0, size )))
- ret = RegQueryValueExA( hkey, "DisabledExtensions", 0, NULL, (BYTE *)disabled, &size );
- RegCloseKey( hkey );
- if (ret) *disabled = 0;
+ HKEY hkey;
+ DWORD size;
+
+ 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 NULL;
if ((str = HeapAlloc( GetProcessHeap(), 0, strlen(extensions) + 2 )))
{
p = str;
@@ -1521,8 +1538,7 @@ static char *build_gl_extensions( const char *extensions )
}
*p = 0;
}
- HeapFree( GetProcessHeap(), 0, disabled );
- return str;
+ return (GLubyte *)str;
}
/***********************************************************************
@@ -1530,24 +1546,17 @@ static char *build_gl_extensions( const char *extensions )
*/
const GLubyte * WINAPI wine_glGetString( GLenum name )
{
- const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
- static const GLubyte *gl_extensions;
-
- /* this is for buggy nvidia driver, crashing if called from a different
- thread with no context */
- if(wglGetCurrentContext() == NULL)
- return NULL;
-
- if (name != GL_EXTENSIONS) return funcs->gl.p_glGetString(name);
+ const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
+ const GLubyte *ret = funcs->gl.p_glGetString( name );
- if (!gl_extensions)
- {
- const char *orig_ext = (const char *)funcs->gl.p_glGetString(GL_EXTENSIONS);
- char *new_ext = build_gl_extensions( orig_ext );
- if (InterlockedCompareExchangePointer( (void **)&gl_extensions, new_ext, NULL ))
- HeapFree( GetProcessHeap(), 0, new_ext );
- }
- return gl_extensions;
+ if (name == GL_EXTENSIONS && ret)
+ {
+ struct wgl_handle *ptr = get_current_context_ptr();
+ if (ptr->u.context->extensions ||
+ ((ptr->u.context->extensions = filter_extensions( (const char *)ret ))))
+ ret = ptr->u.context->extensions;
+ }
+ return ret;
}
/***********************************************************************
More information about the wine-cvs
mailing list