summaryrefslogtreecommitdiff
path: root/src/amd/vulkan/radv_cmd_buffer.c
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2021-03-26 13:41:03 +0100
committerMarge Bot <eric+marge@anholt.net>2021-04-07 15:35:07 +0000
commitf280367a277246a36117cc862e486a9114d12fc4 (patch)
tree6ea952335cc94905d3e58ece57b704d38256b0c7 /src/amd/vulkan/radv_cmd_buffer.c
parent835c5b7ebf382ea246ed3437332ac8217c7bf897 (diff)
radv: perform MSAA color decompression for storage images with DCC
For MSAA storage images with DCC, we also need to perform a MSAA color decompression. Fixes dEQP-VK.pipeline.multisample.storage_image.* if DCC stores is enabled. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9854>
Diffstat (limited to 'src/amd/vulkan/radv_cmd_buffer.c')
-rw-r--r--src/amd/vulkan/radv_cmd_buffer.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index ae51d0e2dcf..f590be50411 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -6389,6 +6389,8 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe
unsigned dst_queue_mask,
const VkImageSubresourceRange *range)
{
+ bool dcc_decompressed = false, fast_clear_flushed = false;
+
if (!radv_image_has_cmask(image) &&
!radv_image_has_fmask(image) &&
!radv_dcc_enabled(image, range->baseMipLevel))
@@ -6414,11 +6416,13 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe
} else if (radv_layout_dcc_compressed(cmd_buffer->device, image, src_layout, src_render_loop, src_queue_mask) &&
!radv_layout_dcc_compressed(cmd_buffer->device, image, dst_layout, dst_render_loop, dst_queue_mask)) {
radv_decompress_dcc(cmd_buffer, image, range);
+ dcc_decompressed = true;
} else if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout,
src_render_loop, src_queue_mask) &&
!radv_layout_can_fast_clear(cmd_buffer->device, image, dst_layout,
dst_render_loop, dst_queue_mask)) {
radv_fast_clear_flush_image_inplace(cmd_buffer, image, range);
+ fast_clear_flushed = true;
}
if (src_layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&
@@ -6426,39 +6430,44 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe
image->retile_map)
radv_retile_dcc(cmd_buffer, image);
} else if (radv_image_has_cmask(image) || radv_image_has_fmask(image)) {
- bool fce_eliminate = false, fmask_expand = false;
-
if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout,
src_render_loop, src_queue_mask) &&
!radv_layout_can_fast_clear(cmd_buffer->device, image, dst_layout,
dst_render_loop, dst_queue_mask)) {
- fce_eliminate = true;
- }
-
- if (radv_image_has_fmask(image) &&
- (image->usage & (VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_TRANSFER_DST_BIT)) &&
- radv_layout_fmask_compressed(cmd_buffer->device, image,
- src_layout, src_queue_mask) &&
- !radv_layout_fmask_compressed(cmd_buffer->device, image,
- dst_layout, dst_queue_mask)) {
- fmask_expand = true;
+ radv_fast_clear_flush_image_inplace(cmd_buffer, image, range);
+ fast_clear_flushed = true;
}
+ }
- if (fce_eliminate || fmask_expand) {
+ /* MSAA color decompress. */
+ if (radv_image_has_fmask(image) &&
+ (image->usage & (VK_IMAGE_USAGE_STORAGE_BIT |
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT)) &&
+ radv_layout_fmask_compressed(cmd_buffer->device, image,
+ src_layout, src_queue_mask) &&
+ !radv_layout_fmask_compressed(cmd_buffer->device, image,
+ dst_layout, dst_queue_mask)) {
+ if (radv_dcc_enabled(image, range->baseMipLevel) &&
+ !radv_image_use_dcc_image_stores(cmd_buffer->device, image) &&
+ !dcc_decompressed) {
+ /* A DCC decompress is required before expanding FMASK
+ * when DCC stores aren't supported to avoid being in
+ * a state where DCC is compressed and the main
+ * surface is uncompressed.
+ */
+ radv_decompress_dcc(cmd_buffer, image, range);
+ } else if (!fast_clear_flushed) {
/* A FMASK decompress is required before expanding
* FMASK.
*/
radv_fast_clear_flush_image_inplace(cmd_buffer, image, range);
}
- if (fmask_expand) {
- struct radv_barrier_data barrier = {0};
- barrier.layout_transitions.fmask_color_expand = 1;
- radv_describe_layout_transition(cmd_buffer, &barrier);
+ struct radv_barrier_data barrier = {0};
+ barrier.layout_transitions.fmask_color_expand = 1;
+ radv_describe_layout_transition(cmd_buffer, &barrier);
- radv_expand_fmask_image_inplace(cmd_buffer, image, range);
- }
+ radv_expand_fmask_image_inplace(cmd_buffer, image, range);
}
}