mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-02 11:52:10 +01:00
[dxvk] Use out-of-order transfer helper in copyBufferToImage
This commit is contained in:
parent
c402c62fde
commit
9941c3e8ca
@ -2834,14 +2834,11 @@ namespace dxvk {
|
|||||||
VkDeviceSize bufferOffset,
|
VkDeviceSize bufferOffset,
|
||||||
VkDeviceSize bufferRowAlignment,
|
VkDeviceSize bufferRowAlignment,
|
||||||
VkDeviceSize bufferSliceAlignment) {
|
VkDeviceSize bufferSliceAlignment) {
|
||||||
this->spillRenderPass(true);
|
DxvkCmdBuffer cmdBuffer = DxvkCmdBuffer::InitBuffer;
|
||||||
this->prepareImage(image, vk::makeSubresourceRange(imageSubresource));
|
|
||||||
|
|
||||||
VkDeviceSize dataSize = imageSubresource.layerCount * util::computeImageDataSize(
|
VkDeviceSize dataSize = imageSubresource.layerCount * util::computeImageDataSize(
|
||||||
image->info().format, imageExtent, imageSubresource.aspectMask);
|
image->info().format, imageExtent, imageSubresource.aspectMask);
|
||||||
|
|
||||||
auto bufferSlice = buffer->getSliceHandle(bufferOffset, dataSize);
|
|
||||||
|
|
||||||
// We may copy to only one aspect at a time, but pipeline
|
// We may copy to only one aspect at a time, but pipeline
|
||||||
// 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();
|
||||||
@ -2849,26 +2846,35 @@ namespace dxvk {
|
|||||||
auto dstSubresourceRange = vk::makeSubresourceRange(imageSubresource);
|
auto dstSubresourceRange = vk::makeSubresourceRange(imageSubresource);
|
||||||
dstSubresourceRange.aspectMask = dstFormatInfo->aspectMask;
|
dstSubresourceRange.aspectMask = dstFormatInfo->aspectMask;
|
||||||
|
|
||||||
|
if (!prepareOutOfOrderTransfer(buffer, bufferOffset, dataSize, DxvkAccess::Read)
|
||||||
|
|| !prepareOutOfOrderTransfer(image, DxvkAccess::Write)) {
|
||||||
|
spillRenderPass(true);
|
||||||
|
prepareImage(image, vk::makeSubresourceRange(imageSubresource));
|
||||||
|
|
||||||
flushPendingAccesses(*image, dstSubresourceRange, DxvkAccess::Write);
|
flushPendingAccesses(*image, dstSubresourceRange, DxvkAccess::Write);
|
||||||
flushPendingAccesses(*buffer, bufferOffset, dataSize, DxvkAccess::Read);
|
flushPendingAccesses(*buffer, bufferOffset, dataSize, DxvkAccess::Read);
|
||||||
|
|
||||||
|
cmdBuffer = DxvkCmdBuffer::ExecBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto bufferSlice = buffer->getSliceHandle(bufferOffset, dataSize);
|
||||||
|
|
||||||
// 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, dstSubresourceRange, 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(DxvkCmdBuffer::ExecBuffer);
|
flushImageLayoutTransitions(cmdBuffer);
|
||||||
|
|
||||||
this->copyImageBufferData<true>(DxvkCmdBuffer::ExecBuffer,
|
copyImageBufferData<true>(cmdBuffer,
|
||||||
image, imageSubresource, imageOffset, imageExtent, dstImageLayoutTransfer,
|
image, imageSubresource, imageOffset, imageExtent, dstImageLayoutTransfer,
|
||||||
bufferSlice, bufferRowAlignment, bufferSliceAlignment);
|
bufferSlice, bufferRowAlignment, bufferSliceAlignment);
|
||||||
|
|
||||||
accessImage(DxvkCmdBuffer::ExecBuffer,
|
accessImage(cmdBuffer, *image, dstSubresourceRange, dstImageLayoutTransfer,
|
||||||
*image, dstSubresourceRange, 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);
|
||||||
|
|
||||||
accessBuffer(DxvkCmdBuffer::ExecBuffer, *buffer, bufferOffset, dataSize,
|
accessBuffer(cmdBuffer, *buffer, bufferOffset, dataSize,
|
||||||
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT);
|
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_READ_BIT);
|
||||||
|
|
||||||
m_cmd->track(image, DxvkAccess::Write);
|
m_cmd->track(image, DxvkAccess::Write);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user