wined3d: Determine the ORM_BACKBUFFER depth/stencil format in wined3d_adapter_gl_create_context().

Instead of in wined3d_swapchain_cs_init().

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Henri Verbeet 2019-05-07 15:00:09 +04:30 committed by Alexandre Julliard
parent 4499251461
commit 1859ca857f
5 changed files with 68 additions and 64 deletions

View File

@ -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;
}

View File

@ -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);
/* 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;
}
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);
}
}
/* 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);
/* 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)
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);

View File

@ -2258,8 +2258,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;
}

View File

@ -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;

View File

@ -2197,8 +2197,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,
@ -2713,7 +2712,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,
@ -2772,8 +2771,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
{