From d5cb90b9e12853d5f65c122a13afde109f416e7d Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Wed, 14 Dec 2022 23:54:11 -0800 Subject: [PATCH] msl: handle the case of missing binding --- src/back/msl/mod.rs | 6 ++-- src/back/msl/writer.rs | 63 +++++++++++++++++++++++++++--------------- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/back/msl/mod.rs b/src/back/msl/mod.rs index a8ed2dd0d5..02c533bff4 100644 --- a/src/back/msl/mod.rs +++ b/src/back/msl/mod.rs @@ -156,8 +156,10 @@ pub enum Error { #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pub enum EntryPointError { + #[error("global '{0}' doesn't have a binding")] + MissingBinding(String), #[error("mapping of {0:?} is missing")] - MissingBinding(crate::ResourceBinding), + MissingBindTarget(crate::ResourceBinding), #[error("mapping for push constants is missing")] MissingPushConstants, #[error("mapping for sizes buffer is missing")] @@ -303,7 +305,7 @@ impl Options { index: 0, interpolation: None, }), - None => Err(EntryPointError::MissingBinding(res_binding.clone())), + None => Err(EntryPointError::MissingBindTarget(res_binding.clone())), } } diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index 7cf6ebed62..4ef17975f0 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -3399,33 +3399,52 @@ impl Writer { if fun_info[var_handle].is_empty() { continue; } - if let Some(ref br) = var.binding { - let good = match options.per_stage_map[ep.stage].resources.get(br) { - Some(target) => { - let binding_ty = match module.types[var.ty].inner { - crate::TypeInner::BindingArray { base, .. } => { - &module.types[base].inner + match var.space { + crate::AddressSpace::Uniform + | crate::AddressSpace::Storage { .. } + | crate::AddressSpace::Handle => { + let br = match var.binding { + Some(ref br) => br, + None => { + let var_name = var.name.clone().unwrap_or_default(); + ep_error = + Some(super::EntryPointError::MissingBinding(var_name)); + break; + } + }; + let good = match options.per_stage_map[ep.stage].resources.get(br) { + Some(target) => { + let binding_ty = match module.types[var.ty].inner { + crate::TypeInner::BindingArray { base, .. } => { + &module.types[base].inner + } + ref ty => ty, + }; + match *binding_ty { + crate::TypeInner::Image { .. } => target.texture.is_some(), + crate::TypeInner::Sampler { .. } => { + target.sampler.is_some() + } + _ => target.buffer.is_some(), } - ref ty => ty, - }; - match *binding_ty { - crate::TypeInner::Image { .. } => target.texture.is_some(), - crate::TypeInner::Sampler { .. } => target.sampler.is_some(), - _ => target.buffer.is_some(), } + None => false, + }; + if !good { + ep_error = + Some(super::EntryPointError::MissingBindTarget(br.clone())); + break; } - None => false, - }; - if !good { - ep_error = Some(super::EntryPointError::MissingBinding(br.clone())); - break; } - } - if var.space == crate::AddressSpace::PushConstant { - if let Err(e) = options.resolve_push_constants(ep.stage) { - ep_error = Some(e); - break; + crate::AddressSpace::PushConstant => { + if let Err(e) = options.resolve_push_constants(ep.stage) { + ep_error = Some(e); + break; + } } + crate::AddressSpace::Function + | crate::AddressSpace::Private + | crate::AddressSpace::WorkGroup => {} } } if supports_array_length {