@@ -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
9531003impl crate :: MeshOutputTopology {
0 commit comments