panvk: Implement VK_KHR_copy_commands2

This is just 2 versions of all the copy/blit entrypoings.  The common
Vulkan runtime code will implement the 1.0 versions in terms of the 2
versions.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15436>
This commit is contained in:
Jason Ekstrand 2022-03-17 16:10:51 -05:00 committed by Marge Bot
parent b573b22628
commit f9b773a417
3 changed files with 38 additions and 64 deletions

View file

@ -148,6 +148,7 @@ panvk_get_device_extensions(const struct panvk_physical_device *device,
struct vk_device_extension_table *ext)
{
*ext = (struct vk_device_extension_table) {
.KHR_copy_commands2 = true,
#ifdef PANVK_USE_WSI_PLATFORM
.KHR_swapchain = true,
#endif

View file

@ -134,21 +134,15 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf,
}
void
panvk_per_arch(CmdBlitImage)(VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageBlit *pRegions,
VkFilter filter)
panvk_per_arch(CmdBlitImage2)(VkCommandBuffer commandBuffer,
const VkBlitImageInfo2 *pBlitImageInfo)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_image, src, srcImage);
VK_FROM_HANDLE(panvk_image, dst, destImage);
VK_FROM_HANDLE(panvk_image, src, pBlitImageInfo->srcImage);
VK_FROM_HANDLE(panvk_image, dst, pBlitImageInfo->dstImage);
for (unsigned i = 0; i < regionCount; i++) {
const VkImageBlit *region = &pRegions[i];
for (unsigned i = 0; i < pBlitImageInfo->regionCount; i++) {
const VkImageBlit2 *region = &pBlitImageInfo->pRegions[i];
struct pan_blit_info info = {
.src = {
.planes[0].image = &src->pimage,
@ -184,7 +178,7 @@ panvk_per_arch(CmdBlitImage)(VkCommandBuffer commandBuffer,
region->dstSubresource.baseArrayLayer + region->dstSubresource.layerCount - 1,
},
},
.nearest = filter == VK_FILTER_NEAREST,
.nearest = pBlitImageInfo->filter == VK_FILTER_NEAREST,
};
if (region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT)
@ -202,13 +196,8 @@ panvk_per_arch(CmdBlitImage)(VkCommandBuffer commandBuffer,
}
void
panvk_per_arch(CmdResolveImage)(VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageResolve *pRegions)
panvk_per_arch(CmdResolveImage2)(VkCommandBuffer commandBuffer,
const VkResolveImageInfo2* pResolveImageInfo)
{
panvk_stub();
}

View file

@ -654,7 +654,7 @@ static void
panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf,
const struct panvk_image *src,
const struct panvk_image *dst,
const VkImageCopy *region)
const VkImageCopy2 *region)
{
struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info;
@ -849,20 +849,15 @@ panvk_meta_copy_img2img_init(struct panvk_physical_device *dev, bool is_ms)
}
void
panvk_per_arch(CmdCopyImage)(VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkImageCopy *pRegions)
panvk_per_arch(CmdCopyImage2)(VkCommandBuffer commandBuffer,
const VkCopyImageInfo2 *pCopyImageInfo)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_image, dst, destImage);
VK_FROM_HANDLE(panvk_image, src, srcImage);
VK_FROM_HANDLE(panvk_image, dst, pCopyImageInfo->dstImage);
VK_FROM_HANDLE(panvk_image, src, pCopyImageInfo->srcImage);
for (unsigned i = 0; i < regionCount; i++) {
panvk_meta_copy_img2img(cmdbuf, src, dst, &pRegions[i]);
for (unsigned i = 0; i < pCopyImageInfo->regionCount; i++) {
panvk_meta_copy_img2img(cmdbuf, src, dst, &pCopyImageInfo->pRegions[i]);
}
}
@ -1121,7 +1116,7 @@ static void
panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf,
const struct panvk_buffer *buf,
const struct panvk_image *img,
const VkBufferImageCopy *region)
const VkBufferImageCopy2 *region)
{
struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
struct pan_fb_info *fbinfo = &cmdbuf->state.fb.info;
@ -1271,19 +1266,15 @@ panvk_meta_copy_buf2img_init(struct panvk_physical_device *dev)
}
void
panvk_per_arch(CmdCopyBufferToImage)(VkCommandBuffer commandBuffer,
VkBuffer srcBuffer,
VkImage destImage,
VkImageLayout destImageLayout,
uint32_t regionCount,
const VkBufferImageCopy *pRegions)
panvk_per_arch(CmdCopyBufferToImage2)(VkCommandBuffer commandBuffer,
const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_buffer, buf, srcBuffer);
VK_FROM_HANDLE(panvk_image, img, destImage);
VK_FROM_HANDLE(panvk_buffer, buf, pCopyBufferToImageInfo->srcBuffer);
VK_FROM_HANDLE(panvk_image, img, pCopyBufferToImageInfo->dstImage);
for (unsigned i = 0; i < regionCount; i++) {
panvk_meta_copy_buf2img(cmdbuf, buf, img, &pRegions[i]);
for (unsigned i = 0; i < pCopyBufferToImageInfo->regionCount; i++) {
panvk_meta_copy_buf2img(cmdbuf, buf, img, &pCopyBufferToImageInfo->pRegions[i]);
}
}
@ -1587,7 +1578,7 @@ static void
panvk_meta_copy_img2buf(struct panvk_cmd_buffer *cmdbuf,
const struct panvk_buffer *buf,
const struct panvk_image *img,
const VkBufferImageCopy *region)
const VkBufferImageCopy2 *region)
{
struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
struct panvk_meta_copy_format_info key = {
@ -1732,19 +1723,15 @@ panvk_meta_copy_img2buf_init(struct panvk_physical_device *dev)
}
void
panvk_per_arch(CmdCopyImageToBuffer)(VkCommandBuffer commandBuffer,
VkImage srcImage,
VkImageLayout srcImageLayout,
VkBuffer destBuffer,
uint32_t regionCount,
const VkBufferImageCopy *pRegions)
panvk_per_arch(CmdCopyImageToBuffer2)(VkCommandBuffer commandBuffer,
const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_buffer, buf, destBuffer);
VK_FROM_HANDLE(panvk_image, img, srcImage);
VK_FROM_HANDLE(panvk_buffer, buf, pCopyImageToBufferInfo->dstBuffer);
VK_FROM_HANDLE(panvk_image, img, pCopyImageToBufferInfo->srcImage);
for (unsigned i = 0; i < regionCount; i++) {
panvk_meta_copy_img2buf(cmdbuf, buf, img, &pRegions[i]);
for (unsigned i = 0; i < pCopyImageToBufferInfo->regionCount; i++) {
panvk_meta_copy_img2buf(cmdbuf, buf, img, &pCopyImageToBufferInfo->pRegions[i]);
}
}
@ -1840,7 +1827,7 @@ static void
panvk_meta_copy_buf2buf(struct panvk_cmd_buffer *cmdbuf,
const struct panvk_buffer *src,
const struct panvk_buffer *dst,
const VkBufferCopy *region)
const VkBufferCopy2 *region)
{
struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
@ -1889,18 +1876,15 @@ panvk_meta_copy_buf2buf(struct panvk_cmd_buffer *cmdbuf,
}
void
panvk_per_arch(CmdCopyBuffer)(VkCommandBuffer commandBuffer,
VkBuffer srcBuffer,
VkBuffer destBuffer,
uint32_t regionCount,
const VkBufferCopy *pRegions)
panvk_per_arch(CmdCopyBuffer2)(VkCommandBuffer commandBuffer,
const VkCopyBufferInfo2 *pCopyBufferInfo)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
VK_FROM_HANDLE(panvk_buffer, src, srcBuffer);
VK_FROM_HANDLE(panvk_buffer, dst, destBuffer);
VK_FROM_HANDLE(panvk_buffer, src, pCopyBufferInfo->srcBuffer);
VK_FROM_HANDLE(panvk_buffer, dst, pCopyBufferInfo->dstBuffer);
for (unsigned i = 0; i < regionCount; i++) {
panvk_meta_copy_buf2buf(cmdbuf, src, dst, &pRegions[i]);
for (unsigned i = 0; i < pCopyBufferInfo->regionCount; i++) {
panvk_meta_copy_buf2buf(cmdbuf, src, dst, &pCopyBufferInfo->pRegions[i]);
}
}