Mesa (main): venus: support VK_KHR_copy_commands2

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 24 23:29:08 UTC 2022


Module: Mesa
Branch: main
Commit: 627ba5c91b80bab8653dc5c6cc64206ebd8d7c44
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=627ba5c91b80bab8653dc5c6cc64206ebd8d7c44

Author: Ryan Neph <ryanneph at google.com>
Date:   Thu Jun 23 10:56:28 2022 -0700

venus: support VK_KHR_copy_commands2

Signed-off-by: Ryan Neph <ryanneph at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17226>

---

 src/virtio/vulkan/vn_command_buffer.c  | 114 ++++++++++++++++++++++++++-------
 src/virtio/vulkan/vn_physical_device.c |   1 +
 2 files changed, 93 insertions(+), 22 deletions(-)

diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c
index 804e435ba9f..432e75876ea 100644
--- a/src/virtio/vulkan/vn_command_buffer.c
+++ b/src/virtio/vulkan/vn_command_buffer.c
@@ -986,6 +986,13 @@ vn_CmdCopyBuffer(VkCommandBuffer commandBuffer,
                   regionCount, pRegions);
 }
 
+void
+vn_CmdCopyBuffer2(VkCommandBuffer commandBuffer,
+                  const VkCopyBufferInfo2 *pCopyBufferInfo)
+{
+   VN_CMD_ENQUEUE(vkCmdCopyBuffer2, commandBuffer, pCopyBufferInfo);
+}
+
 void
 vn_CmdCopyImage(VkCommandBuffer commandBuffer,
                 VkImage srcImage,
@@ -999,6 +1006,13 @@ vn_CmdCopyImage(VkCommandBuffer commandBuffer,
                   dstImage, dstImageLayout, regionCount, pRegions);
 }
 
+void
+vn_CmdCopyImage2(VkCommandBuffer commandBuffer,
+                 const VkCopyImageInfo2 *pCopyImageInfo)
+{
+   VN_CMD_ENQUEUE(vkCmdCopyImage2, commandBuffer, pCopyImageInfo);
+}
+
 void
 vn_CmdBlitImage(VkCommandBuffer commandBuffer,
                 VkImage srcImage,
@@ -1013,6 +1027,13 @@ vn_CmdBlitImage(VkCommandBuffer commandBuffer,
                   dstImage, dstImageLayout, regionCount, pRegions, filter);
 }
 
+void
+vn_CmdBlitImage2(VkCommandBuffer commandBuffer,
+                 const VkBlitImageInfo2 *pBlitImageInfo)
+{
+   VN_CMD_ENQUEUE(vkCmdBlitImage2, commandBuffer, pBlitImageInfo);
+}
+
 void
 vn_CmdCopyBufferToImage(VkCommandBuffer commandBuffer,
                         VkBuffer srcBuffer,
@@ -1025,6 +1046,46 @@ vn_CmdCopyBufferToImage(VkCommandBuffer commandBuffer,
                   dstImageLayout, regionCount, pRegions);
 }
 
+void
+vn_CmdCopyBufferToImage2(
+   VkCommandBuffer commandBuffer,
+   const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo)
+{
+   VN_CMD_ENQUEUE(vkCmdCopyBufferToImage2, commandBuffer,
+                  pCopyBufferToImageInfo);
+}
+
+static bool
+vn_needs_prime_blit(VkImage src_image, VkImageLayout src_image_layout)
+{
+   if (src_image_layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&
+       VN_PRESENT_SRC_INTERNAL_LAYOUT != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
+
+      /* sanity check */
+      ASSERTED const struct vn_image *img = vn_image_from_handle(src_image);
+      assert(img->wsi.is_wsi && img->wsi.is_prime_blit_src);
+      return true;
+   }
+
+   return false;
+}
+
+static void
+vn_transition_prime_layout(struct vn_command_buffer *cmd, VkBuffer dst_buffer)
+{
+   const VkBufferMemoryBarrier buf_barrier = {
+      .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+      .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
+      .srcQueueFamilyIndex = cmd->queue_family_index,
+      .dstQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT,
+      .buffer = dst_buffer,
+      .size = VK_WHOLE_SIZE,
+   };
+   vn_cmd_encode_memory_barriers(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 1,
+                                 &buf_barrier, 0, NULL);
+}
+
 void
 vn_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer,
                         VkImage srcImage,
