wined3d: Separate the "ops" member of struct wined3d_cs to a new wined3d_device_context structure.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-03-04 21:29:44 -06:00 committed by Alexandre Julliard
parent cc82a51a07
commit fc3919c4ab
4 changed files with 53 additions and 28 deletions

View File

@ -4807,7 +4807,7 @@ static void wined3d_view_gl_destroy(struct wined3d_device *device,
wined3d_cs_destroy_object(device->cs, wined3d_view_gl_destroy_object, ctx); wined3d_cs_destroy_object(device->cs, wined3d_view_gl_destroy_object, ctx);
if (ctx == &c) if (ctx == &c)
device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); device->cs->c.ops->finish(&device->cs->c, WINED3D_CS_QUEUE_DEFAULT);
} }
static void adapter_gl_destroy_rendertarget_view(struct wined3d_rendertarget_view *view) static void adapter_gl_destroy_rendertarget_view(struct wined3d_rendertarget_view *view)

View File

@ -1394,7 +1394,7 @@ static void wined3d_view_vk_destroy(struct wined3d_device *device, VkBufferView
wined3d_cs_destroy_object(device->cs, wined3d_view_vk_destroy_object, ctx); wined3d_cs_destroy_object(device->cs, wined3d_view_vk_destroy_object, ctx);
if (ctx == &c) if (ctx == &c)
device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); device->cs->c.ops->finish(&device->cs->c, WINED3D_CS_QUEUE_DEFAULT);
} }
static void adapter_vk_destroy_rendertarget_view(struct wined3d_rendertarget_view *view) static void adapter_vk_destroy_rendertarget_view(struct wined3d_rendertarget_view *view)

View File

