From 9719b6a1129c017d96532ff026e2bb933c0b2d0b Mon Sep 17 00:00:00 2001 From: riperiperi Date: Wed, 26 Oct 2022 00:49:23 +0100 Subject: Vulkan: Use dynamic state for blend constants (#3793) --- Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs | 33 +++++++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs') diff --git a/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs b/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs index 4f73b17b..ae29be51 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs @@ -19,21 +19,34 @@ namespace Ryujinx.Graphics.Vulkan private uint _frontWriteMask; private uint _frontReference; + private Array4 _blendConstants; + public int ViewportsCount; public Array16 Viewports; private enum DirtyFlags { None = 0, - DepthBias = 1 << 0, - Scissor = 1 << 1, - Stencil = 1 << 2, - Viewport = 1 << 3, - All = DepthBias | Scissor | Stencil | Viewport + Blend = 1 << 0, + DepthBias = 1 << 1, + Scissor = 1 << 2, + Stencil = 1 << 3, + Viewport = 1 << 4, + All = Blend | DepthBias | Scissor | Stencil | Viewport } private DirtyFlags _dirty; + public void SetBlendConstants(float r, float g, float b, float a) + { + _blendConstants[0] = r; + _blendConstants[1] = g; + _blendConstants[2] = b; + _blendConstants[3] = a; + + _dirty |= DirtyFlags.Blend; + } + public void SetDepthBias(float slopeFactor, float constantFactor, float clamp) { _depthBiasSlopeFactor = slopeFactor; @@ -87,6 +100,11 @@ namespace Ryujinx.Graphics.Vulkan public void ReplayIfDirty(Vk api, CommandBuffer commandBuffer) { + if (_dirty.HasFlag(DirtyFlags.Blend)) + { + RecordBlend(api, commandBuffer); + } + if (_dirty.HasFlag(DirtyFlags.DepthBias)) { RecordDepthBias(api, commandBuffer); @@ -110,6 +128,11 @@ namespace Ryujinx.Graphics.Vulkan _dirty = DirtyFlags.None; } + private void RecordBlend(Vk api, CommandBuffer commandBuffer) + { + api.CmdSetBlendConstants(commandBuffer, _blendConstants.AsSpan()); + } + private void RecordDepthBias(Vk api, CommandBuffer commandBuffer) { api.CmdSetDepthBias(commandBuffer, _depthBiasConstantFactor, _depthBiasClamp, _depthBiasSlopeFactor); -- cgit v1.2.3