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:
parent
23846ad577
commit
0ba741b7d2
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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, ©Info);
|
||||||
|
|
||||||
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, ®ion);
|
copyInfo.srcBuffer = zeroHandle.handle;
|
||||||
|
copyInfo.dstImage = image->handle();
|
||||||
|
copyInfo.dstImageLayout = clearLayout;
|
||||||
|
copyInfo.regionCount = 1;
|
||||||
|
copyInfo.pRegions = ©Region;
|
||||||
|
|
||||||
|
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, ©Info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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, ©Region);
|
copyInfo.srcBuffer = bufferSlice.handle;
|
||||||
|
copyInfo.dstImage = image->handle();
|
||||||
|
copyInfo.dstImageLayout = imageLayout;
|
||||||
|
copyInfo.regionCount = 1;
|
||||||
|
copyInfo.pRegions = ©Region;
|
||||||
|
|
||||||
|
m_cmd->cmdCopyBufferToImage(cmd, ©Info);
|
||||||
} else {
|
} else {
|
||||||
m_cmd->cmdCopyImageToBuffer(cmd, image->handle(), imageLayout,
|
VkCopyImageToBufferInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2 };
|
||||||
bufferSlice.handle, 1, ©Region);
|
copyInfo.srcImage = image->handle();
|
||||||
|
copyInfo.srcImageLayout = imageLayout;
|
||||||
|
copyInfo.dstBuffer = bufferSlice.handle;
|
||||||
|
copyInfo.regionCount = 1;
|
||||||
|
copyInfo.pRegions = ©Region;
|
||||||
|
|
||||||
|
m_cmd->cmdCopyImageToBuffer(cmd, ©Info);
|
||||||
}
|
}
|
||||||
|
|
||||||
aspectOffset += blockCount.depth * slicePitch;
|
aspectOffset += blockCount.depth * slicePitch;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user