Use dynamic state for primitive topology if dynamicPrimitiveTopologyUnrestricted is supported.
This commit is contained in:
parent
dcc999c798
commit
89dee194d2
4 changed files with 77 additions and 5 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue