Skip to content

Commit d27e835

Browse files
committed
Move use ray tracing into a function
1 parent 413b588 commit d27e835

2 files changed

Lines changed: 54 additions & 33 deletions

File tree

naga/src/back/spv/writer.rs

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3598,40 +3598,11 @@ impl Writer {
35983598
.iter()
35993599
.flat_map(|entry| entry.function.arguments.iter())
36003600
.any(|arg| has_view_index_check(ir_module, arg.binding.as_ref(), arg.ty));
3601-
let mut has_ray_query = ir_module.special_types.ray_intersection.is_some();
36023601
let has_vertex_return = ir_module.special_types.ray_vertex_return.is_some();
3603-
// implies we need a longer search.
3604-
let mut has_ray_tracing = ir_module.special_types.ray_desc.is_some();
3605-
let mut has_ray_tracing_pipeline = false;
3606-
3607-
for (_, &crate::Type { ref inner, .. }) in ir_module.types.iter() {
3608-
// spirv does not know whether these have vertex return - that is done by us
3609-
match *inner {
3610-
crate::TypeInner::AccelerationStructure { .. } => {
3611-
has_ray_tracing = true;
3612-
}
3613-
crate::TypeInner::RayQuery { .. } => has_ray_query = true,
3614-
_ => {}
3615-
}
3616-
}
3617-
3618-
for (index, ep) in ir_module.entry_points.iter().enumerate() {
3619-
if ep_index.is_some() && ep_index != Some(index) {
3620-
continue;
3621-
}
3622-
3623-
if matches!(
3624-
ep.stage,
3625-
crate::ShaderStage::RayGeneration
3626-
| crate::ShaderStage::AnyHit
3627-
| crate::ShaderStage::ClosestHit
3628-
| crate::ShaderStage::Miss
3629-
) {
3630-
has_ray_tracing_pipeline = true;
3631-
} else {
3632-
has_ray_query |= has_ray_tracing;
3633-
}
3634-
}
3602+
3603+
let rt_uses = ir_module.uses_ray_tracing(ep_index);
3604+
let has_ray_query = rt_uses.queries;
3605+
let has_ray_tracing_pipeline = rt_uses.pipelines;
36353606

36363607
self.has_ray_tracing_pipeline = has_ray_tracing_pipeline;
36373608

naga/src/proc/mod.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,56 @@ impl crate::Module {
948948
}
949949
false
950950
}
951+
952+
pub fn uses_ray_tracing(&self, ep_index: Option<usize>) -> RayTracingUses {
953+
let mut uses = RayTracingUses::default();
954+
// Whether this uses ray tracing (unknown whether the usage is pipelines or ray queries).
955+
let mut uses_ray_tracing = self.special_types.ray_desc.is_some();
956+
957+
uses.queries |= self.special_types.ray_intersection.is_some();
958+
959+
960+
for (_, &crate::Type { ref inner, .. }) in self.types.iter() {
961+
// Backends do not know whether these have vertex return - that is done by us
962+
match *inner {
963+
crate::TypeInner::AccelerationStructure { .. } => {
964+
uses_ray_tracing = true;
965+
}
966+
crate::TypeInner::RayQuery { .. } => uses.queries = true,
967+
_ => {}
968+
}
969+
}
970+
971+
for (index, ep) in self.entry_points.iter().enumerate() {
972+
if ep_index.is_some() && ep_index != Some(index) {
973+
continue;
974+
}
975+
976+
// if we have a ray tracing pipeline shader we are definitly using
977+
// pipelines, otherwise, if we have a ray tracing type, we might
978+
// be using it in the shader (which would require ray queries),
979+
// so we should use queries.
980+
if matches!(
981+
ep.stage,
982+
crate::ShaderStage::RayGeneration
983+
| crate::ShaderStage::AnyHit
984+
| crate::ShaderStage::ClosestHit
985+
| crate::ShaderStage::Miss
986+
) {
987+
uses.pipelines = true;
988+
} else {
989+
uses.queries |= uses_ray_tracing;
990+
}
991+
}
992+
993+
uses
994+
}
995+
}
996+
997+
#[derive(Default, Copy, Clone)]
998+
pub struct RayTracingUses {
999+
pub pipelines: bool,
1000+
pub queries: bool,
9511001
}
9521002

9531003
impl crate::MeshOutputTopology {

0 commit comments

Comments
 (0)