Mesa (main): radv: add support for copying compressed depth/stencil images on compute
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Sep 20 15:41:16 UTC 2021
Module: Mesa
Branch: main
Commit: 2b805b8a6ca5f129bead094c99ebd9a28e4dc05e
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2b805b8a6ca5f129bead094c99ebd9a28e4dc05e
Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date: Wed Aug 18 17:22:07 2021 +0200
radv: add support for copying compressed depth/stencil images on compute
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12452>
---
src/amd/vulkan/radv_meta_copy.c | 51 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/src/amd/vulkan/radv_meta_copy.c b/src/amd/vulkan/radv_meta_copy.c
index a50818d1ddb..22aa69bca1a 100644
--- a/src/amd/vulkan/radv_meta_copy.c
+++ b/src/amd/vulkan/radv_meta_copy.c
@@ -405,6 +405,33 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image,
old_predicating = cmd_buffer->state.predicating;
cmd_buffer->state.predicating = false;
+ if (cs) {
+ /* For partial copies, HTILE should be decompressed before copying because the metadata is
+ * re-initialized to the uncompressed state after.
+ */
+ uint32_t queue_mask = radv_image_queue_family_mask(dst_image, cmd_buffer->queue_family_index,
+ cmd_buffer->queue_family_index);
+
+ if (radv_layout_is_htile_compressed(cmd_buffer->device, dst_image, dst_image_layout,
+ false, queue_mask) &&
+ (region->dstOffset.x || region->dstOffset.y || region->dstOffset.z ||
+ region->extent.width != dst_image->info.width ||
+ region->extent.height != dst_image->info.height ||
+ region->extent.depth != dst_image->info.depth)) {
+ u_foreach_bit(i, region->dstSubresource.aspectMask) {
+ unsigned aspect_mask = 1u << i;
+ radv_expand_depth_stencil(cmd_buffer, dst_image,
+ &(VkImageSubresourceRange){
+ .aspectMask = aspect_mask,
+ .baseMipLevel = region->dstSubresource.mipLevel,
+ .levelCount = 1,
+ .baseArrayLayer = region->dstSubresource.baseArrayLayer,
+ .layerCount = region->dstSubresource.layerCount,
+ }, NULL);
+ }
+ }
+ }
+
VkImageAspectFlags src_aspects[3] = {VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT,
VK_IMAGE_ASPECT_PLANE_2_BIT};
VkImageAspectFlags dst_aspects[3] = {VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT,
@@ -520,6 +547,30 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image,
}
}
+ if (cs) {
+ /* Fixup HTILE after a copy on compute. */
+ uint32_t queue_mask = radv_image_queue_family_mask(dst_image, cmd_buffer->queue_family_index,
+ cmd_buffer->queue_family_index);
+
+ if (radv_layout_is_htile_compressed(cmd_buffer->device, dst_image, dst_image_layout,
+ false, queue_mask)) {
+
+ cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH | RADV_CMD_FLAG_INV_VCACHE;
+
+ VkImageSubresourceRange range = {
+ .aspectMask = region->dstSubresource.aspectMask,
+ .baseMipLevel = region->dstSubresource.mipLevel,
+ .levelCount = 1,
+ .baseArrayLayer = region->dstSubresource.baseArrayLayer,
+ .layerCount = region->dstSubresource.layerCount,
+ };
+
+ uint32_t htile_value = radv_get_htile_initial_value(cmd_buffer->device, dst_image);
+
+ cmd_buffer->state.flush_bits |= radv_clear_htile(cmd_buffer, dst_image, &range, htile_value);
+ }
+ }
+
/* Restore conditional rendering. */
cmd_buffer->state.predicating = old_predicating;
More information about the mesa-commit
mailing list