[PATCH 6/6] wined3d: Apply buffer barriers only to the relevant range.

Zebediah Figura zfigura at codeweavers.com
Mon Jul 19 22:23:28 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/wined3d/adapter_vk.c      | 20 ++++---------
 dlls/wined3d/buffer.c          |  6 ++--
 dlls/wined3d/context_vk.c      | 55 +++++++++++++++++++++++-----------
 dlls/wined3d/view.c            | 13 ++++----
 dlls/wined3d/wined3d_private.h |  8 +++--
 5 files changed, 58 insertions(+), 44 deletions(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 850e2a6dfdb..7dbe0540e8e 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -1607,7 +1607,6 @@ static void adapter_vk_flush_context(struct wined3d_context *context)
 static void adapter_vk_draw_primitive(struct wined3d_device *device,
         const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters)
 {
-    struct wined3d_buffer_vk *indirect_vk = NULL;
     const struct wined3d_vk_info *vk_info;
     struct wined3d_context_vk *context_vk;
     VkCommandBuffer vk_command_buffer;
@@ -1619,11 +1618,7 @@ static void adapter_vk_draw_primitive(struct wined3d_device *device,
     context_vk = wined3d_context_vk(context_acquire(device, NULL, 0));
     vk_info = context_vk->vk_info;
 
-    if (parameters->indirect)
-        indirect_vk = wined3d_buffer_vk(parameters->u.indirect.buffer);
-
-    if (!(vk_command_buffer = wined3d_context_vk_apply_draw_state(context_vk,
-            state, indirect_vk, parameters->indexed)))
+    if (!(vk_command_buffer = wined3d_context_vk_apply_draw_state(context_vk, state, parameters)))
     {
         ERR("Failed to apply draw state.\n");
         context_release(&context_vk->c);
@@ -1656,11 +1651,12 @@ static void adapter_vk_draw_primitive(struct wined3d_device *device,
 
     if (parameters->indirect)
     {
-        struct wined3d_bo_vk *bo = &indirect_vk->bo;
+        struct wined3d_buffer_vk *buffer_vk = wined3d_buffer_vk(parameters->u.indirect.buffer);
+        struct wined3d_bo_vk *bo = &buffer_vk->bo;
         uint32_t stride, size;
 
         wined3d_context_vk_reference_bo(context_vk, bo);
-        size = indirect_vk->b.resource.size - parameters->u.indirect.offset;
+        size = buffer_vk->b.resource.size - parameters->u.indirect.offset;
 
         if (parameters->indexed)
         {
@@ -1706,7 +1702,6 @@ static void adapter_vk_draw_primitive(struct wined3d_device *device,
 static void adapter_vk_dispatch_compute(struct wined3d_device *device,
         const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters)
 {
-    struct wined3d_buffer_vk *indirect_vk = NULL;
     const struct wined3d_vk_info *vk_info;
     struct wined3d_context_vk *context_vk;
     VkCommandBuffer vk_command_buffer;
@@ -1716,10 +1711,7 @@ static void adapter_vk_dispatch_compute(struct wined3d_device *device,
     context_vk = wined3d_context_vk(context_acquire(device, NULL, 0));
     vk_info = context_vk->vk_info;
 
-    if (parameters->indirect)
-        indirect_vk = wined3d_buffer_vk(parameters->u.indirect.buffer);
-
-    if (!(vk_command_buffer = wined3d_context_vk_apply_compute_state(context_vk, state, indirect_vk)))
+    if (!(vk_command_buffer = wined3d_context_vk_apply_compute_state(context_vk, state, parameters)))
     {
         ERR("Failed to apply compute state.\n");
         context_release(&context_vk->c);
@@ -1728,7 +1720,7 @@ static void adapter_vk_dispatch_compute(struct wined3d_device *device,
 
     if (parameters->indirect)
     {
-        struct wined3d_bo_vk *bo = &indirect_vk->bo;
+        struct wined3d_bo_vk *bo = &wined3d_buffer_vk(parameters->u.indirect.buffer)->bo;
 
         wined3d_context_vk_reference_bo(context_vk, bo);
         VK_CALL(vkCmdDispatchIndirect(vk_command_buffer, bo->vk_buffer,
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 2dbff2310ad..f7510e94ec8 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1574,7 +1574,7 @@ HRESULT wined3d_buffer_vk_init(struct wined3d_buffer_vk *buffer_vk, struct wined
 }
 
 void wined3d_buffer_vk_barrier(struct wined3d_buffer_vk *buffer_vk,
-        struct wined3d_context_vk *context_vk, uint32_t bind_mask)
+        struct wined3d_context_vk *context_vk, uint32_t bind_mask, size_t offset, size_t range)
 {
     TRACE("buffer_vk %p, context_vk %p, bind_mask %s.\n",
             buffer_vk, context_vk, wined3d_debug_bind_flags(bind_mask));
@@ -1596,8 +1596,8 @@ void wined3d_buffer_vk_barrier(struct wined3d_buffer_vk *buffer_vk,
         vk_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
         vk_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
         vk_barrier.buffer = buffer_vk->bo.vk_buffer;
-        vk_barrier.offset = buffer_vk->bo.buffer_offset;
-        vk_barrier.size = buffer_vk->b.resource.size;
+        vk_barrier.offset = buffer_vk->bo.buffer_offset + offset;
+        vk_barrier.size = range;
         VK_CALL(vkCmdPipelineBarrier(wined3d_context_vk_get_command_buffer(context_vk),
                 vk_pipeline_stage_mask_from_bind_flags(buffer_vk->bind_mask),
                 vk_pipeline_stage_mask_from_bind_flags(bind_mask),
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 6af857fac4e..55a97baa033 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -3014,7 +3014,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
                     else
                         context_invalidate_compute_state(&context_vk->c, STATE_COMPUTE_CONSTANT_BUFFER);
                 }
-                wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_CONSTANT_BUFFER);
+                wined3d_buffer_vk_barrier(buffer_vk, context_vk,
+                        WINED3D_BIND_CONSTANT_BUFFER, cb_state->offset, cb_state->size);
                 break;
             }
 
@@ -3025,6 +3026,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
                 srv_vk = wined3d_shader_resource_view_vk(srv);
                 if (srv->resource->type == WINED3D_RTYPE_BUFFER)
                 {
+                    unsigned int offset, size;
+
                     buffer_vk = wined3d_buffer_vk(buffer_from_resource(srv->resource));
 
                     if (!srv_vk->view_vk.bo_user.valid)
@@ -3036,7 +3039,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
                             context_invalidate_compute_state(&context_vk->c, STATE_COMPUTE_SHADER_RESOURCE_BINDING);
                     }
                     wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state);
-                    wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE);
+                    buffer_get_view_range(&buffer_vk->b, &srv->desc, srv->format, &offset, &size);
+                    wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE, offset, size);
                 }
                 else
                 {
@@ -3054,6 +3058,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
                 uav_vk = wined3d_unordered_access_view_vk(uav);
                 if (uav->resource->type == WINED3D_RTYPE_BUFFER)
                 {
+                    unsigned int offset, size;
+
                     buffer_vk = wined3d_buffer_vk(buffer_from_resource(uav->resource));
 
                     if (!uav_vk->view_vk.bo_user.valid)
@@ -3067,7 +3073,8 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
                     }
                     wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state);
                     wined3d_unordered_access_view_invalidate_location(uav, ~WINED3D_LOCATION_BUFFER);
-                    wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS);
+                    buffer_get_view_range(&buffer_vk->b, &uav->desc, uav->format, &offset, &size);
+                    wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS, offset, size);
                 }
                 else
                 {
@@ -3095,7 +3102,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
 }
 
 VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *context_vk,
-        const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk, bool indexed)
+        const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters)
 {
     struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
     const struct wined3d_vk_info *vk_info = context_vk->vk_info;
@@ -3178,12 +3185,15 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
 
     for (i = 0; i < ARRAY_SIZE(state->streams); ++i)
     {
-        if (!(buffer = state->streams[i].buffer))
+        const struct wined3d_stream_state *stream = &state->streams[i];
+
+        if (!(buffer = stream->buffer))
             continue;
 
         buffer_vk = wined3d_buffer_vk(buffer);
         wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state);
-        wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_VERTEX_BUFFER);
+        wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_VERTEX_BUFFER,
+                stream->offset, buffer_vk->b.resource.size - stream->offset);
         if (!buffer_vk->bo_user.valid)
             context_invalidate_state(&context_vk->c, STATE_STREAMSRC);
     }
@@ -3192,12 +3202,15 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
     {
         for (i = 0; i < ARRAY_SIZE(state->stream_output); ++i)
         {
-            if (!(buffer = state->stream_output[i].buffer))
+            const struct wined3d_stream_output *stream = &state->stream_output[i];
+
+            if (!(buffer = stream->buffer))
                 continue;
 
             buffer_vk = wined3d_buffer_vk(buffer);
             wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state);
-            wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_STREAM_OUTPUT);
+            wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_STREAM_OUTPUT,
+                    stream->offset, buffer_vk->b.resource.size - stream->offset);
             wined3d_buffer_invalidate_location(&buffer_vk->b, ~WINED3D_LOCATION_BUFFER);
             if (!buffer_vk->bo_user.valid)
                 context_vk->update_stream_output = 1;
@@ -3205,19 +3218,24 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
         context_vk->c.transform_feedback_active = 1;
     }
 
-    if (indexed || (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_INDEXBUFFER) && state->index_buffer))
+    if (parameters->indexed
+            || (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_INDEXBUFFER) && state->index_buffer))
     {
         buffer_vk = wined3d_buffer_vk(state->index_buffer);
         wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state);
