From 20000703306da9b9dc529fce6fe77c27489efc2a Mon Sep 17 00:00:00 2001 From: riperiperi Date: Thu, 26 May 2022 20:49:06 +0100 Subject: [PATCH] Flush queries on attachment change rather than program change Occlusion queries are usually used in a depth only pass so the attachments changing is a better indication of the query block ending. Write mask changes are also considered since some games do depth only pass by setting 0 write mask on all the colour targets. --- Ryujinx.Graphics.Vulkan/PipelineBase.cs | 17 +++++++++++++++-- Ryujinx.Graphics.Vulkan/PipelineFull.cs | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/Ryujinx.Graphics.Vulkan/PipelineBase.cs index 75da2163e..287218ed2 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -45,6 +45,7 @@ namespace Ryujinx.Graphics.Vulkan protected FramebufferParams FramebufferParams; private Auto _framebuffer; private Auto _renderPass; + private int _writtenAttachmentCount; private bool _renderPassActive; private readonly DescriptorSetUpdater _descriptorSetUpdater; @@ -598,10 +599,9 @@ namespace Ryujinx.Graphics.Vulkan stages.CopyTo(_newState.Stages.ToSpan().Slice(0, stages.Length)); SignalStateChange(); - SignalProgramChange(); } - protected virtual void SignalProgramChange() + protected virtual void SignalAttachmentChange() { } @@ -614,15 +614,27 @@ namespace Ryujinx.Graphics.Vulkan public void SetRenderTargetColorMasks(ReadOnlySpan componentMask) { int count = Math.Min(Constants.MaxRenderTargets, componentMask.Length); + int writtenAttachments = 0; for (int i = 0; i < count; i++) { ref var vkBlend = ref _newState.Internal.ColorBlendAttachmentState[i]; vkBlend.ColorWriteMask = (ColorComponentFlags)componentMask[i]; + + if (componentMask[i] != 0) + { + writtenAttachments++; + } } SignalStateChange(); + + if (writtenAttachments != _writtenAttachmentCount) + { + SignalAttachmentChange(); + _writtenAttachmentCount = writtenAttachments; + } } public void SetRenderTargets(ITexture[] colors, ITexture depthStencil) @@ -631,6 +643,7 @@ namespace Ryujinx.Graphics.Vulkan CreateFramebuffer(colors, depthStencil); CreateRenderPass(); SignalStateChange(); + SignalAttachmentChange(); } public void SetRenderTargetScale(float scale) diff --git a/Ryujinx.Graphics.Vulkan/PipelineFull.cs b/Ryujinx.Graphics.Vulkan/PipelineFull.cs index 7a9465626..ea6a13f8e 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineFull.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineFull.cs @@ -384,7 +384,7 @@ namespace Ryujinx.Graphics.Vulkan _hasPendingQuery = true; } - protected override void SignalProgramChange() + protected override void SignalAttachmentChange() { FlushPendingQuery(); }