Procházet zdrojové kódy

added missing DXR 1.1 flags (#2352)

Added missing DXR 1.1 flags support + tests
amarpMSFT před 6 roky
rodič
revize
fadbe9de8a

+ 2 - 1
include/dxc/DXIL/DxilConstants.h

@@ -1331,7 +1331,8 @@ namespace DXIL {
   enum class StateObjectFlags : uint32_t {
     AllowLocalDependenciesOnExternalDefinitions = 0x1,
     AllowExternalDependenciesOnLocalDefinitions = 0x2,
-    ValidMask = 0x3,
+    AllowStateObjectAdditions                   = 0x4,
+    ValidMask                                   = 0x7,
   };
 
   enum class HitGroupType : uint32_t {

+ 3 - 0
tools/clang/lib/AST/ASTContextHLSL.cpp

@@ -440,6 +440,8 @@ void hlsl::AddRaytracingConstants(ASTContext& context) {
     { "RAY_FLAG_CULL_FRONT_FACING_TRIANGLES", (unsigned)DXIL::RayFlag::CullFrontFacingTriangles },
     { "RAY_FLAG_CULL_OPAQUE", (unsigned)DXIL::RayFlag::CullOpaque },
     { "RAY_FLAG_CULL_NON_OPAQUE", (unsigned)DXIL::RayFlag::CullNonOpaque },
+    { "RAY_FLAG_SKIP_TRIANGLES", (unsigned)DXIL::RayFlag::SkipTriangles },
+    { "RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES", (unsigned)DXIL::RayFlag::SkipProceduralPrimitives },
   });
 
   AddTypedefPseudoEnum(context, "COMMITTED_STATUS", {
@@ -463,6 +465,7 @@ void hlsl::AddRaytracingConstants(ASTContext& context) {
   // The above "_FLAGS_" was a typo, leaving in to avoid breaking anyone.  Supposed to be _FLAG_ below.  
   AddConstUInt(context, StringRef("STATE_OBJECT_FLAG_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS"), (unsigned)DXIL::StateObjectFlags::AllowLocalDependenciesOnExternalDefinitions);
   AddConstUInt(context, StringRef("STATE_OBJECT_FLAG_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS"), (unsigned)DXIL::StateObjectFlags::AllowExternalDependenciesOnLocalDefinitions);
+  AddConstUInt(context, StringRef("STATE_OBJECT_FLAG_ALLOW_STATE_OBJECT_ADDITIONS"), (unsigned)DXIL::StateObjectFlags::AllowStateObjectAdditions);
 
   AddConstUInt(context, StringRef("RAYTRACING_PIPELINE_FLAG_NONE"), (unsigned)DXIL::RaytracingPipelineFlags::None);
   AddConstUInt(context, StringRef("RAYTRACING_PIPELINE_FLAG_SKIP_TRIANGLES"), (unsigned)DXIL::RaytracingPipelineFlags::SkipTriangles);

+ 3 - 3
tools/clang/test/CodeGenHLSL/batch/shader_stages/raytracing/rayquery/tracerayinline.hlsl

@@ -1,18 +1,18 @@
 // RUN: %dxc -T vs_6_5 -E main %s | FileCheck %s
 
 // CHECK: %[[RTAS:[^ ]+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false)
-// CHECK: %[[RQ:[^ ]+]] = call i32 @dx.op.allocateRayQuery(i32 178, i32 1)
+// CHECK: %[[RQ:[^ ]+]] = call i32 @dx.op.allocateRayQuery(i32 178, i32 513)
 // CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 179, i32 %[[RQ]], %dx.types.Handle %[[RTAS]], i32 0, i32 1,
 // CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 179, i32 %[[RQ]], %dx.types.Handle %[[RTAS]], i32 1, i32 2,
 
 RaytracingAccelerationStructure RTAS;
 
-void DoTrace(RayQuery<RAY_FLAG_FORCE_OPAQUE> rayQuery, RayDesc rayDesc) {
+void DoTrace(RayQuery<RAY_FLAG_FORCE_OPAQUE|RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES> rayQuery, RayDesc rayDesc) {
   rayQuery.TraceRayInline(RTAS, 0, 1, rayDesc);
 }
 
 float main(RayDesc rayDesc : RAYDESC) : OUT {
-  RayQuery<RAY_FLAG_FORCE_OPAQUE> rayQuery;
+  RayQuery<RAY_FLAG_FORCE_OPAQUE|RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES> rayQuery;
   DoTrace(rayQuery, rayDesc);
   rayQuery.TraceRayInline(RTAS, 1, 2, rayDesc);
   return 0;

+ 8 - 4
tools/clang/test/CodeGenHLSL/batch/shader_stages/raytracing/raytracing_builtin.hlsl

@@ -11,6 +11,8 @@
 // CHECK: call void @dx.op.rawBufferStore.i32({{.*}}, i32 32
 // CHECK: call void @dx.op.rawBufferStore.i32({{.*}}, i32 64
 // CHECK: call void @dx.op.rawBufferStore.i32({{.*}}, i32 128
+// CHECK: call void @dx.op.rawBufferStore.i32({{.*}}, i32 256
+// CHECK: call void @dx.op.rawBufferStore.i32({{.*}}, i32 512
 // CHECK: call void @dx.op.rawBufferStore.i32({{.*}}, i32 254
 // CHECK: call void @dx.op.rawBufferStore.i32({{.*}}, i32 255
 
@@ -26,8 +28,10 @@ void check(BuiltInTriangleIntersectionAttributes attr) {
     g_buf.Store(24, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES);
     g_buf.Store(28, RAY_FLAG_CULL_OPAQUE);
     g_buf.Store(32, RAY_FLAG_CULL_NON_OPAQUE);
-    g_buf.Store(36, HIT_KIND_TRIANGLE_FRONT_FACE);
-    g_buf.Store(40, HIT_KIND_TRIANGLE_BACK_FACE);
-    g_buf.Store(44, attr.barycentrics.x);
-    g_buf.Store(48, attr.barycentrics.y);
+    g_buf.Store(36, RAY_FLAG_SKIP_TRIANGLES);
+    g_buf.Store(40, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES);
+    g_buf.Store(44, HIT_KIND_TRIANGLE_FRONT_FACE);
+    g_buf.Store(48, HIT_KIND_TRIANGLE_BACK_FACE);
+    g_buf.Store(52, attr.barycentrics.x);
+    g_buf.Store(56, attr.barycentrics.y);
 }

+ 2 - 2
tools/clang/test/CodeGenHLSL/batch/shader_stages/raytracing/subobjects_raytracingPipelineConfig1.hlsl

@@ -1,7 +1,7 @@
 // RUN: %dxc -T lib_6_3 %s | FileCheck %s
 
 // CHECK: ; GlobalRootSignature grs = { <48 bytes> };
-// CHECK: ; StateObjectConfig soc = { STATE_OBJECT_FLAG_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITIONS };
+// CHECK: ; StateObjectConfig soc = { STATE_OBJECT_FLAG_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITIONS | STATE_OBJECT_FLAG_ALLOW_STATE_OBJECT_ADDITIONS };
 // CHECK: ; LocalRootSignature lrs = { <48 bytes> };
 // CHECK: ; SubobjectToExportsAssociation sea = { "grs", { "a", "b", "foo", "c" }  };
 // CHECK: ; SubobjectToExportsAssociation sea2 = { "grs", { }  };
@@ -14,7 +14,7 @@
 // CHECK: ; HitGroup ppHitGt = { HitGroupType = ProceduralPrimitive, Anyhit = "a", Closesthit = "b", Intersection = "c" };
 
 GlobalRootSignature grs = {"CBV(b0)"};
-StateObjectConfig soc = { STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS };
+StateObjectConfig soc = { STATE_OBJECT_FLAGS_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITONS | STATE_OBJECT_FLAG_ALLOW_STATE_OBJECT_ADDITIONS };
 LocalRootSignature lrs = {"UAV(u0, visibility = SHADER_VISIBILITY_GEOMETRY), RootFlags(LOCAL_ROOT_SIGNATURE)"};
 SubobjectToExportsAssociation sea = { "grs", "a;b;foo;c" };
 // Empty association is well-defined: it creates a default association

+ 2 - 0
tools/clang/tools/dxcompiler/dxcdisassembler.cpp

@@ -609,6 +609,8 @@ static const char *FlagToString(DXIL::StateObjectFlags Flag) {
     return "STATE_OBJECT_FLAG_ALLOW_LOCAL_DEPENDENCIES_ON_EXTERNAL_DEFINITIONS";
   case DXIL::StateObjectFlags::AllowExternalDependenciesOnLocalDefinitions:
     return "STATE_OBJECT_FLAG_ALLOW_EXTERNAL_DEPENDENCIES_ON_LOCAL_DEFINITIONS";
+  case DXIL::StateObjectFlags::AllowStateObjectAdditions:
+    return "STATE_OBJECT_FLAG_ALLOW_STATE_OBJECT_ADDITIONS";
   }
   return "<invalid StateObjectFlag>";
 }