Mesa (master): radv: Add retiling for foreign queues.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 8 22:39:08 UTC 2021


Module: Mesa
Branch: master
Commit: 6ff88a823bb4f6adedc4bace66add9ed1e5fe3a4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6ff88a823bb4f6adedc4bace66add9ed1e5fe3a4

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Tue Mar  9 03:41:36 2021 +0100

radv: Add retiling for foreign queues.

This way modifier images that don't go through the present layout
get the retile executed properly.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9998>

---

 src/amd/vulkan/radv_cmd_buffer.c | 22 +++++++++++++++-------
 src/amd/vulkan/radv_image.c      |  3 ++-
 src/amd/vulkan/radv_private.h    |  3 +++
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 1f98414bae1..f1751cbfc17 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -6390,6 +6390,17 @@ static void radv_init_color_image_metadata(struct radv_cmd_buffer *cmd_buffer,
 	cmd_buffer->state.flush_bits |= flush_bits;
 }
 
+static void radv_retile_transition(struct radv_cmd_buffer *cmd_buffer,
+				   struct radv_image *image,
+				   VkImageLayout src_layout,
+				   VkImageLayout dst_layout,
+				   unsigned dst_queue_mask)
+{
+	if (src_layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&
+	    (dst_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR ||
+	     (dst_queue_mask & (1u << RADV_QUEUE_FOREIGN))))
+		radv_retile_dcc(cmd_buffer, image);
+}
 /**
  * Handle color image transitions for DCC/FMASK/CMASK.
  */
@@ -6417,9 +6428,8 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe
 					       src_queue_mask, dst_queue_mask,
 					       range);
 
-		if (dst_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&
-		    image->retile_map)
-			radv_retile_dcc(cmd_buffer, image);
+		if (image->retile_map)
+			radv_retile_transition(cmd_buffer, image, src_layout, dst_layout, dst_queue_mask);
 		return;
 	}
 
@@ -6439,10 +6449,8 @@ static void radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffe
 			fast_clear_flushed = true;
 		}
 
-		if (src_layout != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&
-		    dst_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&
-		    image->retile_map)
-			radv_retile_dcc(cmd_buffer, image);
+		if (image->retile_map)
+			radv_retile_transition(cmd_buffer, image, src_layout, dst_layout, dst_queue_mask);
 	} else if (radv_image_has_cmask(image) || radv_image_has_fmask(image)) {
 		if (radv_layout_can_fast_clear(cmd_buffer->device, image, src_layout,
 		                               src_render_loop, src_queue_mask) &&
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 917713af50d..6335e502840 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -2166,7 +2166,8 @@ unsigned radv_image_queue_family_mask(const struct radv_image *image, uint32_t f
 		return image->queue_family_mask;
 	if (family == VK_QUEUE_FAMILY_EXTERNAL ||
 	    family == VK_QUEUE_FAMILY_FOREIGN_EXT)
-		return (1u << RADV_MAX_QUEUE_FAMILIES) - 1u;
+		return ((1u << RADV_MAX_QUEUE_FAMILIES) - 1u) |
+		        (1u << RADV_QUEUE_FOREIGN);
 	if (family == VK_QUEUE_FAMILY_IGNORED)
 		return 1u << queue_family;
 	return 1u << family;
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 6c80e66b38c..643037f9285 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -662,6 +662,9 @@ struct radv_meta_state {
 #define RADV_QUEUE_COMPUTE 1
 #define RADV_QUEUE_TRANSFER 2
 
+/* Not a real queue family */
+#define RADV_QUEUE_FOREIGN 3
+
 #define RADV_MAX_QUEUE_FAMILIES 3
 
 #define RADV_NUM_HW_CTX (RADEON_CTX_PRIORITY_REALTIME + 1)



More information about the mesa-commit mailing list