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:
parent
8b81098519
commit
627ba5c91b
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue