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