diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c index eba423e49e0..13c449f9892 100644 --- a/src/microsoft/vulkan/dzn_cmd_buffer.c +++ b/src/microsoft/vulkan/dzn_cmd_buffer.c @@ -210,12 +210,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(new_layout, aspect); + dzn_image_layout_to_state(image, new_layout, aspect); D3D12_RESOURCE_STATES before = (old_layout == VK_IMAGE_LAYOUT_UNDEFINED || old_layout == VK_IMAGE_LAYOUT_PREINITIALIZED) ? image->mem->initial_state : - dzn_image_layout_to_state(old_layout, aspect); + dzn_image_layout_to_state(image, old_layout, aspect); uint32_t layer_count = dzn_get_layer_count(image, range); uint32_t level_count = dzn_get_level_count(image, range); @@ -1181,7 +1181,7 @@ dzn_cmd_buffer_clear_rects_with_copy(struct dzn_cmd_buffer *cmdbuf, }; D3D12_RESOURCE_STATES dst_state = - dzn_image_layout_to_state(layout, VK_IMAGE_ASPECT_COLOR_BIT); + dzn_image_layout_to_state(image, layout, VK_IMAGE_ASPECT_COLOR_BIT); dzn_cmd_buffer_queue_transition_barriers(cmdbuf, src_res, 0, 1, D3D12_RESOURCE_STATE_GENERIC_READ, @@ -1319,7 +1319,7 @@ dzn_cmd_buffer_clear_ranges_with_copy(struct dzn_cmd_buffer *cmdbuf, }; D3D12_RESOURCE_STATES dst_state = - dzn_image_layout_to_state(layout, VK_IMAGE_ASPECT_COLOR_BIT); + dzn_image_layout_to_state(image, layout, VK_IMAGE_ASPECT_COLOR_BIT); dzn_cmd_buffer_queue_transition_barriers(cmdbuf, src_res, 0, 1, D3D12_RESOURCE_STATE_GENERIC_READ, @@ -3437,9 +3437,9 @@ dzn_cmd_buffer_resolve_rendering_attachment(struct dzn_cmd_buffer *cmdbuf, VkImageLayout src_layout = att->layout; VkImageLayout dst_layout = att->resolve.layout; struct dzn_image *src_img = container_of(src->vk.image, struct dzn_image, vk); - D3D12_RESOURCE_STATES src_state = dzn_image_layout_to_state(src_layout, aspect); + D3D12_RESOURCE_STATES src_state = dzn_image_layout_to_state(src_img, src_layout, aspect); struct dzn_image *dst_img = container_of(dst->vk.image, struct dzn_image, vk); - D3D12_RESOURCE_STATES dst_state = dzn_image_layout_to_state(src_layout, aspect); + D3D12_RESOURCE_STATES dst_state = dzn_image_layout_to_state(dst_img, dst_layout, aspect); VkImageSubresourceRange src_range = { .aspectMask = (VkImageAspectFlags)aspect, diff --git a/src/microsoft/vulkan/dzn_image.c b/src/microsoft/vulkan/dzn_image.c index f98e3153d02..7d8daddb129 100644 --- a/src/microsoft/vulkan/dzn_image.c +++ b/src/microsoft/vulkan/dzn_image.c @@ -515,8 +515,14 @@ dzn_image_get_rtv_desc(const struct dzn_image *image, } D3D12_RESOURCE_STATES -dzn_image_layout_to_state(VkImageLayout layout, VkImageAspectFlagBits aspect) +dzn_image_layout_to_state(const struct dzn_image *image, + VkImageLayout layout, + VkImageAspectFlagBits aspect) { + D3D12_RESOURCE_STATES shaders_access = + (image->desc.Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE) ? + 0 : D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE; + switch (layout) { case VK_IMAGE_LAYOUT_PREINITIALIZED: case VK_IMAGE_LAYOUT_UNDEFINED: @@ -542,16 +548,16 @@ dzn_image_layout_to_state(VkImageLayout layout, VkImageAspectFlagBits aspect) case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL: - return D3D12_RESOURCE_STATE_DEPTH_READ; + return D3D12_RESOURCE_STATE_DEPTH_READ | shaders_access; case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL: return aspect == VK_IMAGE_ASPECT_STENCIL_BIT ? D3D12_RESOURCE_STATE_DEPTH_WRITE : - D3D12_RESOURCE_STATE_DEPTH_READ; + (D3D12_RESOURCE_STATE_DEPTH_READ | shaders_access); case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL: return aspect == VK_IMAGE_ASPECT_STENCIL_BIT ? - D3D12_RESOURCE_STATE_DEPTH_READ : + (D3D12_RESOURCE_STATE_DEPTH_READ | shaders_access) : D3D12_RESOURCE_STATE_DEPTH_WRITE; case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h index c717ae0673f..af8841e02b3 100644 --- a/src/microsoft/vulkan/dzn_private.h +++ b/src/microsoft/vulkan/dzn_private.h @@ -904,7 +904,9 @@ dzn_image_get_rtv_desc(const struct dzn_image *image, uint32_t level); D3D12_RESOURCE_STATES -dzn_image_layout_to_state(VkImageLayout layout, VkImageAspectFlagBits aspect); +dzn_image_layout_to_state(const struct dzn_image *image, + VkImageLayout layout, + VkImageAspectFlagBits aspect); uint32_t dzn_image_layers_get_subresource_index(const struct dzn_image *image,