From 06f877f6e6e9590d86bb941a5baae7de85751356 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 25 Jan 2021 03:08:27 -0600 Subject: [PATCH] vulkan,anv: Move VK_KHR_copy_commands2 wrappers to common code Reviewed-by: Lionel Landwerlin Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/intel/vulkan/anv_blorp.c | 207 ------------------------ src/vulkan/Makefile.sources | 1 + src/vulkan/util/meson.build | 1 + src/vulkan/util/vk_cmd_copy.c | 285 ++++++++++++++++++++++++++++++++++ 4 files changed, 287 insertions(+), 207 deletions(-) create mode 100644 src/vulkan/util/vk_cmd_copy.c diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 9f624b2c40b..087fd554491 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -415,42 +415,6 @@ copy_image(struct anv_cmd_buffer *cmd_buffer, } } - -void anv_CmdCopyImage( - VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkImageCopy* pRegions) -{ - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); - ANV_FROM_HANDLE(anv_image, src_image, srcImage); - ANV_FROM_HANDLE(anv_image, dst_image, dstImage); - - struct blorp_batch batch; - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0); - - for (unsigned r = 0; r < regionCount; r++) { - VkImageCopy2KHR copy = { - .sType = VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR, - .srcSubresource = pRegions[r].srcSubresource, - .srcOffset = pRegions[r].srcOffset, - .dstSubresource = pRegions[r].dstSubresource, - .dstOffset = pRegions[r].dstOffset, - .extent = pRegions[r].extent, - }; - - copy_image(cmd_buffer, &batch, - src_image, srcImageLayout, - dst_image, dstImageLayout, - ©); - } - - blorp_batch_finish(&batch); -} - void anv_CmdCopyImage2KHR( VkCommandBuffer commandBuffer, const VkCopyImageInfo2KHR* pCopyImageInfo) @@ -623,39 +587,6 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer, } } -void anv_CmdCopyBufferToImage( - VkCommandBuffer commandBuffer, - VkBuffer srcBuffer, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkBufferImageCopy* pRegions) -{ - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); - ANV_FROM_HANDLE(anv_buffer, src_buffer, srcBuffer); - ANV_FROM_HANDLE(anv_image, dst_image, dstImage); - - struct blorp_batch batch; - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0); - - for (unsigned r = 0; r < regionCount; r++) { - VkBufferImageCopy2KHR copy = { - .sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR, - .bufferOffset = pRegions[r].bufferOffset, - .bufferRowLength = pRegions[r].bufferRowLength, - .bufferImageHeight = pRegions[r].bufferImageHeight, - .imageSubresource = pRegions[r].imageSubresource, - .imageOffset = pRegions[r].imageOffset, - .imageExtent = pRegions[r].imageExtent, - }; - - copy_buffer_to_image(cmd_buffer, &batch, src_buffer, dst_image, - dstImageLayout, ©, true); - } - - blorp_batch_finish(&batch); -} - void anv_CmdCopyBufferToImage2KHR( VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo) @@ -676,41 +607,6 @@ void anv_CmdCopyBufferToImage2KHR( blorp_batch_finish(&batch); } -void anv_CmdCopyImageToBuffer( - VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkBuffer dstBuffer, - uint32_t regionCount, - const VkBufferImageCopy* pRegions) -{ - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); - ANV_FROM_HANDLE(anv_image, src_image, srcImage); - ANV_FROM_HANDLE(anv_buffer, dst_buffer, dstBuffer); - - struct blorp_batch batch; - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0); - - for (unsigned r = 0; r < regionCount; r++) { - VkBufferImageCopy2KHR copy = { - .sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR, - .bufferOffset = pRegions[r].bufferOffset, - .bufferRowLength = pRegions[r].bufferRowLength, - .bufferImageHeight = pRegions[r].bufferImageHeight, - .imageSubresource = pRegions[r].imageSubresource, - .imageOffset = pRegions[r].imageOffset, - .imageExtent = pRegions[r].imageExtent, - }; - - copy_buffer_to_image(cmd_buffer, &batch, dst_buffer, src_image, - srcImageLayout, ©, false); - } - - blorp_batch_finish(&batch); - - cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES; -} - void anv_CmdCopyImageToBuffer2KHR( VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo) @@ -871,47 +767,6 @@ blit_image(struct anv_cmd_buffer *cmd_buffer, } } -void anv_CmdBlitImage( - VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkImageBlit* pRegions, - VkFilter filter) -{ - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); - ANV_FROM_HANDLE(anv_image, src_image, srcImage); - ANV_FROM_HANDLE(anv_image, dst_image, dstImage); - - struct blorp_batch batch; - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0); - - for (unsigned r = 0; r < regionCount; r++) { - VkImageBlit2KHR blit = { - .sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR, - .srcSubresource = pRegions[r].srcSubresource, - .srcOffsets = { - pRegions[r].srcOffsets[0], - pRegions[r].srcOffsets[1], - }, - .dstSubresource = pRegions[r].dstSubresource, - .dstOffsets = { - pRegions[r].dstOffsets[0], - pRegions[r].dstOffsets[1], - }, - }; - - blit_image(cmd_buffer, &batch, - src_image, srcImageLayout, - dst_image, dstImageLayout, - &blit, filter); - } - - blorp_batch_finish(&batch); -} - void anv_CmdBlitImage2KHR( VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR* pBlitImageInfo) @@ -977,36 +832,6 @@ copy_buffer(struct anv_device *device, blorp_buffer_copy(batch, src, dst, region->size); } -void anv_CmdCopyBuffer( - VkCommandBuffer commandBuffer, - VkBuffer srcBuffer, - VkBuffer dstBuffer, - uint32_t regionCount, - const VkBufferCopy* pRegions) -{ - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); - ANV_FROM_HANDLE(anv_buffer, src_buffer, srcBuffer); - ANV_FROM_HANDLE(anv_buffer, dst_buffer, dstBuffer); - - struct blorp_batch batch; - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0); - - for (unsigned r = 0; r < regionCount; r++) { - VkBufferCopy2KHR copy = { - .sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR, - .srcOffset = pRegions[r].srcOffset, - .dstOffset = pRegions[r].dstOffset, - .size = pRegions[r].size, - }; - - copy_buffer(cmd_buffer->device, &batch, src_buffer, dst_buffer, ©); - } - - blorp_batch_finish(&batch); - - cmd_buffer->state.pending_pipe_bits |= ANV_PIPE_RENDER_TARGET_BUFFER_WRITES; -} - void anv_CmdCopyBuffer2KHR( VkCommandBuffer commandBuffer, const VkCopyBufferInfo2KHR* pCopyBufferInfo) @@ -1663,38 +1488,6 @@ resolve_image(struct anv_cmd_buffer *cmd_buffer, } } -void anv_CmdResolveImage( - VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkImageResolve* pRegions) -{ - ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer); - ANV_FROM_HANDLE(anv_image, src_image, srcImage); - ANV_FROM_HANDLE(anv_image, dst_image, dstImage); - - assert(!src_image->format->can_ycbcr); - - for (uint32_t r = 0; r < regionCount; r++) { - VkImageResolve2KHR resolve = { - .sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR, - .srcSubresource = pRegions[r].srcSubresource, - .srcOffset = pRegions[r].srcOffset, - .dstSubresource = pRegions[r].dstSubresource, - .dstOffset = pRegions[r].dstOffset, - .extent = pRegions[r].extent, - }; - - resolve_image(cmd_buffer, - src_image, srcImageLayout, - dst_image, dstImageLayout, - &resolve); - } -} - void anv_CmdResolveImage2KHR( VkCommandBuffer commandBuffer, const VkResolveImageInfo2KHR* pResolveImageInfo) diff --git a/src/vulkan/Makefile.sources b/src/vulkan/Makefile.sources index 5c2da98014d..bebb515efab 100644 --- a/src/vulkan/Makefile.sources +++ b/src/vulkan/Makefile.sources @@ -25,6 +25,7 @@ VULKAN_WSI_DISPLAY_FILES := \ VULKAN_UTIL_FILES := \ util/vk_alloc.h \ + util/vk_cmd_copy.c \ util/vk_debug_report.c \ util/vk_debug_report.h \ util/vk_deferred_operation.c \ diff --git a/src/vulkan/util/meson.build b/src/vulkan/util/meson.build index 89ba4a93097..842c61675e7 100644 --- a/src/vulkan/util/meson.build +++ b/src/vulkan/util/meson.build @@ -23,6 +23,7 @@ vk_extensions_gen = files('vk_extensions_gen.py') files_vulkan_util = files( 'vk_alloc.h', + 'vk_cmd_copy.c', 'vk_debug_report.c', 'vk_debug_report.h', 'vk_deferred_operation.c', diff --git a/src/vulkan/util/vk_cmd_copy.c b/src/vulkan/util/vk_cmd_copy.c new file mode 100644 index 00000000000..f6f74d2d0e7 --- /dev/null +++ b/src/vulkan/util/vk_cmd_copy.c @@ -0,0 +1,285 @@ +/* + * Copyright © 2021 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "vk_common_entrypoints.h" +#include "vk_device.h" + +#define STACK_ARRAY_SIZE 8 + +#define STACK_ARRAY(type, name, size) \ + type _stack_##name[STACK_ARRAY_SIZE], *const name = \ + (size) <= STACK_ARRAY_SIZE ? _stack_##name : malloc((size) * sizeof(type)) + +#define STACK_ARRAY_FINISH(name) \ + if (name != _stack_##name) free(name) + +void +vk_common_CmdCopyBuffer(VkCommandBuffer commandBuffer, + VkBuffer srcBuffer, + VkBuffer dstBuffer, + uint32_t regionCount, + const VkBufferCopy *pRegions) +{ + /* We don't have a vk_command_buffer object but we can assume, since we're + * using common dispatch, that it's a vk_object of some sort. + */ + struct vk_object_base *disp = (struct vk_object_base *)commandBuffer; + + STACK_ARRAY(VkBufferCopy2KHR, region2s, regionCount); + + for (uint32_t r = 0; r < regionCount; r++) { + region2s[r] = (VkBufferCopy2KHR) { + .sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR, + .srcOffset = pRegions[r].srcOffset, + .dstOffset = pRegions[r].dstOffset, + .size = pRegions[r].size, + }; + } + + VkCopyBufferInfo2KHR info = { + .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR, + .srcBuffer = srcBuffer, + .dstBuffer = dstBuffer, + .regionCount = regionCount, + .pRegions = region2s, + }; + + disp->device->dispatch_table.CmdCopyBuffer2KHR(commandBuffer, &info); + + STACK_ARRAY_FINISH(region2s); +} + +void +vk_common_CmdCopyImage(VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkImageCopy *pRegions) +{ + /* We don't have a vk_command_buffer object but we can assume, since we're + * using common dispatch, that it's a vk_object of some sort. + */ + struct vk_object_base *disp = (struct vk_object_base *)commandBuffer; + + STACK_ARRAY(VkImageCopy2KHR, region2s, regionCount); + + for (uint32_t r = 0; r < regionCount; r++) { + region2s[r] = (VkImageCopy2KHR) { + .sType = VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR, + .srcSubresource = pRegions[r].srcSubresource, + .srcOffset = pRegions[r].srcOffset, + .dstSubresource = pRegions[r].dstSubresource, + .dstOffset = pRegions[r].dstOffset, + .extent = pRegions[r].extent, + }; + } + + VkCopyImageInfo2KHR info = { + .sType = VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR, + .srcImage = srcImage, + .srcImageLayout = srcImageLayout, + .dstImage = dstImage, + .dstImageLayout = dstImageLayout, + .regionCount = regionCount, + .pRegions = region2s, + }; + + disp->device->dispatch_table.CmdCopyImage2KHR(commandBuffer, &info); + + STACK_ARRAY_FINISH(region2s); +} + +void +vk_common_CmdCopyBufferToImage(VkCommandBuffer commandBuffer, + VkBuffer srcBuffer, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkBufferImageCopy *pRegions) +{ + /* We don't have a vk_command_buffer object but we can assume, since we're + * using common dispatch, that it's a vk_object of some sort. + */ + struct vk_object_base *disp = (struct vk_object_base *)commandBuffer; + + STACK_ARRAY(VkBufferImageCopy2KHR, region2s, regionCount); + + for (uint32_t r = 0; r < regionCount; r++) { + region2s[r] = (VkBufferImageCopy2KHR) { + .sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR, + .bufferOffset = pRegions[r].bufferOffset, + .bufferRowLength = pRegions[r].bufferRowLength, + .bufferImageHeight = pRegions[r].bufferImageHeight, + .imageSubresource = pRegions[r].imageSubresource, + .imageOffset = pRegions[r].imageOffset, + .imageExtent = pRegions[r].imageExtent, + }; + } + + VkCopyBufferToImageInfo2KHR info = { + .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR, + .srcBuffer = srcBuffer, + .dstImage = dstImage, + .dstImageLayout = dstImageLayout, + .regionCount = regionCount, + .pRegions = region2s, + }; + + disp->device->dispatch_table.CmdCopyBufferToImage2KHR(commandBuffer, &info); + + STACK_ARRAY_FINISH(region2s); +} + +void +vk_common_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkBuffer dstBuffer, + uint32_t regionCount, + const VkBufferImageCopy *pRegions) +{ + /* We don't have a vk_command_buffer object but we can assume, since we're + * using common dispatch, that it's a vk_object of some sort. + */ + struct vk_object_base *disp = (struct vk_object_base *)commandBuffer; + + STACK_ARRAY(VkBufferImageCopy2KHR, region2s, regionCount); + + for (uint32_t r = 0; r < regionCount; r++) { + region2s[r] = (VkBufferImageCopy2KHR) { + .sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR, + .bufferOffset = pRegions[r].bufferOffset, + .bufferRowLength = pRegions[r].bufferRowLength, + .bufferImageHeight = pRegions[r].bufferImageHeight, + .imageSubresource = pRegions[r].imageSubresource, + .imageOffset = pRegions[r].imageOffset, + .imageExtent = pRegions[r].imageExtent, + }; + } + + VkCopyImageToBufferInfo2KHR info = { + .sType = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR, + .srcImage = srcImage, + .srcImageLayout = srcImageLayout, + .dstBuffer = dstBuffer, + .regionCount = regionCount, + .pRegions = region2s, + }; + + disp->device->dispatch_table.CmdCopyImageToBuffer2KHR(commandBuffer, &info); + + STACK_ARRAY_FINISH(region2s); +} + +void +vk_common_CmdBlitImage(VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkImageBlit *pRegions, + VkFilter filter) +{ + /* We don't have a vk_command_buffer object but we can assume, since we're + * using common dispatch, that it's a vk_object of some sort. + */ + struct vk_object_base *disp = (struct vk_object_base *)commandBuffer; + + STACK_ARRAY(VkImageBlit2KHR, region2s, regionCount); + + for (uint32_t r = 0; r < regionCount; r++) { + region2s[r] = (VkImageBlit2KHR) { + .sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR, + .srcSubresource = pRegions[r].srcSubresource, + .srcOffsets = { + pRegions[r].srcOffsets[0], + pRegions[r].srcOffsets[1], + }, + .dstSubresource = pRegions[r].dstSubresource, + .dstOffsets = { + pRegions[r].dstOffsets[0], + pRegions[r].dstOffsets[1], + }, + }; + } + + VkBlitImageInfo2KHR info = { + .sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR, + .srcImage = srcImage, + .srcImageLayout = srcImageLayout, + .dstImage = dstImage, + .dstImageLayout = dstImageLayout, + .regionCount = regionCount, + .pRegions = region2s, + .filter = filter, + }; + + disp->device->dispatch_table.CmdBlitImage2KHR(commandBuffer, &info); + + STACK_ARRAY_FINISH(region2s); +} + +void +vk_common_CmdResolveImage(VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkImageResolve *pRegions) +{ + /* We don't have a vk_command_buffer object but we can assume, since we're + * using common dispatch, that it's a vk_object of some sort. + */ + struct vk_object_base *disp = (struct vk_object_base *)commandBuffer; + + STACK_ARRAY(VkImageResolve2KHR, region2s, regionCount); + + for (uint32_t r = 0; r < regionCount; r++) { + region2s[r] = (VkImageResolve2KHR) { + .sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR, + .srcSubresource = pRegions[r].srcSubresource, + .srcOffset = pRegions[r].srcOffset, + .dstSubresource = pRegions[r].dstSubresource, + .dstOffset = pRegions[r].dstOffset, + .extent = pRegions[r].extent, + }; + } + + VkResolveImageInfo2KHR info = { + .sType = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR, + .srcImage = srcImage, + .srcImageLayout = srcImageLayout, + .dstImage = dstImage, + .dstImageLayout = dstImageLayout, + .regionCount = regionCount, + .pRegions = region2s, + }; + + disp->device->dispatch_table.CmdResolveImage2KHR(commandBuffer, &info); + + STACK_ARRAY_FINISH(region2s); +}