1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-14 22:29:15 +01:00

[dxvk] Use granular image access tracking in copyBufferToImageHw

This commit is contained in:
Philip Rebohle 2025-03-01 02:47:23 +01:00
parent e49733f36d
commit e280b137c6

View File

@ -3435,15 +3435,15 @@ namespace dxvk {
// barriers need to have all available aspect bits set // barriers need to have all available aspect bits set
auto dstFormatInfo = image->formatInfo(); auto dstFormatInfo = image->formatInfo();
auto dstSubresourceRange = vk::makeSubresourceRange(imageSubresource); auto dstSubresource = imageSubresource;
dstSubresourceRange.aspectMask = dstFormatInfo->aspectMask; dstSubresource.aspectMask = dstFormatInfo->aspectMask;
if (!prepareOutOfOrderTransfer(buffer, bufferOffset, dataSize, DxvkAccess::Read) if (!prepareOutOfOrderTransfer(buffer, bufferOffset, dataSize, DxvkAccess::Read)
|| !prepareOutOfOrderTransfer(image, DxvkAccess::Write)) { || !prepareOutOfOrderTransfer(image, DxvkAccess::Write)) {
spillRenderPass(true); spillRenderPass(true);
prepareImage(image, vk::makeSubresourceRange(imageSubresource)); prepareImage(image, vk::makeSubresourceRange(imageSubresource));
flushPendingAccesses(*image, dstSubresourceRange, DxvkAccess::Write); flushPendingAccesses(*image, dstSubresource, imageOffset, imageExtent, DxvkAccess::Write);
flushPendingAccesses(*buffer, bufferOffset, dataSize, DxvkAccess::Read); flushPendingAccesses(*buffer, bufferOffset, dataSize, DxvkAccess::Read);
cmdBuffer = DxvkCmdBuffer::ExecBuffer; cmdBuffer = DxvkCmdBuffer::ExecBuffer;
@ -3454,7 +3454,7 @@ namespace dxvk {
// Initialize the image if the entire subresource is covered // Initialize the image if the entire subresource is covered
VkImageLayout dstImageLayoutTransfer = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VkImageLayout dstImageLayoutTransfer = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
addImageLayoutTransition(*image, dstSubresourceRange, dstImageLayoutTransfer, addImageLayoutTransition(*image, vk::makeSubresourceRange(dstSubresource), dstImageLayoutTransfer,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT,
image->isFullSubresource(imageSubresource, imageExtent)); image->isFullSubresource(imageSubresource, imageExtent));
flushImageLayoutTransitions(cmdBuffer); flushImageLayoutTransitions(cmdBuffer);
@ -3463,7 +3463,7 @@ namespace dxvk {
image, imageSubresource, imageOffset, imageExtent, dstImageLayoutTransfer, image, imageSubresource, imageOffset, imageExtent, dstImageLayoutTransfer,
bufferSlice, bufferRowAlignment, bufferSliceAlignment); bufferSlice, bufferRowAlignment, bufferSliceAlignment);
accessImage(cmdBuffer, *image, dstSubresourceRange, dstImageLayoutTransfer, accessImageRegion(cmdBuffer, *image, dstSubresource, imageOffset, imageExtent, dstImageLayoutTransfer,
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, DxvkAccessOp::None); VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, DxvkAccessOp::None);
accessBuffer(cmdBuffer, *buffer, bufferOffset, dataSize, accessBuffer(cmdBuffer, *buffer, bufferOffset, dataSize,