lavapipe: support VK_KHR_copy_commands2

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9693>
This commit is contained in:
Mike Blumenkrantz
2021-03-18 14:13:21 -04:00
parent f7597e7d4f
commit 1ab309377e
4 changed files with 69 additions and 80 deletions
+1 -1
View File
@@ -475,7 +475,7 @@ Vulkan 1.2 -- all DONE: anv
Khronos extensions that are not part of any Vulkan version:
VK_KHR_android_surface not started
VK_KHR_copy_commands2 DONE (anv, radv)
VK_KHR_copy_commands2 DONE (anv, lvp, radv)
VK_KHR_display DONE (anv, lvp, radv, tu, v3dv)
VK_KHR_display_swapchain not started
VK_KHR_external_fence_fd DONE (anv, radv, tu)
+1
View File
@@ -6,3 +6,4 @@ GL_EXT_depth_bounds_test on softpipe, zink
GL_EXT_texture_filter_minmax on nvc0 (gm200+)
GL_ARB_texture_filter_minmax on nvc0 (gm200+)
GL_ARB_post_depth_coverage on zink
VK_KHR_copy_commands2 on lavapipe
+66 -79
View File
@@ -944,20 +944,30 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdWaitEvents(VkCommandBuffer commandBuffer,
cmd_buf_queue(cmd_buffer, cmd);
}
/* copy a 2KHR struct to the base struct */
static inline void
copy_2_struct_to_base(void *base, const void *struct2, size_t struct_size)
{
size_t offset = align(sizeof(VkStructureType) + sizeof(void*), 8);
memcpy(base, ((uint8_t*)struct2) + offset, struct_size);
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBufferToImage(
/* copy an array of 2KHR structs to an array of base structs */
#define COPY_STRUCT2_ARRAY(count, base, struct2, struct_type) \
do { \
for (unsigned _i = 0; _i < (count); _i++) \
copy_2_struct_to_base(&base[_i], &struct2[_i], sizeof(struct_type)); \
} while (0)
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBufferToImage2KHR(
VkCommandBuffer commandBuffer,
VkBuffer srcBuffer,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkBufferImageCopy* pRegions)
const VkCopyBufferToImageInfo2KHR *info)
{
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
LVP_FROM_HANDLE(lvp_buffer, src_buffer, srcBuffer);
LVP_FROM_HANDLE(lvp_image, dst_image, destImage);
LVP_FROM_HANDLE(lvp_buffer, src_buffer, info->srcBuffer);
LVP_FROM_HANDLE(lvp_image, dst_image, info->dstImage);
struct lvp_cmd_buffer_entry *cmd;
uint32_t cmd_size = regionCount * sizeof(VkBufferImageCopy);
uint32_t cmd_size = info->regionCount * sizeof(VkBufferImageCopy);
cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_BUFFER_TO_IMAGE);
if (!cmd)
@@ -965,33 +975,29 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBufferToImage(
cmd->u.buffer_to_img.src = src_buffer;
cmd->u.buffer_to_img.dst = dst_image;
cmd->u.buffer_to_img.dst_layout = destImageLayout;
cmd->u.buffer_to_img.region_count = regionCount;
cmd->u.buffer_to_img.dst_layout = info->dstImageLayout;
cmd->u.buffer_to_img.region_count = info->regionCount;
{
VkBufferImageCopy *regions;
regions = (VkBufferImageCopy *)(cmd + 1);
memcpy(regions, pRegions, regionCount * sizeof(VkBufferImageCopy));
COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkBufferImageCopy);
cmd->u.buffer_to_img.regions = regions;
}
cmd_buf_queue(cmd_buffer, cmd);
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImageToBuffer(
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImageToBuffer2KHR(
VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkBuffer destBuffer,
uint32_t regionCount,
const VkBufferImageCopy* pRegions)
const VkCopyImageToBufferInfo2KHR *info)
{
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
LVP_FROM_HANDLE(lvp_image, src_image, srcImage);
LVP_FROM_HANDLE(lvp_buffer, dst_buffer, destBuffer);
LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);
LVP_FROM_HANDLE(lvp_buffer, dst_buffer, info->dstBuffer);
struct lvp_cmd_buffer_entry *cmd;
uint32_t cmd_size = regionCount * sizeof(VkBufferImageCopy);
uint32_t cmd_size = info->regionCount * sizeof(VkBufferImageCopy);
cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_IMAGE_TO_BUFFER);
if (!cmd)
@@ -999,34 +1005,29 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImageToBuffer(
cmd->u.img_to_buffer.src = src_image;
cmd->u.img_to_buffer.dst = dst_buffer;
cmd->u.img_to_buffer.src_layout = srcImageLayout;
cmd->u.img_to_buffer.region_count = regionCount;
cmd->u.img_to_buffer.src_layout = info->srcImageLayout;
cmd->u.img_to_buffer.region_count = info->regionCount;
{
VkBufferImageCopy *regions;
regions = (VkBufferImageCopy *)(cmd + 1);
memcpy(regions, pRegions, regionCount * sizeof(VkBufferImageCopy));
COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkBufferImageCopy);
cmd->u.img_to_buffer.regions = regions;
}
cmd_buf_queue(cmd_buffer, cmd);
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImage(
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImage2KHR(
VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageCopy* pRegions)
const VkCopyImageInfo2KHR *info)
{
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
LVP_FROM_HANDLE(lvp_image, src_image, srcImage);
LVP_FROM_HANDLE(lvp_image, dest_image, destImage);
LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);
LVP_FROM_HANDLE(lvp_image, dest_image, info->dstImage);
struct lvp_cmd_buffer_entry *cmd;
uint32_t cmd_size = regionCount * sizeof(VkImageCopy);
uint32_t cmd_size = info->regionCount * sizeof(VkImageCopy);
cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_IMAGE);
if (!cmd)
@@ -1034,15 +1035,15 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImage(
cmd->u.copy_image.src = src_image;
cmd->u.copy_image.dst = dest_image;
cmd->u.copy_image.src_layout = srcImageLayout;
cmd->u.copy_image.dst_layout = destImageLayout;
cmd->u.copy_image.region_count = regionCount;
cmd->u.copy_image.src_layout = info->srcImageLayout;
cmd->u.copy_image.dst_layout = info->dstImageLayout;
cmd->u.copy_image.region_count = info->regionCount;
{
VkImageCopy *regions;
regions = (VkImageCopy *)(cmd + 1);
memcpy(regions, pRegions, regionCount * sizeof(VkImageCopy));
COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkImageCopy);
cmd->u.copy_image.regions = regions;
}
@@ -1050,18 +1051,15 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyImage(
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBuffer(
VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBuffer2KHR(
VkCommandBuffer commandBuffer,
VkBuffer srcBuffer,
VkBuffer destBuffer,
uint32_t regionCount,
const VkBufferCopy* pRegions)
const VkCopyBufferInfo2KHR *info)
{
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
LVP_FROM_HANDLE(lvp_buffer, src_buffer, srcBuffer);
LVP_FROM_HANDLE(lvp_buffer, dest_buffer, destBuffer);
LVP_FROM_HANDLE(lvp_buffer, src_buffer, info->srcBuffer);
LVP_FROM_HANDLE(lvp_buffer, dest_buffer, info->dstBuffer);
struct lvp_cmd_buffer_entry *cmd;
uint32_t cmd_size = regionCount * sizeof(VkBufferCopy);
uint32_t cmd_size = info->regionCount * sizeof(VkBufferCopy);
cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_COPY_BUFFER);
if (!cmd)
@@ -1069,34 +1067,29 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdCopyBuffer(
cmd->u.copy_buffer.src = src_buffer;
cmd->u.copy_buffer.dst = dest_buffer;
cmd->u.copy_buffer.region_count = regionCount;
cmd->u.copy_buffer.region_count = info->regionCount;
{
VkBufferCopy *regions;
regions = (VkBufferCopy *)(cmd + 1);
memcpy(regions, pRegions, regionCount * sizeof(VkBufferCopy));
COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkBufferCopy);
cmd->u.copy_buffer.regions = regions;
}
cmd_buf_queue(cmd_buffer, cmd);
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdBlitImage(
VKAPI_ATTR void VKAPI_CALL lvp_CmdBlitImage2KHR(
VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageBlit* pRegions,
VkFilter filter)
const VkBlitImageInfo2KHR *info)
{
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
LVP_FROM_HANDLE(lvp_image, src_image, srcImage);
LVP_FROM_HANDLE(lvp_image, dest_image, destImage);
LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);
LVP_FROM_HANDLE(lvp_image, dest_image, info->dstImage);
struct lvp_cmd_buffer_entry *cmd;
uint32_t cmd_size = regionCount * sizeof(VkImageBlit);
uint32_t cmd_size = info->regionCount * sizeof(VkImageBlit);
cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_BLIT_IMAGE);
if (!cmd)
@@ -1104,16 +1097,16 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdBlitImage(
cmd->u.blit_image.src = src_image;
cmd->u.blit_image.dst = dest_image;
cmd->u.blit_image.src_layout = srcImageLayout;
cmd->u.blit_image.dst_layout = destImageLayout;
cmd->u.blit_image.filter = filter;
cmd->u.blit_image.region_count = regionCount;
cmd->u.blit_image.src_layout = info->srcImageLayout;
cmd->u.blit_image.dst_layout = info->dstImageLayout;
cmd->u.blit_image.filter = info->filter;
cmd->u.blit_image.region_count = info->regionCount;
{
VkImageBlit *regions;
regions = (VkImageBlit *)(cmd + 1);
memcpy(regions, pRegions, regionCount * sizeof(VkImageBlit));
COPY_STRUCT2_ARRAY(info->regionCount, regions, info->pRegions, VkImageBlit);
cmd->u.blit_image.regions = regions;
}
@@ -1250,20 +1243,15 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdClearDepthStencilImage(
}
VKAPI_ATTR void VKAPI_CALL lvp_CmdResolveImage(
VKAPI_ATTR void VKAPI_CALL lvp_CmdResolveImage2KHR(
VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageResolve* regions)
const VkResolveImageInfo2KHR *info)
{
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
LVP_FROM_HANDLE(lvp_image, src_image, srcImage);
LVP_FROM_HANDLE(lvp_image, dst_image, destImage);
LVP_FROM_HANDLE(lvp_image, src_image, info->srcImage);
LVP_FROM_HANDLE(lvp_image, dst_image, info->dstImage);
struct lvp_cmd_buffer_entry *cmd;
uint32_t cmd_size = regionCount * sizeof(VkImageResolve);
uint32_t cmd_size = info->regionCount * sizeof(VkImageResolve);
cmd = cmd_buf_entry_alloc_size(cmd_buffer, cmd_size, LVP_CMD_RESOLVE_IMAGE);
if (!cmd)
@@ -1271,12 +1259,11 @@ VKAPI_ATTR void VKAPI_CALL lvp_CmdResolveImage(
cmd->u.resolve_image.src = src_image;
cmd->u.resolve_image.dst = dst_image;
cmd->u.resolve_image.src_layout = srcImageLayout;
cmd->u.resolve_image.dst_layout = destImageLayout;
cmd->u.resolve_image.region_count = regionCount;
cmd->u.resolve_image.src_layout = info->srcImageLayout;
cmd->u.resolve_image.dst_layout = info->dstImageLayout;
cmd->u.resolve_image.region_count = info->regionCount;
cmd->u.resolve_image.regions = (VkImageResolve *)(cmd + 1);
for (unsigned i = 0; i < regionCount; i++)
cmd->u.resolve_image.regions[i] = regions[i];
COPY_STRUCT2_ARRAY(info->regionCount, cmd->u.resolve_image.regions, info->pRegions, VkImageResolve);
cmd_buf_queue(cmd_buffer, cmd);
}
@@ -91,6 +91,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported =
.KHR_bind_memory2 = true,
.KHR_buffer_device_address = true,
.KHR_create_renderpass2 = true,
.KHR_copy_commands2 = true,
.KHR_dedicated_allocation = true,
.KHR_descriptor_update_template = true,
.KHR_device_group = true,