mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 04:00:10 +01:00
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:
parent
d07befe4f8
commit
e3cf48e8f5
3 changed files with 19 additions and 11 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue