From 2d1006835ad2bf8ea1eb723bb296ed87cbb13488 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Fri, 11 Dec 2020 14:48:32 -0500 Subject: [PATCH] Fix WGSL variable storage classes, spv-out interface --- src/back/spv/writer.rs | 11 ++++++----- src/front/wgsl/mod.rs | 11 ++++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/back/spv/writer.rs b/src/back/spv/writer.rs index b6023581f8..f688c44811 100644 --- a/src/back/spv/writer.rs +++ b/src/back/spv/writer.rs @@ -390,15 +390,16 @@ impl Writer { let function_id = self.write_function(&entry_point.function, ir_module)?; let mut interface_ids = vec![]; - for ((handle, _), &usage) in ir_module + for ((handle, var), &usage) in ir_module .global_variables .iter() - .filter(|&(_, var)| { - var.class == crate::StorageClass::Input || var.class == crate::StorageClass::Output - }) .zip(&entry_point.function.global_usage) { - if usage.contains(crate::GlobalUse::STORE) || usage.contains(crate::GlobalUse::LOAD) { + let is_io = match var.class { + crate::StorageClass::Input | crate::StorageClass::Output => !usage.is_empty(), + _ => false, + }; + if is_io { let id = self.get_global_variable_id(ir_module, handle)?; interface_ids.push(id); } diff --git a/src/front/wgsl/mod.rs b/src/front/wgsl/mod.rs index 2f17ca057a..ec69381f2b 100644 --- a/src/front/wgsl/mod.rs +++ b/src/front/wgsl/mod.rs @@ -1960,7 +1960,16 @@ impl Parser { crate::BuiltIn::Position => crate::StorageClass::Output, _ => unimplemented!(), }, - _ => crate::StorageClass::Handle, + Some(crate::Binding::Resource { .. }) => { + match module.types[pvar.ty].inner { + crate::TypeInner::Struct { .. } if pvar.access.is_empty() => { + crate::StorageClass::Uniform + } + crate::TypeInner::Struct { .. } => crate::StorageClass::Storage, + _ => crate::StorageClass::Handle, + } + } + _ => crate::StorageClass::Private, }, }; let var_handle = module.global_variables.append(crate::GlobalVariable {