Module: wine Branch: stable Commit: f131e9f2c00cd2cd545b4ac4e408538442bdebe6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f131e9f2c00cd2cd545b4ac4e4...
Author: Henri Verbeet hverbeet@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 6b8fb1c22ea26f9fafda76133850af10ac3c7256) Conflicts: dlls/wined3d/swapchain.c Signed-off-by: Michael Stefaniuc mstefani@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