From 2ea6d83b600179d49b87fb0ade5d58071fde5667 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 29 Apr 2021 12:52:55 +0100 Subject: [PATCH] Handle new DXBC system-value semantics --- qrenderdoc/Code/QRDUtils.cpp | 5 ++++- renderdoc/api/replay/renderdoc_tostr.inl | 3 +++ renderdoc/api/replay/replay_enums.h | 18 ++++++++++++++++++ renderdoc/driver/shaders/dxbc/dxbc_common.h | 6 ++++++ .../driver/shaders/dxbc/dxbc_container.cpp | 15 +++++++++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) diff --git a/qrenderdoc/Code/QRDUtils.cpp b/qrenderdoc/Code/QRDUtils.cpp index 721d3c04d..79a7670a6 100644 --- a/qrenderdoc/Code/QRDUtils.cpp +++ b/qrenderdoc/Code/QRDUtils.cpp @@ -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() == ARRAY_COUNT(sysValues), diff --git a/renderdoc/api/replay/renderdoc_tostr.inl b/renderdoc/api/replay/renderdoc_tostr.inl index 52940cd64..026575178 100644 --- a/renderdoc/api/replay/renderdoc_tostr.inl +++ b/renderdoc/api/replay/renderdoc_tostr.inl @@ -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(); } diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index d3c52a881..4f390f7bc 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -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, }; diff --git a/renderdoc/driver/shaders/dxbc/dxbc_common.h b/renderdoc/driver/shaders/dxbc/dxbc_common.h index 54ce14842..cabc5cf9e 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_common.h +++ b/renderdoc/driver/shaders/dxbc/dxbc_common.h @@ -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 diff --git a/renderdoc/driver/shaders/dxbc/dxbc_container.cpp b/renderdoc/driver/shaders/dxbc/dxbc_container.cpp index 14bc1ee7a..3f80b5767 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_container.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_container.cpp @@ -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);