[PATCH 4/6] wined3d: Determine the ORM_BACKBUFFER depth/stencil format in wined3d_adapter_gl_create_context().

Henri Verbeet hverbeet at codeweavers.com
Tue May 7 05:30:09 CDT 2019


Instead of in wined3d_swapchain_cs_init().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/adapter_vk.c      |  2 +-
 dlls/wined3d/context.c         | 90 ++++++++++++++++++++++++++++--------------
 dlls/wined3d/directx.c         |  3 +-
 dlls/wined3d/swapchain.c       | 27 +------------
 dlls/wined3d/wined3d_private.h |  8 ++--
 5 files changed, 67 insertions(+), 63 deletions(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 7177e384fa2..d6438945361 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -288,7 +288,7 @@ static void adapter_vk_destroy_device(struct wined3d_device *device)
     heap_free(device_vk);
 }
 
-static BOOL adapter_vk_create_context(struct wined3d_context *context, const struct wined3d_format *ds_format)
+static BOOL adapter_vk_create_context(struct wined3d_context *context)
 {
     return TRUE;
 }
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 0defbcc25a9..fdf7f9ccc65 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1965,7 +1965,7 @@ static BOOL wined3d_context_init(struct wined3d_context *context, struct wined3d
     return TRUE;
 }
 
-struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, const struct wined3d_format *ds_format)
+struct wined3d_context *context_create(struct wined3d_swapchain *swapchain)
 {
     struct wined3d_device *device = swapchain->device;
     struct wined3d_context_gl *context_gl;
@@ -1984,7 +1984,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, cons
         heap_free(context_gl);
         return NULL;
     }
-    if (!(device->adapter->adapter_ops->adapter_create_context(context, ds_format)))
+    if (!(device->adapter->adapter_ops->adapter_create_context(context)))
     {
         wined3d_release_dc(context->win_handle, context->hdc);
         heap_free(context_gl);
@@ -2003,15 +2003,15 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, cons
     return context;
 }
 
-BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context, const struct wined3d_format *ds_format)
+BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context)
 {
+    struct wined3d_swapchain *swapchain = context->swapchain;
+    const struct wined3d_format *color_format, *ds_format;
     struct wined3d_device *device = context->device;
-    const struct wined3d_format *color_format;
     const struct wined3d_d3d_info *d3d_info;
     const struct wined3d_gl_info *gl_info;
     struct wined3d_resource *target;
     unsigned int target_bind_flags;
-    BOOL aux_buffers = FALSE;
     HGLRC ctx, share_ctx;
     unsigned int i;
 
@@ -2057,47 +2057,77 @@ BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context, const st
         return FALSE;
 
     target = &context->current_rt.texture->resource;
-    color_format = target->format;
     target_bind_flags = target->bind_flags;
 
-    /* In case of ORM_BACKBUFFER, make sure to request an alpha component for
-     * X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
     if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
     {
-        aux_buffers = TRUE;
+        static const enum wined3d_format_id ds_formats[] =
+        {
+            WINED3DFMT_D24_UNORM_S8_UINT,
+            WINED3DFMT_D32_UNORM,
+            WINED3DFMT_R24_UNORM_X8_TYPELESS,
+            WINED3DFMT_D16_UNORM,
+            WINED3DFMT_S1_UINT_D15_UNORM,
+        };
+
+        color_format = target->format;
 
+        /* In case of ORM_BACKBUFFER, make sure to request an alpha component for
+         * X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
         if (color_format->id == WINED3DFMT_B4G4R4X4_UNORM)
             color_format = wined3d_get_format(device->adapter, WINED3DFMT_B4G4R4A4_UNORM, target_bind_flags);
         else if (color_format->id == WINED3DFMT_B8G8R8X8_UNORM)
             color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags);
-    }
 
-    /* DirectDraw supports 8bit paletted render targets and these are used by
-     * old games like StarCraft and C&C. Most modern hardware doesn't support
-     * 8bit natively so we perform some form of 8bit -> 32bit conversion. The
-     * conversion (ab)uses the alpha component for storing the palette index.
-     * For this reason we require a format with 8bit alpha, so request
-     * A8R8G8B8. */
-    if (color_format->id == WINED3DFMT_P8_UINT)
-        color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags);
+        /* DirectDraw supports 8bit paletted render targets and these are used by
+         * old games like StarCraft and C&C. Most modern hardware doesn't support
+         * 8bit natively so we perform some form of 8bit -> 32bit conversion. The
+         * conversion (ab)uses the alpha component for storing the palette index.
+         * For this reason we require a format with 8bit alpha, so request
+         * A8R8G8B8. */
+        if (color_format->id == WINED3DFMT_P8_UINT)
+            color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags);
+
+        /* Try to find a pixel format which matches our requirements. */
+        if (!swapchain->ds_format)
+        {
+            for (i = 0; i < ARRAY_SIZE(ds_formats); ++i)
+            {
+                ds_format = wined3d_get_format(device->adapter, ds_formats[i], WINED3D_BIND_DEPTH_STENCIL);
+                if ((context->pixel_format = context_choose_pixel_format(device,
+                        context->hdc, color_format, ds_format, TRUE)))
+                {
+                    swapchain->ds_format = ds_format;
+                    break;
+                }
 
-    /* When using FBOs for off-screen rendering, we only use the drawable for
-     * presentation blits, and don't do any rendering to it. That means we
-     * don't need depth or stencil buffers, and can mostly ignore the render
-     * target format. This wouldn't necessarily be quite correct for 10bpc
-     * display modes, but we don't currently support those.
-     * Using the same format regardless of the color/depth/stencil targets
-     * makes it much less likely that different wined3d instances will set
-     * conflicting pixel formats. */
-    if (wined3d_settings.offscreen_rendering_mode != ORM_BACKBUFFER)
+                TRACE("Depth stencil format %s is not supported, trying next format.\n",
+                        debug_d3dformat(ds_format->id));
+            }
+        }
+        else
+        {
+            context->pixel_format = context_choose_pixel_format(device,
+                    context->hdc, color_format, swapchain->ds_format, TRUE);
+        }
+    }
+    else
     {
+        /* When using FBOs for off-screen rendering, we only use the drawable for
+         * presentation blits, and don't do any rendering to it. That means we
+         * don't need depth or stencil buffers, and can mostly ignore the render
+         * target format. This wouldn't necessarily be quite correct for 10bpc
+         * display modes, but we don't currently support those.
+         * Using the same format regardless of the color/depth/stencil targets
+         * makes it much less likely that different wined3d instances will set
+         * conflicting pixel formats. */
         color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags);
         ds_format = wined3d_get_format(device->adapter, WINED3DFMT_UNKNOWN, WINED3D_BIND_DEPTH_STENCIL);
