From ecb4e3b4bb29e6d8919ed1ddc697291a4e3a5a1e Mon Sep 17 00:00:00 2001 From: Tex Riddell Date: Mon, 22 Oct 2018 20:25:12 -0700 Subject: [PATCH] Add SV_ShadingRate plus optional feature flag - Move/fix flag collection based on signature properties to be computed per entry function (including for libraries) --- docs/DXIL.rst | 67 ++++++++++--------- include/dxc/DXIL/DxilConstants.h | 4 +- include/dxc/DXIL/DxilModule.h | 1 + include/dxc/DXIL/DxilShaderFlags.h | 7 +- include/dxc/DXIL/DxilSigPoint.inl | 62 ++++++++--------- include/dxc/DxilContainer/DxilContainer.h | 1 + lib/DXIL/DxilModule.cpp | 51 ++------------ lib/DXIL/DxilSemantic.cpp | 1 + lib/DXIL/DxilShaderFlags.cpp | 63 ++++++++++++++++- lib/DxilContainer/DxilContainerAssembler.cpp | 1 + lib/HLSL/DxilValidation.cpp | 1 + .../CodeGenHLSL/quick-test/shadingrate1.hlsl | 16 +++++ .../CodeGenHLSL/quick-test/shadingrate2.hlsl | 23 +++++++ .../CodeGenHLSL/quick-test/shadingrate3.hlsl | 15 +++++ .../CodeGenHLSL/quick-test/shadingrate4.hlsl | 16 +++++ tools/clang/test/HLSL/system-values.hlsl | 1 + .../tools/dxcompiler/dxcdisassembler.cpp | 3 +- utils/hct/hctdb.py | 4 +- 18 files changed, 222 insertions(+), 115 deletions(-) create mode 100644 tools/clang/test/CodeGenHLSL/quick-test/shadingrate1.hlsl create mode 100644 tools/clang/test/CodeGenHLSL/quick-test/shadingrate2.hlsl create mode 100644 tools/clang/test/CodeGenHLSL/quick-test/shadingrate3.hlsl create mode 100644 tools/clang/test/CodeGenHLSL/quick-test/shadingrate4.hlsl diff --git a/docs/DXIL.rst b/docs/DXIL.rst index b906656be..93531539d 100644 --- a/docs/DXIL.rst +++ b/docs/DXIL.rst @@ -662,39 +662,40 @@ Semantic Interpretations for each SemanticKind at each SigPointKind are as follo .. hctdb_instrhelp.get_sem_interpretation_table_rst() .. SEMINT-TABLE-RST:BEGIN -====================== ============ ===== ============ ============ ====== ======= ========== ============ ====== ===== ===== ============ ===== ============= ============= ======== -Semantic VSIn VSOut PCIn HSIn HSCPIn HSCPOut PCOut DSIn DSCPIn DSOut GSVIn GSIn GSOut PSIn PSOut CSIn -====================== ============ ===== ============ ============ ====== ======= ========== ============ ====== ===== ===== ============ ===== ============= ============= ======== -Arbitrary Arb Arb NA NA Arb Arb Arb Arb Arb Arb Arb NA Arb Arb NA NA -VertexID SV NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA -InstanceID SV Arb NA NA Arb Arb NA NA Arb Arb Arb NA Arb Arb NA NA -Position Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA -RenderTargetArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA -ViewPortArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA -ClipDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA -CullDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA -OutputControlPointID NA NA NA NotInSig NA NA NA NA NA NA NA NA NA NA NA NA -DomainLocation NA NA NA NA NA NA NA NotInSig NA NA NA NA NA NA NA NA -PrimitiveID NA NA NotInSig NotInSig NA NA NA NotInSig NA NA NA Shadow SGV SGV NA NA -GSInstanceID NA NA NA NA NA NA NA NA NA NA NA NotInSig NA NA NA NA -SampleIndex NA NA NA NA NA NA NA NA NA NA NA NA NA Shadow _41 NA NA -IsFrontFace NA NA NA NA NA NA NA NA NA NA NA NA SGV SGV NA NA -Coverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NotPacked _41 NA -InnerCoverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NA NA -Target NA NA NA NA NA NA NA NA NA NA NA NA NA NA Target NA -Depth NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked NA -DepthLessEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA -DepthGreaterEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA -StencilRef NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA -DispatchThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig -GroupID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig -GroupIndex NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig -GroupThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig -TessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA -InsideTessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA -ViewID NotInSig _61 NA NotInSig _61 NotInSig _61 NA NA NA NotInSig _61 NA NA NA NotInSig _61 NA NotInSig _61 NA NA -Barycentrics NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _61 NA NA -====================== ============ ===== ============ ============ ====== ======= ========== ============ ====== ===== ===== ============ ===== ============= ============= ======== +====================== ============ ====== ============ ============ ====== ======= ========== ============ ====== ====== ====== ============ ====== ============= ============= ======== +Semantic VSIn VSOut PCIn HSIn HSCPIn HSCPOut PCOut DSIn DSCPIn DSOut GSVIn GSIn GSOut PSIn PSOut CSIn +====================== ============ ====== ============ ============ ====== ======= ========== ============ ====== ====== ====== ============ ====== ============= ============= ======== +Arbitrary Arb Arb NA NA Arb Arb Arb Arb Arb Arb Arb NA Arb Arb NA NA +VertexID SV NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA +InstanceID SV Arb NA NA Arb Arb NA NA Arb Arb Arb NA Arb Arb NA NA +Position Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA +RenderTargetArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA +ViewPortArrayIndex Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA +ClipDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA +CullDistance Arb SV NA NA SV SV Arb Arb SV SV SV NA SV SV NA NA +OutputControlPointID NA NA NA NotInSig NA NA NA NA NA NA NA NA NA NA NA NA +DomainLocation NA NA NA NA NA NA NA NotInSig NA NA NA NA NA NA NA NA +PrimitiveID NA NA NotInSig NotInSig NA NA NA NotInSig NA NA NA Shadow SGV SGV NA NA +GSInstanceID NA NA NA NA NA NA NA NA NA NA NA NotInSig NA NA NA NA +SampleIndex NA NA NA NA NA NA NA NA NA NA NA NA NA Shadow _41 NA NA +IsFrontFace NA NA NA NA NA NA NA NA NA NA NA NA SGV SGV NA NA +Coverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NotPacked _41 NA +InnerCoverage NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig _50 NA NA +Target NA NA NA NA NA NA NA NA NA NA NA NA NA NA Target NA +Depth NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked NA +DepthLessEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA +DepthGreaterEqual NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA +StencilRef NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _50 NA +DispatchThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig +GroupID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig +GroupIndex NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig +GroupThreadID NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NotInSig +TessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA +InsideTessFactor NA NA NA NA NA NA TessFactor TessFactor NA NA NA NA NA NA NA NA +ViewID NotInSig _61 NA NotInSig _61 NotInSig _61 NA NA NA NotInSig _61 NA NA NA NotInSig _61 NA NotInSig _61 NA NA +Barycentrics NA NA NA NA NA NA NA NA NA NA NA NA NA NotPacked _61 NA NA +ShadingRate NA SV _64 NA NA SV _64 SV _64 NA NA SV _64 SV _64 SV _64 NA SV _64 SV _64 NA NA +====================== ============ ====== ============ ============ ====== ======= ========== ============ ====== ====== ====== ============ ====== ============= ============= ======== .. SEMINT-TABLE-RST:END diff --git a/include/dxc/DXIL/DxilConstants.h b/include/dxc/DXIL/DxilConstants.h index d253b0aad..0d5571f29 100644 --- a/include/dxc/DXIL/DxilConstants.h +++ b/include/dxc/DXIL/DxilConstants.h @@ -168,6 +168,7 @@ namespace DXIL { InsideTessFactor, ViewID, Barycentrics, + ShadingRate, Invalid, }; // SemanticKind-ENUM:END @@ -1139,8 +1140,9 @@ namespace DXIL { const uint64_t ShaderFeatureInfo_ViewID = 0x10000; const uint64_t ShaderFeatureInfo_Barycentrics = 0x20000; const uint64_t ShaderFeatureInfo_NativeLowPrecision = 0x40000; + const uint64_t ShaderFeatureInfo_ShadingRate = 0x80000; - const unsigned ShaderFeatureInfoCount = 19; + const unsigned ShaderFeatureInfoCount = 20; extern const char* kLegacyLayoutString; extern const char* kNewLayoutString; diff --git a/include/dxc/DXIL/DxilModule.h b/include/dxc/DXIL/DxilModule.h index 87501658f..c67236b99 100644 --- a/include/dxc/DXIL/DxilModule.h +++ b/include/dxc/DXIL/DxilModule.h @@ -129,6 +129,7 @@ public: void CloneDxilEntryProps(llvm::Function *F, llvm::Function *NewF); bool HasDxilEntryProps(const llvm::Function *F) const; DxilEntryProps &GetDxilEntryProps(const llvm::Function *F); + const DxilEntryProps &GetDxilEntryProps(const llvm::Function *F) const; // DxilFunctionProps. bool HasDxilFunctionProps(const llvm::Function *F) const; diff --git a/include/dxc/DXIL/DxilShaderFlags.h b/include/dxc/DXIL/DxilShaderFlags.h index 945858d1e..4d38928e3 100644 --- a/include/dxc/DXIL/DxilShaderFlags.h +++ b/include/dxc/DXIL/DxilShaderFlags.h @@ -105,6 +105,9 @@ namespace hlsl { void SetUseNativeLowPrecision(bool flag) { m_bUseNativeLowPrecision = flag; } bool GetUseNativeLowPrecision() const { return m_bUseNativeLowPrecision; } + void SetShadingRate(bool flag) { m_bShadingRate = flag; } + bool GetShadingRate() const { return m_bShadingRate; } + private: unsigned m_bDisableOptimizations :1; // D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION unsigned m_bDisableMathRefactoring :1; //~D3D10_SB_GLOBAL_FLAG_REFACTORING_ALLOWED @@ -138,7 +141,9 @@ namespace hlsl { unsigned m_bUseNativeLowPrecision : 1; - unsigned m_align0 : 8; // align to 32 bit. + unsigned m_bShadingRate : 1; // SHADER_FEATURE_SHADINGRATE + + unsigned m_align0 : 7; // align to 32 bit. uint32_t m_align1; // align to 64 bit. }; diff --git a/include/dxc/DXIL/DxilSigPoint.inl b/include/dxc/DXIL/DxilSigPoint.inl index 5d631332e..891079f4a 100644 --- a/include/dxc/DXIL/DxilSigPoint.inl +++ b/include/dxc/DXIL/DxilSigPoint.inl @@ -49,43 +49,45 @@ const SigPoint SigPoint::ms_SigPoints[kNumSigPointRecords] = { // hctdb_instrhelp.get_interpretation_table() // INTERPRETATION-TABLE:BEGIN -// Semantic, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn +// Semantic, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn #define DO_INTERPRETATION_TABLE(ROW) \ - ROW(Arbitrary, Arb, Arb, NA, NA, Arb, Arb, Arb, Arb, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \ - ROW(VertexID, SV, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \ - ROW(InstanceID, SV, Arb, NA, NA, Arb, Arb, NA, NA, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \ - ROW(Position, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ - ROW(RenderTargetArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ - ROW(ViewPortArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ - ROW(ClipDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ - ROW(CullDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ - ROW(OutputControlPointID, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \ - ROW(DomainLocation, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA) \ - ROW(PrimitiveID, NA, NA, NotInSig, NotInSig, NA, NA, NA, NotInSig, NA, NA, NA, Shadow, SGV, SGV, NA, NA) \ - ROW(GSInstanceID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA) \ - ROW(SampleIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Shadow _41, NA, NA) \ - ROW(IsFrontFace, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, SGV, SGV, NA, NA) \ - ROW(Coverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NotPacked _41, NA) \ - ROW(InnerCoverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NA, NA) \ - ROW(Target, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Target, NA) \ - ROW(Depth, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked, NA) \ - ROW(DepthLessEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \ - ROW(DepthGreaterEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \ - ROW(StencilRef, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \ - ROW(DispatchThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ - ROW(GroupID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ - ROW(GroupIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ - ROW(GroupThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ - ROW(TessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \ - ROW(InsideTessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \ - ROW(ViewID, NotInSig _61, NA, NotInSig _61, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NotInSig _61, NA, NA) \ - ROW(Barycentrics, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _61, NA, NA) + ROW(Arbitrary, Arb, Arb, NA, NA, Arb, Arb, Arb, Arb, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \ + ROW(VertexID, SV, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \ + ROW(InstanceID, SV, Arb, NA, NA, Arb, Arb, NA, NA, Arb, Arb, Arb, NA, Arb, Arb, NA, NA) \ + ROW(Position, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ + ROW(RenderTargetArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ + ROW(ViewPortArrayIndex, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ + ROW(ClipDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ + ROW(CullDistance, Arb, SV, NA, NA, SV, SV, Arb, Arb, SV, SV, SV, NA, SV, SV, NA, NA) \ + ROW(OutputControlPointID, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) \ + ROW(DomainLocation, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA, NA, NA, NA, NA) \ + ROW(PrimitiveID, NA, NA, NotInSig, NotInSig, NA, NA, NA, NotInSig, NA, NA, NA, Shadow, SGV, SGV, NA, NA) \ + ROW(GSInstanceID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig, NA, NA, NA, NA) \ + ROW(SampleIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Shadow _41, NA, NA) \ + ROW(IsFrontFace, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, SGV, SGV, NA, NA) \ + ROW(Coverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NotPacked _41, NA) \ + ROW(InnerCoverage, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig _50, NA, NA) \ + ROW(Target, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, Target, NA) \ + ROW(Depth, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked, NA) \ + ROW(DepthLessEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \ + ROW(DepthGreaterEqual, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \ + ROW(StencilRef, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _50, NA) \ + ROW(DispatchThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ + ROW(GroupID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ + ROW(GroupIndex, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ + ROW(GroupThreadID, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotInSig) \ + ROW(TessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \ + ROW(InsideTessFactor, NA, NA, NA, NA, NA, NA, TessFactor, TessFactor, NA, NA, NA, NA, NA, NA, NA, NA) \ + ROW(ViewID, NotInSig _61, NA, NotInSig _61, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NA, NA, NotInSig _61, NA, NotInSig _61, NA, NA) \ + ROW(Barycentrics, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NotPacked _61, NA, NA) \ + ROW(ShadingRate, NA, SV _64, NA, NA, SV _64, SV _64, NA, NA, SV _64, SV _64, SV _64, NA, SV _64, SV _64, NA, NA) // INTERPRETATION-TABLE:END const VersionedSemanticInterpretation SigPoint::ms_SemanticInterpretationTable[(unsigned)DXIL::SemanticKind::Invalid][(unsigned)SigPoint::Kind::Invalid] = { #define _41 ,4,1 #define _50 ,5,0 #define _61 ,6,1 +#define _64 ,6,4 #define DO_ROW(SEM, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn) \ { VersionedSemanticInterpretation(DXIL::SemanticInterpretationKind::VSIn), \ VersionedSemanticInterpretation(DXIL::SemanticInterpretationKind::VSOut), \ diff --git a/include/dxc/DxilContainer/DxilContainer.h b/include/dxc/DxilContainer/DxilContainer.h index 7e17663c5..32b200230 100644 --- a/include/dxc/DxilContainer/DxilContainer.h +++ b/include/dxc/DxilContainer/DxilContainer.h @@ -143,6 +143,7 @@ enum class DxilProgramSigSemantic : uint32_t { FinalLineDetailTessfactor = 15, FinalLineDensityTessfactor = 16, Barycentrics = 23, + ShadingRate = 24, Target = 64, Depth = 65, Coverage = 66, diff --git a/lib/DXIL/DxilModule.cpp b/lib/DXIL/DxilModule.cpp index 362a24ab8..607a8ef42 100644 --- a/lib/DXIL/DxilModule.cpp +++ b/lib/DXIL/DxilModule.cpp @@ -266,53 +266,6 @@ void DxilModule::CollectShaderFlagsForModule(ShaderFlags &Flags) { }; const ShaderModel *SM = GetShaderModel(); - if (SM->IsPS()) { - bool hasStencilRef = false; - DxilSignature &outS = GetOutputSignature(); - for (auto &&E : outS.GetElements()) { - if (E->GetKind() == Semantic::Kind::StencilRef) { - hasStencilRef = true; - } else if (E->GetKind() == Semantic::Kind::InnerCoverage) { - Flags.SetInnerCoverage(true); - } - } - - Flags.SetStencilRef(hasStencilRef); - } - - bool checkInputRTArrayIndex = - SM->IsGS() || SM->IsDS() || SM->IsHS() || SM->IsPS(); - if (checkInputRTArrayIndex) { - bool hasViewportArrayIndex = false; - bool hasRenderTargetArrayIndex = false; - DxilSignature &inS = GetInputSignature(); - for (auto &E : inS.GetElements()) { - if (E->GetKind() == Semantic::Kind::ViewPortArrayIndex) { - hasViewportArrayIndex = true; - } else if (E->GetKind() == Semantic::Kind::RenderTargetArrayIndex) { - hasRenderTargetArrayIndex = true; - } - } - Flags.SetViewportAndRTArrayIndex(hasViewportArrayIndex | - hasRenderTargetArrayIndex); - } - - bool checkOutputRTArrayIndex = - SM->IsVS() || SM->IsDS() || SM->IsHS() || SM->IsPS(); - if (checkOutputRTArrayIndex) { - bool hasViewportArrayIndex = false; - bool hasRenderTargetArrayIndex = false; - DxilSignature &outS = GetOutputSignature(); - for (auto &E : outS.GetElements()) { - if (E->GetKind() == Semantic::Kind::ViewPortArrayIndex) { - hasViewportArrayIndex = true; - } else if (E->GetKind() == Semantic::Kind::RenderTargetArrayIndex) { - hasRenderTargetArrayIndex = true; - } - } - Flags.SetViewportAndRTArrayIndex(hasViewportArrayIndex | - hasRenderTargetArrayIndex); - } unsigned NumUAVs = m_UAVs.size(); const unsigned kSmallUAVCount = 8; @@ -985,6 +938,10 @@ DxilEntryProps &DxilModule::GetDxilEntryProps(const llvm::Function *F) { DXASSERT(m_DxilEntryPropsMap.count(F) != 0, "cannot find F in map"); return *m_DxilEntryPropsMap.find(F)->second.get(); } +const DxilEntryProps &DxilModule::GetDxilEntryProps(const llvm::Function *F) const { + DXASSERT(m_DxilEntryPropsMap.count(F) != 0, "cannot find F in map"); + return *m_DxilEntryPropsMap.find(F)->second.get(); +} bool DxilModule::HasDxilFunctionProps(const llvm::Function *F) const { return m_DxilEntryPropsMap.find(F) != m_DxilEntryPropsMap.end(); diff --git a/lib/DXIL/DxilSemantic.cpp b/lib/DXIL/DxilSemantic.cpp index 1c5ae0df5..e90bfffc2 100644 --- a/lib/DXIL/DxilSemantic.cpp +++ b/lib/DXIL/DxilSemantic.cpp @@ -145,6 +145,7 @@ const Semantic Semantic::ms_SemanticTable[kNumSemanticRecords] = { SP(Kind::InsideTessFactor, "SV_InsideTessFactor"), SP(Kind::ViewID, "SV_ViewID"), SP(Kind::Barycentrics, "SV_Barycentrics"), + SP(Kind::ShadingRate, "SV_ShadingRate"), SP(Kind::Invalid, nullptr), }; diff --git a/lib/DXIL/DxilShaderFlags.cpp b/lib/DXIL/DxilShaderFlags.cpp index 334196740..3a4dba0e3 100644 --- a/lib/DXIL/DxilShaderFlags.cpp +++ b/lib/DXIL/DxilShaderFlags.cpp @@ -16,6 +16,7 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/Constants.h" #include "llvm/Support/Casting.h" +#include "dxc/DXIL/DxilEntryProps.h" using namespace hlsl; using namespace llvm; @@ -45,6 +46,7 @@ ShaderFlags::ShaderFlags(): , m_bViewID(false) , m_bBarycentrics(false) , m_bUseNativeLowPrecision(false) +, m_bShadingRate(false) , m_align0(0) , m_align1(0) {} @@ -90,6 +92,7 @@ uint64_t ShaderFlags::GetFeatureInfo() const { : 0; Flags |= m_bViewID ? hlsl::DXIL::ShaderFeatureInfo_ViewID : 0; Flags |= m_bBarycentrics ? hlsl::DXIL::ShaderFeatureInfo_Barycentrics : 0; + Flags |= m_bShadingRate ? hlsl::DXIL::ShaderFeatureInfo_ShadingRate : 0; return Flags; } @@ -141,6 +144,7 @@ uint64_t ShaderFlags::GetShaderFlagsRawForCollection() { Flags.SetCSRawAndStructuredViaShader4X(true); Flags.SetViewID(true); Flags.SetBarycentrics(true); + Flags.SetShadingRate(true); return Flags.GetShaderFlagsRaw(); } @@ -237,9 +241,13 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F, bool hasWaveOps = false; bool hasCheckAccessFully = false; bool hasMSAD = false; + bool hasStencilRef = false; bool hasInnerCoverage = false; bool hasViewID = false; bool hasMulticomponentUAVLoads = false; + bool hasViewportOrRTArrayIndex = false; + bool hasShadingRate = false; + // Try to maintain compatibility with a v1.0 validator if that's what we have. uint32_t valMajor, valMinor; M->GetValidatorVersion(valMajor, valMinor); @@ -379,8 +387,59 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F, } } } - + + // If this function is a shader, add flags based on signatures + if (M->HasDxilEntryProps(F)) { + const DxilEntryProps &entryProps = M->GetDxilEntryProps(F); + + bool checkInputRTArrayIndex = + entryProps.props.IsGS() || entryProps.props.IsDS() || + entryProps.props.IsHS() || entryProps.props.IsPS(); + bool checkOutputRTArrayIndex = + entryProps.props.IsVS() || entryProps.props.IsDS() || + entryProps.props.IsHS() || entryProps.props.IsPS(); + + for (auto &&E : entryProps.sig.InputSignature.GetElements()) { + switch (E->GetKind()) { + case Semantic::Kind::ViewPortArrayIndex: + case Semantic::Kind::RenderTargetArrayIndex: + if (checkInputRTArrayIndex) + hasViewportOrRTArrayIndex = true; + break; + case Semantic::Kind::ShadingRate: + hasShadingRate = true; + break; + default: + break; + } + } + + for (auto &&E : entryProps.sig.OutputSignature.GetElements()) { + switch (E->GetKind()) { + case Semantic::Kind::ViewPortArrayIndex: + case Semantic::Kind::RenderTargetArrayIndex: + if (checkOutputRTArrayIndex) + hasViewportOrRTArrayIndex = true; + break; + case Semantic::Kind::StencilRef: + if (entryProps.props.IsPS()) + hasStencilRef = true; + break; + case Semantic::Kind::InnerCoverage: + if (entryProps.props.IsPS()) + hasInnerCoverage = true; + break; + case Semantic::Kind::ShadingRate: + hasShadingRate = true; + break; + default: + break; + } + } + } + flag.SetEnableDoublePrecision(hasDouble); + flag.SetStencilRef(hasStencilRef); flag.SetInnerCoverage(hasInnerCoverage); flag.SetInt64Ops(has64Int); flag.SetLowPrecisionPresent(has16); @@ -390,6 +449,8 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F, flag.SetEnableMSAD(hasMSAD); flag.SetUAVLoadAdditionalFormats(hasMulticomponentUAVLoads); flag.SetViewID(hasViewID); + flag.SetViewportAndRTArrayIndex(hasViewportOrRTArrayIndex); + flag.SetShadingRate(hasShadingRate); return flag; } diff --git a/lib/DxilContainer/DxilContainerAssembler.cpp b/lib/DxilContainer/DxilContainerAssembler.cpp index 1514eb0ae..58868e8ba 100644 --- a/lib/DxilContainer/DxilContainerAssembler.cpp +++ b/lib/DxilContainer/DxilContainerAssembler.cpp @@ -54,6 +54,7 @@ static DxilProgramSigSemantic KindToSystemValue(Semantic::Kind kind, DXIL::Tesse case Semantic::Kind::ClipDistance: return DxilProgramSigSemantic::ClipDistance; case Semantic::Kind::CullDistance: return DxilProgramSigSemantic::CullDistance; case Semantic::Kind::Barycentrics: return DxilProgramSigSemantic::Barycentrics; + case Semantic::Kind::ShadingRate: return DxilProgramSigSemantic::ShadingRate; case Semantic::Kind::TessFactor: { switch (domain) { case DXIL::TessellatorDomain::IsoLine: diff --git a/lib/HLSL/DxilValidation.cpp b/lib/HLSL/DxilValidation.cpp index a5a4b90da..68572277e 100644 --- a/lib/HLSL/DxilValidation.cpp +++ b/lib/HLSL/DxilValidation.cpp @@ -4027,6 +4027,7 @@ static void ValidateSignatureElement(DxilSignatureElement &SE, case DXIL::SemanticKind::GSInstanceID: case DXIL::SemanticKind::SampleIndex: case DXIL::SemanticKind::StencilRef: + case DXIL::SemanticKind::ShadingRate: if ((compKind != CompType::Kind::U32 && compKind != CompType::Kind::U16) || SE.GetCols() != 1) { ValCtx.EmitFormatError(ValidationRule::MetaSemanticCompType, {SE.GetSemantic()->GetName(), "uint"}); diff --git a/tools/clang/test/CodeGenHLSL/quick-test/shadingrate1.hlsl b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate1.hlsl new file mode 100644 index 000000000..3841b5dc4 --- /dev/null +++ b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate1.hlsl @@ -0,0 +1,16 @@ +// RUN: %dxc -E main -T ps_6_4 %s | FileCheck %s + +// CHECK: ; Note: shader requires additional functionality: +// CHECK-NEXT: ; Shading Rate +// CHECK: ; Input signature: +// CHECK: ; SV_ShadingRate 0 x 1 NONE uint +// CHECK: ; Output signature: +// CHECK: ; Input signature: +// CHECK: ; SV_ShadingRate 0 nointerpolation +// CHECK: ; Output signature: +// CHECK: !{i32 1, !"SV_ShadingRate", i8 5, i8 29, + +float2 main(float2 v0 : Texcoord0, uint rate : SV_ShadingRate) : SV_Target { + uint2 rate2 = uint2(1 << (rate & 0x3), 1 << ((rate >> 2) & 0x3)); + return v0 * rate2; +} diff --git a/tools/clang/test/CodeGenHLSL/quick-test/shadingrate2.hlsl b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate2.hlsl new file mode 100644 index 000000000..7e73cb9f5 --- /dev/null +++ b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate2.hlsl @@ -0,0 +1,23 @@ +// RUN: %dxc -E main -T vs_6_4 %s | FileCheck %s + +// CHECK: ; Note: shader requires additional functionality: +// CHECK-NEXT: ; Shading Rate +// CHECK: ; Input signature: +// CHECK: ; Output signature: +// CHECK: ; SV_ShadingRate 0 x 1 NONE uint +// CHECK: ; Input signature: +// CHECK: ; Output signature: +// CHECK: ; SV_ShadingRate 0 nointerpolation +// CHECK: !{i32 1, !"SV_ShadingRate", i8 5, i8 29, + +struct VS_OUT { + float4 pos : SV_Position; + uint rate : SV_ShadingRate; +}; + +VS_OUT main(float4 pos : Pos, uint rate : ShadingRate) { + VS_OUT Out; + Out.pos = pos; + Out.rate = rate; + return Out; +} diff --git a/tools/clang/test/CodeGenHLSL/quick-test/shadingrate3.hlsl b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate3.hlsl new file mode 100644 index 000000000..3ec2f2e71 --- /dev/null +++ b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate3.hlsl @@ -0,0 +1,15 @@ +// RUN: %dxc -E main -T vs_6_4 %s | FileCheck %s + +// CHECK: error: invalid semantic 'SV_ShadingRate' + +struct VS_OUT { + float4 pos : SV_Position; + uint rate : ShadingRate; +}; + +VS_OUT main(float4 pos : Pos, uint rate : SV_ShadingRate) { + VS_OUT Out; + Out.pos = pos; + Out.rate = rate; + return Out; +} diff --git a/tools/clang/test/CodeGenHLSL/quick-test/shadingrate4.hlsl b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate4.hlsl new file mode 100644 index 000000000..935725e42 --- /dev/null +++ b/tools/clang/test/CodeGenHLSL/quick-test/shadingrate4.hlsl @@ -0,0 +1,16 @@ +// RUN: %dxc -E main -T vs_6_3 %s | FileCheck %s + +// TODO: fix consistency of error between invalid for shader model vs. invalid location +// CHECK: error: Semantic SV_ShadingRate is invalid for shader model: vs + +struct VS_OUT { + float4 pos : SV_Position; + uint rate : SV_ShadingRate; +}; + +VS_OUT main(float4 pos : Pos, uint rate : ShadingRate) { + VS_OUT Out; + Out.pos = pos; + Out.rate = rate; + return Out; +} diff --git a/tools/clang/test/HLSL/system-values.hlsl b/tools/clang/test/HLSL/system-values.hlsl index a48d8cf34..cbfc298ac 100644 --- a/tools/clang/test/HLSL/system-values.hlsl +++ b/tools/clang/test/HLSL/system-values.hlsl @@ -38,6 +38,7 @@ #define Def_GSInstanceID DECLARE(uint gsiid : SV_GSInstanceID) USE(uint, gsiid) #define Def_ViewID DECLARE(uint viewID : SV_ViewID) USE(uint, viewID) #define Def_Barycentrics DECLARE(float3 BaryWeights : SV_Barycentrics) USE(float, BaryWeights.x) USE(float, BaryWeights.y) USE(float, BaryWeights.z) +#define Def_ShadingRate DECLARE(uint rate : SV_ShadingRate) USE(uint, rate) #define Domain_Quad 0 #define Domain_Tri 1 diff --git a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp index cebb7299f..388ae5810 100644 --- a/tools/clang/tools/dxcompiler/dxcdisassembler.cpp +++ b/tools/clang/tools/dxcompiler/dxcdisassembler.cpp @@ -322,7 +322,8 @@ PCSTR g_pFeatureInfoNames[] = { "64-Bit integer", "View Instancing", "Barycentrics", - "Use native low precision" + "Use native low precision", + "Shading Rate" }; static_assert(_countof(g_pFeatureInfoNames) == ShaderFeatureInfoCount, "g_pFeatureInfoNames needs to be updated"); diff --git a/utils/hct/hctdb.py b/utils/hct/hctdb.py index e4a8cff45..fbfcf51aa 100644 --- a/utils/hct/hctdb.py +++ b/utils/hct/hctdb.py @@ -1700,7 +1700,8 @@ class db_dxil(object): (26, "InsideTessFactor", ""), (27, "ViewID", ""), (28, "Barycentrics", ""), - (29, "Invalid", ""), + (29, "ShadingRate", ""), + (30, "Invalid", ""), ]) self.enums.append(SemanticKind) SigPointKind = db_dxil_enum("SigPointKind", "Signature Point is more specific than shader stage or signature as it is unique in both stage and item dimensionality or frequency.", [ @@ -1819,6 +1820,7 @@ class db_dxil(object): InsideTessFactor,NA,NA,NA,NA,NA,NA,TessFactor,TessFactor,NA,NA,NA,NA,NA,NA,NA,NA ViewID,NotInSig _61,NA,NotInSig _61,NotInSig _61,NA,NA,NA,NotInSig _61,NA,NA,NA,NotInSig _61,NA,NotInSig _61,NA,NA Barycentrics,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NotPacked _61,NA,NA + ShadingRate,NA,SV _64,NA,NA,SV _64,SV _64,NA,NA,SV _64,SV _64,SV _64,NA,SV _64,SV _64,NA,NA """ table = [list(map(str.strip, line.split(','))) for line in SemanticInterpretationCSV.splitlines() if line.strip()] for row in table[1:]: assert(len(row) == len(table[0])) # Ensure table is rectangular