Henri Verbeet : wined3d: Also update the swap interval when not recreating the context in wined3d_device_reset ().

Alexandre Julliard julliard at winehq.org
Mon Aug 22 07:32:39 CDT 2016


Module: wine
Branch: stable
Commit: f131e9f2c00cd2cd545b4ac4e408538442bdebe6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f131e9f2c00cd2cd545b4ac4e408538442bdebe6

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Apr  4 18:42:59 2016 +0200

wined3d: Also update the swap interval when not recreating the context in wined3d_device_reset().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 6b8fb1c22ea26f9fafda76133850af10ac3c7256)
Conflicts:
	dlls/wined3d/swapchain.c
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/wined3d/context.c         | 31 ------------------------------
 dlls/wined3d/device.c          |  8 ++++++--
 dlls/wined3d/swapchain.c       | 43 ++++++++++++++++++++++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |  1 +
 4 files changed, 50 insertions(+), 33 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 1e357e7..a15aad2 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1454,7 +1454,6 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     HGLRC ctx, share_ctx;
     int pixel_format;
     unsigned int s;
-    int swap_interval;
     DWORD state;
     HDC hdc;
     BOOL hdc_is_private = FALSE;
@@ -1704,36 +1703,6 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
         }
     }
 
-    switch (swapchain->desc.swap_interval)
-    {
-        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 swap interval %#x.\n", swapchain->desc.swap_interval);
-            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());
-    }
-
     gl_info->gl_ops.gl.p_glGetIntegerv(GL_AUX_BUFFERS, &ret->aux_buffers);
 
     TRACE("Setting up the screen\n");
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 7753e76..b9ab347 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4806,8 +4806,12 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         wined3d_cs_emit_set_scissor_rect(device->cs, &state->scissor_rect);
     }
 
-    if (reset_state && device->d3d_initialized)
-        hr = create_primary_opengl_context(device, swapchain);
+    if (device->d3d_initialized)
+    {
+        if (reset_state)
+            hr = create_primary_opengl_context(device, swapchain);
+        swapchain_update_swap_interval(swapchain);
+    }
 
     /* All done. There is no need to reload resources or shaders, this will happen automatically on the
      * first use
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 069b071..f7d48de 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -924,6 +924,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
             FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n");
         }
         context_release(swapchain->context[0]);
+        swapchain_update_swap_interval(swapchain);
     }
 
     if (swapchain->desc.backbuffer_count > 0)
@@ -1154,6 +1155,48 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
     }
 }
 
+void swapchain_update_swap_interval(struct wined3d_swapchain *swapchain)
+{
+    const struct wined3d_gl_info *gl_info;
+    struct wined3d_context *context;
+    int swap_interval;
+
+    context = context_acquire(swapchain->device, surface_from_resource(swapchain->front_buffer->sub_resources[0]));
+    gl_info = context->gl_info;
+
+    switch (swapchain->desc.swap_interval)
+    {
+        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("Unhandled present interval %#x.\n", swapchain->desc.swap_interval);
+            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, context, GetLastError());
+    }
+
+    context_release(context);
+}
+
 void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activate)
 {
     struct wined3d_device *device = swapchain->device;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b6edd4c..d7d3796 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2876,6 +2876,7 @@ struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchai
 void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
+void swapchain_update_swap_interval(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 
 /*****************************************************************************
  * Utility function prototypes




More information about the wine-cvs mailing list