@ -458,12 +458,12 @@ struct wined3d_cs_stop
static inline void *wined3d_cs_require_space(struct wined3d_cs *cs, static inline void *wined3d_cs_require_space(struct wined3d_cs *cs,
size_t size, enum wined3d_cs_queue_id queue_id) size_t size, enum wined3d_cs_queue_id queue_id)
{ {
return cs->ops->require_space(cs, size, queue_id); return cs->c.ops->require_space(&cs->c, size, queue_id);
} }
static inline void wined3d_cs_submit(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id) static inline void wined3d_cs_submit(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id)
{ {
cs->ops->submit(cs, queue_id); cs->c.ops->submit(&cs->c, queue_id);
} }
static const char *debug_cs_op(enum wined3d_cs_op op) static const char *debug_cs_op(enum wined3d_cs_op op)
@ -2023,9 +2023,15 @@ wined3d_cs_push_constant_info[] =
{FIELD_OFFSET(struct wined3d_state, ps_consts_b), sizeof(BOOL), WINED3D_SHADER_CONST_PS_B}, {FIELD_OFFSET(struct wined3d_state, ps_consts_b), sizeof(BOOL), WINED3D_SHADER_CONST_PS_B},
}; };
static void wined3d_cs_st_push_constants(struct wined3d_cs *cs, enum wined3d_push_constants p, static struct wined3d_cs *wined3d_cs_from_context(struct wined3d_device_context *context)
{
return CONTAINING_RECORD(context, struct wined3d_cs, c);
}
static void wined3d_cs_st_push_constants(struct wined3d_device_context *context, enum wined3d_push_constants p,
unsigned int start_idx, unsigned int count, const void *constants) unsigned int start_idx, unsigned int count, const void *constants)
{ {
struct wined3d_cs *cs = wined3d_cs_from_context(context);
struct wined3d_device *device = cs->device; struct wined3d_device *device = cs->device;
unsigned int context_count; unsigned int context_count;
unsigned int i; unsigned int i;
@ -2048,12 +2054,13 @@ static void wined3d_cs_exec_push_constants(struct wined3d_cs *cs, const void *da
{ {
const struct wined3d_cs_push_constants *op = data; const struct wined3d_cs_push_constants *op = data;
wined3d_cs_st_push_constants(cs, op->type, op->start_idx, op->count, op->constants); wined3d_cs_st_push_constants(&cs->c, op->type, op->start_idx, op->count, op->constants);
} }
static void wined3d_cs_mt_push_constants(struct wined3d_cs *cs, enum wined3d_push_constants p, static void wined3d_cs_mt_push_constants(struct wined3d_device_context *context, enum wined3d_push_constants p,
unsigned int start_idx, unsigned int count, const void *constants) unsigned int start_idx, unsigned int count, const void *constants)
{ {
struct wined3d_cs *cs = wined3d_cs_from_context(context);
struct wined3d_cs_push_constants *op; struct wined3d_cs_push_constants *op;
size_t size; size_t size;
@ -2669,8 +2676,11 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void
/* WINED3D_CS_OP_GENERATE_MIPMAPS */ wined3d_cs_exec_generate_mipmaps, /* WINED3D_CS_OP_GENERATE_MIPMAPS */ wined3d_cs_exec_generate_mipmaps,
}; };
static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id) static void *wined3d_cs_st_require_space(struct wined3d_device_context *context,
size_t size, enum wined3d_cs_queue_id queue_id)
{ {
struct wined3d_cs *cs = wined3d_cs_from_context(context);
if (size > (cs->data_size - cs->end)) if (size > (cs->data_size - cs->end))
{ {
size_t new_size; size_t new_size;
@ -2694,8 +2704,9 @@ static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size, enu
return (BYTE *)cs->data + cs->start; return (BYTE *)cs->data + cs->start;
} }
static void wined3d_cs_st_submit(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id) static void wined3d_cs_st_submit(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id)
{ {
struct wined3d_cs *cs = wined3d_cs_from_context(context);
enum wined3d_cs_op opcode; enum wined3d_cs_op opcode;
size_t start; size_t start;
BYTE *data; BYTE *data;
@ -2716,11 +2727,11 @@ static void wined3d_cs_st_submit(struct wined3d_cs *cs, enum wined3d_cs_queue_id
heap_free(data); heap_free(data);
} }
static void wined3d_cs_st_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id) static void wined3d_cs_st_finish(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id)
{ {
} }
static const struct wined3d_cs_ops wined3d_cs_st_ops = static const struct wined3d_device_context_ops wined3d_cs_st_ops =
{ {
wined3d_cs_st_require_space, wined3d_cs_st_require_space,
wined3d_cs_st_submit, wined3d_cs_st_submit,
@ -2747,10 +2758,12 @@ static void wined3d_cs_queue_submit(struct wined3d_cs_queue *queue, struct wined
SetEvent(cs->event); SetEvent(cs->event);
} }
static void wined3d_cs_mt_submit(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id) static void wined3d_cs_mt_submit(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id)
{ {
struct wined3d_cs *cs = wined3d_cs_from_context(context);
if (cs->thread_id == GetCurrentThreadId()) if (cs->thread_id == GetCurrentThreadId())
return wined3d_cs_st_submit(cs, queue_id); return wined3d_cs_st_submit(context, queue_id);
wined3d_cs_queue_submit(&cs->queue[queue_id], cs); wined3d_cs_queue_submit(&cs->queue[queue_id], cs);
} }
@ -2817,24 +2830,29 @@ static void *wined3d_cs_queue_require_space(struct wined3d_cs_queue *queue, size
return packet->data; return packet->data;
} }
static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id) static void *wined3d_cs_mt_require_space(struct wined3d_device_context *context,
size_t size, enum wined3d_cs_queue_id queue_id)
{ {
struct wined3d_cs *cs = wined3d_cs_from_context(context);
if (cs->thread_id == GetCurrentThreadId()) if (cs->thread_id == GetCurrentThreadId())
return wined3d_cs_st_require_space(cs, size, queue_id); return wined3d_cs_st_require_space(context, size, queue_id);
return wined3d_cs_queue_require_space(&cs->queue[queue_id], size, cs); return wined3d_cs_queue_require_space(&cs->queue[queue_id], size, cs);
} }
static void wined3d_cs_mt_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id) static void wined3d_cs_mt_finish(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id)
{ {
struct wined3d_cs *cs = wined3d_cs_from_context(context);
if (cs->thread_id == GetCurrentThreadId()) if (cs->thread_id == GetCurrentThreadId())
return wined3d_cs_st_finish(cs, queue_id); return wined3d_cs_st_finish(context, queue_id);
while (cs->queue[queue_id].head != *(volatile LONG *)&cs->queue[queue_id].tail) while (cs->queue[queue_id].head != *(volatile LONG *)&cs->queue[queue_id].tail)
YieldProcessor(); YieldProcessor();
} }
static const struct wined3d_cs_ops wined3d_cs_mt_ops = static const struct wined3d_device_context_ops wined3d_cs_mt_ops =
{ {
wined3d_cs_mt_require_space, wined3d_cs_mt_require_space,
wined3d_cs_mt_submit, wined3d_cs_mt_submit,
@ -2969,7 +2987,7 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device)
if (!(cs = heap_alloc_zero(sizeof(*cs)))) if (!(cs = heap_alloc_zero(sizeof(*cs))))
return NULL; return NULL;
cs->ops = &wined3d_cs_st_ops; cs->c.ops = &wined3d_cs_st_ops;
cs->device = device; cs->device = device;
cs->serialize_commands = TRACE_ON(d3d_sync) || wined3d_settings.cs_multithreaded & WINED3D_CSMT_SERIALIZE; cs->serialize_commands = TRACE_ON(d3d_sync) || wined3d_settings.cs_multithreaded & WINED3D_CSMT_SERIALIZE;
@ -2982,7 +3000,7 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device)
if (wined3d_settings.cs_multithreaded & WINED3D_CSMT_ENABLE if (wined3d_settings.cs_multithreaded & WINED3D_CSMT_ENABLE
&& !RtlIsCriticalSectionLockedByThread(NtCurrentTeb()->Peb->LoaderLock)) && !RtlIsCriticalSectionLockedByThread(NtCurrentTeb()->Peb->LoaderLock))
{ {
cs->ops = &wined3d_cs_mt_ops; cs->c.ops = &wined3d_cs_mt_ops;
if (!(cs->event = CreateEventW(NULL, FALSE, FALSE, NULL))) if (!(cs->event = CreateEventW(NULL, FALSE, FALSE, NULL)))
{ {

View File

@ -89,6 +89,7 @@ struct wined3d_adapter;
struct wined3d_buffer_vk; struct wined3d_buffer_vk;
struct wined3d_context; struct wined3d_context;
struct wined3d_context_vk; struct wined3d_context_vk;
struct wined3d_device_context;
struct wined3d_gl_info; struct wined3d_gl_info;
struct wined3d_state; struct wined3d_state;
struct wined3d_swapchain_gl; struct wined3d_swapchain_gl;
@ -4671,18 +4672,24 @@ struct wined3d_cs_queue
BYTE data[WINED3D_CS_QUEUE_SIZE]; BYTE data[WINED3D_CS_QUEUE_SIZE];
}; };
struct wined3d_cs_ops struct wined3d_device_context_ops
{ {
void *(*require_space)(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id); void *(*require_space)(struct wined3d_device_context *context, size_t size, enum wined3d_cs_queue_id queue_id);
void (*submit)(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id); void (*submit)(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id);
void (*finish)(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id); void (*finish)(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id);
void (*push_constants)(struct wined3d_cs *cs, enum wined3d_push_constants p, void (*push_constants)(struct wined3d_device_context *context, enum wined3d_push_constants p,
unsigned int start_idx, unsigned int count, const void *constants); unsigned int start_idx, unsigned int count, const void *constants);
}; };
struct wined3d_device_context
{
const struct wined3d_device_context_ops *ops;
};
struct wined3d_cs struct wined3d_cs
{ {
const struct wined3d_cs_ops *ops; struct wined3d_device_context c;
struct wined3d_device *device; struct wined3d_device *device;
struct wined3d_state state; struct wined3d_state state;
HMODULE wined3d_module; HMODULE wined3d_module;
@ -4800,13 +4807,13 @@ HRESULT wined3d_cs_unmap(struct wined3d_cs *cs, struct wined3d_resource *resourc
static inline void wined3d_cs_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id) static inline void wined3d_cs_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id)
{ {
cs->ops->finish(cs, queue_id); cs->c.ops->finish(&cs->c, queue_id);
} }
static inline void wined3d_cs_push_constants(struct wined3d_cs *cs, enum wined3d_push_constants p, static inline void wined3d_cs_push_constants(struct wined3d_cs *cs, enum wined3d_push_constants p,
unsigned int start_idx, unsigned int count, const void *constants) unsigned int start_idx, unsigned int count, const void *constants)
{ {
cs->ops->push_constants(cs, p, start_idx, count, constants); cs->c.ops->push_constants(&cs->c, p, start_idx, count, constants);
} }
static inline void wined3d_resource_wait_idle(struct wined3d_resource *resource) static inline void wined3d_resource_wait_idle(struct wined3d_resource *resource)