1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-22 07:54:15 +01:00

[dxvk] Use copy_commands2 functions for buffer <-> image copies

This commit is contained in:
Philip Rebohle 2022-07-19 14:38:39 +02:00
parent 23846ad577
commit 0ba741b7d2
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 55 additions and 41 deletions

View File

@ -390,16 +390,10 @@ namespace dxvk {
void cmdCopyBufferToImage( void cmdCopyBufferToImage(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
VkBuffer srcBuffer, const VkCopyBufferToImageInfo2* copyInfo) {
VkImage dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkBufferImageCopy* pRegions) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmdBuffersUsed.set(cmdBuffer);
m_vkd->vkCmdCopyBufferToImage(getCmdBuffer(cmdBuffer), m_vkd->vkCmdCopyBufferToImage2(getCmdBuffer(cmdBuffer), copyInfo);
srcBuffer, dstImage, dstImageLayout,
regionCount, pRegions);
} }
@ -414,16 +408,10 @@ namespace dxvk {
void cmdCopyImageToBuffer( void cmdCopyImageToBuffer(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
VkImage srcImage, const VkCopyImageToBufferInfo2* copyInfo) {
VkImageLayout srcImageLayout,
VkBuffer dstBuffer,
uint32_t regionCount,
const VkBufferImageCopy* pRegions) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmdBuffersUsed.set(cmdBuffer);
m_vkd->vkCmdCopyImageToBuffer(getCmdBuffer(cmdBuffer), m_vkd->vkCmdCopyImageToBuffer2(getCmdBuffer(cmdBuffer), copyInfo);
srcImage, srcImageLayout, dstBuffer,
regionCount, pRegions);
} }

View File

@ -1202,17 +1202,27 @@ namespace dxvk {
VkImageSubresourceLayers dstSubresourceS = dstSubresource; VkImageSubresourceLayers dstSubresourceS = dstSubresource;
dstSubresourceS.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; dstSubresourceS.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
std::array<VkBufferImageCopy, 2> copyRegions = {{ std::array<VkBufferImageCopy2, 2> copyRegions;
{ tmpBufferViewD->info().rangeOffset, 0, 0, dstSubresourceD, dstOffset3D, dstExtent3D }, copyRegions[0] = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
{ tmpBufferViewS->info().rangeOffset, 0, 0, dstSubresourceS, dstOffset3D, dstExtent3D }, copyRegions[0].bufferOffset = tmpBufferViewD->info().rangeOffset;
}}; copyRegions[0].imageSubresource = dstSubresourceD;
copyRegions[0].imageOffset = dstOffset3D;
copyRegions[0].imageExtent = dstExtent3D;
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, copyRegions[1] = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
tmpBuffer->getSliceHandle().handle, copyRegions[1].bufferOffset = tmpBufferViewS->info().rangeOffset;
dstImage->handle(), copyRegions[1].imageSubresource = dstSubresourceS;
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL), copyRegions[1].imageOffset = dstOffset3D;
copyRegions.size(), copyRegions[1].imageExtent = dstExtent3D;
copyRegions.data());
VkCopyBufferToImageInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 };
copyInfo.srcBuffer = tmpBuffer->getSliceHandle().handle;
copyInfo.dstImage = dstImage->handle();
copyInfo.dstImageLayout = dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
copyInfo.regionCount = copyRegions.size();
copyInfo.pRegions = copyRegions.data();
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, &copyInfo);
m_execBarriers.accessImage( m_execBarriers.accessImage(
dstImage, vk::makeSubresourceRange(dstSubresource), dstImage, vk::makeSubresourceRange(dstSubresource),
@ -1517,18 +1527,22 @@ namespace dxvk {
} }
for (uint32_t layer = 0; layer < subresources.layerCount; layer++) { for (uint32_t layer = 0; layer < subresources.layerCount; layer++) {
VkBufferImageCopy region; VkBufferImageCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
region.bufferOffset = zeroHandle.offset; copyRegion.bufferOffset = zeroHandle.offset;
region.bufferRowLength = 0; copyRegion.imageSubresource = vk::makeSubresourceLayers(
region.bufferImageHeight = 0;
region.imageSubresource = vk::makeSubresourceLayers(
vk::pickSubresource(subresources, level, layer)); vk::pickSubresource(subresources, level, layer));
region.imageSubresource.aspectMask = aspect; copyRegion.imageSubresource.aspectMask = aspect;
region.imageOffset = offset; copyRegion.imageOffset = offset;
region.imageExtent = extent; copyRegion.imageExtent = extent;
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, VkCopyBufferToImageInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 };
zeroHandle.handle, image->handle(), clearLayout, 1, &region); copyInfo.srcBuffer = zeroHandle.handle;
copyInfo.dstImage = image->handle();
copyInfo.dstImageLayout = clearLayout;
copyInfo.regionCount = 1;
copyInfo.pRegions = &copyRegion;
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, &copyInfo);
} }
} }
@ -2943,7 +2957,7 @@ namespace dxvk {
auto aspect = vk::getNextAspect(aspects); auto aspect = vk::getNextAspect(aspects);
auto elementSize = formatInfo->elementSize; auto elementSize = formatInfo->elementSize;
VkBufferImageCopy copyRegion = { }; VkBufferImageCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
copyRegion.imageSubresource.aspectMask = aspect; copyRegion.imageSubresource.aspectMask = aspect;
copyRegion.imageSubresource.baseArrayLayer = imageSubresource.baseArrayLayer + i; copyRegion.imageSubresource.baseArrayLayer = imageSubresource.baseArrayLayer + i;
copyRegion.imageSubresource.layerCount = layers; copyRegion.imageSubresource.layerCount = layers;
@ -2979,11 +2993,23 @@ namespace dxvk {
// Perform the actual copy // Perform the actual copy
if constexpr (ToImage) { if constexpr (ToImage) {
m_cmd->cmdCopyBufferToImage(cmd, bufferSlice.handle, VkCopyBufferToImageInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 };
image->handle(), imageLayout, 1, &copyRegion); copyInfo.srcBuffer = bufferSlice.handle;
copyInfo.dstImage = image->handle();
copyInfo.dstImageLayout = imageLayout;
copyInfo.regionCount = 1;
copyInfo.pRegions = &copyRegion;
m_cmd->cmdCopyBufferToImage(cmd, &copyInfo);
} else { } else {
m_cmd->cmdCopyImageToBuffer(cmd, image->handle(), imageLayout, VkCopyImageToBufferInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2 };
bufferSlice.handle, 1, &copyRegion); copyInfo.srcImage = image->handle();
copyInfo.srcImageLayout = imageLayout;
copyInfo.dstBuffer = bufferSlice.handle;
copyInfo.regionCount = 1;
copyInfo.pRegions = &copyRegion;
m_cmd->cmdCopyImageToBuffer(cmd, &copyInfo);
} }
aspectOffset += blockCount.depth * slicePitch; aspectOffset += blockCount.depth * slicePitch;