-        wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDEX_BUFFER);
+        wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDEX_BUFFER,
+                state->index_offset, buffer_vk->b.resource.size - state->index_offset);
         if (!buffer_vk->bo_user.valid)
             context_invalidate_state(&context_vk->c, STATE_INDEXBUFFER);
     }
 
-    if (indirect_vk)
+    if (parameters->indirect)
     {
-        wined3d_buffer_load(&indirect_vk->b, &context_vk->c, state);
-        wined3d_buffer_vk_barrier(indirect_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER);
+        struct wined3d_buffer_vk *buffer_vk = wined3d_buffer_vk(parameters->u.indirect.buffer);
+
+        wined3d_buffer_load(&buffer_vk->b, &context_vk->c, state);
+        wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER,
+                parameters->u.indirect.offset, buffer_vk->b.resource.size - parameters->u.indirect.offset);
     }
 
     if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk)))
@@ -3325,7 +3343,7 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
 }
 
 VkCommandBuffer wined3d_context_vk_apply_compute_state(struct wined3d_context_vk *context_vk,
-        const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk)
+        const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters)
 {
     struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device);
     const struct wined3d_vk_info *vk_info = context_vk->vk_info;
@@ -3351,10 +3369,13 @@ VkCommandBuffer wined3d_context_vk_apply_compute_state(struct wined3d_context_vk
 
     wined3d_context_vk_load_shader_resources(context_vk, state, WINED3D_PIPELINE_COMPUTE);
 
-    if (indirect_vk)
+    if (parameters->indirect)
     {
-        wined3d_buffer_load_location(&indirect_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
-        wined3d_buffer_vk_barrier(indirect_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER);
+        struct wined3d_buffer_vk *buffer_vk = wined3d_buffer_vk(parameters->u.indirect.buffer);
+
+        wined3d_buffer_load_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
+        wined3d_buffer_vk_barrier(buffer_vk, context_vk, WINED3D_BIND_INDIRECT_BUFFER,
+                parameters->u.indirect.offset, buffer_vk->b.resource.size - parameters->u.indirect.offset);
     }
 
     if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk)))
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 0adb0a115dc..1ca0340d8d7 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -285,9 +285,8 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
     context_invalidate_state(&context_gl->c, STATE_GRAPHICS_SHADER_RESOURCE_BINDING);
 }
 
