From a92f7689f2dc4b15ffd03726cb5ca24d76e545aa Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Thu, 1 Jul 2021 23:52:36 -0400 Subject: [PATCH] [mtl] detect binding incomatibility --- src/back/msl/writer.rs | 18 +++++++++++++++--- src/front/glsl/ast.rs | 7 +++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index 2d2d715ca5..836cc523e3 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -2007,15 +2007,27 @@ impl Writer { let mut ep_error = None; let mut supports_array_length = false; - // skip this entry point if any global bindings are missing + // skip this entry point if any global bindings are missing, + // or their types are incompatible. if !options.fake_missing_bindings { for (var_handle, var) in module.global_variables.iter() { if fun_info[var_handle].is_empty() { continue; } if let Some(ref br) = var.binding { - if let Err(e) = options.resolve_resource_binding(ep.stage, br) { - ep_error = Some(e); + let good = match options.per_stage_map[ep.stage].resources.get(br) { + Some(target) => match module.types[var.ty].inner { + crate::TypeInner::Struct { + top_level: true, .. + } => target.buffer.is_some(), + crate::TypeInner::Image { .. } => target.texture.is_some(), + crate::TypeInner::Sampler { .. } => target.sampler.is_some(), + _ => false, + }, + None => false, + }; + if !good { + ep_error = Some(super::EntryPointError::MissingBinding(br.clone())); break; } } diff --git a/src/front/glsl/ast.rs b/src/front/glsl/ast.rs index 9aae023813..4a55caa43b 100644 --- a/src/front/glsl/ast.rs +++ b/src/front/glsl/ast.rs @@ -898,10 +898,9 @@ impl<'function> Context<'function> { let expr_type = program.resolve_type(self, *expr, meta)?; if let (&TypeInner::Scalar { .. }, Some(size)) = (expr_type, vector_size) { - *expr = self.expressions.append(Expression::Splat { - size, - value: *expr, - }) + *expr = self + .expressions + .append(Expression::Splat { size, value: *expr }) } Ok(())