Module: wine Branch: master Commit: 3b0e37a0f49e4d0c94da18188dd150c601071855 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3b0e37a0f49e4d0c94da18188d...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Mar 1 07:14:52 2017 +0100
wined3d: Send swapchain context creation through the command stream.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/swapchain.c | 86 +++++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 41 deletions(-)
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 1f31352..dff1354 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -782,6 +782,50 @@ static void wined3d_swapchain_apply_sample_count_override(const struct wined3d_s *quality = 0; }
+static void wined3d_swapchain_cs_init(void *object) +{ + struct wined3d_swapchain *swapchain = object; + const struct wined3d_gl_info *gl_info; + unsigned int i; + + static const enum wined3d_format_id formats[] = + { + WINED3DFMT_D24_UNORM_S8_UINT, + WINED3DFMT_D32_UNORM, + WINED3DFMT_R24_UNORM_X8_TYPELESS, + WINED3DFMT_D16_UNORM, + WINED3DFMT_S1_UINT_D15_UNORM, + }; + + gl_info = &swapchain->device->adapter->gl_info; + + /* Without ORM_FBO, switching the depth/stencil format is hard. Always + * request a depth/stencil buffer in the likely case it's needed later. */ + for (i = 0; i < ARRAY_SIZE(formats); ++i) + { + swapchain->ds_format = wined3d_get_format(gl_info, formats[i], WINED3DUSAGE_DEPTHSTENCIL); + if ((swapchain->context[0] = context_create(swapchain, swapchain->front_buffer, swapchain->ds_format))) + break; + TRACE("Depth stencil format %s is not supported, trying next format.\n", debug_d3dformat(formats[i])); + } + + if (!swapchain->context[0]) + { + WARN("Failed to create context.\n"); + return; + } + swapchain->num_contexts = 1; + + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO + && (!swapchain->desc.enable_auto_depth_stencil + || swapchain->desc.auto_depth_stencil_format != swapchain->ds_format->id)) + FIXME("Add OpenGL context recreation support.\n"); + + context_release(swapchain->context[0]); + + swapchain_update_swap_interval(swapchain); +} + static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3d_device *device, struct wined3d_swapchain_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops) { @@ -908,17 +952,6 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
if (!(device->wined3d->flags & WINED3D_NO3D)) { - static const enum wined3d_format_id formats[] = - { - WINED3DFMT_D24_UNORM_S8_UINT, - WINED3DFMT_D32_UNORM, - WINED3DFMT_R24_UNORM_X8_TYPELESS, - WINED3DFMT_D16_UNORM, - WINED3DFMT_S1_UINT_D15_UNORM - }; - - const struct wined3d_gl_info *gl_info = &adapter->gl_info; - swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(*swapchain->context)); if (!swapchain->context) { @@ -927,42 +960,13 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3 goto err; }
- /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate. - * You are able to add a depth + stencil surface at a later stage when you need it. - * In order to support this properly in WineD3D we need the ability to recreate the opengl context and - * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new - * context, need torecreate shaders, textures and other resources. - * - * The context manager already takes care of the state problem and for the other tasks code from Reset - * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now. - * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the - * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this - * issue needs to be fixed. */ - for (i = 0; i < (sizeof(formats) / sizeof(*formats)); i++) - { - swapchain->ds_format = wined3d_get_format(gl_info, formats[i], WINED3DUSAGE_DEPTHSTENCIL); - swapchain->context[0] = context_create(swapchain, swapchain->front_buffer, swapchain->ds_format); - if (swapchain->context[0]) break; - TRACE("Depth stencil format %s is not supported, trying next format\n", - debug_d3dformat(formats[i])); - } + wined3d_cs_init_object(device->cs, wined3d_swapchain_cs_init, swapchain);
if (!swapchain->context[0]) { - WARN("Failed to create context.\n"); hr = WINED3DERR_NOTAVAILABLE; goto err; } - swapchain->num_contexts = 1; - - if (wined3d_settings.offscreen_rendering_mode != ORM_FBO - && (!desc->enable_auto_depth_stencil - || swapchain->desc.auto_depth_stencil_format != swapchain->ds_format->id)) - { - 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)