From d8150e70612b58fb1cfefa262d3d862a6e6e79ba Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Mon, 15 Mar 2021 09:27:48 -0700 Subject: Fix handling of RT accelerations structures for non-RT stages (#1753) * Fix handling of RT accelerations structures for non-RT stages The recent change that added support for the `GL_EXT_ray_query` extension made is so that a shader that declares a `RaytracingAccelerationStructure` as an input to a non-RT shader stage but then never *uses* it wouldn't enable any RT extension, resulting in a compilation failure in glslang. This change reverts that behavior so that such shaders enable `GL_EXT_ray_tracing`, since that is the older of the two RT extensions that introduce `accelerationStructureEXT`. It is possible that we will need to revisit this decision based on which of the two extensions ends up being more broadly supported, but I think that right now it is fair to say that there exist drivers that support `GL_EXT_ray_tracing` but not `GL_EXT_ray_query`, so the former is the better default. * fixup: failing test --- source/slang/slang-emit-glsl.cpp | 16 ++++++---------- .../acceleration-structure-in-compute.slang | 20 ++++++++++++++++++++ .../acceleration-structure-in-compute.slang.glsl | 17 +++++++++++++++++ tests/pipeline/ray-tracing/trace-ray-inline.slang | 2 +- .../pipeline/ray-tracing/trace-ray-inline.slang.glsl | 1 + 5 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang create mode 100644 tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang.glsl diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index fb4417119..86339e94b 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -1831,17 +1831,13 @@ void GLSLSourceEmitter::emitSimpleTypeImpl(IRType* type) // could provide the `accelerationSturctureEXT` type, but there // can be drivers that provide only one and not the other. // - // Because we can't pick one upon just seeing the type, we need to - // emit the type here but *not* call `_requireRayTracing()` or - // anything like it, because we don't yet know the specific extension - // we should ask for. + // For now we will just kludge this by assuming that any driver + // that supports one of these extensions supports the other. // - // TODO: We might eventually want to have this step set a flag that - // will cause a compilation error if nothing else in the code requires - // a specific concrete ray-tracing extension. Ideally all of these - // details could be subusmed under the capability system sooner or - // later. - // + // TODO: Revisit that decision once the driver landscape is more stable/clear. + // + _requireRayTracing(); + m_writer->emit("accelerationStructureEXT"); } break; diff --git a/tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang b/tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang new file mode 100644 index 000000000..9f18d353c --- /dev/null +++ b/tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang @@ -0,0 +1,20 @@ +// acceleration-structure-in-compute.slang + +// Test for using ray-tracing acceleration structures as a shader input +// in non-ray-tracing shader code (that never actually traces rays) + +//TEST:CROSS_COMPILE:-target spirv-asm -stage compute -profile glsl_460+spirv_1_4 -entry main + +uniform RaytracingAccelerationStructure gScene; + +int helper(RaytracingAccelerationStructure a, int b) +{ + return b; +} + +[shader("compute")] +void main( + uniform RaytracingAccelerationStructure x) +{ + helper(x, 1); +} \ No newline at end of file diff --git a/tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang.glsl b/tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang.glsl new file mode 100644 index 000000000..f95321039 --- /dev/null +++ b/tests/pipeline/ray-tracing/acceleration-structure-in-compute.slang.glsl @@ -0,0 +1,17 @@ +#version 460 +#extension GL_EXT_ray_tracing : require + +int helper_0(accelerationStructureEXT a_0, int b_0) +{ + return b_0; +} + +layout(binding = 1) +uniform accelerationStructureEXT entryPointParams_x_0; + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() +{ + int _S1 = helper_0(entryPointParams_x_0, 1); + return; +} diff --git a/tests/pipeline/ray-tracing/trace-ray-inline.slang b/tests/pipeline/ray-tracing/trace-ray-inline.slang index 30c32ee4f..774a392a8 100644 --- a/tests/pipeline/ray-tracing/trace-ray-inline.slang +++ b/tests/pipeline/ray-tracing/trace-ray-inline.slang @@ -1,7 +1,7 @@ // trace-ray-inline.slang //TEST:CROSS_COMPILE:-target dxil-asm -stage compute -profile sm_6_5 -entry main -//TEST:CROSS_COMPILE:-target spirv-asm -stage compute -profile sm_6_5 -entry main +//TEST:CROSS_COMPILE:-target spirv-asm -stage compute -profile glsl_460+spirv_1_4 -entry main // The goal of this shader is to use all the main pieces // of functionality in DXR 1.1's `TraceRayInline` feature, diff --git a/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl b/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl index 883742020..fb94867a8 100644 --- a/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl +++ b/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl @@ -2,6 +2,7 @@ //TEST_IGNORE_FILE: #version 460 +#extension GL_EXT_ray_tracing : require #extension GL_EXT_ray_query : require struct SLANG_ParameterGroup_C_0 -- cgit v1.2.3