diff --git a/shaders/vulkan/rgen/pure_call.vk.rgen b/shaders/vulkan/rgen/pure_call.vk.rgen new file mode 100644 index 00000000..3e362ed0 --- /dev/null +++ b/shaders/vulkan/rgen/pure_call.vk.rgen @@ -0,0 +1,18 @@ +#version 460 +#extension GL_NV_ray_tracing : require + +layout(set = 0, binding = 1) uniform accelerationStructureNV as; +layout(location = 0) rayPayloadNV float payload; + +float pure_call(vec2 launchID, vec2 launchSize) +{ + vec3 origin = vec3(launchID.x / launchSize.x, launchID.y / launchSize.y, 1.0); + vec3 direction = vec3(0.0, 0.0, -1.0); + traceNV(as, 0u, 255u, 0u, 1u, 0u, origin, 0.0, direction, 1000.0, 0); + return 0.0; +} + +void main() +{ + pure_call(vec2(gl_LaunchIDNV.xy), vec2(gl_LaunchSizeNV.xy)); +} diff --git a/spirv_cross.cpp b/spirv_cross.cpp index 93f57f6e..334e5776 100644 --- a/spirv_cross.cpp +++ b/spirv_cross.cpp @@ -144,6 +144,14 @@ bool Compiler::block_is_pure(const SPIRBlock &block) case OpMemoryBarrier: return false; + // Ray tracing builtins are impure. + case OpReportIntersectionNV: + case OpIgnoreIntersectionNV: + case OpTerminateRayNV: + case OpTraceNV: + case OpExecuteCallableNV: + return false; + // OpExtInst is potentially impure depending on extension, but GLSL builtins are at least pure. default: