blob: d7011d2b13587f83066b027645e8d42a80d6ab31 [file] [log] [blame]
// This is the GLSL source for the compute shader that is used during ray tracing acceleration structure
// building validation which inspects instance buffers for top level acceleration structure builds and
// reports and replaces invalid bottom level acceleration structure handles with good bottom level
// acceleration structure handle so that applications can continue without undefined behavior long enough
// to report errors.
//
#version 450
#extension GL_GOOGLE_include_directive : enable
#include "gpu_shaders_constants.h"
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
struct VkGeometryInstanceNV {
uint unused[14];
uint handle_bits_0;
uint handle_bits_1;
};
layout(set=0, binding=0, std430) buffer InstanceBuffer {
VkGeometryInstanceNV instances[];
};
layout(set=0, binding=1, std430) buffer ValidationBuffer {
uint instances_to_validate;
uint replacement_handle_bits_0;
uint replacement_handle_bits_1;
uint invalid_handle_found;
uint invalid_handle_bits_0;
uint invalid_handle_bits_1;
uint valid_handles_count;
uint valid_handles[];
};
void main() {
for (uint instance_index = 0; instance_index < instances_to_validate; instance_index++) {
uint instance_handle_bits_0 = instances[instance_index].handle_bits_0;
uint instance_handle_bits_1 = instances[instance_index].handle_bits_1;
bool valid = false;
for (uint valid_handle_index = 0; valid_handle_index < valid_handles_count; valid_handle_index++) {
if (instance_handle_bits_0 == valid_handles[2*valid_handle_index+0] &&
instance_handle_bits_1 == valid_handles[2*valid_handle_index+1]) {
valid = true;
break;
}
}
if (!valid) {
invalid_handle_found += 1;
invalid_handle_bits_0 = instance_handle_bits_0;
invalid_handle_bits_1 = instance_handle_bits_1;
instances[instance_index].handle_bits_0 = replacement_handle_bits_0;
instances[instance_index].handle_bits_1 = replacement_handle_bits_1;
}
}
}