android: radv: add libmesa_git_sha1 static dependency
[mesa.git] / src / amd / vulkan / radv_meta_copy.c
index 3442b49fb9c5f7e86d5339223826243e0bbc7be0..ddfb5c54673c8cdc08f4ae2d6fcd814b6c2e40c6 100644 (file)
@@ -117,6 +117,7 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
 {
        bool cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE;
        struct radv_meta_saved_state saved_state;
+       bool old_predicating;
 
        /* The Vulkan 1.0 spec says "dstImage must have a sample count equal to
         * VK_SAMPLE_COUNT_1_BIT."
@@ -129,6 +130,12 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
                       RADV_META_SAVE_CONSTANTS |
                       RADV_META_SAVE_DESCRIPTORS);
 
+       /* VK_EXT_conditional_rendering says that copy commands should not be
+        * affected by conditional rendering.
+        */
+       old_predicating = cmd_buffer->state.predicating;
+       cmd_buffer->state.predicating = false;
+
        for (unsigned r = 0; r < regionCount; r++) {
 
                /**
@@ -188,10 +195,14 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
 
 
                        /* Perform Blit */
-                       if (cs)
+                       if (cs ||
+                           (img_bsurf.image->vk_format == VK_FORMAT_R32G32B32_UINT ||
+                            img_bsurf.image->vk_format == VK_FORMAT_R32G32B32_SINT ||
+                            img_bsurf.image->vk_format == VK_FORMAT_R32G32B32_SFLOAT)) {
                                radv_meta_buffer_to_image_cs(cmd_buffer, &buf_bsurf, &img_bsurf, 1, &rect);
-                       else
+                       } else {
                                radv_meta_blit2d(cmd_buffer, NULL, &buf_bsurf, &img_bsurf, 1, &rect);
+                       }
 
                        /* Once we've done the blit, all of the actual information about
                         * the image is embedded in the command buffer so we can just
@@ -208,6 +219,9 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
                }
        }
 
+       /* Restore conditional rendering. */
+       cmd_buffer->state.predicating = old_predicating;
+
        radv_meta_restore(&saved_state, cmd_buffer);
 }
 
@@ -236,12 +250,19 @@ meta_copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer,
                           const VkBufferImageCopy* pRegions)
 {
        struct radv_meta_saved_state saved_state;
+       bool old_predicating;
 
        radv_meta_save(&saved_state, cmd_buffer,
                       RADV_META_SAVE_COMPUTE_PIPELINE |
                       RADV_META_SAVE_CONSTANTS |
                       RADV_META_SAVE_DESCRIPTORS);
 
+       /* VK_EXT_conditional_rendering says that copy commands should not be
+        * affected by conditional rendering.
+        */
+       old_predicating = cmd_buffer->state.predicating;
+       cmd_buffer->state.predicating = false;
+
        for (unsigned r = 0; r < regionCount; r++) {
 
                /**
@@ -313,6 +334,9 @@ meta_copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer,
                }
        }
 
+       /* Restore conditional rendering. */
+       cmd_buffer->state.predicating = old_predicating;
+
        radv_meta_restore(&saved_state, cmd_buffer);
 }
 
@@ -344,6 +368,7 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,
 {
        bool cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE;
        struct radv_meta_saved_state saved_state;
+       bool old_predicating;
 
        /* From the Vulkan 1.0 spec:
         *
@@ -358,6 +383,12 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,
                       RADV_META_SAVE_CONSTANTS |
                       RADV_META_SAVE_DESCRIPTORS);
 
+       /* VK_EXT_conditional_rendering says that copy commands should not be
+        * affected by conditional rendering.
+        */
+       old_predicating = cmd_buffer->state.predicating;
+       cmd_buffer->state.predicating = false;
+
        for (unsigned r = 0; r < regionCount; r++) {
                assert(pRegions[r].srcSubresource.aspectMask ==
                       pRegions[r].dstSubresource.aspectMask);
@@ -451,10 +482,14 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,
                        rect.src_y = src_offset_el.y;
 
                        /* Perform Blit */
-                       if (cs)
+                       if (cs ||
+                           (b_src.format == VK_FORMAT_R32G32B32_UINT ||
+                            b_src.format == VK_FORMAT_R32G32B32_SINT ||
+                            b_src.format == VK_FORMAT_R32G32B32_SFLOAT)) {
                                radv_meta_image_to_image_cs(cmd_buffer, &b_src, &b_dst, 1, &rect);
-                       else
+                       } else {
                                radv_meta_blit2d(cmd_buffer, &b_src, NULL, &b_dst, 1, &rect);
+                       }
 
                        b_src.layer++;
                        b_dst.layer++;
@@ -465,6 +500,9 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer,
                }
        }
 
+       /* Restore conditional rendering. */
+       cmd_buffer->state.predicating = old_predicating;
+
        radv_meta_restore(&saved_state, cmd_buffer);
 }