From f2a5a03d3b6de9ac27783277d415e5d8725cd8fe Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Thu, 23 Mar 2023 08:34:39 -0700 Subject: [PATCH] dzn: Fix SRV barrier state on compute command lists Cc: mesa-stable Part-of: --- src/microsoft/vulkan/dzn_cmd_buffer.c | 8 ++++---- src/microsoft/vulkan/dzn_image.c | 9 ++++++--- src/microsoft/vulkan/dzn_private.h | 3 ++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c index 3ee1c91..dfa0df9 100644 --- a/src/microsoft/vulkan/dzn_cmd_buffer.c +++ b/src/microsoft/vulkan/dzn_cmd_buffer.c @@ -213,12 +213,12 @@ dzn_cmd_buffer_queue_image_range_layout_transition(struct dzn_cmd_buffer *cmdbuf dzn_foreach_aspect(aspect, range->aspectMask) { D3D12_RESOURCE_STATES after = - dzn_image_layout_to_state(image, new_layout, aspect); + dzn_image_layout_to_state(image, new_layout, aspect, cmdbuf->type); D3D12_RESOURCE_STATES before = (old_layout == VK_IMAGE_LAYOUT_UNDEFINED || old_layout == VK_IMAGE_LAYOUT_PREINITIALIZED) ? D3D12_RESOURCE_STATE_COMMON : - dzn_image_layout_to_state(image, old_layout, aspect); + dzn_image_layout_to_state(image, old_layout, aspect, cmdbuf->type); uint32_t layer_count = dzn_get_layer_count(image, range); uint32_t level_count = dzn_get_level_count(image, range); @@ -4402,8 +4402,8 @@ dzn_cmd_buffer_resolve_rendering_attachment(struct dzn_cmd_buffer *cmdbuf, dst_range.layerCount = 1; } - D3D12_RESOURCE_STATES src_state = dzn_image_layout_to_state(src_img, src_layout, aspect); - D3D12_RESOURCE_STATES dst_state = dzn_image_layout_to_state(dst_img, dst_layout, aspect); + D3D12_RESOURCE_STATES src_state = dzn_image_layout_to_state(src_img, src_layout, aspect, cmdbuf->type); + D3D12_RESOURCE_STATES dst_state = dzn_image_layout_to_state(dst_img, dst_layout, aspect, cmdbuf->type); D3D12_BARRIER_LAYOUT src_restore_layout = D3D12_BARRIER_LAYOUT_COMMON, src_needed_layout = D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_GENERIC_READ; D3D12_BARRIER_LAYOUT dst_restore_layout = D3D12_BARRIER_LAYOUT_COMMON, diff --git a/src/microsoft/vulkan/dzn_image.c b/src/microsoft/vulkan/dzn_image.c index dfcbf05..4b4a400 100644 --- a/src/microsoft/vulkan/dzn_image.c +++ b/src/microsoft/vulkan/dzn_image.c @@ -590,11 +590,14 @@ dzn_image_get_rtv_desc(const struct dzn_image *image, D3D12_RESOURCE_STATES dzn_image_layout_to_state(const struct dzn_image *image, VkImageLayout layout, - VkImageAspectFlagBits aspect) + VkImageAspectFlagBits aspect, + D3D12_COMMAND_LIST_TYPE type) { D3D12_RESOURCE_STATES shaders_access = (image->desc.Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE) ? - 0 : D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE; + 0 : (type == D3D12_COMMAND_LIST_TYPE_DIRECT ? + D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE : + D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE); switch (layout) { case VK_IMAGE_LAYOUT_PREINITIALIZED: @@ -633,7 +636,7 @@ dzn_image_layout_to_state(const struct dzn_image *image, D3D12_RESOURCE_STATE_DEPTH_WRITE; case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - return D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE; + return shaders_access; case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT: return D3D12_RESOURCE_STATE_COMMON; diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h index 86ec664..93c4ab7 100644 --- a/src/microsoft/vulkan/dzn_private.h +++ b/src/microsoft/vulkan/dzn_private.h @@ -1075,7 +1075,8 @@ dzn_image_get_rtv_desc(const struct dzn_image *image, D3D12_RESOURCE_STATES dzn_image_layout_to_state(const struct dzn_image *image, VkImageLayout layout, - VkImageAspectFlagBits aspect); + VkImageAspectFlagBits aspect, + D3D12_COMMAND_LIST_TYPE type); D3D12_BARRIER_LAYOUT dzn_vk_layout_to_d3d_layout(VkImageLayout layout, -- 2.7.4