From 7ba434b4fafa351b1792183d58d59b6dc33850dc Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Mon, 10 Nov 2014 18:56:11 +0100 Subject: [PATCH] winex11.drv: Add support for GLX_OML_swap_method. --- dlls/winex11.drv/opengl.c | 61 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 1481034bed1..cf5d4406d76 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -145,6 +145,10 @@ typedef XID GLXPbuffer; #define GLX_PBUFFER 0x8023 #define GLX_PBUFFER_HEIGHT 0x8040 #define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 #define GLX_RGBA_BIT 0x00000001 #define GLX_COLOR_INDEX_BIT 0x00000002 #define GLX_PBUFFER_CLOBBER_MASK 0x08000000 @@ -285,6 +289,7 @@ static BOOL use_render_texture_emulation = TRUE; static enum glx_swap_control_method swap_control_method = GLX_SWAP_CONTROL_NONE; /* Set when GLX_EXT_swap_control_tear is supported, requires GLX_SWAP_CONTROL_EXT */ static BOOL has_swap_control_tear = FALSE; +static BOOL has_swap_method = FALSE; static CRITICAL_SECTION context_section; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -878,8 +883,30 @@ static int ConvertAttribWGLtoGLX(const int* iWGLAttr, int* oGLXAttr, struct wgl_ case WGL_SWAP_METHOD_ARB: pop = iWGLAttr[++cur]; - /* For now we ignore this and just return SWAP_EXCHANGE */ TRACE("pAttr[%d] = WGL_SWAP_METHOD_ARB: %#x\n", cur, pop); + if (has_swap_method) + { + switch (pop) + { + case WGL_SWAP_EXCHANGE_ARB: + pop = GLX_SWAP_EXCHANGE_OML; + break; + case WGL_SWAP_COPY_ARB: + pop = GLX_SWAP_COPY_OML; + break; + case WGL_SWAP_UNDEFINED_ARB: + pop = GLX_SWAP_UNDEFINED_OML; + break; + default: + ERR("Unexpected swap method %#x.\n", pop); + pop = GLX_DONT_CARE; + } + PUSH2(oGLXAttr, GLX_SWAP_METHOD_OML, pop); + } + else + { + WARN("GLX_OML_swap_method not supported, ignoring attribute.\n"); + } break; case WGL_PBUFFER_LARGEST_ARB: @@ -2737,11 +2764,30 @@ static BOOL X11DRV_wglGetPixelFormatAttribivARB( HDC hdc, int iPixelFormat, int continue; case WGL_SWAP_METHOD_ARB: - /* For now return SWAP_EXCHANGE_ARB which is the best type of buffer switch available. - * Later on we can also use GLX_OML_swap_method on drivers which support this. At this - * point only ATI offers this. - */ - piValues[i] = WGL_SWAP_EXCHANGE_ARB; + if (has_swap_method) + { + hTest = pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_DRAWABLE_TYPE, &tmp); + if (hTest) goto get_error; + switch (tmp) + { + case GLX_SWAP_EXCHANGE_OML: + piValues[i] = WGL_SWAP_EXCHANGE_ARB; + break; + case GLX_SWAP_COPY_OML: + piValues[i] = WGL_SWAP_COPY_ARB; + break; + case GLX_SWAP_UNDEFINED_OML: + piValues[i] = WGL_SWAP_UNDEFINED_ARB; + break; + default: + ERR("Unexpected swap method %x.\n", tmp); + } + } + else + { + WARN("GLX_OML_swap_method not supported, returning WGL_SWAP_EXCHANGE_ARB.\n"); + piValues[i] = WGL_SWAP_EXCHANGE_ARB; + } continue; case WGL_PBUFFER_LARGEST_ARB: @@ -3167,6 +3213,9 @@ static void X11DRV_WineGL_LoadExtensions(void) opengl_funcs.ext.p_wglFreeMemoryNV = pglXFreeMemoryNV; } + if (has_extension(WineGLInfo.glxExtensions, "GLX_OML_swap_method")) + has_swap_method = TRUE; + /* WINE-specific WGL Extensions */ /* In WineD3D we need the ability to set the pixel format more than once (e.g. after a device reset). -- 2.11.4.GIT