From: Andrew Nguyen Subject: [4/4] wined3d: Handle the swapchain presentation interval with wglSwapIntervalEXT. Message-Id: <4D188A25.3020406@codeweavers.com> Date: Mon, 27 Dec 2010 06:44:21 -0600 --- dlls/wined3d/context.c | 31 +++++++++++++++++++++++++++++++ dlls/wined3d/directx.c | 4 ++++ dlls/wined3d/wined3d_gl.h | 6 +++++- 3 files changed, 40 insertions(+), 1 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index d8988f8..f9b99b9 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1280,6 +1280,7 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, int numSamples = 0; int pixel_format; unsigned int s; + int swap_interval; DWORD state; HGLRC ctx; HDC hdc; @@ -1460,6 +1461,36 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, goto out; } + switch (swapchain->presentParms.PresentationInterval) + { + case WINED3DPRESENT_INTERVAL_IMMEDIATE: + swap_interval = 0; + break; + case WINED3DPRESENT_INTERVAL_DEFAULT: + case WINED3DPRESENT_INTERVAL_ONE: + swap_interval = 1; + break; + case WINED3DPRESENT_INTERVAL_TWO: + swap_interval = 2; + break; + case WINED3DPRESENT_INTERVAL_THREE: + swap_interval = 3; + break; + case WINED3DPRESENT_INTERVAL_FOUR: + swap_interval = 4; + break; + default: + FIXME("Unknown presentation interval %08x\n", swapchain->presentParms.PresentationInterval); + swap_interval = 1; + } + + if (gl_info->supported[WGL_EXT_SWAP_CONTROL]) + { + if (!GL_EXTCALL(wglSwapIntervalEXT(swap_interval))) + ERR("wglSwapIntervalEXT failed to set swap interval %d for context %p, last error %#x\n", + swap_interval, ret, GetLastError()); + } + ENTER_GL(); glGetIntegerv(GL_AUX_BUFFERS, &ret->aux_buffers); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 742627d..da179a7 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2572,6 +2572,10 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) gl_info->supported[WGL_ARB_PIXEL_FORMAT] = TRUE; TRACE_(d3d_caps)("FOUND: WGL_ARB_pixel_format support\n"); } + if (!strcmp(ThisExtn, "WGL_EXT_swap_control")) { + gl_info->supported[WGL_EXT_SWAP_CONTROL] = TRUE; + TRACE_(d3d_caps)("FOUND: WGL_EXT_swap_control support\n"); + } if (!strcmp(ThisExtn, "WGL_WINE_pixel_format_passthrough")) { gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH] = TRUE; TRACE_(d3d_caps)("FOUND: WGL_WINE_pixel_format_passthrough support\n"); diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index 0635347..a2e0140 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -1836,6 +1836,7 @@ typedef enum wined3d_gl_extension SGIS_GENERATE_MIPMAP, /* WGL extensions */ WGL_ARB_PIXEL_FORMAT, + WGL_EXT_SWAP_CONTROL, WGL_WINE_PIXEL_FORMAT_PASSTHROUGH, /* Internally used */ WINED3D_GL_NORMALIZED_TEXRECT, @@ -3796,6 +3797,8 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR *ppfd); +typedef BOOL (WINAPI *WINED3D_PFNWGLSWAPINTERVALEXTPROC)(int interval); + #define GL_EXT_FUNCS_GEN \ /* GL_APPLE_fence */ \ USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC, \ @@ -4531,6 +4534,7 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \ USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \ USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL) + USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLSWAPINTERVALEXTPROC, wglSwapIntervalEXT, 0, NULL) #endif /* __WINE_WINED3D_GL */ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.14 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iQIcBAEBAgAGBQJNGIolAAoJEK/FbHgLAxL28dsP/1MktvSAX46Qejwe1+zONRG6 lgNnhaeNGV/0VIT2IeDYNTQikI7OEF1byk07mQbFHkvJkibmonQCGA9n1MxtHt4v XkPtcgpyM6KsX9Ig5WV6+ag6jxwBXD9UmMMI4PcRD8mP7uMtja0ucFjFKVvIE0im xbNIJfZbCIlsdG4s3oswwoGqLjdDCV5AyuCO/r2o1IUHDPaiApb/UjtKhQDM+Gfl V1yHtAN3KJJDL7iWvc8yp3MTx6gAgJSKAkhTzUG15bRtUY1DQznSt2wT2CZsJK+U 8daPrtjYlNpYpTx8NXYpUHVse2nXnYI0oQPM/KKjo9h7wNoJrXHXn/896OFXfMHb ozJfBEBbsg4nq/FUJMguaeU3KFOLlUMHYAuZwebYhHg08jiZ6MWn2vGQjz7fzfnj lPDn70Ff6XnRIOSaHqjfYq3zQCNz+iwXhpFt36qluE3dgKp/4VPt3SRN1fvcB2Hb t62vEQqFDkil4JsNeQ4Ch5KkdItV2TTOxwkOESr6oSV7jS6JaPvZtt8Ipdizak/M dCgejOU8pVJF1UfvjfBOQO6iYbjGTHCep4DgIP1rRyZ1OaZ9BjgX593YQ7A6Ls7p h0jdwdI2nDDCNT4wmN2yPSjSBJFHGPpT0HCG7X80yExgxOXL+t31KAh8RxtJJHrK CcuS9rXd9p96aNON9Dl/ =jeLO -----END PGP SIGNATURE-----