@@ -1036,33 +1097,35 @@ vn_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer,
    struct vn_command_buffer *cmd =
       vn_command_buffer_from_handle(commandBuffer);
 
-   bool prime_blit = false;
-   if (srcImageLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR &&
-       VN_PRESENT_SRC_INTERNAL_LAYOUT != VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
+   bool prime_blit = vn_needs_prime_blit(srcImage, srcImageLayout);
+   if (prime_blit)
       srcImageLayout = VN_PRESENT_SRC_INTERNAL_LAYOUT;
 
-      /* sanity check */
-      const struct vn_image *img = vn_image_from_handle(srcImage);
-      prime_blit = img->wsi.is_wsi && img->wsi.is_prime_blit_src;
-      assert(prime_blit);
-   }
-
    VN_CMD_ENQUEUE(vkCmdCopyImageToBuffer, commandBuffer, srcImage,
                   srcImageLayout, dstBuffer, regionCount, pRegions);
 
-   if (prime_blit) {
-      const VkBufferMemoryBarrier buf_barrier = {
-         .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
-         .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
-         .srcQueueFamilyIndex = cmd->queue_family_index,
-         .dstQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT,
-         .buffer = dstBuffer,
-         .size = VK_WHOLE_SIZE,
-      };
-      vn_cmd_encode_memory_barriers(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT,
-                                    VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 1,
-                                    &buf_barrier, 0, NULL);
-   }
+   if (prime_blit)
+      vn_transition_prime_layout(cmd, dstBuffer);
+}
+
+void
+vn_CmdCopyImageToBuffer2(
+   VkCommandBuffer commandBuffer,
+   const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo)
+{
+   struct vn_command_buffer *cmd =
+      vn_command_buffer_from_handle(commandBuffer);
+   struct VkCopyImageToBufferInfo2 copy_info = *pCopyImageToBufferInfo;
+
+   bool prime_blit =
+      vn_needs_prime_blit(copy_info.srcImage, copy_info.srcImageLayout);
+   if (prime_blit)
+      copy_info.srcImageLayout = VN_PRESENT_SRC_INTERNAL_LAYOUT;
+
+   VN_CMD_ENQUEUE(vkCmdCopyImageToBuffer2, commandBuffer, &copy_info);
+
+   if (prime_blit)
+      vn_transition_prime_layout(cmd, copy_info.dstBuffer);
 }
 
 void
@@ -1135,6 +1198,13 @@ vn_CmdResolveImage(VkCommandBuffer commandBuffer,
                   dstImage, dstImageLayout, regionCount, pRegions);
 }
 
+void
+vn_CmdResolveImage2(VkCommandBuffer commandBuffer,
+                    const VkResolveImageInfo2 *pResolveImageInfo)
+{
+   VN_CMD_ENQUEUE(vkCmdResolveImage2, commandBuffer, pResolveImageInfo);
+}
+
 void
 vn_CmdSetEvent(VkCommandBuffer commandBuffer,
                VkEvent event,
diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c
index d96f5f7f929..ac79e4b9da1 100644
--- a/src/virtio/vulkan/vn_physical_device.c
+++ b/src/virtio/vulkan/vn_physical_device.c
@@ -984,6 +984,7 @@ vn_physical_device_get_passthrough_extensions(
       .EXT_extended_dynamic_state2 = false,
       .EXT_image_robustness = true,
       .EXT_shader_demote_to_helper_invocation = true,
+      .KHR_copy_commands2 = true,
 
       /* EXT */
       .EXT_calibrated_timestamps = true,



More information about the mesa-commit mailing list