Andrew Nguyen : wined3d: Handle the swapchain presentation interval with wglSwapIntervalEXT.

Alexandre Julliard julliard at winehq.org
Mon Dec 27 10:04:00 CST 2010


Module: wine
Branch: master
Commit: 12880784fea51b8f9f8e60c159f442a0f9f8e8e5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=12880784fea51b8f9f8e60c159f442a0f9f8e8e5

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Mon Dec 27 06:44:21 2010 -0600

wined3d: Handle the swapchain presentation interval with wglSwapIntervalEXT.

---

 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 */




More information about the wine-cvs mailing list