On NVIDIA 610.43.02, selecting a descriptor-heap descriptor with a runtime index in a hit shader lost the device, for storage buffers and sampled images alike, which is why the examples use spec constants there. HeapDynamicIndexHit renders two instances whose closest-hit picks a buffer and a texture by a runtime index: one instance uses the same set across every wave, the other a different set in every other pixel column, so neighbouring lanes select different descriptors. It passes on 615.78.08 and on llvmpipe. On NVIDIA drivers older than 615.78.08 it skips rather than abort the suite. With validation on it also renders in a child process with validation off, since GPU-assisted validation hides the fault. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
1.2 KiB
GLSL
31 lines
1.2 KiB
GLSL
//SPDX-License-Identifier: LGPL-3.0-only
|
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
|
|
#version 460
|
|
#extension GL_EXT_ray_tracing : enable
|
|
#extension GL_EXT_shader_image_load_formatted : enable
|
|
#extension GL_EXT_shader_explicit_arithmetic_types_int16 : enable
|
|
#extension GL_EXT_descriptor_heap : enable
|
|
#extension GL_EXT_nonuniform_qualifier : enable
|
|
|
|
layout(constant_id = 0) const uint16_t bufferStart = 0us;
|
|
layout(descriptor_heap) uniform accelerationStructureEXT topLevelAS[];
|
|
layout(descriptor_heap) uniform writeonly image2D image[];
|
|
|
|
layout(location = 0) rayPayloadEXT vec3 hitValue;
|
|
|
|
void main() {
|
|
uvec2 pixel = gl_LaunchIDEXT.xy;
|
|
uvec2 resolution = gl_LaunchSizeEXT.xy;
|
|
vec2 ndc = (vec2(pixel) + 0.5) / vec2(resolution) * 2.0 - 1.0;
|
|
|
|
// Same pinhole camera as examples/VulkanTriangle, facing +Z.
|
|
vec3 origin = vec3(0.0, 0.0, -300.0);
|
|
float aspect = float(resolution.x) / float(resolution.y);
|
|
float tanHalfFov = tan(radians(60.0) * 0.5);
|
|
vec3 direction = normalize(vec3(ndc.x * aspect * tanHalfFov, -ndc.y * tanHalfFov, 1.0));
|
|
|
|
traceRayEXT(topLevelAS[bufferStart], gl_RayFlagsNoneEXT, 0xff, 0, 0, 0,
|
|
origin, 0.001, direction, 10000.0, 0);
|
|
imageStore(image[0], ivec2(pixel), vec4(hitValue, 1.0));
|
|
}
|