Handle new DXBC system-value semantics

This commit is contained in:
baldurk
2021-04-29 13:05:10 +01:00
parent 26aa09c665
commit 2ea6d83b60
5 changed files with 46 additions and 1 deletions
+4 -1
View File
@@ -1350,9 +1350,12 @@ QString D3DSemanticString(const SigParameter &sig)
lit("Unsupported (SubgroupLessEqualMask)"),
lit("Unsupported (SubgroupLessMask)"),
lit("Unsupported (DeviceIndex)"),
lit("Unsupported (IsFullyCovered)"),
lit("SV_InnerCoverage"),
lit("Unsupported (FragAreaSize)"),
lit("Unsupported (FragInvocationCount)"),
lit("SV_ShadingRate"),
lit("SV_Barycentrics"),
lit("SV_CullPrimitive"),
};
static_assert(arraydim<ShaderBuiltin>() == ARRAY_COUNT(sysValues),
+3
View File
@@ -674,6 +674,9 @@ rdcstr DoStringise(const ShaderBuiltin &el)
STRINGISE_ENUM_CLASS_NAMED(IsFullyCovered, "Is Fully Covered");
STRINGISE_ENUM_CLASS_NAMED(FragAreaSize, "Fragment Area Size");
STRINGISE_ENUM_CLASS_NAMED(FragInvocationCount, "Fragment Invocation Count");
STRINGISE_ENUM_CLASS_NAMED(PackedFragRate, "Packed Fragment Rate");
STRINGISE_ENUM_CLASS_NAMED(Barycentrics, "Barycentrics");
STRINGISE_ENUM_CLASS_NAMED(CullPrimitive, "Cull Primitive Output");
}
END_ENUM_STRINGISE();
}
+18
View File
@@ -1076,6 +1076,21 @@ to apply to multiple related things - see :data:`ClipDistance`, :data:`CullDista
.. data:: FragInvocationCount
Gives the maximum number of invocations for the fragment being covered.
.. data:: PackedFragRate
Contains the packed shading rate, with an API specific packing of X and Y. For example:
1x being 0, 2x being 1, 4x being 2. Then the lower two bits being the Y rate and the next 2 bits
being the X rate.
.. data:: Barycentrics
Contains the barycentric co-ordinates.
.. data:: CullPrimitive
An output to indicate whether or not a primitive should be culled.
)");
enum class ShaderBuiltin : uint32_t
{
@@ -1129,6 +1144,9 @@ enum class ShaderBuiltin : uint32_t
IsFullyCovered,
FragAreaSize,
FragInvocationCount,
PackedFragRate,
Barycentrics,
CullPrimitive,
Count,
};
@@ -142,11 +142,17 @@ enum SVSemantic
SVNAME_FINAL_LINE_DENSITY_TESSFACTOR,
SVNAME_BARYCENTRICS,
SVNAME_SHADINGRATE,
SVNAME_CULLPRIMITIVE,
SVNAME_TARGET = 64,
SVNAME_DEPTH,
SVNAME_COVERAGE,
SVNAME_DEPTH_GREATER_EQUAL,
SVNAME_DEPTH_LESS_EQUAL,
SVNAME_STENCIL_REF,
SVNAME_INNER_COVERAGE,
};
enum VariableType
@@ -298,11 +298,16 @@ ShaderBuiltin GetSystemValue(SVSemantic systemValue)
case SVNAME_FINAL_TRI_INSIDE_TESSFACTOR: return ShaderBuiltin::InsideTessFactor;
case SVNAME_FINAL_LINE_DETAIL_TESSFACTOR: return ShaderBuiltin::OuterTessFactor;
case SVNAME_FINAL_LINE_DENSITY_TESSFACTOR: return ShaderBuiltin::InsideTessFactor;
case SVNAME_BARYCENTRICS: return ShaderBuiltin::Barycentrics;
case SVNAME_SHADINGRATE: return ShaderBuiltin::PackedFragRate;
case SVNAME_CULLPRIMITIVE: return ShaderBuiltin::CullPrimitive;
case SVNAME_TARGET: return ShaderBuiltin::ColorOutput;
case SVNAME_DEPTH: return ShaderBuiltin::DepthOutput;
case SVNAME_COVERAGE: return ShaderBuiltin::MSAACoverage;
case SVNAME_DEPTH_GREATER_EQUAL: return ShaderBuiltin::DepthOutputGreaterEqual;
case SVNAME_DEPTH_LESS_EQUAL: return ShaderBuiltin::DepthOutputLessEqual;
case SVNAME_STENCIL_REF: return ShaderBuiltin::StencilReference;
case SVNAME_INNER_COVERAGE: return ShaderBuiltin::IsFullyCovered;
}
return ShaderBuiltin::Undefined;
@@ -1546,6 +1551,16 @@ DXBCContainer::DXBCContainer(bytebuf &ByteCode, const rdcstr &debugInfoPath, Gra
desc.systemValue = ShaderBuiltin::DepthOutputGreaterEqual;
if(!_stricmp(desc.semanticName.c_str(), "SV_DepthLessEqual"))
desc.systemValue = ShaderBuiltin::DepthOutputLessEqual;
if(!_stricmp(desc.semanticName.c_str(), "SV_Barycentrics"))
desc.systemValue = ShaderBuiltin::Barycentrics;
if(!_stricmp(desc.semanticName.c_str(), "SV_ShadingRate"))
desc.systemValue = ShaderBuiltin::PackedFragRate;
if(!_stricmp(desc.semanticName.c_str(), "SV_CullPrimitive"))
desc.systemValue = ShaderBuiltin::CullPrimitive;
if(!_stricmp(desc.semanticName.c_str(), "SV_StencilRef"))
desc.systemValue = ShaderBuiltin::StencilReference;
if(!_stricmp(desc.semanticName.c_str(), "SV_InnerCoverage"))
desc.systemValue = ShaderBuiltin::IsFullyCovered;
}
RDCASSERT(desc.systemValue != ShaderBuiltin::Undefined || desc.regIndex >= 0);