Resolve issue with primitive toplogy

Primitive Restart Enable should depend on Extended dynamic state 2 extension not 1

Resolve Primitive restart enable

Fix MoltenVK crash
This commit is contained in:
sunshineinabox 2024-08-03 19:47:08 -07:00
parent 3b398adbe6
commit c53f58a4a9
3 changed files with 27 additions and 33 deletions

View file

@ -669,9 +669,9 @@ namespace Ryujinx.Graphics.Vulkan
if (_supportExtDynamic) if (_supportExtDynamic)
{ {
if (oldTopology.ConvertToClass() != _newState.TopologyClass.ConvertToClass()) if (oldTopology.ConvertToClass() != _newState.Topology.ConvertToClass())
{ {
_newState.TopologyClass = _newState.TopologyClass.ConvertToClass(); _newState.Topology = oldTopology;
} }
DynamicState.SetCullMode(oldCullMode); DynamicState.SetCullMode(oldCullMode);
@ -686,9 +686,8 @@ namespace Ryujinx.Graphics.Vulkan
_newState.DepthTestEnable = oldDepthTestEnable; _newState.DepthTestEnable = oldDepthTestEnable;
_newState.DepthWriteEnable = oldDepthWriteEnable; _newState.DepthWriteEnable = oldDepthWriteEnable;
_newState.ViewportsCount = oldViewportsCount; _newState.ViewportsCount = oldViewportsCount;
}
_newState.Topology = oldTopology; _newState.Topology = oldTopology;
}
DynamicState.SetViewports(ref oldViewports, oldViewportsCount); DynamicState.SetViewports(ref oldViewports, oldViewportsCount);
@ -1072,15 +1071,17 @@ namespace Ryujinx.Graphics.Vulkan
{ {
var newTopologyClass = vkTopology.ConvertToClass(); var newTopologyClass = vkTopology.ConvertToClass();
if ((_newState.TopologyClass != newTopologyClass)) if ((_newState.Topology.ConvertToClass() != newTopologyClass))
{ {
_newState.TopologyClass = newTopologyClass; _newState.Topology = vkTopology;
} }
DynamicState.SetPrimitiveTopology(vkTopology); DynamicState.SetPrimitiveTopology(vkTopology);
} }
else
{
_newState.Topology = vkTopology; _newState.Topology = vkTopology;
}
SignalStateChange(); SignalStateChange();
} }

View file

@ -53,7 +53,7 @@ namespace Ryujinx.Graphics.Vulkan
private uint _patchControlPoints; private uint _patchControlPoints;
public PrimitiveTopology Topology; private PrimitiveTopology _topology;
private bool _primitiveRestartEnable; private bool _primitiveRestartEnable;
@ -78,7 +78,7 @@ namespace Ryujinx.Graphics.Vulkan
PrimitiveRestart = 1 << 14, PrimitiveRestart = 1 << 14,
PrimitiveTopology = 1 << 15, PrimitiveTopology = 1 << 15,
DepthBiasEnable = 1 << 16, DepthBiasEnable = 1 << 16,
Standard = Blend | DepthBias | Scissor | Stencil | Viewport | LineWidth, Standard = Blend | DepthBias | Scissor | Stencil | Viewport,
Extended = CullMode | FrontFace | DepthTestBool | DepthTestCompareOp | StencilTestEnableandStencilOp | PrimitiveTopology, Extended = CullMode | FrontFace | DepthTestBool | DepthTestCompareOp | StencilTestEnableandStencilOp | PrimitiveTopology,
Extended2 = RasterDiscard | PrimitiveRestart | DepthBiasEnable, Extended2 = RasterDiscard | PrimitiveRestart | DepthBiasEnable,
} }
@ -217,7 +217,7 @@ namespace Ryujinx.Graphics.Vulkan
public void SetPrimitiveTopology(PrimitiveTopology primitiveTopology) public void SetPrimitiveTopology(PrimitiveTopology primitiveTopology)
{ {
Topology = primitiveTopology; _topology = primitiveTopology;
_dirty |= DirtyFlags.PrimitiveTopology; _dirty |= DirtyFlags.PrimitiveTopology;
} }
@ -460,7 +460,7 @@ namespace Ryujinx.Graphics.Vulkan
private readonly void RecordPrimitiveTopology(VulkanRenderer gd, CommandBuffer commandBuffer) private readonly void RecordPrimitiveTopology(VulkanRenderer gd, CommandBuffer commandBuffer)
{ {
gd.ExtendedDynamicStateApi.CmdSetPrimitiveTopology(commandBuffer, Topology); gd.ExtendedDynamicStateApi.CmdSetPrimitiveTopology(commandBuffer, _topology);
} }
private readonly void RecordLogicOp(VulkanRenderer gd, CommandBuffer commandBuffer) private readonly void RecordLogicOp(VulkanRenderer gd, CommandBuffer commandBuffer)

View file

@ -239,12 +239,6 @@ namespace Ryujinx.Graphics.Vulkan
set => Internal.Id3 = (Internal.Id3 & 0xFFFFFFFFFFFFFFBF) | ((value ? 1UL : 0UL) << 6); set => Internal.Id3 = (Internal.Id3 & 0xFFFFFFFFFFFFFFBF) | ((value ? 1UL : 0UL) << 6);
} }
public PrimitiveTopology TopologyClass
{
readonly get => (PrimitiveTopology)((Internal.Id3 >> 7) & 0xF);
set => Internal.Id3 = (Internal.Id3 & 0xFFFFFFFFFFFFFF8F) | ((ulong)value << 7);
}
public bool HasTessellationControlShader; public bool HasTessellationControlShader;
public NativeArray<PipelineShaderStageCreateInfo> Stages; public NativeArray<PipelineShaderStageCreateInfo> Stages;
public PipelineLayout PipelineLayout; public PipelineLayout PipelineLayout;
@ -366,17 +360,11 @@ namespace Ryujinx.Graphics.Vulkan
var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo
{ {
SType = StructureType.PipelineInputAssemblyStateCreateInfo, SType = StructureType.PipelineInputAssemblyStateCreateInfo,
Topology = supportsExtDynamicState ? TopologyClass : Topology, Topology = Topology,
}; };
PipelineTessellationStateCreateInfo tessellationState; PipelineTessellationStateCreateInfo tessellationState;
if (!gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2PatchControlPoints && HasTessellationControlShader)
{
tessellationState.SType = StructureType.PipelineTessellationStateCreateInfo;
tessellationState.PatchControlPoints = PatchControlPoints;
}
var rasterizationState = new PipelineRasterizationStateCreateInfo var rasterizationState = new PipelineRasterizationStateCreateInfo
{ {
SType = StructureType.PipelineRasterizationStateCreateInfo, SType = StructureType.PipelineRasterizationStateCreateInfo,
@ -390,12 +378,6 @@ namespace Ryujinx.Graphics.Vulkan
rasterizationState.LineWidth = 1.0f; rasterizationState.LineWidth = 1.0f;
} }
if (!supportsExtDynamicState2)
{
rasterizationState.DepthBiasEnable = DepthBiasEnable;
rasterizationState.RasterizerDiscardEnable = RasterizerDiscardEnable;
}
var viewportState = new PipelineViewportStateCreateInfo var viewportState = new PipelineViewportStateCreateInfo
{ {
SType = StructureType.PipelineViewportStateCreateInfo, SType = StructureType.PipelineViewportStateCreateInfo,
@ -430,8 +412,6 @@ namespace Ryujinx.Graphics.Vulkan
if (!supportsExtDynamicState) if (!supportsExtDynamicState)
{ {
inputAssemblyState.PrimitiveRestartEnable = PrimitiveRestartEnable;
rasterizationState.CullMode = CullMode; rasterizationState.CullMode = CullMode;
rasterizationState.FrontFace = FrontFace; rasterizationState.FrontFace = FrontFace;
@ -458,6 +438,19 @@ namespace Ryujinx.Graphics.Vulkan
depthStencilState.DepthCompareOp = DepthCompareOp; depthStencilState.DepthCompareOp = DepthCompareOp;
} }
if (!supportsExtDynamicState2)
{
inputAssemblyState.PrimitiveRestartEnable = PrimitiveRestartEnable;
rasterizationState.DepthBiasEnable = DepthBiasEnable;
rasterizationState.RasterizerDiscardEnable = RasterizerDiscardEnable;
}
if (!gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2PatchControlPoints && HasTessellationControlShader)
{
tessellationState.SType = StructureType.PipelineTessellationStateCreateInfo;
tessellationState.PatchControlPoints = PatchControlPoints;
}
uint blendEnables = 0; uint blendEnables = 0;
if (isMoltenVk && Internal.AttachmentIntegerFormatMask != 0) if (isMoltenVk && Internal.AttachmentIntegerFormatMask != 0)