Implement VK_EXT_extended_dynamic_state3

This commit is contained in:
sunshineinabox 2024-05-17 16:32:05 -07:00
parent 66b6b46716
commit 19db5a0ce2
7 changed files with 342 additions and 50 deletions

View file

@ -404,7 +404,7 @@ namespace Ryujinx.Graphics.Vulkan
{
UpdateVertexAttributeDescriptions(gd);
}
bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState;
bool supportsExtDynamicState2 = gd.Capabilities.SupportsExtendedDynamicState2;
@ -457,7 +457,7 @@ namespace Ryujinx.Graphics.Vulkan
{
primitiveRestartEnable = true;
}
var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo
{
SType = StructureType.PipelineInputAssemblyStateCreateInfo,
@ -494,12 +494,12 @@ namespace Ryujinx.Graphics.Vulkan
rasterizationState.DepthBiasEnable = DepthBiasEnable;
rasterizationState.RasterizerDiscardEnable = RasterizerDiscardEnable;
}
var viewportState = new PipelineViewportStateCreateInfo
{
SType = StructureType.PipelineViewportStateCreateInfo,
};
if (!supportsExtDynamicState)
{
viewportState.ViewportCount = ViewportsCount;
@ -534,7 +534,7 @@ namespace Ryujinx.Graphics.Vulkan
MinDepthBounds = MinDepthBounds,
MaxDepthBounds = MaxDepthBounds,
};
if (!supportsExtDynamicState)
{
var stencilFront = new StencilOpState(
@ -613,9 +613,54 @@ namespace Ryujinx.Graphics.Vulkan
colorBlendState.PNext = &colorBlendAdvancedState;
}
int dynamicStatesCount = supportsExtDynamicState ? (isMoltenVk ? 18 : 19) : (isMoltenVk ? 7 : 8);
int baseDynamicStatesCount = 7;
int additionalDynamicStatesCount = 0;
if (!isMoltenVk)
{
baseDynamicStatesCount++;
}
if (supportsExtDynamicState)
{
additionalDynamicStatesCount += isMoltenVk ? 10 : 11;
}
if (supportsExtDynamicState2)
{
additionalDynamicStatesCount += 2;
if (gd.ExtendedDynamicState2Features.ExtendedDynamicState2LogicOp)
{
additionalDynamicStatesCount++;
}
if (gd.ExtendedDynamicState2Features.ExtendedDynamicState2PatchControlPoints)
{
additionalDynamicStatesCount++;
}
}
if (supportsExtDynamicState3)
{
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3DepthClampEnable)
{
additionalDynamicStatesCount++;
}
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3LogicOpEnable)
{
additionalDynamicStatesCount++;
}
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3AlphaToCoverageEnable)
{
additionalDynamicStatesCount++;
}
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3AlphaToOneEnable)
{
additionalDynamicStatesCount++;
}
}
int dynamicStatesCount = baseDynamicStatesCount + additionalDynamicStatesCount;
DynamicState* dynamicStates = stackalloc DynamicState[dynamicStatesCount];
dynamicStates[0] = DynamicState.Viewport;
@ -625,33 +670,64 @@ namespace Ryujinx.Graphics.Vulkan
dynamicStates[4] = DynamicState.StencilWriteMask;
dynamicStates[5] = DynamicState.StencilReference;
dynamicStates[6] = DynamicState.BlendConstants;
if(!isMoltenVk)
int currentIndex = 7;
if (!isMoltenVk)
{
dynamicStates[7] = DynamicState.LineWidth;
dynamicStates[currentIndex++] = DynamicState.LineWidth;
}
if (supportsExtDynamicState)
{
int index = (isMoltenVk ? 7 : 8);
if (!isMoltenVk) {
dynamicStates[index++] = DynamicState.VertexInputBindingStrideExt;
if (!isMoltenVk)
{
dynamicStates[currentIndex++] = DynamicState.VertexInputBindingStrideExt;
}
dynamicStates[index++] = DynamicState.CullModeExt;
dynamicStates[index++] = DynamicState.FrontFaceExt;
dynamicStates[index++] = DynamicState.DepthTestEnableExt;
dynamicStates[index++] = DynamicState.DepthWriteEnableExt;
dynamicStates[index++] = DynamicState.DepthCompareOpExt;
dynamicStates[index++] = DynamicState.StencilTestEnableExt;
dynamicStates[index++] = DynamicState.ViewportWithCountExt;
dynamicStates[index++] = DynamicState.ScissorWithCountExt;
dynamicStates[index] = DynamicState.StencilOpExt;
dynamicStates[currentIndex++] = DynamicState.CullModeExt;
dynamicStates[currentIndex++] = DynamicState.FrontFaceExt;
dynamicStates[currentIndex++] = DynamicState.DepthTestEnableExt;
dynamicStates[currentIndex++] = DynamicState.DepthWriteEnableExt;
dynamicStates[currentIndex++] = DynamicState.DepthCompareOpExt;
dynamicStates[currentIndex++] = DynamicState.StencilTestEnableExt;
dynamicStates[currentIndex++] = DynamicState.ViewportWithCountExt;
dynamicStates[currentIndex++] = DynamicState.ScissorWithCountExt;
dynamicStates[currentIndex++] = DynamicState.StencilOpExt;
}
if (supportsExtDynamicState2)
{
dynamicStates[16] = DynamicState.DepthBiasEnableExt;
dynamicStates[17] = DynamicState.RasterizerDiscardEnableExt;
dynamicStates[currentIndex++] = DynamicState.DepthBiasEnableExt;
dynamicStates[currentIndex++] = DynamicState.RasterizerDiscardEnableExt;
if (gd.ExtendedDynamicState2Features.ExtendedDynamicState2LogicOp)
{
dynamicStates[currentIndex++] = DynamicState.LogicOpExt;
}
if (gd.ExtendedDynamicState2Features.ExtendedDynamicState2PatchControlPoints)
{
dynamicStates[currentIndex++] = DynamicState.PatchControlPointsExt;
}
}
if (supportsExtDynamicState3)
{
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3DepthClampEnable)
{
dynamicStates[currentIndex++] = DynamicState.DepthClampEnableExt;
}
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3LogicOpEnable)
{
dynamicStates[currentIndex++] = DynamicState.LogicOpEnableExt;
}
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3AlphaToCoverageEnable)
{
dynamicStates[currentIndex++] = DynamicState.AlphaToCoverageEnableExt;
}
if (gd.ExtendedDynamicState3Features.ExtendedDynamicState3AlphaToOneEnable)
{
dynamicStates[currentIndex++] = DynamicState.AlphaToOneEnableExt;
}
}
var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo