278 lines
10 KiB
C
278 lines
10 KiB
C
/*
|
|
* 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"
|
|
#include "vk_util.h"
|
|
|
|
VKAPI_ATTR void VKAPI_CALL
|
|
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(VkBufferCopy2, region2s, regionCount);
|
|
|
|
for (uint32_t r = 0; r < regionCount; r++) {
|
|
region2s[r] = (VkBufferCopy2) {
|
|
.sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2,
|
|
.srcOffset = pRegions[r].srcOffset,
|
|
.dstOffset = pRegions[r].dstOffset,
|
|
.size = pRegions[r].size,
|
|
};
|
|
}
|
|
|
|
VkCopyBufferInfo2 info = {
|
|
.sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2,
|
|
.srcBuffer = srcBuffer,
|
|
.dstBuffer = dstBuffer,
|
|
.regionCount = regionCount,
|
|
.pRegions = region2s,
|
|
};
|
|
|
|
disp->device->dispatch_table.CmdCopyBuffer2KHR(commandBuffer, &info);
|
|
|
|
STACK_ARRAY_FINISH(region2s);
|
|
}
|
|
|
|
VKAPI_ATTR void VKAPI_CALL
|
|
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(VkImageCopy2, region2s, regionCount);
|
|
|
|
for (uint32_t r = 0; r < regionCount; r++) {
|
|
region2s[r] = (VkImageCopy2) {
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_COPY_2,
|
|
.srcSubresource = pRegions[r].srcSubresource,
|
|
.srcOffset = pRegions[r].srcOffset,
|
|
.dstSubresource = pRegions[r].dstSubresource,
|
|
.dstOffset = pRegions[r].dstOffset,
|
|
.extent = pRegions[r].extent,
|
|
};
|
|
}
|
|
|
|
VkCopyImageInfo2 info = {
|
|
.sType = VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2,
|
|
.srcImage = srcImage,
|
|
.srcImageLayout = srcImageLayout,
|
|
.dstImage = dstImage,
|
|
.dstImageLayout = dstImageLayout,
|
|
.regionCount = regionCount,
|
|
.pRegions = region2s,
|
|
};
|
|
|
|
disp->device->dispatch_table.CmdCopyImage2KHR(commandBuffer, &info);
|
|
|
|
STACK_ARRAY_FINISH(region2s);
|
|
}
|
|
|
|
VKAPI_ATTR void VKAPI_CALL
|
|
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(VkBufferImageCopy2, region2s, regionCount);
|
|
|
|
for (uint32_t r = 0; r < regionCount; r++) {
|
|
region2s[r] = (VkBufferImageCopy2) {
|
|
.sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2,
|
|
.bufferOffset = pRegions[r].bufferOffset,
|
|
.bufferRowLength = pRegions[r].bufferRowLength,
|
|
.bufferImageHeight = pRegions[r].bufferImageHeight,
|
|
.imageSubresource = pRegions[r].imageSubresource,
|
|
.imageOffset = pRegions[r].imageOffset,
|
|
.imageExtent = pRegions[r].imageExtent,
|
|
};
|
|
}
|
|
|
|
VkCopyBufferToImageInfo2 info = {
|
|
.sType = VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2,
|
|
.srcBuffer = srcBuffer,
|
|
.dstImage = dstImage,
|
|
.dstImageLayout = dstImageLayout,
|
|
.regionCount = regionCount,
|
|
.pRegions = region2s,
|
|
};
|
|
|
|
disp->device->dispatch_table.CmdCopyBufferToImage2KHR(commandBuffer, &info);
|
|
|
|
STACK_ARRAY_FINISH(region2s);
|
|
}
|
|
|
|
VKAPI_ATTR void VKAPI_CALL
|
|
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(VkBufferImageCopy2, region2s, regionCount);
|
|
|
|
for (uint32_t r = 0; r < regionCount; r++) {
|
|
region2s[r] = (VkBufferImageCopy2) {
|
|
.sType = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2,
|
|
.bufferOffset = pRegions[r].bufferOffset,
|
|
.bufferRowLength = pRegions[r].bufferRowLength,
|
|
.bufferImageHeight = pRegions[r].bufferImageHeight,
|
|
.imageSubresource = pRegions[r].imageSubresource,
|
|
.imageOffset = pRegions[r].imageOffset,
|
|
.imageExtent = pRegions[r].imageExtent,
|
|
};
|
|
}
|
|
|
|
VkCopyImageToBufferInfo2 info = {
|
|
.sType = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2,
|
|
.srcImage = srcImage,
|
|
.srcImageLayout = srcImageLayout,
|
|
.dstBuffer = dstBuffer,
|
|
.regionCount = regionCount,
|
|
.pRegions = region2s,
|
|
};
|
|
|
|
disp->device->dispatch_table.CmdCopyImageToBuffer2KHR(commandBuffer, &info);
|
|
|
|
STACK_ARRAY_FINISH(region2s);
|
|
}
|
|
|
|
VKAPI_ATTR void VKAPI_CALL
|
|
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(VkImageBlit2, region2s, regionCount);
|
|
|
|
for (uint32_t r = 0; r < regionCount; r++) {
|
|
region2s[r] = (VkImageBlit2) {
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2,
|
|
.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],
|
|
},
|
|
};
|
|
}
|
|
|
|
VkBlitImageInfo2 info = {
|
|
.sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2,
|
|
.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);
|
|
}
|
|
|
|
VKAPI_ATTR void VKAPI_CALL
|
|
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(VkImageResolve2, region2s, regionCount);
|
|
|
|
for (uint32_t r = 0; r < regionCount; r++) {
|
|
region2s[r] = (VkImageResolve2) {
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2,
|
|
.srcSubresource = pRegions[r].srcSubresource,
|
|
.srcOffset = pRegions[r].srcOffset,
|
|
.dstSubresource = pRegions[r].dstSubresource,
|
|
.dstOffset = pRegions[r].dstOffset,
|
|
.extent = pRegions[r].extent,
|
|
};
|
|
}
|
|
|
|
VkResolveImageInfo2 info = {
|
|
.sType = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2,
|
|
.srcImage = srcImage,
|
|
.srcImageLayout = srcImageLayout,
|
|
.dstImage = dstImage,
|
|
.dstImageLayout = dstImageLayout,
|
|
.regionCount = regionCount,
|
|
.pRegions = region2s,
|
|
};
|
|
|
|
disp->device->dispatch_table.CmdResolveImage2KHR(commandBuffer, &info);
|
|
|
|
STACK_ARRAY_FINISH(region2s);
|
|
}
|