Quellcode durchsuchen

[spirv] Add needed capabilities for Raytracing AccelerationStructure. (#3104)

* [spirv] Add needed capabilities for Raytracing AccelerationStructure.

* Address code review comments.
Ehsan vor 5 Jahren
Ursprung
Commit
19d8514c8a

+ 14 - 3
tools/clang/lib/SPIRV/CapabilityVisitor.cpp

@@ -195,9 +195,20 @@ void CapabilityVisitor::addCapabilityForType(const SpirvType *type,
     for (auto field : structType->getFields())
       addCapabilityForType(field.type, loc, sc);
   }
-  //
-  else if (const auto *rayQueryType =
-               dyn_cast<RayQueryProvisionalTypeKHR>(type)) {
+  // AccelerationStructureTypeNV type
+  else if (isa<AccelerationStructureTypeNV>(type)) {
+    if (featureManager.isExtensionEnabled(Extension::NV_ray_tracing)) {
+      addCapability(spv::Capability::RayTracingNV);
+      addExtension(Extension::NV_ray_tracing, "SPV_NV_ray_tracing", {});
+    } else {
+      // KHR_ray_tracing extension requires SPIR-V 1.4/Vulkan 1.2
+      featureManager.requestTargetEnv(SPV_ENV_VULKAN_1_2, "Raytracing", {});
+      addCapability(spv::Capability::RayTracingProvisionalKHR);
+      addExtension(Extension::KHR_ray_tracing, "SPV_KHR_ray_tracing", {});
+    }
+  }
+  // RayQueryProvisionalTypeKHR type
+  else if (isa<RayQueryProvisionalTypeKHR>(type)) {
     addCapability(spv::Capability::RayQueryProvisionalKHR);
     addExtension(Extension::KHR_ray_query, "SPV_KHR_ray_query", {});
   }

+ 10 - 0
tools/clang/test/CodeGenSPIRV/raytracing.acceleration-structure.hlsl

@@ -0,0 +1,10 @@
+// Run: %dxc -E main -T cs_6_4 -fspv-target-env=vulkan1.2
+
+// CHECK: OpCapability RayTracingProvisionalKHR
+
+// CHECK: %accelerationStructureNV = OpTypeAccelerationStructureKHR
+
+RaytracingAccelerationStructure test_bvh;
+
+[numthreads(1, 1, 1)]
+void main() {}

+ 11 - 0
tools/clang/test/CodeGenSPIRV/raytracing.nv.acceleration-structure.hlsl

@@ -0,0 +1,11 @@
+// Run: %dxc -E main -T cs_6_4 -fspv-target-env=vulkan1.2 -fspv-extension=SPV_NV_ray_tracing
+
+// CHECK: OpCapability RayTracingNV
+// CHECK: OpExtension "SPV_NV_ray_tracing"
+
+// CHECK: %accelerationStructureNV = OpTypeAccelerationStructureKHR
+
+RaytracingAccelerationStructure test_bvh;
+
+[numthreads(1, 1, 1)]
+void main() {}

+ 9 - 0
tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp

@@ -2189,6 +2189,10 @@ TEST_F(FileTest, RayTracingNVCallable) {
 TEST_F(FileTest, RayTracingNVLibrary) {
   runFileTest("raytracing.nv.library.hlsl");
 }
+TEST_F(FileTest, RayTracingNVAccelerationStructure) {
+  useVulkan1p2();
+  runFileTest("raytracing.nv.acceleration-structure.hlsl");
+}
 
 // === Raytracing KHR examples ===
 TEST_F(FileTest, RayTracingKHRClosestHit) {
@@ -2196,6 +2200,11 @@ TEST_F(FileTest, RayTracingKHRClosestHit) {
   runFileTest("raytracing.khr.closesthit.hlsl");
 }
 
+TEST_F(FileTest, RayTracingAccelerationStructure) {
+  useVulkan1p2();
+  runFileTest("raytracing.acceleration-structure.hlsl");
+}
+
 // For decoration uniqueness
 TEST_F(FileTest, DecorationUnique) { runFileTest("decoration.unique.hlsl"); }