Use dynamic state for primitive topology if dynamicPrimitiveTopologyUnrestricted is supported.

This commit is contained in:
sunshineinabox 2024-05-22 09:45:50 -07:00
parent dcc999c798
commit 89dee194d2
4 changed files with 77 additions and 5 deletions

View file

@ -65,6 +65,8 @@ namespace Ryujinx.Graphics.Vulkan
private bool _primitiveRestartEnable;
public PrimitiveTopology Topology;
[Flags]
private enum DirtyFlags
{
@ -89,10 +91,11 @@ namespace Ryujinx.Graphics.Vulkan
PatchControlPoints = 1 << 17,
DepthMode = 1 << 18,
PrimitiveRestart = 1 << 19,
PrimitiveTopology = 1 << 20,
Standard = Blend | DepthBias | Scissor | Stencil | Viewport | LineWidth,
Extended = CullMode | FrontFace | DepthTestBool | DepthTestCompareOp | StencilTestEnable,
Extended2 = RasterDiscard | LogicOp | PatchControlPoints | PrimitiveRestart,
Extended3 = DepthClampEnable | LogicOpEnable | AlphaToCover | AlphaToOne | DepthMode,
Extended3 = DepthClampEnable | LogicOpEnable | AlphaToCover | AlphaToOne | DepthMode | PrimitiveTopology,
}
private DirtyFlags _dirty;
@ -218,6 +221,12 @@ namespace Ryujinx.Graphics.Vulkan
_dirty |= DirtyFlags.PrimitiveRestart;
}
public void SetPrimitiveTopology(PrimitiveTopology topology)
{
Topology = topology;
_dirty |= DirtyFlags.PrimitiveTopology;
}
public void SetLogicOp(LogicOp op)
{
_logicOp = op;
@ -318,6 +327,11 @@ namespace Ryujinx.Graphics.Vulkan
{
_dirty &= ~DirtyFlags.DepthMode;
}
if (!gd.SupportsUnrestrictedDynamicTopology)
{
_dirty &= ~DirtyFlags.PrimitiveTopology;
}
}
public void ReplayIfDirty(VulkanRenderer gd, CommandBuffer commandBuffer)
@ -387,6 +401,11 @@ namespace Ryujinx.Graphics.Vulkan
RecordPrimitiveRestartEnable(gd, commandBuffer);
}
if (_dirty.HasFlag(DirtyFlags.PrimitiveTopology))
{
RecordPrimitiveRestartEnable(gd, commandBuffer);
}
if (_dirty.HasFlag(DirtyFlags.LogicOp))
{
RecordLogicOp(gd, commandBuffer);
@ -422,6 +441,11 @@ namespace Ryujinx.Graphics.Vulkan
RecordDepthMode(gd, commandBuffer);
}
if (_dirty.HasFlag(DirtyFlags.PrimitiveTopology))
{
RecordPrimitiveTopology(gd, commandBuffer);
}
_dirty = DirtyFlags.None;
}
@ -538,6 +562,11 @@ namespace Ryujinx.Graphics.Vulkan
gd.ExtendedDynamicState2Api.CmdSetPrimitiveRestartEnable(commandBuffer, _primitiveRestartEnable);
}
private readonly void RecordPrimitiveTopology(VulkanRenderer gd, CommandBuffer commandBuffer)
{
gd.ExtendedDynamicStateApi.CmdSetPrimitiveTopology(commandBuffer, Topology);
}
private readonly void RecordLogicOp(VulkanRenderer gd, CommandBuffer commandBuffer)
{
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3LogicOpEnable && !_logicOpEnable)