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@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17250>
This commit is contained in:
Boris Brezillon 2022-06-27 10:20:27 +02:00
parent d07befe4f8
commit e3cf48e8f5
3 changed files with 19 additions and 11 deletions

View file

@ -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,

View file

@ -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:

View file

@ -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,