Alexandre Julliard : winex11: Add a helper function to correctly check extension strings.
Alexandre Julliard
julliard at winehq.org
Tue Jul 24 14:39:36 CDT 2012
Module: wine
Branch: master
Commit: f3e1e46c85c036ca212f1e34a247c7be80934107
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f3e1e46c85c036ca212f1e34a247c7be80934107
Author: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list