diff --git a/src/back/msl/mod.rs b/src/back/msl/mod.rs index 311f5e3741..8e26c7b16f 100644 --- a/src/back/msl/mod.rs +++ b/src/back/msl/mod.rs @@ -381,11 +381,10 @@ impl ResolvedBinding { Ok(()) } - fn try_fmt_decorated(&self, out: &mut W, terminator: &str) -> Result<(), Error> { + fn try_fmt_decorated(&self, out: &mut W) -> Result<(), Error> { write!(out, " [[")?; self.try_fmt(out)?; write!(out, "]]")?; - write!(out, "{}", terminator)?; Ok(()) } } diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index 0e2f53a645..1c8103d84f 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -2862,7 +2862,7 @@ impl Writer { }; let resolved = options.resolve_local_binding(binding, in_mode)?; write!(self.out, "{}{} {}", back::INDENT, ty_name, name)?; - resolved.try_fmt_decorated(&mut self.out, "")?; + resolved.try_fmt_decorated(&mut self.out)?; writeln!(self.out, ";")?; } writeln!(self.out, "}};")?; @@ -2931,11 +2931,17 @@ impl Writer { }; let resolved = options.resolve_local_binding(binding, out_mode)?; write!(self.out, "{}{} {}", back::INDENT, ty_name, name)?; - resolved.try_fmt_decorated(&mut self.out, "")?; if let Some(array_len) = array_len { write!(self.out, " [{}]", array_len)?; } - writeln!(self.out, ";")?; + write!(self.out, " [[")?; + resolved.try_fmt(&mut self.out)?; + if options.lang_version >= (2, 3) + && *binding == crate::Binding::BuiltIn(crate::BuiltIn::Position) + { + write!(self.out, ", invariant")?; + } + writeln!(self.out, "]];")?; } if pipeline_options.allow_point_size @@ -2986,7 +2992,8 @@ impl Writer { ',' }; write!(self.out, "{} {} {}", separator, ty_name, name)?; - resolved.try_fmt_decorated(&mut self.out, "\n")?; + resolved.try_fmt_decorated(&mut self.out)?; + writeln!(self.out)?; } for (handle, var) in module.global_variables.iter() { let usage = fun_info[handle]; @@ -3026,7 +3033,7 @@ impl Writer { write!(self.out, "{} ", separator)?; tyvar.try_fmt(&mut self.out)?; if let Some(resolved) = resolved { - resolved.try_fmt_decorated(&mut self.out, "")?; + resolved.try_fmt_decorated(&mut self.out)?; } if let Some(value) = var.init { let coco = ConstantContext { @@ -3053,7 +3060,8 @@ impl Writer { "{} constant _mslBufferSizes& _buffer_sizes", separator, )?; - resolved.try_fmt_decorated(&mut self.out, "\n")?; + resolved.try_fmt_decorated(&mut self.out)?; + writeln!(self.out)?; } // end of the entry point argument list diff --git a/tests/in/skybox.param.ron b/tests/in/skybox.param.ron index 9c9bd1f30a..7471e49412 100644 --- a/tests/in/skybox.param.ron +++ b/tests/in/skybox.param.ron @@ -6,7 +6,7 @@ adjust_coordinate_space: false, ), msl: ( - lang_version: (2, 1), + lang_version: (2, 3), per_stage_map: ( vs: ( resources: { diff --git a/tests/out/msl/skybox.msl b/tests/out/msl/skybox.msl index ec7942cb4b..d10b005a95 100644 --- a/tests/out/msl/skybox.msl +++ b/tests/out/msl/skybox.msl @@ -1,4 +1,4 @@ -// language: metal2.1 +// language: metal2.3 #include #include @@ -14,7 +14,7 @@ struct Data { struct vs_mainInput { }; struct vs_mainOutput { - metal::float4 position [[position]]; + metal::float4 position [[position, invariant]]; metal::float3 uv [[user(loc0), center_perspective]]; }; vertex vs_mainOutput vs_main(