+        context->pixel_format = context_choose_pixel_format(device,
+                context->hdc, color_format, ds_format, FALSE);
     }
 
-    /* Try to find a pixel format which matches our requirements. */
-    if (!(context->pixel_format = context_choose_pixel_format(device,
-            context->hdc, color_format, ds_format, aux_buffers)))
+    if (!context->pixel_format)
         return FALSE;
 
     context_enter(context);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index d4aefadc29e..7e6ac823e5a 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2255,8 +2255,7 @@ static void adapter_no3d_destroy_device(struct wined3d_device *device)
     heap_free(device);
 }
 
-static BOOL wined3d_adapter_no3d_create_context(struct wined3d_context *context,
-        const struct wined3d_format *ds_format)
+static BOOL wined3d_adapter_no3d_create_context(struct wined3d_context *context)
 {
     return TRUE;
 }
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 7210682c45f..f47c1a44297 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -720,31 +720,8 @@ static void wined3d_swapchain_apply_sample_count_override(const struct wined3d_s
 static void wined3d_swapchain_cs_init(void *object)
 {
     struct wined3d_swapchain *swapchain = object;
-    const struct wined3d_adapter *adapter;
-    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,
-    };
-
-    adapter = swapchain->device->adapter;
-
-    /* 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(adapter, formats[i], WINED3D_BIND_DEPTH_STENCIL);
-        if ((swapchain->context[0] = context_create(swapchain, swapchain->ds_format)))
-            break;
-        TRACE("Depth stencil format %s is not supported, trying next format.\n", debug_d3dformat(formats[i]));
-    }
 
-    if (!swapchain->context[0])
+    if (!(swapchain->context[0] = context_create(swapchain)))
     {
         WARN("Failed to create context.\n");
         return;
@@ -1085,7 +1062,7 @@ static struct wined3d_context *swapchain_create_context(struct wined3d_swapchain
 
     TRACE("Creating a new context for swapchain %p, thread %u.\n", swapchain, GetCurrentThreadId());
 
-    if (!(ctx = context_create(swapchain, swapchain->ds_format)))
+    if (!(ctx = context_create(swapchain)))
     {
         ERR("Failed to create a new context for the swapchain\n");
         return NULL;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index ddd5b8d0951..1eec960c045 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2196,8 +2196,7 @@ void context_check_fbo_status(const struct wined3d_context *context, GLenum targ
 void context_copy_bo_address(struct wined3d_context *context,
         const struct wined3d_bo_address *dst, GLenum dst_binding,
         const struct wined3d_bo_address *src, GLenum src_binding, size_t size) DECLSPEC_HIDDEN;
-struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
-        const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
+struct wined3d_context *context_create(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx) DECLSPEC_HIDDEN;
 void wined3d_context_destroy(struct wined3d_context *context) DECLSPEC_HIDDEN;
 void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_texture_gl *texture_gl,
@@ -2711,7 +2710,7 @@ struct wined3d_adapter_ops
             BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count,
             struct wined3d_device_parent *device_parent, struct wined3d_device **device);
     void (*adapter_destroy_device)(struct wined3d_device *device);
-    BOOL (*adapter_create_context)(struct wined3d_context *context, const struct wined3d_format *ds_format);
+    BOOL (*adapter_create_context)(struct wined3d_context *context);
     void (*adapter_get_wined3d_caps)(const struct wined3d_adapter *adapter, struct wined3d_caps *caps);
     BOOL (*adapter_check_format)(const struct wined3d_adapter *adapter,
             const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format,
@@ -2770,8 +2769,7 @@ static inline const struct wined3d_adapter_gl *wined3d_adapter_gl_const(const st
 
 struct wined3d_adapter *wined3d_adapter_gl_create(unsigned int ordinal,
         unsigned int wined3d_creation_flags) DECLSPEC_HIDDEN;
-BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
-        const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
+BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context) DECLSPEC_HIDDEN;
 
 struct wined3d_adapter_vk
 {
-- 
2.11.0




More information about the wine-devel mailing list