[msl-out] copy array elements one by one

This commit is contained in:
Dzmitry Malyshau
2021-03-31 23:48:21 -04:00
committed by Dzmitry Malyshau
parent cf3a6da3ce
commit af4d989f55

View File

@@ -907,12 +907,41 @@ impl<W: Write> Writer<W> {
writeln!(self.out, "{}{}::discard_fragment();", level, NAMESPACE)?; writeln!(self.out, "{}{}::discard_fragment();", level, NAMESPACE)?;
} }
crate::Statement::Store { pointer, value } => { crate::Statement::Store { pointer, value } => {
// we can't assign fixed-size arrays
let pointer_info = &context.expression.info[pointer];
let array_size =
match *pointer_info.ty.inner_with(&context.expression.module.types) {
crate::TypeInner::Pointer { base, .. } => {
match context.expression.module.types[base].inner {
crate::TypeInner::Array {
size: crate::ArraySize::Constant(ch),
..
} => Some(ch),
_ => None,
}
}
_ => None,
};
match array_size {
Some(const_handle) => {
let size = context.expression.module.constants[const_handle]
.to_array_length()
.unwrap();
write!(self.out, "{}for(int _i=0; _i<{}; ++_i) ", level, size)?;
self.put_expression(pointer, &context.expression, true)?;
write!(self.out, "[_i] = ")?;
self.put_expression(value, &context.expression, true)?;
writeln!(self.out, "[_i];")?;
}
None => {
write!(self.out, "{}", level)?; write!(self.out, "{}", level)?;
self.put_expression(pointer, &context.expression, true)?; self.put_expression(pointer, &context.expression, true)?;
write!(self.out, " = ")?; write!(self.out, " = ")?;
self.put_expression(value, &context.expression, true)?; self.put_expression(value, &context.expression, true)?;
writeln!(self.out, ";")?; writeln!(self.out, ";")?;
} }
}
}
crate::Statement::ImageStore { crate::Statement::ImageStore {
image, image,
coordinate, coordinate,