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, ©_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