[PATCH 1/2] d3d8: Accept D3DSWAPEFFECT_COPY_VSYNC.

Stefan Dösinger stefan at codeweavers.com
Mon Sep 28 14:02:10 CDT 2015


This fixes bug 39281.

In my quick testing there seems to be no difference between COPY_VSYNC
and COPY, at least on my r500 GPU on Windows 7. In both cases the
presentation interval determines vsync.

(D3d8 doesn't allow windowed vsync, unlike d3d9. This is something for a
different patch...)

Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
 dlls/d3d8/device.c       |  5 +++--
 dlls/d3d8/tests/device.c | 48 ++++++++++++++++++++++++++++--------------------
 2 files changed, 31 insertions(+), 22 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index e899b34..c6e34ef 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -191,13 +191,14 @@ static void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS
 static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapchain_desc *swapchain_desc,
         const D3DPRESENT_PARAMETERS *present_parameters)
 {
-    if (!present_parameters->SwapEffect || present_parameters->SwapEffect > D3DSWAPEFFECT_COPY)
+    if (!present_parameters->SwapEffect || present_parameters->SwapEffect > D3DSWAPEFFECT_COPY_VSYNC)
     {
         WARN("Invalid swap effect %u passed.\n", present_parameters->SwapEffect);
         return FALSE;
     }
     if (present_parameters->BackBufferCount > 3
-            || (present_parameters->SwapEffect == D3DSWAPEFFECT_COPY
+            || ((present_parameters->SwapEffect == D3DSWAPEFFECT_COPY
+            || present_parameters->SwapEffect == D3DSWAPEFFECT_COPY_VSYNC)
             && present_parameters->BackBufferCount > 1))
     {
         WARN("Invalid backbuffer count %u.\n", present_parameters->BackBufferCount);
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index cb7f5e1..ccc16c6 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -7309,36 +7309,44 @@ static void test_swapchain_parameters(void)
     tests[] =
     {
         /* Swap effect 0 is not allowed. */
-        {TRUE,  1, 0,                     D3DERR_INVALIDCALL},
-        {FALSE, 1, 0,                     D3DERR_INVALIDCALL},
+        {TRUE,  1, 0,                            D3DERR_INVALIDCALL},
+        {FALSE, 1, 0,                            D3DERR_INVALIDCALL},
 
         /* All (non-ex) swap effects are allowed in
          * windowed and fullscreen mode. */
-        {TRUE,  1, D3DSWAPEFFECT_DISCARD, D3D_OK},
-        {TRUE,  1, D3DSWAPEFFECT_FLIP,    D3D_OK},
-        {FALSE, 1, D3DSWAPEFFECT_DISCARD, D3D_OK},
-        {FALSE, 1, D3DSWAPEFFECT_FLIP,    D3D_OK},
-        {FALSE, 1, D3DSWAPEFFECT_COPY,    D3D_OK},
+        {TRUE,  1, D3DSWAPEFFECT_DISCARD,        D3D_OK},
+        {TRUE,  1, D3DSWAPEFFECT_FLIP,           D3D_OK},
+        {FALSE, 1, D3DSWAPEFFECT_DISCARD,        D3D_OK},
+        {FALSE, 1, D3DSWAPEFFECT_FLIP,           D3D_OK},
+        {FALSE, 1, D3DSWAPEFFECT_COPY,           D3D_OK},
 
         /* Only one backbuffer in copy mode. Reset allows it for
          * some reason. */
-        {TRUE,  0, D3DSWAPEFFECT_COPY,    D3D_OK},
-        {TRUE,  1, D3DSWAPEFFECT_COPY,    D3D_OK},
-        {TRUE,  2, D3DSWAPEFFECT_COPY,    D3DERR_INVALIDCALL},
-        {FALSE, 2, D3DSWAPEFFECT_COPY,    D3DERR_INVALIDCALL},
+        {TRUE,  0, D3DSWAPEFFECT_COPY,           D3D_OK},
+        {TRUE,  1, D3DSWAPEFFECT_COPY,           D3D_OK},
+        {TRUE,  2, D3DSWAPEFFECT_COPY,           D3DERR_INVALIDCALL},
+        {FALSE, 2, D3DSWAPEFFECT_COPY,           D3DERR_INVALIDCALL},
+        {TRUE,  0, D3DSWAPEFFECT_COPY_VSYNC,     D3D_OK},
+        {TRUE,  1, D3DSWAPEFFECT_COPY_VSYNC,     D3D_OK},
+        {TRUE,  2, D3DSWAPEFFECT_COPY_VSYNC,     D3DERR_INVALIDCALL},
+        {FALSE, 2, D3DSWAPEFFECT_COPY_VSYNC,     D3DERR_INVALIDCALL},
 
         /* Ok with the others, in fullscreen and windowed mode. */
-        {TRUE,  2, D3DSWAPEFFECT_DISCARD, D3D_OK},
-        {TRUE,  2, D3DSWAPEFFECT_FLIP,    D3D_OK},
-        {FALSE, 2, D3DSWAPEFFECT_DISCARD, D3D_OK},
-        {FALSE, 2, D3DSWAPEFFECT_FLIP,    D3D_OK},
+        {TRUE,  2, D3DSWAPEFFECT_DISCARD,        D3D_OK},
+        {TRUE,  2, D3DSWAPEFFECT_FLIP,           D3D_OK},
+        {FALSE, 2, D3DSWAPEFFECT_DISCARD,        D3D_OK},
+        {FALSE, 2, D3DSWAPEFFECT_FLIP,           D3D_OK},
+
+        /* Invalid swapeffects. */
+        {TRUE,  1, D3DSWAPEFFECT_COPY_VSYNC + 1, D3DERR_INVALIDCALL},
+        {FALSE, 1, D3DSWAPEFFECT_COPY_VSYNC + 1, D3DERR_INVALIDCALL},
 
         /* 3 is the highest allowed backbuffer count. */
-        {TRUE,  3, D3DSWAPEFFECT_DISCARD,    D3D_OK},
-        {TRUE,  4, D3DSWAPEFFECT_DISCARD,    D3DERR_INVALIDCALL},
-        {TRUE,  4, D3DSWAPEFFECT_FLIP,       D3DERR_INVALIDCALL},
-        {FALSE, 4, D3DSWAPEFFECT_DISCARD,    D3DERR_INVALIDCALL},
-        {FALSE, 4, D3DSWAPEFFECT_FLIP,       D3DERR_INVALIDCALL},
+        {TRUE,  3, D3DSWAPEFFECT_DISCARD,        D3D_OK},
+        {TRUE,  4, D3DSWAPEFFECT_DISCARD,        D3DERR_INVALIDCALL},
+        {TRUE,  4, D3DSWAPEFFECT_FLIP,           D3DERR_INVALIDCALL},
+        {FALSE, 4, D3DSWAPEFFECT_DISCARD,        D3DERR_INVALIDCALL},
+        {FALSE, 4, D3DSWAPEFFECT_FLIP,           D3DERR_INVALIDCALL},
     };
 
     window = CreateWindowA("static", "d3d8_test", WS_OVERLAPPEDWINDOW,
-- 
2.4.9




More information about the wine-patches mailing list