diff --git a/examples/convert.rs b/examples/convert.rs index 22ff8c6181..df0879dc0e 100644 --- a/examples/convert.rs +++ b/examples/convert.rs @@ -159,7 +159,7 @@ fn main() { spirv_cross_compatibility: false, binding_map, }; - let msl = msl::write_string(&module, &options).unwrap(); + let (msl, _) = msl::write_string(&module, &options).unwrap(); fs::write(&args[2], msl).unwrap(); } #[cfg(feature = "spv-out")] diff --git a/src/back/msl/mod.rs b/src/back/msl/mod.rs index 493e7d0c85..e96991ba33 100644 --- a/src/back/msl/mod.rs +++ b/src/back/msl/mod.rs @@ -204,8 +204,20 @@ impl ResolvedBinding { } } -pub fn write_string(module: &crate::Module, options: &Options) -> Result { - let mut w = writer::Writer::new(Vec::new()); - w.write(module, options)?; - Ok(String::from_utf8(w.finish())?) +/// Information about a translated module that is required +/// for the use of the result. +pub struct TranslationInfo { + /// Mapping of the entry point names. Each item in the array + /// corresponds to an entry point in `module.entry_points.iter()`. + pub entry_point_names: Vec, +} + +pub fn write_string( + module: &crate::Module, + options: &Options, +) -> Result<(String, TranslationInfo), Error> { + let mut w = writer::Writer::new(Vec::new()); + let info = w.write(module, options)?; + let string = String::from_utf8(w.finish())?; + Ok((string, info)) } diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index e2adbea6b7..0a9f29e04d 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -1,4 +1,4 @@ -use super::{keywords::RESERVED, Error, LocationMode, Options, ResolvedBinding}; +use super::{keywords::RESERVED, Error, LocationMode, Options, ResolvedBinding, TranslationInfo}; use crate::{ arena::Handle, proc::{EntryPointIndex, NameKey, Namer, ResolveContext, Typifier}, @@ -563,7 +563,11 @@ impl Writer { Ok(()) } - pub fn write(&mut self, module: &crate::Module, options: &Options) -> Result<(), Error> { + pub fn write( + &mut self, + module: &crate::Module, + options: &Options, + ) -> Result { self.names.clear(); Namer::process(module, RESERVED, &mut self.names); @@ -574,9 +578,7 @@ impl Writer { self.write_type_defs(module)?; writeln!(self.out)?; - self.write_functions(module, options)?; - - Ok(()) + self.write_functions(module, options) } fn write_type_defs(&mut self, module: &crate::Module) -> Result<(), Error> { @@ -711,7 +713,12 @@ impl Writer { Ok(()) } - fn write_functions(&mut self, module: &crate::Module, options: &Options) -> Result<(), Error> { + // Returns the array of mapped entry point names. + fn write_functions( + &mut self, + module: &crate::Module, + options: &Options, + ) -> Result { for (fun_handle, fun) in module.functions.iter() { self.typifier.resolve_all( &fun.expressions, @@ -760,6 +767,9 @@ impl Writer { writeln!(self.out, "}}")?; } + let mut info = TranslationInfo { + entry_point_names: Vec::with_capacity(module.entry_points.len()), + }; for (ep_index, (&(stage, _), ep)) in module.entry_points.iter().enumerate() { let fun = &ep.function; self.typifier.resolve_all( @@ -792,6 +802,7 @@ impl Writer { } let fun_name = &self.names[&NameKey::EntryPoint(ep_index as _)]; + info.entry_point_names.push(fun_name.clone()); let output_name = format!("{}Output", fun_name); let location_input_name = format!("{}Input", fun_name); @@ -985,6 +996,6 @@ impl Writer { writeln!(self.out, "}}")?; } - Ok(()) + Ok(info) } }