[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