mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-21 22:54:16 +01:00
[dxvk] Use new barrier helpers in copyPackedBufferImage
This commit is contained in:
parent
3ecca3d171
commit
826114f612
@ -631,13 +631,6 @@ namespace dxvk {
|
|||||||
this->spillRenderPass(true);
|
this->spillRenderPass(true);
|
||||||
this->invalidateState();
|
this->invalidateState();
|
||||||
|
|
||||||
auto dstBufferSlice = dstBuffer->getSliceHandle(dstBufferOffset, elementSize * util::flattenImageExtent(dstSize));
|
|
||||||
auto srcBufferSlice = srcBuffer->getSliceHandle(srcBufferOffset, elementSize * util::flattenImageExtent(srcSize));
|
|
||||||
|
|
||||||
if (m_execBarriers.isBufferDirty(dstBufferSlice, DxvkAccess::Write)
|
|
||||||
|| m_execBarriers.isBufferDirty(srcBufferSlice, DxvkAccess::Read))
|
|
||||||
m_execBarriers.recordCommands(m_cmd);
|
|
||||||
|
|
||||||
// We'll use texel buffer views with an appropriately
|
// We'll use texel buffer views with an appropriately
|
||||||
// sized integer format to perform the copy
|
// sized integer format to perform the copy
|
||||||
VkFormat format = VK_FORMAT_UNDEFINED;
|
VkFormat format = VK_FORMAT_UNDEFINED;
|
||||||
@ -659,21 +652,24 @@ namespace dxvk {
|
|||||||
DxvkBufferViewKey viewInfo;
|
DxvkBufferViewKey viewInfo;
|
||||||
viewInfo.format = format;
|
viewInfo.format = format;
|
||||||
viewInfo.offset = dstBufferOffset;
|
viewInfo.offset = dstBufferOffset;
|
||||||
viewInfo.size = dstBufferSlice.length;
|
viewInfo.size = elementSize * util::flattenImageExtent(dstSize);
|
||||||
viewInfo.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
|
viewInfo.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
|
||||||
Rc<DxvkBufferView> dstView = dstBuffer->createView(viewInfo);
|
Rc<DxvkBufferView> dstView = dstBuffer->createView(viewInfo);
|
||||||
|
|
||||||
viewInfo.offset = srcBufferOffset;
|
viewInfo.offset = srcBufferOffset;
|
||||||
viewInfo.size = srcBufferSlice.length;
|
viewInfo.size = elementSize * util::flattenImageExtent(srcSize);
|
||||||
viewInfo.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
viewInfo.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
||||||
Rc<DxvkBufferView> srcView;
|
Rc<DxvkBufferView> srcView = srcBuffer->createView(viewInfo);
|
||||||
|
|
||||||
|
flushPendingAccesses(*dstView, DxvkAccess::Write);
|
||||||
|
flushPendingAccesses(*srcView, DxvkAccess::Read);
|
||||||
|
|
||||||
if (srcBuffer == dstBuffer
|
if (srcBuffer == dstBuffer
|
||||||
&& srcBufferSlice.offset < dstBufferSlice.offset + dstBufferSlice.length
|
&& srcView->info().offset < dstView->info().offset + dstView->info().size
|
||||||
&& srcBufferSlice.offset + srcBufferSlice.length > dstBufferSlice.offset) {
|
&& srcView->info().offset + srcView->info().size > dstView->info().offset) {
|
||||||
// Create temporary copy in case of overlapping regions
|
// Create temporary copy in case of overlapping regions
|
||||||
DxvkBufferCreateInfo bufferInfo;
|
DxvkBufferCreateInfo bufferInfo;
|
||||||
bufferInfo.size = srcBufferSlice.length;
|
bufferInfo.size = srcView->info().size;
|
||||||
bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT
|
bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT
|
||||||
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
||||||
bufferInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT
|
bufferInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT
|
||||||
@ -683,6 +679,7 @@ namespace dxvk {
|
|||||||
Rc<DxvkBuffer> tmpBuffer = m_device->createBuffer(bufferInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
Rc<DxvkBuffer> tmpBuffer = m_device->createBuffer(bufferInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||||
|
|
||||||
auto tmpBufferSlice = tmpBuffer->getSliceHandle();
|
auto tmpBufferSlice = tmpBuffer->getSliceHandle();
|
||||||
|
auto srcBufferSlice = srcView->getSliceHandle();
|
||||||
|
|
||||||
VkBufferCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_COPY_2 };
|
VkBufferCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_COPY_2 };
|
||||||
copyRegion.srcOffset = srcBufferSlice.offset;
|
copyRegion.srcOffset = srcBufferSlice.offset;
|
||||||
@ -707,8 +704,6 @@ namespace dxvk {
|
|||||||
srcView = tmpBuffer->createView(viewInfo);
|
srcView = tmpBuffer->createView(viewInfo);
|
||||||
|
|
||||||
m_cmd->trackResource<DxvkAccess::Write>(tmpBuffer);
|
m_cmd->trackResource<DxvkAccess::Write>(tmpBuffer);
|
||||||
} else {
|
|
||||||
srcView = srcBuffer->createView(viewInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pipeInfo = m_common->metaCopy().getCopyFormattedBufferPipeline();
|
auto pipeInfo = m_common->metaCopy().getCopyFormattedBufferPipeline();
|
||||||
@ -762,19 +757,11 @@ namespace dxvk {
|
|||||||
(extent.height + 7) / 8,
|
(extent.height + 7) / 8,
|
||||||
extent.depth);
|
extent.depth);
|
||||||
|
|
||||||
m_execBarriers.accessBuffer(
|
accessBuffer(DxvkCmdBuffer::ExecBuffer, *dstView,
|
||||||
dstView->getSliceHandle(),
|
VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT);
|
||||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
|
||||||
VK_ACCESS_SHADER_WRITE_BIT,
|
|
||||||
dstBuffer->info().stages,
|
|
||||||
dstBuffer->info().access);
|
|
||||||
|
|
||||||
m_execBarriers.accessBuffer(
|
accessBuffer(DxvkCmdBuffer::ExecBuffer, *srcView,
|
||||||
srcView->getSliceHandle(),
|
VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT);
|
||||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
|
||||||
VK_ACCESS_SHADER_READ_BIT,
|
|
||||||
srcBuffer->info().stages,
|
|
||||||
srcBuffer->info().access);
|
|
||||||
|
|
||||||
// Track all involved resources
|
// Track all involved resources
|
||||||
m_cmd->trackResource<DxvkAccess::Write>(dstBuffer);
|
m_cmd->trackResource<DxvkAccess::Write>(dstBuffer);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user