Rebase against 5bccf6fc3f309207ef4162df335157649f627f50.

This commit is contained in:
Zebediah Figura
2021-03-05 21:21:19 -06:00
parent 3a33c70a9a
commit cb2a6e06e1
6 changed files with 89 additions and 125 deletions

View File

@@ -1,19 +1,19 @@
From 6ba32e009912c40b81c83f30c0589876280bad6d Mon Sep 17 00:00:00 2001
From a994b3627570ca44e30cbf238412159347ebb010 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 20 Feb 2017 00:27:25 +0100
Subject: [PATCH] wined3d: Improve wined3d_cs_emit_update_sub_resource.
---
dlls/wined3d/cs.c | 75 ++++++++++++++++++++++++++++++++++
dlls/wined3d/cs.c | 78 ++++++++++++++++++++++++++++++++++
dlls/wined3d/device.c | 2 -
dlls/wined3d/wined3d_private.h | 1 +
3 files changed, 76 insertions(+), 2 deletions(-)
3 files changed, 79 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 1417c07b..7da87ba8 100644
index 5176c635cf5..efacf42eb12 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -409,6 +409,7 @@ struct wined3d_cs_update_sub_resource
@@ -420,6 +420,7 @@ struct wined3d_cs_update_sub_resource
unsigned int sub_resource_idx;
struct wined3d_box box;
struct wined3d_sub_resource_data data;
@@ -21,7 +21,7 @@ index 1417c07b..7da87ba8 100644
};
struct wined3d_cs_add_dirty_texture_region
@@ -2375,6 +2376,51 @@ void wined3d_cs_emit_update_sub_resource(struct wined3d_cs *cs, struct wined3d_r
@@ -2481,6 +2482,51 @@ void wined3d_cs_emit_update_sub_resource(struct wined3d_cs *cs, struct wined3d_r
unsigned int slice_pitch)
{
struct wined3d_cs_update_sub_resource *op;
@@ -50,10 +50,10 @@ index 1417c07b..7da87ba8 100644
+ }
+
+ size = FIELD_OFFSET(struct wined3d_cs_update_sub_resource, copy_data[data_size]);
+ if (!cs->ops->check_space(cs, size, WINED3D_CS_QUEUE_DEFAULT))
+ if (!cs->c.ops->check_space(&cs->c, size, WINED3D_CS_QUEUE_DEFAULT))
+ goto no_async;
+
+ op = cs->ops->require_space(cs, size, WINED3D_CS_QUEUE_DEFAULT);
+ op = cs->c.ops->require_space(&cs->c, size, WINED3D_CS_QUEUE_DEFAULT);
+ op->opcode = WINED3D_CS_OP_UPDATE_SUB_RESOURCE;
+ op->resource = resource;
+ op->sub_resource_idx = sub_resource_idx;
@@ -65,43 +65,36 @@ index 1417c07b..7da87ba8 100644
+
+ wined3d_resource_acquire(resource);
+
+ cs->ops->submit(cs, WINED3D_CS_QUEUE_DEFAULT);
+ cs->c.ops->submit(&cs->c, WINED3D_CS_QUEUE_DEFAULT);
+ return;
+
+no_async:
+ wined3d_resource_wait_idle(resource);
op = wined3d_cs_require_space(cs, sizeof(*op), WINED3D_CS_QUEUE_MAP);
op = wined3d_device_context_require_space(&cs->c, sizeof(*op), WINED3D_CS_QUEUE_MAP);
op->opcode = WINED3D_CS_OP_UPDATE_SUB_RESOURCE;
@@ -2388,6 +2434,7 @@ void wined3d_cs_emit_update_sub_resource(struct wined3d_cs *cs, struct wined3d_r
wined3d_resource_acquire(resource);
wined3d_cs_submit(cs, WINED3D_CS_QUEUE_MAP);
+
/* The data pointer may go away, so we need to wait until it is read.
* Copying the data may be faster if it's small. */
wined3d_cs_finish(cs, WINED3D_CS_QUEUE_MAP);
@@ -2572,6 +2619,11 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void
@@ -2677,6 +2723,12 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void
/* WINED3D_CS_OP_GENERATE_MIPMAPS */ wined3d_cs_exec_generate_mipmaps,
};
+static BOOL wined3d_cs_st_check_space(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id)
+static BOOL wined3d_cs_st_check_space(struct wined3d_device_context *context,
+ size_t size, enum wined3d_cs_queue_id queue_id)
+{
+ return TRUE;
+}
+
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)
{
if (size > (cs->data_size - cs->end))
@@ -2625,6 +2677,7 @@ static void wined3d_cs_st_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id
@@ -2734,6 +2786,7 @@ static void wined3d_cs_st_finish(struct wined3d_device_context *context, enum wi
static const struct wined3d_cs_ops wined3d_cs_st_ops =
static const struct wined3d_device_context_ops wined3d_cs_st_ops =
{
+ wined3d_cs_st_check_space,
wined3d_cs_st_require_space,
wined3d_cs_st_submit,
wined3d_cs_st_finish,
@@ -2658,6 +2711,19 @@ static void wined3d_cs_mt_submit(struct wined3d_cs *cs, enum wined3d_cs_queue_id
@@ -2769,6 +2822,19 @@ static void wined3d_cs_mt_submit(struct wined3d_device_context *context, enum wi
wined3d_cs_queue_submit(&cs->queue[queue_id], cs);
}
@@ -121,34 +114,37 @@ index 1417c07b..7da87ba8 100644
static void *wined3d_cs_queue_require_space(struct wined3d_cs_queue *queue, size_t size, struct wined3d_cs *cs)
{
size_t queue_size = ARRAY_SIZE(queue->data);
@@ -2719,6 +2785,14 @@ static void *wined3d_cs_queue_require_space(struct wined3d_cs_queue *queue, size
@@ -2831,6 +2897,17 @@ static void *wined3d_cs_queue_require_space(struct wined3d_cs_queue *queue, size
return packet->data;
}
+static BOOL wined3d_cs_mt_check_space(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id)
+static BOOL wined3d_cs_mt_check_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_check_space(cs, size, queue_id);
+ return wined3d_cs_st_check_space(context, size, queue_id);
+
+ return wined3d_cs_queue_check_space(&cs->queue[queue_id], size);
+}
+
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)
{
if (cs->thread_id == GetCurrentThreadId())
@@ -2738,6 +2812,7 @@ static void wined3d_cs_mt_finish(struct wined3d_cs *cs, enum wined3d_cs_queue_id
@@ -2855,6 +2932,7 @@ static void wined3d_cs_mt_finish(struct wined3d_device_context *context, enum wi
static const struct wined3d_cs_ops wined3d_cs_mt_ops =
static const struct wined3d_device_context_ops wined3d_cs_mt_ops =
{
+ wined3d_cs_mt_check_space,
wined3d_cs_mt_require_space,
wined3d_cs_mt_submit,
wined3d_cs_mt_finish,
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index f51f4c87..7427fe48 100644
index 06329293261..356f549e5c6 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4342,8 +4342,6 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
@@ -4972,8 +4972,6 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
return;
}
@@ -158,17 +154,17 @@ index f51f4c87..7427fe48 100644
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 886f20b7..dbdb16a6 100644
index ee00530981c..6881fe8e4cd 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3639,6 +3639,7 @@ struct wined3d_cs_queue
@@ -4671,6 +4671,7 @@ struct wined3d_cs_queue
struct wined3d_cs_ops
struct wined3d_device_context_ops
{
+ BOOL (*check_space)(struct wined3d_cs *cs, size_t size, enum wined3d_cs_queue_id queue_id);
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);
+ BOOL (*check_space)(struct wined3d_device_context *context, 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_device_context *context, enum wined3d_cs_queue_id queue_id);
void (*finish)(struct wined3d_device_context *context, enum wined3d_cs_queue_id queue_id);
--
2.19.1
2.20.1