diff --git a/Ryujinx.Graphics.Vulkan/BufferHolder.cs b/Ryujinx.Graphics.Vulkan/BufferHolder.cs index 24f789f623..f5c478db76 100644 --- a/Ryujinx.Graphics.Vulkan/BufferHolder.cs +++ b/Ryujinx.Graphics.Vulkan/BufferHolder.cs @@ -210,7 +210,10 @@ namespace Ryujinx.Graphics.Vulkan } } - if (cbs != null && !(_buffer.HasCommandBufferDependency(cbs.Value) && _waitable.IsBufferRangeInUse(cbs.Value.CommandBufferIndex, offset, dataSize))) + if (cbs != null && + _gd.PipelineInternal.RenderPassActive && + !(_buffer.HasCommandBufferDependency(cbs.Value) && + _waitable.IsBufferRangeInUse(cbs.Value.CommandBufferIndex, offset, dataSize))) { // If the buffer hasn't been used on the command buffer yet, try to preload the data. // This avoids ending and beginning render passes on each buffer data upload. diff --git a/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/Ryujinx.Graphics.Vulkan/PipelineBase.cs index 55c3fea228..4efe61bf38 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -49,7 +49,6 @@ namespace Ryujinx.Graphics.Vulkan private Auto _framebuffer; private Auto _renderPass; private int _writtenAttachmentCount; - private bool _renderPassActive; private readonly DescriptorSetUpdater _descriptorSetUpdater; @@ -73,6 +72,7 @@ namespace Ryujinx.Graphics.Vulkan private PipelineColorBlendAttachmentState[] _storedBlend; public ulong DrawCount { get; private set; } + public bool RenderPassActive { get; private set; } public unsafe PipelineBase(VulkanRenderer gd, Device device) { @@ -838,6 +838,11 @@ namespace Ryujinx.Graphics.Vulkan stages.CopyTo(_newState.Stages.AsSpan().Slice(0, stages.Length)); SignalStateChange(); + + if (_program.IsCompute) + { + EndRenderPass(); + } } public void Specialize(in T data) where T : unmanaged @@ -1451,7 +1456,7 @@ namespace Ryujinx.Graphics.Vulkan private unsafe void BeginRenderPass() { - if (!_renderPassActive) + if (!RenderPassActive) { var renderArea = new Rect2D(null, new Extent2D(FramebufferParams.Width, FramebufferParams.Height)); var clearValue = new ClearValue(); @@ -1467,18 +1472,18 @@ namespace Ryujinx.Graphics.Vulkan }; Gd.Api.CmdBeginRenderPass(CommandBuffer, renderPassBeginInfo, SubpassContents.Inline); - _renderPassActive = true; + RenderPassActive = true; } } public void EndRenderPass() { - if (_renderPassActive) + if (RenderPassActive) { PauseTransformFeedbackInternal(); Gd.Api.CmdEndRenderPass(CommandBuffer); SignalRenderPassEnd(); - _renderPassActive = false; + RenderPassActive = false; } } diff --git a/Ryujinx.Graphics.Vulkan/ShaderCollection.cs b/Ryujinx.Graphics.Vulkan/ShaderCollection.cs index ab0ea2e959..bf2874d7cd 100644 --- a/Ryujinx.Graphics.Vulkan/ShaderCollection.cs +++ b/Ryujinx.Graphics.Vulkan/ShaderCollection.cs @@ -19,6 +19,7 @@ namespace Ryujinx.Graphics.Vulkan public bool HasMinimalLayout { get; } public bool UsePushDescriptors { get; } + public bool IsCompute { get; } public uint Stages { get; } @@ -47,7 +48,6 @@ namespace Ryujinx.Graphics.Vulkan private VulkanRenderer _gd; private Device _device; private bool _initialized; - private bool _isCompute; private ProgramPipelineState _state; private DisposableRenderPass _dummyRenderPass; @@ -91,7 +91,7 @@ namespace Ryujinx.Graphics.Vulkan if (shader.StageFlags == ShaderStageFlags.ShaderStageComputeBit) { - _isCompute = true; + IsCompute = true; } internalShaders[i] = shader; @@ -163,7 +163,7 @@ namespace Ryujinx.Graphics.Vulkan try { - if (_isCompute) + if (IsCompute) { CreateBackgroundComputePipeline(); }