diff --git a/src/back/dot/mod.rs b/src/back/dot/mod.rs index 1167357e8..f53d2faa1 100644 --- a/src/back/dot/mod.rs +++ b/src/back/dot/mod.rs @@ -252,6 +252,22 @@ impl StatementGraph { } "Atomic" } + S::RayQuery { query, ref fun } => { + self.dependencies.push((id, query, "query")); + if let crate::RayQueryFunction::Initialize { + acceleration_structure, + descriptor, + } = *fun + { + self.dependencies.push(( + id, + acceleration_structure, + "acceleration_structure", + )); + self.dependencies.push((id, descriptor, "descriptor")); + } + "RayQuery" + } }; // Set the last node to the merge node last_node = merge_id; diff --git a/src/back/glsl/mod.rs b/src/back/glsl/mod.rs index 419f4c438..e81c27c50 100644 --- a/src/back/glsl/mod.rs +++ b/src/back/glsl/mod.rs @@ -2197,6 +2197,7 @@ impl<'a, W: Write> Writer<'a, W> { self.write_expr(value, ctx)?; writeln!(self.out, ");")?; } + Statement::RayQuery { .. } => unreachable!(), } Ok(()) diff --git a/src/back/hlsl/writer.rs b/src/back/hlsl/writer.rs index d11032bbf..9e9aa19d7 100644 --- a/src/back/hlsl/writer.rs +++ b/src/back/hlsl/writer.rs @@ -1980,6 +1980,7 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { writeln!(self.out, "{level}}}")? } + Statement::RayQuery { .. } => unreachable!(), } Ok(()) diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index 68945315c..fa222d8d4 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -2759,6 +2759,7 @@ impl Writer { // done writeln!(self.out, ";")?; } + crate::Statement::RayQuery { .. } => unreachable!(), } } diff --git a/src/back/spv/block.rs b/src/back/spv/block.rs index c3fa8455e..02a83a19a 100644 --- a/src/back/spv/block.rs +++ b/src/back/spv/block.rs @@ -2196,6 +2196,17 @@ impl<'w> BlockContext<'w> { block.body.push(instruction); } + crate::Statement::RayQuery { query, ref fun } => { + let query_id = self.cached[query]; + match *fun { + crate::RayQueryFunction::Initialize { + acceleration_structure, + descriptor, + } => {} + crate::RayQueryFunction::Proceed => {} + crate::RayQueryFunction::Terminate => {} + } + } } } diff --git a/src/back/wgsl/writer.rs b/src/back/wgsl/writer.rs index f24f4a9c2..90d3b5330 100644 --- a/src/back/wgsl/writer.rs +++ b/src/back/wgsl/writer.rs @@ -937,6 +937,7 @@ impl Writer { writeln!(self.out, "{level}workgroupBarrier();")?; } } + Statement::RayQuery { .. } => unreachable!(), } Ok(()) diff --git a/src/front/spv/mod.rs b/src/front/spv/mod.rs index ce42be35b..c69a230cb 100644 --- a/src/front/spv/mod.rs +++ b/src/front/spv/mod.rs @@ -3672,7 +3672,8 @@ impl> Frontend { | S::Barrier(_) | S::Store { .. } | S::ImageStore { .. } - | S::Atomic { .. } => {} + | S::Atomic { .. } + | S::RayQuery { .. } => {} S::Call { function: ref mut callee, ref arguments, diff --git a/src/lib.rs b/src/lib.rs index f8491f3a3..efb05c8ff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1473,6 +1473,19 @@ pub struct SwitchCase { pub fall_through: bool, } +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serialize", derive(Serialize))] +#[cfg_attr(feature = "deserialize", derive(Deserialize))] +#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] +pub enum RayQueryFunction { + Initialize { + acceleration_structure: Handle, + descriptor: Handle, + }, + Proceed, + Terminate, +} + //TODO: consider removing `Clone`. It's not valid to clone `Statement::Emit` anyway. /// Instructions which make up an executable block. // Clone is used only for error reporting and is not intended for end users @@ -1646,6 +1659,10 @@ pub enum Statement { arguments: Vec>, result: Option>, }, + RayQuery { + query: Handle, + fun: RayQueryFunction, + }, } /// A function argument. diff --git a/src/proc/terminator.rs b/src/proc/terminator.rs index 5915616cc..ca0c3f10b 100644 --- a/src/proc/terminator.rs +++ b/src/proc/terminator.rs @@ -34,6 +34,7 @@ pub fn ensure_block_returns(block: &mut crate::Block) { | S::Store { .. } | S::ImageStore { .. } | S::Call { .. } + | S::RayQuery { .. } | S::Atomic { .. } | S::Barrier(_)), ) diff --git a/src/valid/analyzer.rs b/src/valid/analyzer.rs index 40d5f95c1..8d1943098 100644 --- a/src/valid/analyzer.rs +++ b/src/valid/analyzer.rs @@ -893,6 +893,18 @@ impl FunctionInfo { } FunctionUniformity::new() } + S::RayQuery { query, ref fun } => { + let _ = self.add_ref(query); + if let crate::RayQueryFunction::Initialize { + acceleration_structure, + descriptor, + } = *fun + { + let _ = self.add_ref(acceleration_structure); + let _ = self.add_ref(descriptor); + } + FunctionUniformity::new() + } }; disruptor = disruptor.or(uniformity.exit_disruptor()); diff --git a/src/valid/function.rs b/src/valid/function.rs index 464496f6d..a13a07bcf 100644 --- a/src/valid/function.rs +++ b/src/valid/function.rs @@ -807,6 +807,9 @@ impl super::Validator { } => { self.validate_atomic(pointer, fun, value, result, context)?; } + S::RayQuery { query: _, fun: _ } => { + //TODO + } } } Ok(BlockInfo { stages, finished }) diff --git a/src/valid/handles.rs b/src/valid/handles.rs index 871a73a21..20d8448a1 100644 --- a/src/valid/handles.rs +++ b/src/valid/handles.rs @@ -496,6 +496,20 @@ impl super::Validator { validate_expr_opt(result)?; Ok(()) } + crate::Statement::RayQuery { query, ref fun } => { + validate_expr(query)?; + match *fun { + crate::RayQueryFunction::Initialize { + acceleration_structure, + descriptor, + } => { + validate_expr(acceleration_structure)?; + validate_expr(descriptor)?; + } + crate::RayQueryFunction::Proceed | crate::RayQueryFunction::Terminate => {} + } + Ok(()) + } crate::Statement::Break | crate::Statement::Continue | crate::Statement::Kill diff --git a/tests/in/ray-query.wgsl b/tests/in/ray-query.wgsl index 26023ff2f..b772e69d7 100644 --- a/tests/in/ray-query.wgsl +++ b/tests/in/ray-query.wgsl @@ -1,5 +1,23 @@ var acc_struct: acceleration_structure; +/* +let RAY_FLAG_NONE = 0u; +let RAY_FLAG_TERMINATE_ON_FIRST_HIT = 4u; + +let RAY_QUERY_INTERSECTION_NONE = 0u; +let RAY_QUERY_INTERSECTION_TRIANGLE = 1u; +let RAY_QUERY_INTERSECTION_GENERATED = 2u; +let RAY_QUERY_INTERSECTION_AABB = 4u; + +struct RayDesc { + flags: u32, + cull_mask: u32, + origin: vec3, + t_min: f32, + dir: vec3, + t_max: f32, +}*/ + struct Output { visible: u32, } @@ -9,7 +27,7 @@ var output: Output; fn main() { var rq: ray_query; - rayQueryInitialize(rq, acceleration_structure, RAY_FLAGS_TERMINATE_ON_FIRST_HIT, 0xFF, vec3(0.0), 0.1, vec3(0.0, 1.0, 0.0), 100.0); + rayQueryInitialize(rq, acceleration_structure, RayDesc(RAY_FLAG_TERMINATE_ON_FIRST_HIT, 0xFF, vec3(0.0), 0.1, vec3(0.0, 1.0, 0.0), 100.0)); rayQueryProceed(rq);