radv: handle VK_QUEUE_FAMILY_IGNORED in image transitions (v3)
authorDave Airlie <airlied@redhat.com>
Tue, 31 Jan 2017 05:18:33 +0000 (15:18 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 1 Feb 2017 22:25:04 +0000 (08:25 +1000)
The CTS tests at least are using this, and we were totally
ignoring it.

This hopefully fixes the bouncing multisample CTS tests.

v2: get family mask in ignored case from command buffer.
v3: only change things in one place, use logic from Bas.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_image.c
src/amd/vulkan/radv_meta_clear.c
src/amd/vulkan/radv_private.h

index 97c6b63ce0111d2a965b4192608e1e8db0830476..f281f33dc7363745c0ef11b483db211121156dee 100644 (file)
@@ -38,8 +38,8 @@ static void radv_handle_image_transition(struct radv_cmd_buffer *cmd_buffer,
                                         struct radv_image *image,
                                         VkImageLayout src_layout,
                                         VkImageLayout dst_layout,
-                                        int src_family,
-                                        int dst_family,
+                                        uint32_t src_family,
+                                        uint32_t dst_family,
                                         VkImageSubresourceRange range,
                                         VkImageAspectFlags pending_clears);
 
@@ -2719,8 +2719,8 @@ static void radv_handle_image_transition(struct radv_cmd_buffer *cmd_buffer,
                                         struct radv_image *image,
                                         VkImageLayout src_layout,
                                         VkImageLayout dst_layout,
-                                        int src_family,
-                                        int dst_family,
+                                        uint32_t src_family,
+                                        uint32_t dst_family,
                                         VkImageSubresourceRange range,
                                         VkImageAspectFlags pending_clears)
 {
@@ -2741,8 +2741,8 @@ static void radv_handle_image_transition(struct radv_cmd_buffer *cmd_buffer,
                        return;
        }
 
-       unsigned src_queue_mask = radv_image_queue_family_mask(image, src_family);
-       unsigned dst_queue_mask = radv_image_queue_family_mask(image, dst_family);
+       unsigned src_queue_mask = radv_image_queue_family_mask(image, src_family, cmd_buffer->queue_family_index);
+       unsigned dst_queue_mask = radv_image_queue_family_mask(image, dst_family, cmd_buffer->queue_family_index);
 
        if (image->htile.size)
                radv_handle_depth_image_transition(cmd_buffer, image, src_layout,
index f75f00884956586c36f09a6618a5a4bd0bdd7d27..99d17376cf65e6e5d5b8742147b10cc52fc4c4cf 100644 (file)
@@ -905,10 +905,13 @@ bool radv_layout_can_fast_clear(const struct radv_image *image,
 }
 
 
-unsigned radv_image_queue_family_mask(const struct radv_image *image, int family) {
-       if (image->exclusive)
-               return 1u <<family;
-       return image->queue_family_mask;
+unsigned radv_image_queue_family_mask(const struct radv_image *image, uint32_t family, uint32_t queue_family)
+{
+       if (!image->exclusive)
+               return image->queue_family_mask;
+       if (family == VK_QUEUE_FAMILY_IGNORED)
+               return 1u << queue_family;
+       return 1u << family;
 }
 
 VkResult
index 957b38859390f88375e6560d7c10afb869cde12e..a42e8345716271204c26320fc1b78b7d6777e097 100644 (file)
@@ -844,7 +844,7 @@ emit_fast_color_clear(struct radv_cmd_buffer *cmd_buffer,
        if (!(cmd_buffer->device->debug_flags & RADV_DEBUG_FAST_CLEARS))
                return false;
 
-       if (!radv_layout_can_fast_clear(iview->image, image_layout, radv_image_queue_family_mask(iview->image, cmd_buffer->queue_family_index)))
+       if (!radv_layout_can_fast_clear(iview->image, image_layout, radv_image_queue_family_mask(iview->image, cmd_buffer->queue_family_index, cmd_buffer->queue_family_index)))
                goto fail;
        if (vk_format_get_blocksizebits(iview->image->vk_format) > 64)
                goto fail;
index 57aa9ead9b75e1f7e170a336a8a598bb29f0546c..69ff3578e3411f623fb00ac2c3723674ed18c69c 100644 (file)
@@ -1083,7 +1083,7 @@ bool radv_layout_can_fast_clear(const struct radv_image *image,
                                unsigned queue_mask);
 
 
-unsigned radv_image_queue_family_mask(const struct radv_image *image, int family);
+unsigned radv_image_queue_family_mask(const struct radv_image *image, uint32_t family, uint32_t queue_family);
 
 static inline uint32_t
 radv_get_layerCount(const struct radv_image *image,