Path: blob/21.2-virgl/src/vulkan/util/vk_cmd_copy.c
7188 views
/*1* Copyright © 2021 Intel Corporation2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#include "vk_common_entrypoints.h"24#include "vk_device.h"2526#define STACK_ARRAY_SIZE 82728#define STACK_ARRAY(type, name, size) \29type _stack_##name[STACK_ARRAY_SIZE], *const name = \30(size) <= STACK_ARRAY_SIZE ? _stack_##name : malloc((size) * sizeof(type))3132#define STACK_ARRAY_FINISH(name) \33if (name != _stack_##name) free(name)3435VKAPI_ATTR void VKAPI_CALL36vk_common_CmdCopyBuffer(VkCommandBuffer commandBuffer,37VkBuffer srcBuffer,38VkBuffer dstBuffer,39uint32_t regionCount,40const VkBufferCopy *pRegions)41{42/* We don't have a vk_command_buffer object but we can assume, since we're43* using common dispatch, that it's a vk_object of some sort.44*/45struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;4647STACK_ARRAY(VkBufferCopy2KHR, region2s, regionCount);4849for (uint32_t r = 0; r < regionCount; r++) {50region2s[r] = (VkBufferCopy2KHR) {51.sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR,52.srcOffset = pRegions[r].srcOffset,53.dstOffset = pRegions[r].dstOffset,54.size = pRegions[r].size,55};56}5758VkCopyBufferInfo2KHR info = {59.sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR,60.srcBuffer = srcBuffer,61.dstBuffer = dstBuffer,62.regionCount = regionCount,63.pRegions = region2s,64};6566disp->device->dispatch_table.CmdCopyBuffer2KHR(commandBuffer, &info);6768STACK_ARRAY_FINISH(region2s);69}7071VKAPI_ATTR void VKAPI_CALL72vk_common_CmdCopyImage(VkCommandBuffer commandBuffer,73VkImage srcImage,74VkImageLayout srcImageLayout,75VkImage dstImage,76VkImageLayout dstImageLayout,77uint32_t regionCount,78const VkImageCopy *pRegions)79{80/* We don't have a vk_command_buffer object but we can assume, since we're81* using common dispatch, that it's a vk_object of some sort.82*/83struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;8485STACK_ARRAY(VkImageCopy2KHR, region2s, regionCount);8687for (uint32_t r = 0; r < regionCount; r++) {88region2s[r] = (VkImageCopy2KHR) {89.sType = VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,90.srcSubresource = pRegions[r].srcSubresource,91.srcOffset = pRegions[r].srcOffset,92.dstSubresource = pRegions[r].dstSubresource,93.dstOffset = pRegions[r].dstOffset,94.extent = pRegions[r].extent,95};96}9798VkCopyImageInfo2KHR info = {99.sType = VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,100.srcImage = srcImage,101.srcImageLayout = srcImageLayout,102.dstImage = dstImage,103.dstImageLayout = dstImageLayout,104.regionCount = regionCount,105.pRegions = region2s,106};107108disp->device->dispatch_table.CmdCopyImage2KHR(commandBuffer, &info);109110STACK_ARRAY_FINISH(region2s);111}112113VKAPI_ATTR void VKAPI_CALL114vk_common_CmdCopyBufferToImage(VkCommandBuffer commandBuffer,115VkBuffer srcBuffer,116VkImage dstImage,117VkImageLayout dstImageLayout,118uint32_t regionCount,119const VkBufferImageCopy *pRegions)120{121/* We don't have a vk_command_buffer object but we can assume, since we're122* using common dispatch, that it's a vk_object of some sort.123*/124struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;125126STACK_ARRAY(VkBufferImageCopy2KHR, region2s, regionCount);127128for (uint32_t r = 0; r < regionCount; r++) {129region2s[r] = (VkBufferImageCopy2KHR) {130.sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,131.bufferOffset = pRegions[r].bufferOffset,132.bufferRowLength = pRegions[r].bufferRowLength,133.bufferImageHeight = pRegions[r].bufferImageHeight,134.imageSubresource = pRegions[r].imageSubresource,135.imageOffset = pRegions[r].imageOffset,136.imageExtent = pRegions[r].imageExtent,137};138}139140VkCopyBufferToImageInfo2KHR info = {141.sType = VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,142.srcBuffer = srcBuffer,143.dstImage = dstImage,144.dstImageLayout = dstImageLayout,145.regionCount = regionCount,146.pRegions = region2s,147};148149disp->device->dispatch_table.CmdCopyBufferToImage2KHR(commandBuffer, &info);150151STACK_ARRAY_FINISH(region2s);152}153154VKAPI_ATTR void VKAPI_CALL155vk_common_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer,156VkImage srcImage,157VkImageLayout srcImageLayout,158VkBuffer dstBuffer,159uint32_t regionCount,160const VkBufferImageCopy *pRegions)161{162/* We don't have a vk_command_buffer object but we can assume, since we're163* using common dispatch, that it's a vk_object of some sort.164*/165struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;166167STACK_ARRAY(VkBufferImageCopy2KHR, region2s, regionCount);168169for (uint32_t r = 0; r < regionCount; r++) {170region2s[r] = (VkBufferImageCopy2KHR) {171.sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,172.bufferOffset = pRegions[r].bufferOffset,173.bufferRowLength = pRegions[r].bufferRowLength,174.bufferImageHeight = pRegions[r].bufferImageHeight,175.imageSubresource = pRegions[r].imageSubresource,176.imageOffset = pRegions[r].imageOffset,177.imageExtent = pRegions[r].imageExtent,178};179}180181VkCopyImageToBufferInfo2KHR info = {182.sType = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR,183.srcImage = srcImage,184.srcImageLayout = srcImageLayout,185.dstBuffer = dstBuffer,186.regionCount = regionCount,187.pRegions = region2s,188};189190disp->device->dispatch_table.CmdCopyImageToBuffer2KHR(commandBuffer, &info);191192STACK_ARRAY_FINISH(region2s);193}194195VKAPI_ATTR void VKAPI_CALL196vk_common_CmdBlitImage(VkCommandBuffer commandBuffer,197VkImage srcImage,198VkImageLayout srcImageLayout,199VkImage dstImage,200VkImageLayout dstImageLayout,201uint32_t regionCount,202const VkImageBlit *pRegions,203VkFilter filter)204{205/* We don't have a vk_command_buffer object but we can assume, since we're206* using common dispatch, that it's a vk_object of some sort.207*/208struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;209210STACK_ARRAY(VkImageBlit2KHR, region2s, regionCount);211212for (uint32_t r = 0; r < regionCount; r++) {213region2s[r] = (VkImageBlit2KHR) {214.sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR,215.srcSubresource = pRegions[r].srcSubresource,216.srcOffsets = {217pRegions[r].srcOffsets[0],218pRegions[r].srcOffsets[1],219},220.dstSubresource = pRegions[r].dstSubresource,221.dstOffsets = {222pRegions[r].dstOffsets[0],223pRegions[r].dstOffsets[1],224},225};226}227228VkBlitImageInfo2KHR info = {229.sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR,230.srcImage = srcImage,231.srcImageLayout = srcImageLayout,232.dstImage = dstImage,233.dstImageLayout = dstImageLayout,234.regionCount = regionCount,235.pRegions = region2s,236.filter = filter,237};238239disp->device->dispatch_table.CmdBlitImage2KHR(commandBuffer, &info);240241STACK_ARRAY_FINISH(region2s);242}243244VKAPI_ATTR void VKAPI_CALL245vk_common_CmdResolveImage(VkCommandBuffer commandBuffer,246VkImage srcImage,247VkImageLayout srcImageLayout,248VkImage dstImage,249VkImageLayout dstImageLayout,250uint32_t regionCount,251const VkImageResolve *pRegions)252{253/* We don't have a vk_command_buffer object but we can assume, since we're254* using common dispatch, that it's a vk_object of some sort.255*/256struct vk_object_base *disp = (struct vk_object_base *)commandBuffer;257258STACK_ARRAY(VkImageResolve2KHR, region2s, regionCount);259260for (uint32_t r = 0; r < regionCount; r++) {261region2s[r] = (VkImageResolve2KHR) {262.sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,263.srcSubresource = pRegions[r].srcSubresource,264.srcOffset = pRegions[r].srcOffset,265.dstSubresource = pRegions[r].dstSubresource,266.dstOffset = pRegions[r].dstOffset,267.extent = pRegions[r].extent,268};269}270271VkResolveImageInfo2KHR info = {272.sType = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,273.srcImage = srcImage,274.srcImageLayout = srcImageLayout,275.dstImage = dstImage,276.dstImageLayout = dstImageLayout,277.regionCount = regionCount,278.pRegions = region2s,279};280281disp->device->dispatch_table.CmdResolveImage2KHR(commandBuffer, &info);282283STACK_ARRAY_FINISH(region2s);284}285286287