[PATCH 1/7] wined3d: Separate the "ops" member of struct wined3d_cs to a new wined3d_device_context structure.
Zebediah Figura
z.figura12 at gmail.com
Thu Mar 4 21:29:44 CST 2021
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
Apologies for the large series of large patches...
dlls/wined3d/adapter_gl.c | 2 +-
dlls/wined3d/adapter_vk.c | 2 +-
dlls/wined3d/cs.c | 54 ++++++++++++++++++++++------------
dlls/wined3d/wined3d_private.h | 23 ++++++++++-----
4 files changed, 53 insertions(+), 28 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index e12a1ff13b7..59a925717e9 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -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);
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)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 8c79cc05058..8ba912eaee6 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -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);
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)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 4ee3d97b7fc..12a0230b361 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -458,12 +458,12 @@ struct wined3d_cs_stop
static inline void *wined3d_cs_require_space(struct wined3d_cs *cs,
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)
{
- 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)
@@ -2023,9 +2023,15 @@ wined3d_cs_push_constant_info[] =
{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)
{
+ struct wined3d_cs *cs = wined3d_cs_from_context(context);
struct wined3d_device *device = cs->device;
unsigned int context_count;
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;
- 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)
{
+ struct wined3d_cs *cs = wined3d_cs_from_context(context);
struct wined3d_cs_push_constants *op;
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,
};
-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))
{
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;
}
-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;
size_t start;
BYTE *data;
@@ -2716,11 +2727,11 @@ static void wined3d_cs_st_submit(struct wined3d_cs *cs, enum wined3d_cs_queue_id
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_submit,
@@ -2747,10 +2758,12 @@ static void wined3d_cs_queue_submit(struct wined3d_cs_queue *queue, struct wined
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())
- 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);
}
@@ -2817,24 +2830,29 @@ static void *wined3d_cs_queue_require_space(struct wined3d_cs_queue *queue, size
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())
- 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);
}
-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())
- 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)
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_submit,
@@ -2969,7 +2987,7 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device)
if (!(cs = heap_alloc_zero(sizeof(*cs))))
return NULL;
- cs->ops = &wined3d_cs_st_ops;
+ cs->c.ops = &wined3d_cs_st_ops;
cs->device = device;
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
&& !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)))
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 56d3ef8fea2..3c77c295027 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -89,6 +89,7 @@ struct wined3d_adapter;
struct wined3d_buffer_vk;
struct wined3d_context;
struct wined3d_context_vk;
+struct wined3d_device_context;
struct wined3d_gl_info;
struct wined3d_state;
struct wined3d_swapchain_gl;
@@ -4671,18 +4672,24 @@ struct wined3d_cs_queue
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 (*submit)(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id);
- void (*finish)(struct wined3d_cs *cs, enum wined3d_cs_queue_id queue_id);
- void (*push_constants)(struct wined3d_cs *cs, enum wined3d_push_constants p,
+ void *(*require_space)(struct wined3d_device_context *context, size_t size, 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_device_context *context, enum wined3d_cs_queue_id queue_id);
+ void (*push_constants)(struct wined3d_device_context *context, enum wined3d_push_constants p,
unsigned int start_idx, unsigned int count, const void *constants);
};
+struct wined3d_device_context
+{
+ const struct wined3d_device_context_ops *ops;
+};
+
struct wined3d_cs
{
- const struct wined3d_cs_ops *ops;
+ struct wined3d_device_context c;
+
struct wined3d_device *device;
struct wined3d_state state;
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)
{
- 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,
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)
--
2.20.1
More information about the wine-devel
mailing list