Module: wine Branch: master Commit: f3e1e46c85c036ca212f1e34a247c7be80934107 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3e1e46c85c036ca212f1e34a2...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Jul 24 17:37:39 2012 +0200
winex11: Add a helper function to correctly check extension strings.
---
dlls/winex11.drv/opengl.c | 56 ++++++++++++++++++++++++--------------------- 1 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index e958132..22c608e 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -209,7 +209,6 @@ static const char *opengl_func_names[] = { ALL_WGL_FUNCS }; static void X11DRV_WineGL_LoadExtensions(void); static WineGLPixelFormat* ConvertPixelFormatWGLtoGLX(Display *display, int iPixelFormat, BOOL AllowOffscreen, int *fmt_count); static BOOL glxRequireVersion(int requiredVersion); -static BOOL glxRequireExtension(const char *requiredExtension);
static void dump_PIXELFORMATDESCRIPTOR(const PIXELFORMATDESCRIPTOR *ppfd) { TRACE(" - size / version : %d / %d\n", ppfd->nSize, ppfd->nVersion); @@ -320,6 +319,20 @@ static void (*pglFlush)(void); static void wglFinish(void); static void wglFlush(void);
+/* check if the extension is present in the list */ +static BOOL has_extension( const char *list, const char *ext ) +{ + size_t len = strlen( ext ); + + while (list) + { + while (*list == ' ') list++; + if (!strncmp( list, ext, len ) && (!list[len] || list[len] == ' ')) return TRUE; + list = strchr( list, ' ' ); + } + return FALSE; +} + static int GLXErrorHandler(Display *dpy, XErrorEvent *event, void *arg) { /* In the future we might want to find the exact X or GLX error to report back to the app */ @@ -590,7 +603,7 @@ static BOOL has_opengl(void) pglXGetFBConfigAttrib = pglXGetProcAddressARB((const GLubyte *) "glXGetFBConfigAttrib"); pglXGetVisualFromFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXGetVisualFromFBConfig"); pglXQueryDrawable = pglXGetProcAddressARB((const GLubyte *) "glXQueryDrawable"); - } else if(glxRequireExtension("GLX_SGIX_fbconfig")) { + } else if (has_extension( WineGLInfo.glxExtensions, "GLX_SGIX_fbconfig")) { pglXChooseFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXChooseFBConfigSGIX"); pglXGetFBConfigAttrib = pglXGetProcAddressARB((const GLubyte *) "glXGetFBConfigAttribSGIX"); pglXGetVisualFromFBConfig = pglXGetProcAddressARB((const GLubyte *) "glXGetVisualFromFBConfigSGIX"); @@ -615,7 +628,7 @@ static BOOL has_opengl(void) ERR(" glx_version is %s and GLX_SGIX_fbconfig extension is unsupported. Expect problems.\n", WineGLInfo.glxServerVersion); }
- if(glxRequireExtension("GLX_MESA_copy_sub_buffer")) { + if (has_extension( WineGLInfo.glxExtensions, "GLX_MESA_copy_sub_buffer")) { pglXCopySubBufferMESA = pglXGetProcAddressARB((const GLubyte *) "glXCopySubBufferMESA"); }
@@ -854,7 +867,7 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, struct wgl_ TRACE("pAttr[?] = GLX_RENDER_TYPE: %#x\n", pixelattrib);
/* Set GLX_FLOAT_COMPONENTS_NV all the time */ - if(strstr(WineGLInfo.glxExtensions, "GLX_NV_float_buffer")) { + if (has_extension(WineGLInfo.glxExtensions, "GLX_NV_float_buffer")) { PUSH2(oGLXAttr, GLX_FLOAT_COMPONENTS_NV, nvfloatattrib); TRACE("pAttr[?] = GLX_FLOAT_COMPONENTS_NV: %#x\n", nvfloatattrib); } @@ -2860,15 +2873,6 @@ static BOOL glxRequireVersion(int requiredVersion) return FALSE; }
-static BOOL glxRequireExtension(const char *requiredExtension) -{ - if (strstr(WineGLInfo.glxExtensions, requiredExtension) == NULL) { - return FALSE; - } - - return TRUE; -} - static void register_extension(const char *ext) { if (WineGLInfo.wglExtensions[0]) @@ -2887,16 +2891,16 @@ static void X11DRV_WineGL_LoadExtensions(void)
/* ARB Extensions */
- if(glxRequireExtension("GLX_ARB_create_context")) + if (has_extension( WineGLInfo.glxExtensions, "GLX_ARB_create_context")) { register_extension( "WGL_ARB_create_context" ); opengl_funcs.ext.p_wglCreateContextAttribsARB = X11DRV_wglCreateContextAttribsARB;
- if(glxRequireExtension("GLX_ARB_create_context_profile")) + if (has_extension( WineGLInfo.glxExtensions, "GLX_ARB_create_context_profile")) register_extension("WGL_ARB_create_context_profile"); }
- if(glxRequireExtension("GLX_ARB_fbconfig_float")) + if (has_extension( WineGLInfo.glxExtensions, "GLX_ARB_fbconfig_float")) { register_extension("WGL_ARB_pixel_format_float"); register_extension("WGL_ATI_pixel_format_float"); @@ -2912,12 +2916,12 @@ static void X11DRV_WineGL_LoadExtensions(void) opengl_funcs.ext.p_wglMakeContextCurrentARB = X11DRV_wglMakeContextCurrentARB; }
- if (glxRequireExtension("GLX_ARB_multisample")) register_extension( "WGL_ARB_multisample" ); + if (has_extension( WineGLInfo.glxExtensions, "GLX_ARB_multisample")) register_extension( "WGL_ARB_multisample" );
/* In general pbuffer functionality requires support in the X-server. The functionality is * available either when the GLX_SGIX_pbuffer is present or when the GLX server version is 1.3. */ - if ( glxRequireVersion(3) && glxRequireExtension("GLX_SGIX_pbuffer") ) + if ( glxRequireVersion(3) && has_extension( WineGLInfo.glxExtensions, "GLX_SGIX_pbuffer") ) { register_extension( "WGL_ARB_pbuffer" ); opengl_funcs.ext.p_wglCreatePbufferARB = X11DRV_wglCreatePbufferARB; @@ -2934,19 +2938,19 @@ static void X11DRV_WineGL_LoadExtensions(void) opengl_funcs.ext.p_wglGetPixelFormatAttribivARB = X11DRV_wglGetPixelFormatAttribivARB;
/* Support WGL_ARB_render_texture when there's support or pbuffer based emulation */ - if (glxRequireExtension("GLX_ARB_render_texture") || - (glxRequireVersion(3) && glxRequireExtension("GLX_SGIX_pbuffer") && use_render_texture_emulation)) + if (has_extension( WineGLInfo.glxExtensions, "GLX_ARB_render_texture") || + (glxRequireVersion(3) && has_extension( WineGLInfo.glxExtensions, "GLX_SGIX_pbuffer") && use_render_texture_emulation)) { register_extension( "WGL_ARB_render_texture" ); opengl_funcs.ext.p_wglBindTexImageARB = X11DRV_wglBindTexImageARB; opengl_funcs.ext.p_wglReleaseTexImageARB = X11DRV_wglReleaseTexImageARB;
/* The WGL version of GLX_NV_float_buffer requires render_texture */ - if(glxRequireExtension("GLX_NV_float_buffer")) + if (has_extension( WineGLInfo.glxExtensions, "GLX_NV_float_buffer")) register_extension("WGL_NV_float_buffer");
/* Again there's no GLX equivalent for this extension, so depend on the required GL extension */ - if(strstr(WineGLInfo.glExtensions, "GL_NV_texture_rectangle") != NULL) + if (has_extension(WineGLInfo.glExtensions, "GL_NV_texture_rectangle")) register_extension("WGL_NV_texture_rectangle"); }
@@ -2961,17 +2965,17 @@ static void X11DRV_WineGL_LoadExtensions(void) opengl_funcs.ext.p_wglSwapIntervalEXT = X11DRV_wglSwapIntervalEXT; opengl_funcs.ext.p_wglGetSwapIntervalEXT = X11DRV_wglGetSwapIntervalEXT;
- if(glxRequireExtension("GLX_EXT_framebuffer_sRGB")) + if (has_extension( WineGLInfo.glxExtensions, "GLX_EXT_framebuffer_sRGB")) register_extension("WGL_EXT_framebuffer_sRGB");
- if(glxRequireExtension("GLX_EXT_fbconfig_packed_float")) + if (has_extension( WineGLInfo.glxExtensions, "GLX_EXT_fbconfig_packed_float")) register_extension("WGL_EXT_pixel_format_packed_float");
- if (glxRequireExtension("GLX_EXT_swap_control")) + if (has_extension( WineGLInfo.glxExtensions, "GLX_EXT_swap_control")) has_swap_control = TRUE;
/* The OpenGL extension GL_NV_vertex_array_range adds wgl/glX functions which aren't exported as 'real' wgl/glX extensions. */ - if(strstr(WineGLInfo.glExtensions, "GL_NV_vertex_array_range") != NULL) + if (has_extension(WineGLInfo.glExtensions, "GL_NV_vertex_array_range")) { register_extension( "WGL_NV_vertex_array_range" ); opengl_funcs.ext.p_wglAllocateMemoryNV = pglXAllocateMemoryNV;