Skip to content

Commit 524193a

Browse files
committed
Add RayQuery::get_intersection_triangle_vertex_positions() extension
1 parent 7369a36 commit 524193a

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

crates/rustc_codegen_spirv/src/spirv_type_constraints.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,9 +1104,7 @@ pub fn instruction_signatures(op: Op) -> Option<&'static [InstSig<'static>]> {
11041104
reserved!(SPV_NV_displacement_micromap)
11051105
}
11061106
// SPV_KHR_ray_tracing_position_fetch
1107-
Op::RayQueryGetIntersectionTriangleVertexPositionsKHR => {
1108-
reserved!(SPV_KHR_ray_tracing_position_fetch)
1109-
}
1107+
Op::RayQueryGetIntersectionTriangleVertexPositionsKHR => {}
11101108
// SPV_INTEL_bfloat16_conversion
11111109
Op::ConvertFToBF16INTEL | Op::ConvertBF16ToFINTEL => {
11121110
reserved!(SPV_INTEL_bfloat16_conversion)

crates/spirv-std/src/ray_tracing.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,4 +1061,27 @@ impl RayQuery {
10611061
result
10621062
}
10631063
}
1064+
1065+
/// Gets the vertex positions for the triangle at the current intersection.
1066+
///
1067+
/// Requires Capability `RayQueryPositionFetchKHR` and extension `SPV_KHR_ray_tracing_position_fetch`
1068+
#[spirv_std_macros::gpu_only]
1069+
#[doc(alias = "OpRayQueryGetIntersectionTriangleVertexPositionsKHR")]
1070+
#[inline]
1071+
pub unsafe fn get_intersection_triangle_vertex_positions<V: Vector<f32, 3>>(&self) -> [V; 3] {
1072+
unsafe {
1073+
let mut result = Default::default();
1074+
1075+
asm! {
1076+
"%u32 = OpTypeInt 32 0",
1077+
"%intersection = OpConstant %u32 0",
1078+
"%result = OpRayQueryGetIntersectionTriangleVertexPositionsKHR typeof*{result} {ray_query} %intersection",
1079+
"OpStore {result} %result",
1080+
ray_query = in(reg) self,
1081+
result = in(reg) &mut result,
1082+
}
1083+
1084+
result
1085+
}
1086+
}
10641087
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// build-pass
2+
// compile-flags: -Ctarget-feature=+RayQueryKHR,+ext:SPV_KHR_ray_query
3+
// compile-flags: -Ctarget-feature=+RayQueryPositionFetchKHR,+ext:SPV_KHR_ray_tracing_position_fetch
4+
5+
use glam::{Vec3, Vec4};
6+
use spirv_std::ray_tracing::{AccelerationStructure, RayFlags, RayQuery};
7+
use spirv_std::spirv;
8+
9+
#[spirv(fragment)]
10+
pub fn main(
11+
#[spirv(descriptor_set = 0, binding = 0)] accel: &AccelerationStructure,
12+
out0: &mut Vec4,
13+
out1: &mut Vec4,
14+
out2: &mut Vec4,
15+
) {
16+
unsafe {
17+
spirv_std::ray_query!(let mut handle);
18+
handle.initialize(accel, RayFlags::NONE, 0, Vec3::ZERO, 0.0, Vec3::ZERO, 0.0);
19+
let vertex_positions: [Vec3; 3] = handle.get_intersection_triangle_vertex_positions();
20+
*out0 = Vec4::from((vertex_positions[0], 1.));
21+
*out1 = Vec4::from((vertex_positions[1], 1.));
22+
*out2 = Vec4::from((vertex_positions[2], 1.));
23+
}
24+
}

0 commit comments

Comments
 (0)