summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/hlsl.meta.slang18
-rw-r--r--source/slang/slang-emit-glsl.cpp1
-rw-r--r--tests/spirv/u-to-accelstruct.slang22
3 files changed, 40 insertions, 1 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 774c6a247..d8f9845b8 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -15592,7 +15592,23 @@ struct RayDesc
__builtin
__magic_type(RaytracingAccelerationStructureType)
__intrinsic_type($(kIROp_RaytracingAccelerationStructureType))
-struct RaytracingAccelerationStructure {};
+struct RaytracingAccelerationStructure
+{
+ [require(glsl_spirv, raytracing)]
+ [__readNone]
+ __init(uint64_t address)
+ {
+ __target_switch
+ {
+ case spirv:
+ return spirv_asm {
+ result: $$RaytracingAccelerationStructure = OpConvertUToAccelerationStructureKHR $address;
+ };
+ case glsl:
+ __intrinsic_asm "accelerationStructureEXT($0)";
+ }
+ }
+};
// 10.1.4 - Subobject Definitions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp
index a19c9c01f..a863e7eb1 100644
--- a/source/slang/slang-emit-glsl.cpp
+++ b/source/slang/slang-emit-glsl.cpp
@@ -3139,6 +3139,7 @@ void GLSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
}
case kIROp_RayQueryType:
{
+ _requireRayQuery();
m_writer->emit("rayQueryEXT");
return;
}
diff --git a/tests/spirv/u-to-accelstruct.slang b/tests/spirv/u-to-accelstruct.slang
new file mode 100644
index 000000000..71d693c63
--- /dev/null
+++ b/tests/spirv/u-to-accelstruct.slang
@@ -0,0 +1,22 @@
+//TEST:SIMPLE(filecheck=CHECK): -target spirv
+//TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-via-glsl
+
+uniform uint64_t accelStructAddr;
+RWStructuredBuffer<int> output;
+
+// CHECK: %[[REG:[A-Za-z0-9_]+]] = OpConvertUToAccelerationStructureKHR
+// CHECK: OpRayQueryInitializeKHR %rayQuery{{.*}} %[[REG]]
+
+[numthreads(1,1,1)]
+void main()
+{
+ let accelStruct = RaytracingAccelerationStructure(accelStructAddr);
+ RayQuery rayQuery;
+ RayDesc ray;
+ ray.Direction = float3(0, 0, 1);
+ ray.Origin = float3(0, 0, 0);
+ ray.TMax = 1000;
+ ray.TMin = 0;
+ let rs = rayQuery.TraceRayInline(accelStruct, 0, 0, ray);
+ output[0] = rayQuery.CandidateGeometryIndex();
+} \ No newline at end of file