Mesa (main): dzn: Allow shaders to read from depth/stencil attachments

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 29 20:05:20 UTC 2022


Module: Mesa
Branch: main
Commit: e3cf48e8f596096263cd97f52e61ebc8aebbee78
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e3cf48e8f596096263cd97f52e61ebc8aebbee78

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Mon Jun 27 10:20:27 2022 +0200

dzn: Allow shaders to read from depth/stencil attachments

D3D12_RESOURCE_STATE_DEPTH_READ only provides access for fixed-function
depth/stencil test. If we want the shaders to be able to read the
depth/stencil attachment, we need to combine
D3D12_RESOURCE_STATE_DEPTH_READ and
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE.

Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17250>

---

 src/microsoft/vulkan/dzn_cmd_buffer.c | 12 ++++++------
 src/microsoft/vulkan/dzn_image.c      | 14 ++++++++++----
 src/microsoft/vulkan/dzn_private.h    |  4 +++-
 3 files changed, 19 insertions(+), 11 deletions(-)

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,



More information about the mesa-commit mailing list