vulkan,anv: Move VK_KHR_copy_commands2 wrappers to common code

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8676>
This commit is contained in:
Jason Ekstrand 2021-01-25 03:08:27 -06:00 committed by Marge Bot
parent ac6be0ef22
commit 06f877f6e6
4 changed files with 287 additions and 207 deletions

View file

@ -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,
&copy);
}
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, &copy, 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, &copy, 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, &copy);
}
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)

View file

@ -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 \

View file

@ -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',

View file

@ -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);
}