[PATCH 5/6] wined3d: Apply texture barriers only to the view range.

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


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
I don't know if this (or the next patch) offers a measurable performance
benefit, but it seems like probably a good idea...

 dlls/wined3d/context_vk.c      |  4 ++--
 dlls/wined3d/texture.c         | 10 +++++-----
 dlls/wined3d/wined3d_private.h |  6 +++---
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 856adc4ad1a..6af857fac4e 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -3043,7 +3043,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
                     struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(srv->resource));
 
                     wined3d_texture_load(&texture_vk->t, &context_vk->c, FALSE);
-                    wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE);
+                    wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_SHADER_RESOURCE, &srv->desc);
                 }
                 break;
 
@@ -3075,7 +3075,7 @@ static void wined3d_context_vk_load_shader_resources(struct wined3d_context_vk *
 
                     wined3d_texture_load(&texture_vk->t, &context_vk->c, FALSE);
                     wined3d_unordered_access_view_invalidate_location(uav, ~WINED3D_LOCATION_TEXTURE_RGB);
-                    wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS);
+                    wined3d_texture_vk_barrier(texture_vk, context_vk, WINED3D_BIND_UNORDERED_ACCESS, &uav->desc);
                 }
                 break;
 
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index c1247fbc56b..3a467c4aa06 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -5242,7 +5242,7 @@ HRESULT wined3d_texture_vk_init(struct wined3d_texture_vk *texture_vk, struct wi
 }
 
 void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk,
-        struct wined3d_context_vk *context_vk, uint32_t bind_mask)
+        struct wined3d_context_vk *context_vk, uint32_t bind_mask, const struct wined3d_view_desc *view_desc)
 {
     VkImageSubresourceRange vk_range;
 
@@ -5255,10 +5255,10 @@ void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk,
                 wined3d_debug_bind_flags(texture_vk->bind_mask), wined3d_debug_bind_flags(bind_mask));
 
         vk_range.aspectMask = vk_aspect_mask_from_format(texture_vk->t.resource.format);
-        vk_range.baseMipLevel = 0;
-        vk_range.levelCount = VK_REMAINING_MIP_LEVELS;
-        vk_range.baseArrayLayer = 0;
-        vk_range.layerCount = VK_REMAINING_ARRAY_LAYERS;
+        vk_range.baseMipLevel = view_desc->u.texture.level_idx;
+        vk_range.levelCount = view_desc->u.texture.level_count;
+        vk_range.baseArrayLayer = view_desc->u.texture.layer_idx;
+        vk_range.layerCount = view_desc->u.texture.layer_count;
 
         wined3d_context_vk_image_barrier(context_vk, wined3d_context_vk_get_command_buffer(context_vk),
                 vk_pipeline_stage_mask_from_bind_flags(texture_vk->bind_mask),
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 98cb1c9e2f7..7783a68bd7e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4488,8 +4488,8 @@ static inline struct wined3d_texture_vk *wined3d_texture_vk(struct wined3d_textu
     return CONTAINING_RECORD(texture, struct wined3d_texture_vk, t);
 }
 
-void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk,
-        struct wined3d_context_vk *context_vk, uint32_t bind_mask) DECLSPEC_HIDDEN;
+void wined3d_texture_vk_barrier(struct wined3d_texture_vk *texture_vk, struct wined3d_context_vk *context_vk,
+        uint32_t bind_mask, const struct wined3d_view_desc *view_desc) DECLSPEC_HIDDEN;
 const VkDescriptorImageInfo *wined3d_texture_vk_get_default_image_info(struct wined3d_texture_vk *texture_vk,
         struct wined3d_context_vk *context_vk) DECLSPEC_HIDDEN;
 HRESULT wined3d_texture_vk_init(struct wined3d_texture_vk *texture_vk, struct wined3d_device *device,
@@ -5057,7 +5057,7 @@ static inline void wined3d_rendertarget_view_vk_barrier(struct wined3d_rendertar
 {
     struct wined3d_texture_vk *texture_vk = wined3d_texture_vk(texture_from_resource(rtv_vk->v.resource));
 
-    wined3d_texture_vk_barrier(texture_vk, context_vk, bind_mask);
+    wined3d_texture_vk_barrier(texture_vk, context_vk, bind_mask, &rtv_vk->v.desc);
 }
 
 static inline VkImageView wined3d_rendertarget_view_vk_get_image_view(struct wined3d_rendertarget_view_vk *rtv_vk,
-- 
2.32.0




More information about the wine-devel mailing list