Module: wine
Branch: master
Commit: 3b0e37a0f49e4d0c94da18188dd150c601071855
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3b0e37a0f49e4d0c94da18188…
Author: Henri Verbeet <hverbeet(a)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(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)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)