summaryrefslogtreecommitdiff
path: root/src/amd/vulkan
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2021-01-08 11:56:00 +0100
committerMarge Bot <eric+marge@anholt.net>2021-01-12 16:03:36 +0000
commit1f548b7670435f022bc3ebb7ded66e6cfd62b7ad (patch)
tree619bd90c85cfadbac849d77b9daf514ed141eadc /src/amd/vulkan
parent095a428844b7c7378d0b07ac69a69daa80d4d2e5 (diff)
radv: decompress DCC for partial resolves using the compute path
Because DCC is re-initialized to the uncompressed state after the resolve, so if the app does a partial resolve it should be decompressed first. 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/8326>
Diffstat (limited to 'src/amd/vulkan')
-rw-r--r--src/amd/vulkan/radv_meta_resolve_cs.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/amd/vulkan/radv_meta_resolve_cs.c b/src/amd/vulkan/radv_meta_resolve_cs.c
index 85e3d1e8c55..fa2d48a12af 100644
--- a/src/amd/vulkan/radv_meta_resolve_cs.c
+++ b/src/amd/vulkan/radv_meta_resolve_cs.c
@@ -768,6 +768,30 @@ void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer,
radv_decompress_resolve_src(cmd_buffer, src_image, src_image_layout,
region);
+ /* For partial resolves, DCC should be decompressed before resolving
+ * because the metadata is re-initialized to the uncompressed after.
+ */
+ uint32_t queue_mask = radv_image_queue_family_mask(dest_image,
+ cmd_buffer->queue_family_index,
+ cmd_buffer->queue_family_index);
+
+ if (radv_layout_dcc_compressed(cmd_buffer->device, dest_image,
+ dest_image_layout, false, queue_mask) &&
+ (region->dstOffset.x ||
+ region->dstOffset.y ||
+ region->dstOffset.z ||
+ region->extent.width != dest_image->info.width ||
+ region->extent.height != dest_image->info.height ||
+ region->extent.depth != dest_image->info.depth)) {
+ radv_decompress_dcc(cmd_buffer, dest_image, &(VkImageSubresourceRange) {
+ .aspectMask = region->dstSubresource.aspectMask,
+ .baseMipLevel = region->dstSubresource.mipLevel,
+ .levelCount = 1,
+ .baseArrayLayer = region->dstSubresource.baseArrayLayer,
+ .layerCount = region->dstSubresource.layerCount,
+ });
+ }
+
radv_meta_save(&saved_state, cmd_buffer,
RADV_META_SAVE_COMPUTE_PIPELINE |
RADV_META_SAVE_CONSTANTS |