If dynamic states are enabled use default values for calculation uuid

This commit is contained in:
sunshineinabox 2024-08-10 16:35:30 -07:00
parent af31a14c77
commit 42c47e408d
5 changed files with 109 additions and 56 deletions

View file

@ -129,7 +129,7 @@ namespace Ryujinx.Graphics.Vulkan
_supportExtDynamic2 = gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2; _supportExtDynamic2 = gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2;
_newState.Initialize(); _newState.Initialize(_supportExtDynamic, gd.Capabilities.SupportsExtendedDynamicState2);
} }
public void Initialize() public void Initialize()

View file

@ -154,8 +154,11 @@ namespace Ryujinx.Graphics.Vulkan
public static PipelineState ToVulkanPipelineState(this ProgramPipelineState state, VulkanRenderer gd) public static PipelineState ToVulkanPipelineState(this ProgramPipelineState state, VulkanRenderer gd)
{ {
var extendedDynamicState2 = gd.Capabilities.SupportsExtendedDynamicState2;
var extendedDynamicState = gd.Capabilities.SupportsExtendedDynamicState;
PipelineState pipeline = new(); PipelineState pipeline = new();
pipeline.Initialize(); pipeline.Initialize(extendedDynamicState, extendedDynamicState2);
// It is assumed that Dynamic State is enabled when this conversion is used. // It is assumed that Dynamic State is enabled when this conversion is used.
pipeline.DepthBoundsTestEnable = false; // Not implemented. pipeline.DepthBoundsTestEnable = false; // Not implemented.
@ -169,62 +172,66 @@ namespace Ryujinx.Graphics.Vulkan
pipeline.PolygonMode = PolygonMode.Fill; // Not implemented. pipeline.PolygonMode = PolygonMode.Fill; // Not implemented.
if (!gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2) pipeline.PrimitiveRestartEnable = extendedDynamicState2.ExtendedDynamicState2 ? false : state.PrimitiveRestartEnable;
{ pipeline.RasterizerDiscardEnable = extendedDynamicState2.ExtendedDynamicState2 ? false : state.RasterizerDiscard;
pipeline.PrimitiveRestartEnable = state.PrimitiveRestartEnable; pipeline.DepthBiasEnable = extendedDynamicState2.ExtendedDynamicState2 ? false : state.BiasEnable != 0;
pipeline.RasterizerDiscardEnable = state.RasterizerDiscard;
pipeline.DepthBiasEnable = state.BiasEnable != 0;
}
if (!gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2LogicOp)
if (!extendedDynamicState2.ExtendedDynamicState2LogicOp)
{ {
pipeline.LogicOp = state.LogicOpEnable ? state.LogicOp.Convert() : default; pipeline.LogicOp = state.LogicOpEnable ? state.LogicOp.Convert() : default;
} }
else
if (!gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2PatchControlPoints)
{ {
pipeline.PatchControlPoints = state.PatchControlPoints; pipeline.LogicOp = 0;
} }
pipeline.PatchControlPoints = extendedDynamicState2.ExtendedDynamicState2PatchControlPoints ? 0 : state.PatchControlPoints;
pipeline.SamplesCount = (uint)state.SamplesCount; pipeline.SamplesCount = (uint)state.SamplesCount;
// Stencil masks and ref are dynamic, so are 0 in the Vulkan pipeline. pipeline.DepthTestEnable = !extendedDynamicState && state.DepthTest.TestEnable;
if (!gd.Capabilities.SupportsExtendedDynamicState) pipeline.DepthWriteEnable = !extendedDynamicState && state.DepthTest.WriteEnable && state.DepthTest.TestEnable;
{
pipeline.DepthTestEnable = state.DepthTest.TestEnable;
pipeline.DepthWriteEnable = state.DepthTest.WriteEnable && state.DepthTest.TestEnable;
if (!extendedDynamicState)
{
pipeline.DepthCompareOp = state.DepthTest.TestEnable ? state.DepthTest.Func.Convert() : default; pipeline.DepthCompareOp = state.DepthTest.TestEnable ? state.DepthTest.Func.Convert() : default;
pipeline.CullMode = state.CullEnable ? state.CullMode.Convert() : CullModeFlags.None; pipeline.CullMode = state.CullEnable ? state.CullMode.Convert() : CullModeFlags.None;
pipeline.FrontFace = state.FrontFace.Convert();
if (gd.Capabilities.SupportsMultiView)
{
pipeline.ScissorsCount = Constants.MaxViewports;
pipeline.ViewportsCount = Constants.MaxViewports;
} }
else else
{ {
pipeline.ScissorsCount = 1; pipeline.DepthCompareOp = 0;
pipeline.ViewportsCount = 1; pipeline.CullMode = 0;
} }
pipeline.StencilFrontFailOp = state.StencilTest.FrontSFail.Convert(); pipeline.FrontFace = extendedDynamicState ? 0 : state.FrontFace.Convert();
pipeline.StencilFrontPassOp = state.StencilTest.FrontDpPass.Convert();
pipeline.StencilFrontDepthFailOp = state.StencilTest.FrontDpFail.Convert();
pipeline.StencilFrontCompareOp = state.StencilTest.FrontFunc.Convert();
pipeline.StencilBackFailOp = state.StencilTest.BackSFail.Convert(); if (gd.Capabilities.SupportsMultiView)
pipeline.StencilBackPassOp = state.StencilTest.BackDpPass.Convert(); {
pipeline.StencilBackDepthFailOp = state.StencilTest.BackDpFail.Convert(); pipeline.ScissorsCount = (uint)(extendedDynamicState ? 0 : Constants.MaxViewports);
pipeline.StencilBackCompareOp = state.StencilTest.BackFunc.Convert(); pipeline.ViewportsCount = (uint)(extendedDynamicState ? 0 : Constants.MaxViewports);
}
pipeline.StencilTestEnable = state.StencilTest.TestEnable; else
{
pipeline.ScissorsCount = (uint)(extendedDynamicState ? 0 : 1);
pipeline.ViewportsCount = (uint)(extendedDynamicState ? 0 : 1);
} }
pipeline.Topology = gd.TopologyRemap(state.Topology).Convert(); pipeline.StencilTestEnable = !extendedDynamicState && state.StencilTest.TestEnable;
pipeline.StencilFrontFailOp = extendedDynamicState ? 0 : state.StencilTest.FrontSFail.Convert();
pipeline.StencilFrontPassOp = extendedDynamicState ? 0 : state.StencilTest.FrontDpPass.Convert();
pipeline.StencilFrontDepthFailOp = extendedDynamicState ? 0 : state.StencilTest.FrontDpFail.Convert();
pipeline.StencilFrontCompareOp = extendedDynamicState ? 0 : state.StencilTest.FrontFunc.Convert();
pipeline.StencilBackFailOp = extendedDynamicState ? 0 : state.StencilTest.BackSFail.Convert();
pipeline.StencilBackPassOp = extendedDynamicState ? 0 : state.StencilTest.BackDpPass.Convert();
pipeline.StencilBackDepthFailOp = extendedDynamicState ? 0 : state.StencilTest.BackDpFail.Convert();
pipeline.StencilBackCompareOp = extendedDynamicState ? 0 : state.StencilTest.BackFunc.Convert();
var vkTopology = gd.TopologyRemap(state.Topology).Convert();
pipeline.Topology = extendedDynamicState ? vkTopology.ConvertToClass() : vkTopology;
int vaCount = Math.Min(Constants.MaxVertexAttributes, state.VertexAttribCount); int vaCount = Math.Min(Constants.MaxVertexAttributes, state.VertexAttribCount);
int vbCount = Math.Min(Constants.MaxVertexBuffers, state.VertexBufferCount); int vbCount = Math.Min(Constants.MaxVertexBuffers, state.VertexBufferCount);

View file

@ -246,7 +246,12 @@ namespace Ryujinx.Graphics.Vulkan
private Array32<VertexInputAttributeDescription> _vertexAttributeDescriptions2; private Array32<VertexInputAttributeDescription> _vertexAttributeDescriptions2;
public void Initialize() private bool _supportsExtDynamicState;
private PhysicalDeviceExtendedDynamicState2FeaturesEXT _supportsExtDynamicState2;
public void Initialize(bool supportsExtDynamicState,
PhysicalDeviceExtendedDynamicState2FeaturesEXT extendedDynamicState2)
{ {
HasTessellationControlShader = false; HasTessellationControlShader = false;
Stages = new NativeArray<PipelineShaderStageCreateInfo>(Constants.MaxShaderStages); Stages = new NativeArray<PipelineShaderStageCreateInfo>(Constants.MaxShaderStages);
@ -257,6 +262,50 @@ namespace Ryujinx.Graphics.Vulkan
SamplesCount = 1; SamplesCount = 1;
DepthMode = true; DepthMode = true;
_supportsExtDynamicState = supportsExtDynamicState;
_supportsExtDynamicState2 = extendedDynamicState2;
if (_supportsExtDynamicState)
{
StencilFrontFailOp = 0;
StencilFrontPassOp = 0;
StencilFrontDepthFailOp = 0;
StencilFrontCompareOp = 0;
StencilBackFailOp = 0;
StencilBackPassOp = 0;
StencilBackDepthFailOp = 0;
StencilBackCompareOp = 0;
ViewportsCount = 0;
ScissorsCount = 0;
CullMode = 0;
FrontFace = 0;
DepthTestEnable = false;
DepthWriteEnable = false;
DepthCompareOp = 0;
StencilTestEnable = false;
}
if (_supportsExtDynamicState2.ExtendedDynamicState2)
{
PrimitiveRestartEnable = false;
DepthBiasEnable = false;
RasterizerDiscardEnable = false;
}
if (_supportsExtDynamicState2.ExtendedDynamicState2LogicOp)
{
LogicOp = 0;
}
if (_supportsExtDynamicState2.ExtendedDynamicState2PatchControlPoints)
{
PatchControlPoints = 0;
}
} }
public unsafe Auto<DisposablePipeline> CreateComputePipeline( public unsafe Auto<DisposablePipeline> CreateComputePipeline(
@ -340,9 +389,6 @@ namespace Ryujinx.Graphics.Vulkan
UpdateVertexAttributeDescriptions(gd); UpdateVertexAttributeDescriptions(gd);
} }
bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState;
bool supportsExtDynamicState2 = gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2;
fixed (VertexInputAttributeDescription* pVertexAttributeDescriptions = &Internal.VertexAttributeDescriptions[0]) fixed (VertexInputAttributeDescription* pVertexAttributeDescriptions = &Internal.VertexAttributeDescriptions[0])
fixed (VertexInputAttributeDescription* pVertexAttributeDescriptions2 = &_vertexAttributeDescriptions2[0]) fixed (VertexInputAttributeDescription* pVertexAttributeDescriptions2 = &_vertexAttributeDescriptions2[0])
fixed (VertexInputBindingDescription* pVertexBindingDescriptions = &Internal.VertexBindingDescriptions[0]) fixed (VertexInputBindingDescription* pVertexBindingDescriptions = &Internal.VertexBindingDescriptions[0])
@ -410,7 +456,7 @@ namespace Ryujinx.Graphics.Vulkan
DepthBoundsTestEnable = false, DepthBoundsTestEnable = false,
}; };
if (!supportsExtDynamicState) if (!_supportsExtDynamicState)
{ {
rasterizationState.CullMode = CullMode; rasterizationState.CullMode = CullMode;
rasterizationState.FrontFace = FrontFace; rasterizationState.FrontFace = FrontFace;
@ -438,7 +484,7 @@ namespace Ryujinx.Graphics.Vulkan
depthStencilState.DepthCompareOp = DepthCompareOp; depthStencilState.DepthCompareOp = DepthCompareOp;
} }
if (!supportsExtDynamicState2) if (!_supportsExtDynamicState2.ExtendedDynamicState2)
{ {
inputAssemblyState.PrimitiveRestartEnable = PrimitiveRestartEnable; inputAssemblyState.PrimitiveRestartEnable = PrimitiveRestartEnable;
rasterizationState.DepthBiasEnable = DepthBiasEnable; rasterizationState.DepthBiasEnable = DepthBiasEnable;
@ -518,7 +564,7 @@ namespace Ryujinx.Graphics.Vulkan
dynamicStates[currentIndex++] = DynamicState.LineWidth; dynamicStates[currentIndex++] = DynamicState.LineWidth;
} }
if (supportsExtDynamicState) if (_supportsExtDynamicState)
{ {
if (!isMoltenVk) if (!isMoltenVk)
{ {
@ -538,17 +584,17 @@ namespace Ryujinx.Graphics.Vulkan
dynamicStates[currentIndex++] = DynamicState.PrimitiveTopologyExt; dynamicStates[currentIndex++] = DynamicState.PrimitiveTopologyExt;
} }
if (supportsExtDynamicState2) if (_supportsExtDynamicState2.ExtendedDynamicState2)
{ {
dynamicStates[currentIndex++] = DynamicState.DepthBiasEnableExt; dynamicStates[currentIndex++] = DynamicState.DepthBiasEnableExt;
dynamicStates[currentIndex++] = DynamicState.RasterizerDiscardEnableExt; dynamicStates[currentIndex++] = DynamicState.RasterizerDiscardEnableExt;
dynamicStates[currentIndex++] = DynamicState.PrimitiveRestartEnableExt; dynamicStates[currentIndex++] = DynamicState.PrimitiveRestartEnableExt;
if (gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2LogicOp) if (_supportsExtDynamicState2.ExtendedDynamicState2LogicOp)
{ {
dynamicStates[currentIndex++] = DynamicState.LogicOpExt; dynamicStates[currentIndex++] = DynamicState.LogicOpExt;
} }
if (gd.Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2PatchControlPoints) if (_supportsExtDynamicState2.ExtendedDynamicState2PatchControlPoints)
{ {
dynamicStates[currentIndex++] = DynamicState.PatchControlPointsExt; dynamicStates[currentIndex++] = DynamicState.PatchControlPointsExt;
} }

View file

@ -528,7 +528,7 @@ namespace Ryujinx.Graphics.Vulkan
public void CreateBackgroundComputePipeline() public void CreateBackgroundComputePipeline()
{ {
PipelineState pipeline = new(); PipelineState pipeline = new();
pipeline.Initialize(); pipeline.Initialize(_gd.Capabilities.SupportsExtendedDynamicState, _gd.Capabilities.SupportsExtendedDynamicState2);
pipeline.Stages[0] = _shaders[0].GetInfo(); pipeline.Stages[0] = _shaders[0].GetInfo();
pipeline.StagesCount = 1; pipeline.StagesCount = 1;

View file

@ -51,7 +51,7 @@ namespace Ryujinx.Graphics.Vulkan
{ {
if (_count != 0) if (_count != 0)
{ {
if (_gd.Capabilities.SupportsExtendedDynamicState) if (_gd.Capabilities.SupportsExtendedDynamicState && !_gd.IsMoltenVk)
{ {
_gd.ExtendedDynamicStateApi.CmdBindVertexBuffers2( _gd.ExtendedDynamicStateApi.CmdBindVertexBuffers2(
cbs.CommandBuffer, cbs.CommandBuffer,