aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs b/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs
index a6a006bb9..bcfb3dbfe 100644
--- a/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs
+++ b/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs
@@ -32,10 +32,12 @@ namespace Ryujinx.Graphics.Vulkan
32 CommandBuffer 32 CommandBuffer
33 } 33 }
34 34
35 private bool _feedbackLoopActive;
35 private PipelineStageFlags _incoherentBufferWriteStages; 36 private PipelineStageFlags _incoherentBufferWriteStages;
36 private PipelineStageFlags _incoherentTextureWriteStages; 37 private PipelineStageFlags _incoherentTextureWriteStages;
37 private PipelineStageFlags _extraStages; 38 private PipelineStageFlags _extraStages;
38 private IncoherentBarrierType _queuedIncoherentBarrier; 39 private IncoherentBarrierType _queuedIncoherentBarrier;
40 private bool _queuedFeedbackLoopBarrier;
39 41
40 public BarrierBatch(VulkanRenderer gd) 42 public BarrierBatch(VulkanRenderer gd)
41 { 43 {
@@ -53,17 +55,6 @@ namespace Ryujinx.Graphics.Vulkan
53 stages |= PipelineStageFlags.TransformFeedbackBitExt; 55 stages |= PipelineStageFlags.TransformFeedbackBitExt;
54 } 56 }
55 57
56 if (!gd.IsTBDR)
57 {
58 // Desktop GPUs can transform image barriers into memory barriers.
59
60 access |= AccessFlags.DepthStencilAttachmentWriteBit | AccessFlags.ColorAttachmentWriteBit;
61 access |= AccessFlags.DepthStencilAttachmentReadBit | AccessFlags.ColorAttachmentReadBit;
62
63 stages |= PipelineStageFlags.EarlyFragmentTestsBit | PipelineStageFlags.LateFragmentTestsBit;
64 stages |= PipelineStageFlags.ColorAttachmentOutputBit;
65 }
66
67 return (access, stages); 58 return (access, stages);
68 } 59 }
69 60
@@ -178,16 +169,34 @@ namespace Ryujinx.Graphics.Vulkan
178 } 169 }
179 170
180 _queuedIncoherentBarrier = IncoherentBarrierType.None; 171 _queuedIncoherentBarrier = IncoherentBarrierType.None;
172 _queuedFeedbackLoopBarrier = false;
181 } 173 }
174 else if (_feedbackLoopActive && _queuedFeedbackLoopBarrier)
175 {
176 // Feedback loop barrier.
177
178 MemoryBarrier barrier = new MemoryBarrier()
179 {
180 SType = StructureType.MemoryBarrier,
181 SrcAccessMask = AccessFlags.ShaderWriteBit,
182 DstAccessMask = AccessFlags.ShaderReadBit
183 };
184
185 QueueBarrier(barrier, PipelineStageFlags.FragmentShaderBit, PipelineStageFlags.AllGraphicsBit);
186
187 _queuedFeedbackLoopBarrier = false;
188 }
189
190 _feedbackLoopActive = false;
182 } 191 }
183 } 192 }
184 193
185 public unsafe void Flush(CommandBufferScoped cbs, bool inRenderPass, RenderPassHolder rpHolder, Action endRenderPass) 194 public unsafe void Flush(CommandBufferScoped cbs, bool inRenderPass, RenderPassHolder rpHolder, Action endRenderPass)
186 { 195 {
187 Flush(cbs, null, inRenderPass, rpHolder, endRenderPass); 196 Flush(cbs, null, false, inRenderPass, rpHolder, endRenderPass);
188 } 197 }
189 198
190 public unsafe void Flush(CommandBufferScoped cbs, ShaderCollection program, bool inRenderPass, RenderPassHolder rpHolder, Action endRenderPass) 199 public unsafe void Flush(CommandBufferScoped cbs, ShaderCollection program, bool feedbackLoopActive, bool inRenderPass, RenderPassHolder rpHolder, Action endRenderPass)
191 { 200 {
192 if (program != null) 201 if (program != null)
193 { 202 {
@@ -195,6 +204,8 @@ namespace Ryujinx.Graphics.Vulkan
195 _incoherentTextureWriteStages |= program.IncoherentTextureWriteStages; 204 _incoherentTextureWriteStages |= program.IncoherentTextureWriteStages;
196 } 205 }
197 206
207 _feedbackLoopActive |= feedbackLoopActive;
208
198 FlushMemoryBarrier(program, inRenderPass); 209 FlushMemoryBarrier(program, inRenderPass);
199 210
200 if (!inRenderPass && rpHolder != null) 211 if (!inRenderPass && rpHolder != null)
@@ -406,6 +417,8 @@ namespace Ryujinx.Graphics.Vulkan
406 { 417 {
407 _queuedIncoherentBarrier = type; 418 _queuedIncoherentBarrier = type;
408 } 419 }
420
421 _queuedFeedbackLoopBarrier = true;
409 } 422 }
410 423
411 public void QueueTextureBarrier() 424 public void QueueTextureBarrier()