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:
parent
cc82a51a07
commit
fc3919c4ab
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue