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:
parent
3b398adbe6
commit
c53f58a4a9
3 changed files with 27 additions and 33 deletions
|
@ -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,10 +686,9 @@ 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);
|
||||||
|
|
||||||
SignalStateChange();
|
SignalStateChange();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue