소스 검색

Merged PR 78: Add shader stage limitation for Raytracing intrinsic.

Add shader stage limitation for Raytracing intrinsic.
Xiang_Li (XBox) 7 년 전
부모
커밋
f34bd5054c

+ 18 - 6
include/dxc/HLSL/DxilConstants.h

@@ -405,19 +405,25 @@ namespace DXIL {
     WorldToObject = 152, // Matrix for transforming from world-space to object-space.
   
     // Ray Vectors
-    ObjectRayDirection = 150, // Object-space direction for the current ray.
-    ObjectRayOrigin = 149, // Object-space origin for the current ray.
     WorldRayDirection = 148, // The world-space direction for the current ray.
     WorldRayOrigin = 147, // The world-space origin for the current ray.
   
+    // Ray object space Vectors
+    ObjectRayDirection = 150, // Object-space direction for the current ray.
+    ObjectRayOrigin = 149, // Object-space origin for the current ray.
+  
     // RayT
     RayTCurrent = 154, // float representing the current parametric ending point for the ray
     RayTMin = 153, // float representing the parametric starting point for the ray.
   
-    // Raytracing uint System Values
+    // Raytracing hit uint System Values
     HitKind = 143, // Returns the value passed as HitKind in ReportIntersection().  If intersection was reported by fixed-function triangle intersection, HitKind will be one of HIT_KIND_TRIANGLE_FRONT_FACE or HIT_KIND_TRIANGLE_BACK_FACE.
+  
+    // Raytracing object space uint System Values
     InstanceID = 141, // The user-provided InstanceID on the bottom-level acceleration structure instance within the top-level structure
     InstanceIndex = 142, // The autogenerated index of the current instance in the top-level structure
+  
+    // Raytracing uint System Values
     RayFlags = 144, // uint containing the current ray flags.
   
     // Resources - gather
@@ -644,19 +650,25 @@ namespace DXIL {
     WorldToObject,
   
     // Ray Vectors
-    ObjectRayDirection,
-    ObjectRayOrigin,
     WorldRayDirection,
     WorldRayOrigin,
   
+    // Ray object space Vectors
+    ObjectRayDirection,
+    ObjectRayOrigin,
+  
     // RayT
     RayTCurrent,
     RayTMin,
   
-    // Raytracing uint System Values
+    // Raytracing hit uint System Values
     HitKind,
+  
+    // Raytracing object space uint System Values
     InstanceID,
     InstanceIndex,
+  
+    // Raytracing uint System Values
     RayFlags,
   
     // Resources - gather

+ 53 - 50
include/dxc/HLSL/DxilSigPoint.inl

@@ -20,24 +20,24 @@ namespace hlsl {
 // <py::lines('SIGPOINT-TABLE')>hctdb_instrhelp.get_sigpoint_table()</py>
 // SIGPOINT-TABLE:BEGIN
 //   SigPoint, Related, ShaderKind, PackingKind,    SignatureKind
-#define DO_SIGPOINTS(DO) \
-  DO(VSIn,     Invalid, Vertex,     InputAssembler, Input) \
-  DO(VSOut,    Invalid, Vertex,     Vertex,         Output) \
-  DO(PCIn,     HSCPIn,  Hull,       None,           Invalid) \
-  DO(HSIn,     HSCPIn,  Hull,       None,           Invalid) \
-  DO(HSCPIn,   Invalid, Hull,       Vertex,         Input) \
-  DO(HSCPOut,  Invalid, Hull,       Vertex,         Output) \
-  DO(PCOut,    Invalid, Hull,       PatchConstant,  PatchConstant) \
-  DO(DSIn,     Invalid, Domain,     PatchConstant,  PatchConstant) \
-  DO(DSCPIn,   Invalid, Domain,     Vertex,         Input) \
-  DO(DSOut,    Invalid, Domain,     Vertex,         Output) \
-  DO(GSVIn,    Invalid, Geometry,   Vertex,         Input) \
-  DO(GSIn,     GSVIn,   Geometry,   None,           Invalid) \
-  DO(GSOut,    Invalid, Geometry,   Vertex,         Output) \
-  DO(PSIn,     Invalid, Pixel,      Vertex,         Input) \
-  DO(PSOut,    Invalid, Pixel,      Target,         Output) \
-  DO(CSIn,     Invalid, Compute,    None,           Invalid) \
-  DO(Invalid,  Invalid, Invalid,    Invalid,        Invalid)
+#define DO_SIGPOINTS(ROW) \
+  ROW(VSIn,     Invalid, Vertex,     InputAssembler, Input) \
+  ROW(VSOut,    Invalid, Vertex,     Vertex,         Output) \
+  ROW(PCIn,     HSCPIn,  Hull,       None,           Invalid) \
+  ROW(HSIn,     HSCPIn,  Hull,       None,           Invalid) \
+  ROW(HSCPIn,   Invalid, Hull,       Vertex,         Input) \
+  ROW(HSCPOut,  Invalid, Hull,       Vertex,         Output) \
+  ROW(PCOut,    Invalid, Hull,       PatchConstant,  PatchConstant) \
+  ROW(DSIn,     Invalid, Domain,     PatchConstant,  PatchConstant) \
+  ROW(DSCPIn,   Invalid, Domain,     Vertex,         Input) \
+  ROW(DSOut,    Invalid, Domain,     Vertex,         Output) \
+  ROW(GSVIn,    Invalid, Geometry,   Vertex,         Input) \
+  ROW(GSIn,     GSVIn,   Geometry,   None,           Invalid) \
+  ROW(GSOut,    Invalid, Geometry,   Vertex,         Output) \
+  ROW(PSIn,     Invalid, Pixel,      Vertex,         Input) \
+  ROW(PSOut,    Invalid, Pixel,      Target,         Output) \
+  ROW(CSIn,     Invalid, Compute,    None,           Invalid) \
+  ROW(Invalid,  Invalid, Invalid,    Invalid,        Invalid)
 // SIGPOINT-TABLE:END
 
 const SigPoint SigPoint::ms_SigPoints[kNumSigPointRecords] = {
@@ -49,37 +49,37 @@ 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
-#define DO_INTERPRETATION_TABLE(D) \
-  {/*Arbitrary*/        D(Arb),         D(Arb), D(NA),           D(NA),           D(Arb), D(Arb),  D(Arb),        D(Arb),          D(Arb), D(Arb), D(Arb), D(NA),           D(Arb), D(Arb),           D(NA),            D(NA)}, \
-  {/*VertexID*/         D(SV),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NA)}, \
-  {/*InstanceID*/       D(SV),          D(Arb), D(NA),           D(NA),           D(Arb), D(Arb),  D(NA),         D(NA),           D(Arb), D(Arb), D(Arb), D(NA),           D(Arb), D(Arb),           D(NA),            D(NA)}, \
-  {/*Position*/         D(Arb),         D(SV),  D(NA),           D(NA),           D(SV),  D(SV),   D(Arb),        D(Arb),          D(SV),  D(SV),  D(SV),  D(NA),           D(SV),  D(SV),            D(NA),            D(NA)}, \
-  {/*RenderTgArrayIdx*/ D(Arb),         D(SV),  D(NA),           D(NA),           D(SV),  D(SV),   D(Arb),        D(Arb),          D(SV),  D(SV),  D(SV),  D(NA),           D(SV),  D(SV),            D(NA),            D(NA)}, \
-  {/*ViewPortArrayIdx*/ D(Arb),         D(SV),  D(NA),           D(NA),           D(SV),  D(SV),   D(Arb),        D(Arb),          D(SV),  D(SV),  D(SV),  D(NA),           D(SV),  D(SV),            D(NA),            D(NA)}, \
-  {/*ClipDistance*/     D(Arb),         D(SV),  D(NA),           D(NA),           D(SV),  D(SV),   D(Arb),        D(Arb),          D(SV),  D(SV),  D(SV),  D(NA),           D(SV),  D(SV),            D(NA),            D(NA)}, \
-  {/*CullDistance*/     D(Arb),         D(SV),  D(NA),           D(NA),           D(SV),  D(SV),   D(Arb),        D(Arb),          D(SV),  D(SV),  D(SV),  D(NA),           D(SV),  D(SV),            D(NA),            D(NA)}, \
-  {/*OutputControlPtID*/D(NA),          D(NA),  D(NA),           D(NotInSig),     D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NA)}, \
-  {/*DomainLocation*/   D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NotInSig),     D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NA)}, \
-  {/*PrimitiveID*/      D(NA),          D(NA),  D(NotInSig),     D(NotInSig),     D(NA),  D(NA),   D(NA),         D(NotInSig),     D(NA),  D(NA),  D(NA),  D(Shadow),       D(SGV), D(SGV),           D(NA),            D(NA)}, \
-  {/*GSInstanceID*/     D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NotInSig),     D(NA),  D(NA),            D(NA),            D(NA)}, \
-  {/*SampleIndex*/      D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(Shadow _41),    D(NA),            D(NA)}, \
-  {/*IsFrontFace*/      D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(SGV), D(SGV),           D(NA),            D(NA)}, \
-  {/*Coverage*/         D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NotInSig _50),  D(NotPacked _41), D(NA)}, \
-  {/*InnerCoverage*/    D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NotInSig _50),  D(NA),            D(NA)}, \
-  {/*Target*/           D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(Target),        D(NA)}, \
-  {/*Depth*/            D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NotPacked),     D(NA)}, \
-  {/*DepthLessEqual*/   D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NotPacked _50), D(NA)}, \
-  {/*DepthGreaterEqual*/D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NotPacked _50), D(NA)}, \
-  {/*StencilRef*/       D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NotPacked _50), D(NA)}, \
-  {/*DispatchThreadID*/ D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NotInSig)}, \
-  {/*GroupID*/          D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NotInSig)}, \
-  {/*GroupIndex*/       D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NotInSig)}, \
-  {/*GroupThreadID*/    D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NotInSig)}, \
-  {/*TessFactor*/       D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(TessFactor), D(TessFactor),   D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NA)}, \
-  {/*InsideTessFactor*/ D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(TessFactor), D(TessFactor),   D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NA),            D(NA),            D(NA)}, \
-  {/*ViewID*/           D(NotInSig _61),D(NA),  D(NotInSig _61), D(NotInSig _61), D(NA),  D(NA),   D(NA),         D(NotInSig _61), D(NA),  D(NA),  D(NA),  D(NotInSig _61), D(NA),  D(NotInSig _61),  D(NA),            D(NA)}, \
-  {/*Barycentrics*/     D(NA),          D(NA),  D(NA),           D(NA),           D(NA),  D(NA),   D(NA),         D(NA),           D(NA),  D(NA),  D(NA),  D(NA),           D(NA),  D(NotPacked _61), D(NA),            D(NA)}, \
+//   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)
 // INTERPRETATION-TABLE:END
 
 const VersionedSemanticInterpretation SigPoint::ms_SemanticInterpretationTable[(unsigned)DXIL::SemanticKind::Invalid][(unsigned)SigPoint::Kind::Invalid] = {
@@ -87,7 +87,10 @@ const VersionedSemanticInterpretation SigPoint::ms_SemanticInterpretationTable[(
 #define _50 ,5,0
 #define _61 ,6,1
 #define DO(k) VersionedSemanticInterpretation(DXIL::SemanticInterpretationKind::k)
-  DO_INTERPRETATION_TABLE(DO)
+#define DO_ROW(SEM, VSIn, VSOut, PCIn, HSIn, HSCPIn, HSCPOut, PCOut, DSIn, DSCPIn, DSOut, GSVIn, GSIn, GSOut, PSIn, PSOut, CSIn) \
+  { DO(VSIn), DO(VSOut), DO(PCIn), DO(HSIn), DO(HSCPIn), DO(HSCPOut), DO(PCOut), DO(DSIn), DO(DSCPIn), DO(DSOut), DO(GSVIn), DO(GSIn), DO(GSOut), DO(PSIn), DO(PSOut), DO(CSIn) },
+  DO_INTERPRETATION_TABLE(DO_ROW)
+#undef DO_ROW
 #undef DO
 };
 

+ 14 - 2
lib/HLSL/DxilOperations.cpp

@@ -265,10 +265,14 @@ const OP::OpCodeProperty OP::m_OpCodeProps[(unsigned)OP::OpCode::NumOpCodes] = {
   {  OC::RawBufferLoad,           "RawBufferLoad",            OCC::RawBufferLoad,            "rawBufferLoad",              false,  true,  true, false, false, false,  true,  true, false, false, false, Attribute::ReadOnly, },
   {  OC::RawBufferStore,          "RawBufferStore",           OCC::RawBufferStore,           "rawBufferStore",             false,  true,  true, false, false, false,  true,  true, false, false, false, Attribute::None,     },
 
-  // Raytracing uint System Values                                                                                          void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64,   udt,  obj,  function attribute
+  // Raytracing object space uint System Values                                                                             void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64,   udt,  obj,  function attribute
   {  OC::InstanceID,              "InstanceID",               OCC::InstanceID,               "instanceID",                 false, false, false, false, false, false, false,  true, false, false, false, Attribute::ReadNone, },
   {  OC::InstanceIndex,           "InstanceIndex",            OCC::InstanceIndex,            "instanceIndex",              false, false, false, false, false, false, false,  true, false, false, false, Attribute::ReadNone, },
+
+  // Raytracing hit uint System Values                                                                                      void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64,   udt,  obj,  function attribute
   {  OC::HitKind,                 "HitKind",                  OCC::HitKind,                  "hitKind",                    false, false, false, false, false, false, false,  true, false, false, false, Attribute::ReadNone, },
+
+  // Raytracing uint System Values                                                                                          void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64,   udt,  obj,  function attribute
   {  OC::RayFlags,                "RayFlags",                 OCC::RayFlags,                 "rayFlags",                   false, false, false, false, false, false, false,  true, false, false, false, Attribute::ReadNone, },
 
   // Ray Dispatch Arguments                                                                                                 void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64,   udt,  obj,  function attribute
@@ -278,6 +282,8 @@ const OP::OpCodeProperty OP::m_OpCodeProps[(unsigned)OP::OpCode::NumOpCodes] = {
   // Ray Vectors                                                                                                            void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64,   udt,  obj,  function attribute
   {  OC::WorldRayOrigin,          "WorldRayOrigin",           OCC::WorldRayOrigin,           "worldRayOrigin",             false, false,  true, false, false, false, false, false, false, false, false, Attribute::ReadNone, },
   {  OC::WorldRayDirection,       "WorldRayDirection",        OCC::WorldRayDirection,        "worldRayDirection",          false, false,  true, false, false, false, false, false, false, false, false, Attribute::ReadNone, },
+
+  // Ray object space Vectors                                                                                               void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64,   udt,  obj,  function attribute
   {  OC::ObjectRayOrigin,         "ObjectRayOrigin",          OCC::ObjectRayOrigin,          "objectRayOrigin",            false, false,  true, false, false, false, false, false, false, false, false, Attribute::ReadNone, },
   {  OC::ObjectRayDirection,      "ObjectRayDirection",       OCC::ObjectRayDirection,       "objectRayDirection",         false, false,  true, false, false, false, false, false, false, false, false, Attribute::ReadNone, },
 
@@ -838,10 +844,14 @@ Function *OP::GetOpFunc(OpCode OpCode, Type *pOverloadType) {
   case OpCode::RawBufferLoad:          RRT(pETy);   A(pI32); A(pRes); A(pI32); A(pI32); A(pI8);  A(pI32); break;
   case OpCode::RawBufferStore:         A(pV);       A(pI32); A(pRes); A(pI32); A(pI32); A(pETy); A(pETy); A(pETy); A(pETy); A(pI8);  A(pI32); break;
 
-    // Raytracing uint System Values
+    // Raytracing object space uint System Values
   case OpCode::InstanceID:             A(pI32);     A(pI32); break;
   case OpCode::InstanceIndex:          A(pI32);     A(pI32); break;
+
+    // Raytracing hit uint System Values
   case OpCode::HitKind:                A(pI32);     A(pI32); break;
+
+    // Raytracing uint System Values
   case OpCode::RayFlags:               A(pI32);     A(pI32); break;
 
     // Ray Dispatch Arguments
@@ -851,6 +861,8 @@ Function *OP::GetOpFunc(OpCode OpCode, Type *pOverloadType) {
     // Ray Vectors
   case OpCode::WorldRayOrigin:         A(pF32);     A(pI32); A(pI8);  break;
   case OpCode::WorldRayDirection:      A(pF32);     A(pI32); A(pI8);  break;
+
+    // Ray object space Vectors
   case OpCode::ObjectRayOrigin:        A(pF32);     A(pI32); A(pI8);  break;
   case OpCode::ObjectRayDirection:     A(pF32);     A(pI32); A(pI8);  break;
 

+ 38 - 8
lib/HLSL/DxilValidation.cpp

@@ -609,7 +609,7 @@ static bool ValidateOpcodeInProfile(DXIL::OpCode opcode,
     return (pSM->IsGS());
   // Instructions: PrimitiveID=108
   if (op == 108)
-    return (pSM->IsGS() || pSM->IsDS() || pSM->IsHS() || pSM->IsPS());
+    return (pSM->IsGS() || pSM->IsDS() || pSM->IsHS() || pSM->IsPS() || pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::Intersection || pSM->GetKind() == DXIL::ShaderKind::AnyHit || pSM->GetKind() == DXIL::ShaderKind::ClosestHit);
   // Instructions: StorePatchConstant=106, OutputControlPointID=107
   if (106 <= op && op <= 107)
     return (pSM->IsHS());
@@ -631,14 +631,40 @@ static bool ValidateOpcodeInProfile(DXIL::OpCode opcode,
   // Instructions: RawBufferLoad=139, RawBufferStore=140
   if (139 <= op && op <= 140)
     return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 2));
-  // Instructions: InstanceID=141, InstanceIndex=142, HitKind=143, RayFlags=144,
-  // DispatchRaysIndex=145, DispatchRaysDimensions=146, WorldRayOrigin=147,
-  // WorldRayDirection=148, ObjectRayOrigin=149, ObjectRayDirection=150,
-  // ObjectToWorld=151, WorldToObject=152, RayTMin=153, RayTCurrent=154,
-  // IgnoreHit=155, AcceptHitAndEndSearch=156, TraceRay=157, ReportHit=158,
-  // CallShader=159, CreateHandleFromResourceStructForLib=160
-  if (141 <= op && op <= 160)
+  // Instructions: CreateHandleFromResourceStructForLib=160
+  if (op == 160)
     return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3));
+  // Instructions: IgnoreHit=155, AcceptHitAndEndSearch=156
+  if (155 <= op && op <= 156)
+    return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3))
+        && (pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::AnyHit);
+  // Instructions: CallShader=159
+  if (op == 159)
+    return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3))
+        && (pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::ClosestHit || pSM->GetKind() == DXIL::ShaderKind::RayGeneration || pSM->GetKind() == DXIL::ShaderKind::Miss || pSM->GetKind() == DXIL::ShaderKind::Callable);
+  // Instructions: ReportHit=158
+  if (op == 158)
+    return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3))
+        && (pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::Intersection);
+  // Instructions: InstanceID=141, InstanceIndex=142, HitKind=143,
+  // ObjectRayOrigin=149, ObjectRayDirection=150, ObjectToWorld=151,
+  // WorldToObject=152
+  if (141 <= op && op <= 143 || 149 <= op && op <= 152)
+    return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3))
+        && (pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::Intersection || pSM->GetKind() == DXIL::ShaderKind::AnyHit || pSM->GetKind() == DXIL::ShaderKind::ClosestHit);
+  // Instructions: RayFlags=144, WorldRayOrigin=147, WorldRayDirection=148,
+  // RayTMin=153, RayTCurrent=154
+  if (op == 144 || 147 <= op && op <= 148 || 153 <= op && op <= 154)
+    return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3))
+        && (pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::Intersection || pSM->GetKind() == DXIL::ShaderKind::AnyHit || pSM->GetKind() == DXIL::ShaderKind::ClosestHit || pSM->GetKind() == DXIL::ShaderKind::Miss);
+  // Instructions: TraceRay=157
+  if (op == 157)
+    return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3))
+        && (pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::RayGeneration || pSM->GetKind() == DXIL::ShaderKind::ClosestHit || pSM->GetKind() == DXIL::ShaderKind::Miss);
+  // Instructions: DispatchRaysIndex=145, DispatchRaysDimensions=146
+  if (145 <= op && op <= 146)
+    return (pSM->GetMajor() > 6 || (pSM->GetMajor() == 6 && pSM->GetMinor() >= 3))
+        && (pSM->IsLib() || pSM->GetKind() == DXIL::ShaderKind::RayGeneration || pSM->GetKind() == DXIL::ShaderKind::Intersection || pSM->GetKind() == DXIL::ShaderKind::AnyHit || pSM->GetKind() == DXIL::ShaderKind::ClosestHit || pSM->GetKind() == DXIL::ShaderKind::Miss || pSM->GetKind() == DXIL::ShaderKind::Callable);
   return true;
   // VALOPCODESM-TEXT:END
 }
@@ -2045,6 +2071,10 @@ static void ValidateDxilOperationCallInProfile(CallInst *CI,
       ValCtx.EmitFormatError(ValidationRule::SmOpcodeInInvalidFunction,
                              {"QuadReadLaneAt", "Pixel Shader"});
     break;
+  case DXIL::OpCode::CreateHandleFromResourceStructForLib:
+    ValCtx.EmitFormatError(ValidationRule::SmOpcodeInInvalidFunction,
+                           {"CreateHandleFromResourceStructForLib", "Library"});
+    break;
   default:
     // Skip opcodes don't need special check.
     break;

+ 2 - 2
tools/clang/lib/Sema/gen_intrin_main_tables_15.h

@@ -70,12 +70,12 @@ static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args8[] =
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args9[] =
 {
-    {"DispatchRaysDimensions", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 2},
+    {"DispatchRaysDimensions", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 3},
 };
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args10[] =
 {
-    {"DispatchRaysIndex", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 2},
+    {"DispatchRaysIndex", AR_QUAL_OUT, 0, LITEMPLATE_VECTOR, 0, LICOMPTYPE_UINT, 1, 3},
 };
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args11[] =

+ 2 - 2
utils/hct/gen_intrin_main.txt

@@ -274,8 +274,8 @@ bool [[]]  ReportHit(in float THit, in uint HitKind, in udt Attributes);
 void [[]]  CallShader(in uint ShaderIndex, inout udt Parameter);
 void [[]]  IgnoreHit();
 void [[]]  AcceptHitAndEndSearch();
-uint<2> [[rn]] DispatchRaysIndex();
-uint<2> [[rn]] DispatchRaysDimensions();
+uint<3> [[rn]] DispatchRaysIndex();
+uint<3> [[rn]] DispatchRaysDimensions();
 // group: Ray Vectors
 float<3> [[rn]] WorldRayOrigin();
 float<3> [[rn]] WorldRayDirection();

+ 62 - 16
utils/hct/hctdb.py

@@ -5,6 +5,22 @@
 ###############################################################################
 import os
 
+all_stages = (
+    'vertex',
+    'pixel',
+    'geometry',
+    'compute',
+    'hull',
+    'domain',
+    'library',
+    'raygeneration',
+    'intersection',
+    'anyhit',
+    'closesthit',
+    'miss',
+    'callable',
+    )
+
 class db_dxil_enum_value(object):
     "A representation for a value in an enumeration type"
     def __init__(self, name, value, doc):
@@ -49,7 +65,7 @@ class db_dxil_inst(object):
         self.is_gradient = False        # whether this requires a gradient calculation
         self.is_wave = False            # whether this requires in-wave, cross-lane functionality
         self.requires_uniform_inputs = False  # whether this operation requires that all of its inputs are uniform across the wave
-        self.shader_stages = "*"        # shader stages to which this applies, * or one or more of cdghpv
+        self.shader_stages = ()         # shader stages to which this applies, empty for all.
         self.shader_model = 6,0         # minimum shader model required
         self.inst_helper_prefix = None
         self.fully_qualified_name_prefix = "hlsl::OP::OpCode"
@@ -119,7 +135,7 @@ class db_dxil_valrule(object):
         self.err_msg = ""                   # error message associated with rule
         self.category = ""                  # classification for this rule
         self.doc = ""                       # the documentation description of this rule
-        self.shader_stages = "*"            # shader stages to which this applies, * or one or more of cdghpv
+        self.shader_stages = ()             # shader stages to which this applies, empty for all.
         self.shader_model = 6,0             # minimum shader model required
         for k,v in list(kwargs.items()):
             setattr(self, k, v)
@@ -253,32 +269,35 @@ class db_dxil(object):
         for i in "Sample,SampleBias,SampleLevel,SampleGrad,SampleCmp,SampleCmpLevelZero,Texture2DMSGetSamplePosition,RenderTargetGetSamplePosition,RenderTargetGetSampleCount".split(","):
             self.name_idx[i].category = "Resources - sample"
         for i in "Sample,SampleBias,SampleCmp,RenderTargetGetSamplePosition,RenderTargetGetSampleCount".split(","):
-            self.name_idx[i].shader_stages = "p"
+            self.name_idx[i].shader_stages = ("pixel",)
         for i in "TextureGather,TextureGatherCmp".split(","):
             self.name_idx[i].category = "Resources - gather"
         for i in "AtomicBinOp,AtomicCompareExchange,Barrier".split(","):
             self.name_idx[i].category = "Synchronization"
         for i in "CalculateLOD,Discard,DerivCoarseX,DerivCoarseY,DerivFineX,DerivFineY,EvalSnapped,EvalSampleIndex,EvalCentroid,SampleIndex,Coverage,InnerCoverage,AttributeAtVertex".split(","):
             self.name_idx[i].category = "Pixel shader"
-            self.name_idx[i].shader_stages = "p"
+            self.name_idx[i].shader_stages = ("pixel",)
         for i in "ThreadId,GroupId,ThreadIdInGroup,FlattenedThreadIdInGroup".split(","):
             self.name_idx[i].category = "Compute shader"
-            self.name_idx[i].shader_stages = "c"
+            self.name_idx[i].shader_stages = ("compute",)
         for i in "EmitStream,CutStream,EmitThenCutStream,GSInstanceID".split(","):
             self.name_idx[i].category = "Geometry shader"
-            self.name_idx[i].shader_stages = "g"
+            self.name_idx[i].shader_stages = ("geometry",)
         for i in "LoadOutputControlPoint,LoadPatchConstant".split(","):
             self.name_idx[i].category = "Domain and hull shader"
-            self.name_idx[i].shader_stages = "dh"
+            self.name_idx[i].shader_stages = ("domain", "hull")
         for i in "DomainLocation".split(","):
             self.name_idx[i].category = "Domain shader"
-            self.name_idx[i].shader_stages = "d"
-        for i in "StorePatchConstant,OutputControlPointID,PrimitiveID".split(","):
+            self.name_idx[i].shader_stages = ("domain",)
+        for i in "StorePatchConstant,OutputControlPointID".split(","):
+            self.name_idx[i].category = "Hull shader"
+            self.name_idx[i].shader_stages = ("hull",)
+        for i in "PrimitiveID".split(","):
             self.name_idx[i].category = "Hull shader"
-            self.name_idx[i].shader_stages = "gdhp" if i == "PrimitiveID" else "h"
+            self.name_idx[i].shader_stages = ("geometry", "domain", "hull", "pixel","library","intersection","anyhit","closesthit")		
         for i in "ViewID".split(","):
             self.name_idx[i].category = "Graphics shader"
-            self.name_idx[i].shader_stages = "vhdgp"
+            self.name_idx[i].shader_stages = ("vertex", "hull", "domain", "geometry", "pixel")
         for i in "MakeDouble,SplitDouble,LegacyDoubleToFloat,LegacyDoubleToSInt32,LegacyDoubleToUInt32".split(","):
             self.name_idx[i].category = "Double precision"
         for i in "CycleCounterLegacy".split(","):
@@ -295,27 +314,54 @@ class db_dxil(object):
             self.name_idx[i].shader_model = 6,1
         for i in "RawBufferLoad,RawBufferStore".split(","):
             self.name_idx[i].shader_model = 6,2
-        for i in "InstanceID,InstanceIndex,HitKind,RayFlags".split(","):
-            self.name_idx[i].category = "Raytracing uint System Values"
-            self.name_idx[i].shader_model = 6,3
         for i in "DispatchRaysIndex,DispatchRaysDimensions".split(","):
             self.name_idx[i].category = "Ray Dispatch Arguments"
             self.name_idx[i].shader_model = 6,3
-        for i in "WorldRayOrigin,WorldRayDirection,ObjectRayOrigin,ObjectRayDirection".split(","):
+            self.name_idx[i].shader_stages = ("library", "raygeneration","intersection","anyhit", "closesthit","miss","callable")
+        for i in "InstanceID,InstanceIndex".split(","):
+            self.name_idx[i].category = "Raytracing object space uint System Values"
+            self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library","intersection","anyhit","closesthit")
+        for i in "HitKind".split(","):
+            self.name_idx[i].category = "Raytracing hit uint System Values"
+            self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library","intersection","anyhit","closesthit",)
+        for i in "RayFlags".split(","):
+            self.name_idx[i].category = "Raytracing uint System Values"
+            self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library","intersection","anyhit","closesthit","miss")
+        for i in "WorldRayOrigin,WorldRayDirection".split(","):
             self.name_idx[i].category = "Ray Vectors"
             self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library","intersection","anyhit","closesthit","miss")
+        for i in "ObjectRayOrigin,ObjectRayDirection".split(","):
+            self.name_idx[i].category = "Ray object space Vectors"
+            self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library","intersection","anyhit","closesthit")
         for i in "ObjectToWorld,WorldToObject".split(","):
             self.name_idx[i].category = "Ray Transforms"
             self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library","intersection","anyhit","closesthit")
         for i in "RayTMin,RayTCurrent".split(","):
             self.name_idx[i].category = "RayT"
             self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library","intersection","anyhit","closesthit", "miss")
         for i in "IgnoreHit,AcceptHitAndEndSearch".split(","):
             self.name_idx[i].category = "AnyHit Terminals"
             self.name_idx[i].shader_model = 6,3
-        for i in "TraceRay,ReportHit,CallShader".split(","):
+            self.name_idx[i].shader_stages = ("library","anyhit")
+        for i in "CallShader".split(","):
+            self.name_idx[i].category = "Indirect Shader Invocation"
+            self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library", "closesthit","raygeneration","miss","callable")
+        for i in "TraceRay".split(","):
+            self.name_idx[i].category = "Indirect Shader Invocation"
+            self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library", "raygeneration","closesthit","miss")
+        for i in "ReportHit".split(","):
             self.name_idx[i].category = "Indirect Shader Invocation"
             self.name_idx[i].shader_model = 6,3
+            self.name_idx[i].shader_stages = ("library", "intersection")
         for i in "CreateHandleFromResourceStructForLib".split(","):
             self.name_idx[i].category = "Library create handle from resource struct (like HL intrinsic)"
             self.name_idx[i].shader_model = 6,3

+ 20 - 4
utils/hct/hctdb_instrhelp.py

@@ -598,8 +598,8 @@ class macro_table_gen:
     def print_table(self, table, macro_name):
         formatted = self.format_table(table)
         print(  '//   %s\n' % formatted[0] +
-                '#define %s(DO) \\\n' % macro_name +
-                ' \\\n'.join(['  DO(%s)' % frow for frow in formatted[1:]]))
+                '#define %s(ROW) \\\n' % macro_name +
+                ' \\\n'.join(['  ROW(%s)' % frow for frow in formatted[1:]]))
 
 class db_sigpoint_gen(macro_table_gen):
     "A generator for SigPoint tables."
@@ -921,6 +921,22 @@ def get_opsigs():
     code += "};\n"
     return code
 
+check_pSM_for_shader_stage = {
+    'vertex': 'pSM->IsVS()',
+    'pixel': 'pSM->IsPS()',
+    'geometry': 'pSM->IsGS()',
+    'compute': 'pSM->IsCS()',
+    'hull': 'pSM->IsHS()',
+    'domain': 'pSM->IsDS()',
+    'library': 'pSM->IsLib()',
+    'raygeneration': 'pSM->GetKind() == DXIL::ShaderKind::RayGeneration',
+    'intersection': 'pSM->GetKind() == DXIL::ShaderKind::Intersection',
+    'anyhit': 'pSM->GetKind() == DXIL::ShaderKind::AnyHit',
+    'closesthit': 'pSM->GetKind() == DXIL::ShaderKind::ClosestHit',
+    'miss': 'pSM->GetKind() == DXIL::ShaderKind::Miss',
+    'callable': 'pSM->GetKind() == DXIL::ShaderKind::Callable',
+}
+
 def get_valopcode_sm_text():
     db = get_db_dxil()
     instrs = [i for i in db.instr if i.is_dxil_op]
@@ -940,8 +956,8 @@ def get_valopcode_sm_text():
         if last_model != (6,0):
             model_cond = "pSM->GetMajor() > %d || (pSM->GetMajor() == %d && pSM->GetMinor() >= %d)" % (
                 last_model[0], last_model[0], last_model[1])
-        if last_stage != "*":
-            stage_cond = ' || '.join(["pSM->Is%sS()" % c.upper() for c in last_stage])
+        if last_stage:
+            stage_cond = ' || '.join([check_pSM_for_shader_stage[c] for c in last_stage])
         if model_cond or stage_cond:
             result += '\n      && '.join(
                 ["(%s)" % expr for expr in (model_cond, stage_cond) if expr] )