From 6a5c7f10ad86e4952cf2ae2f2edfd9ce6c783777 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Thu, 1 Apr 2021 09:52:23 -0400 Subject: [PATCH] [msl-out] cast image load/store coordinates to unsigned --- src/back/msl/writer.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index 549a683b05..bb029876e7 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -212,6 +212,23 @@ impl Writer { Ok(()) } + fn put_storage_image_coordinate( + &mut self, + expr: Handle, + context: &ExpressionContext, + ) -> Result<(), Error> { + // coordinates in IR are int, but Metal expects uint + let size_str = match *context.info[expr].ty.inner_with(&context.module.types) { + crate::TypeInner::Scalar { .. } => "", + crate::TypeInner::Vector { size, .. } => vector_size_string(size), + _ => return Err(Error::Validation), + }; + write!(self.out, "{}::uint{}(", NAMESPACE, size_str)?; + self.put_expression(expr, context, true)?; + write!(self.out, ")")?; + Ok(()) + } + fn put_initialization_component( &mut self, component: Handle, @@ -441,7 +458,7 @@ impl Writer { } => { self.put_expression(image, context, false)?; write!(self.out, ".read(")?; - self.put_expression(coordinate, context, true)?; + self.put_storage_image_coordinate(coordinate, context)?; if let Some(expr) = array_index { write!(self.out, ", ")?; self.put_expression(expr, context, true)?; @@ -953,7 +970,7 @@ impl Writer { write!(self.out, ".write(")?; self.put_expression(value, &context.expression, true)?; write!(self.out, ", ")?; - self.put_expression(coordinate, &context.expression, true)?; + self.put_storage_image_coordinate(coordinate, &context.expression)?; if let Some(expr) = array_index { write!(self.out, ", ")?; self.put_expression(expr, &context.expression, true)?;