diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs | 39 |
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() |