aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2024-07-25 20:34:30 +0100
committerGitHub <noreply@github.com>2024-07-25 16:34:30 -0300
commitccd330ba0f1aa281725ae03a1dbd5cea744339da (patch)
treec2e8b8f774a11ecc4979f115a86f0ab21fd5d325
parent95d252b7b8d9940be032e6f4e37fba37b2fb9aad (diff)
Vulkan: Add missing barriers for texture to buffer copy (#7092)1.1.1360
This barrier has always been missing, but it only became apparent when #7012 merged. I also added some barriers in case the target buffer used here is used by other commands, though right now it isn't. Fixes a regression where water would turn white on AMD GPUs with the proprietary driver. May fix other issues on this driver.
-rw-r--r--src/Ryujinx.Graphics.Vulkan/TextureView.cs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/TextureView.cs b/src/Ryujinx.Graphics.Vulkan/TextureView.cs
index eb612da7..d4f26a2d 100644
--- a/src/Ryujinx.Graphics.Vulkan/TextureView.cs
+++ b/src/Ryujinx.Graphics.Vulkan/TextureView.cs
@@ -667,8 +667,36 @@ namespace Ryujinx.Graphics.Vulkan
if (PrepareOutputBuffer(cbs, hostSize, buffer, out VkBuffer copyToBuffer, out BufferHolder tempCopyHolder))
{
+ // No barrier necessary, as this is a temporary copy buffer.
offset = 0;
}
+ else
+ {
+ BufferHolder.InsertBufferBarrier(
+ _gd,
+ cbs.CommandBuffer,
+ copyToBuffer,
+ BufferHolder.DefaultAccessFlags,
+ AccessFlags.TransferWriteBit,
+ PipelineStageFlags.AllCommandsBit,
+ PipelineStageFlags.TransferBit,
+ offset,
+ outSize);
+ }
+
+ InsertImageBarrier(
+ _gd.Api,
+ cbs.CommandBuffer,
+ image,
+ TextureStorage.DefaultAccessMask,
+ AccessFlags.TransferReadBit,
+ PipelineStageFlags.AllCommandsBit,
+ PipelineStageFlags.TransferBit,
+ Info.Format.ConvertAspectFlags(),
+ FirstLayer + layer,
+ FirstLevel + level,
+ 1,
+ 1);
CopyFromOrToBuffer(cbs.CommandBuffer, copyToBuffer, image, hostSize, true, layer, level, 1, 1, singleSlice: true, offset, stride);
@@ -677,6 +705,19 @@ namespace Ryujinx.Graphics.Vulkan
CopyDataToOutputBuffer(cbs, tempCopyHolder, autoBuffer, hostSize, range.Offset);
tempCopyHolder.Dispose();
}
+ else
+ {
+ BufferHolder.InsertBufferBarrier(
+ _gd,
+ cbs.CommandBuffer,
+ copyToBuffer,
+ AccessFlags.TransferWriteBit,
+ BufferHolder.DefaultAccessFlags,
+ PipelineStageFlags.TransferBit,
+ PipelineStageFlags.AllCommandsBit,
+ offset,
+ outSize);
+ }
}
private ReadOnlySpan<byte> GetData(CommandBufferPool cbp, PersistentFlushBuffer flushBuffer)