-static void get_buffer_view_range(const struct wined3d_buffer *buffer,
-        const struct wined3d_view_desc *desc, const struct wined3d_format *view_format,
-        unsigned int *offset, unsigned int *size)
+void buffer_get_view_range(const struct wined3d_buffer *buffer, const struct wined3d_view_desc *desc,
+        const struct wined3d_format *view_format, unsigned int *offset, unsigned int *size)
 {
     if (desc->format_id == WINED3DFMT_UNKNOWN)
     {
@@ -307,7 +306,7 @@ static void create_buffer_view(struct wined3d_gl_view *view, struct wined3d_cont
 {
     unsigned int offset, size;
 
-    get_buffer_view_range(buffer, desc, view_format, &offset, &size);
+    buffer_get_view_range(buffer, desc, view_format, &offset, &size);
     create_buffer_texture(view, wined3d_context_gl(context),
             wined3d_buffer_gl(buffer), wined3d_format_gl(view_format), offset, size);
 }
@@ -664,7 +663,7 @@ static VkBufferView wined3d_view_vk_create_vk_buffer_view(struct wined3d_context
     unsigned int offset, size;
     VkResult vr;
 
-    get_buffer_view_range(&buffer_vk->b, desc, &view_format_vk->f, &offset, &size);
+    buffer_get_view_range(&buffer_vk->b, desc, &view_format_vk->f, &offset, &size);
     wined3d_buffer_prepare_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
 
     create_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
@@ -1569,7 +1568,7 @@ void wined3d_unordered_access_view_gl_clear(struct wined3d_unordered_access_view
     wined3d_buffer_load_location(&buffer_gl->b, &context_gl->c, WINED3D_LOCATION_BUFFER);
     wined3d_unordered_access_view_invalidate_location(&view_gl->v, ~WINED3D_LOCATION_BUFFER);
 
-    get_buffer_view_range(&buffer_gl->b, &view_gl->v.desc, &format_gl->f, &offset, &size);
+    buffer_get_view_range(&buffer_gl->b, &view_gl->v.desc, &format_gl->f, &offset, &size);
     wined3d_context_gl_bind_bo(context_gl, buffer_gl->bo.binding, buffer_gl->bo.id);
     GL_EXTCALL(glClearBufferSubData(buffer_gl->bo.binding, format_gl->internal,
             offset, size, format_gl->format, format_gl->type, clear_value));
@@ -1740,7 +1739,7 @@ void wined3d_unordered_access_view_vk_clear(struct wined3d_unordered_access_view
     wined3d_buffer_load_location(&buffer_vk->b, &context_vk->c, WINED3D_LOCATION_BUFFER);
     wined3d_buffer_invalidate_location(&buffer_vk->b, ~WINED3D_LOCATION_BUFFER);
 
-    get_buffer_view_range(&buffer_vk->b, &view_vk->v.desc, format, &offset, &size);
+    buffer_get_view_range(&buffer_vk->b, &view_vk->v.desc, format, &offset, &size);
 
     if (!(vk_command_buffer = wined3d_context_vk_get_command_buffer(context_vk)))
         return;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 7783a68bd7e..abfd4031692 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2610,9 +2610,9 @@ bool wined3d_context_vk_allocate_query(struct wined3d_context_vk *context_vk,
 VkDeviceMemory wined3d_context_vk_allocate_vram_chunk_memory(struct wined3d_context_vk *context_vk,
         unsigned int pool, size_t size) DECLSPEC_HIDDEN;
 VkCommandBuffer wined3d_context_vk_apply_compute_state(struct wined3d_context_vk *context_vk,
-        const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk) DECLSPEC_HIDDEN;
+        const struct wined3d_state *state, const struct wined3d_dispatch_parameters *parameters) DECLSPEC_HIDDEN;
 VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *context_vk,
-        const struct wined3d_state *state, struct wined3d_buffer_vk *indirect_vk, bool indexed) DECLSPEC_HIDDEN;
+        const struct wined3d_state *state, const struct wined3d_draw_parameters *parameters) DECLSPEC_HIDDEN;
 void wined3d_context_vk_cleanup(struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN;
 BOOL wined3d_context_vk_create_bo(struct wined3d_context_vk *context_vk, VkDeviceSize size,
         VkBufferUsageFlags usage, VkMemoryPropertyFlags memory_type, struct wined3d_bo_vk *bo) DECLSPEC_HIDDEN;
@@ -4921,6 +4921,8 @@ static inline struct wined3d_buffer *buffer_from_resource(struct wined3d_resourc
     return CONTAINING_RECORD(resource, struct wined3d_buffer, resource);
 }
 
+void buffer_get_view_range(const struct wined3d_buffer *buffer, const struct wined3d_view_desc *desc,
+        const struct wined3d_format *view_format, unsigned int *offset, unsigned int *size) DECLSPEC_HIDDEN;
 void wined3d_buffer_cleanup(struct wined3d_buffer *buffer) DECLSPEC_HIDDEN;
 void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_offset,
         struct wined3d_buffer *src_buffer, unsigned int src_offset, unsigned int size) DECLSPEC_HIDDEN;
@@ -4980,7 +4982,7 @@ static inline struct wined3d_buffer_vk *wined3d_buffer_vk(struct wined3d_buffer
 }
 
 void wined3d_buffer_vk_barrier(struct wined3d_buffer_vk *buffer_vk,
-        struct wined3d_context_vk *context_vk, uint32_t bind_mask) DECLSPEC_HIDDEN;
+        struct wined3d_context_vk *context_vk, uint32_t bind_mask, size_t offset, size_t range) DECLSPEC_HIDDEN;
 void wined3d_buffer_vk_get_buffer_info(struct wined3d_buffer_vk *buffer_vk,
         VkDescriptorBufferInfo *buffer_info) DECLSPEC_HIDDEN;
 HRESULT wined3d_buffer_vk_init(struct wined3d_buffer_vk *buffer_vk, struct wined3d_device *device,
-- 
2.32.0




More information about the wine-devel mailing list