Implement VK_EXT_extended_dynamic_state3
This commit is contained in:
parent
66b6b46716
commit
19db5a0ce2
7 changed files with 342 additions and 50 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue