msl: add invariance if supported

This commit is contained in:
Dzmitry Malyshau
2022-01-24 09:54:48 -05:00
parent 81dc67402a
commit aea427fa92
4 changed files with 18 additions and 11 deletions

View File

@@ -381,11 +381,10 @@ impl ResolvedBinding {
Ok(())
}
fn try_fmt_decorated<W: Write>(&self, out: &mut W, terminator: &str) -> Result<(), Error> {
fn try_fmt_decorated<W: Write>(&self, out: &mut W) -> Result<(), Error> {
write!(out, " [[")?;
self.try_fmt(out)?;
write!(out, "]]")?;
write!(out, "{}", terminator)?;
Ok(())
}
}

View File

@@ -2862,7 +2862,7 @@ impl<W: Write> Writer<W> {
};
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<W: Write> Writer<W> {
};
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<W: Write> Writer<W> {
','
};
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<W: Write> Writer<W> {
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<W: Write> Writer<W> {
"{} 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

View File

@@ -6,7 +6,7 @@
adjust_coordinate_space: false,
),
msl: (
lang_version: (2, 1),
lang_version: (2, 3),
per_stage_map: (
vs: (
resources: {

View File

@@ -1,4 +1,4 @@
// language: metal2.1
// language: metal2.3
#include <metal_stdlib>
#include <simd/simd.h>
@@ -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(