venus: support VK_KHR_copy_commands2

Signed-off-by: Ryan Neph <ryanneph@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17226>
This commit is contained in:
Ryan Neph 2022-06-23 10:56:28 -07:00 committed by Marge Bot
parent 8b81098519
commit 627ba5c91b
2 changed files with 93 additions and 22 deletions

View File

@ -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,

View File

@ -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,