Browse Source

Add SV_ShadingRate plus optional feature flag

- Move/fix flag collection based on signature properties to be computed
  per entry function (including for libraries)
Tex Riddell 6 years ago
parent
commit
ecb4e3b4bb

+ 34 - 33
docs/DXIL.rst

@@ -662,39 +662,40 @@ Semantic Interpretations for each SemanticKind at each SigPointKind are as follo
 .. <py::lines('SEMINT-TABLE-RST')>hctdb_instrhelp.get_sem_interpretation_table_rst()</py>
 .. 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
 

+ 3 - 1
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;

+ 1 - 0
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;

+ 6 - 1
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.
   };
 

+ 32 - 30
include/dxc/DXIL/DxilSigPoint.inl

@@ -49,43 +49,45 @@ const SigPoint SigPoint::ms_SigPoints[kNumSigPointRecords] = {
 
 // <py::lines('INTERPRETATION-TABLE')>hctdb_instrhelp.get_interpretation_table()</py>
 // 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), \

+ 1 - 0
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,

+ 4 - 47
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();

+ 1 - 0
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),
 };
 

+ 62 - 1
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;
 }

+ 1 - 0
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:

+ 1 - 0
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"});

+ 16 - 0
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;
+}

+ 23 - 0
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;
+}

+ 15 - 0
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;
+}

+ 16 - 0
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;
+}

+ 1 - 0
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

+ 2 - 1
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");
 

+ 3 - 1
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