From e47ff2dc26a049bc2830f468f0acf6d0214ff8a2 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Fri, 26 Mar 2021 22:07:40 -0400 Subject: [PATCH] [spv-in] support output interface block --- src/front/spv/function.rs | 55 ++++++++++++++++++++++++++++---------- src/front/spv/mod.rs | 8 +++--- tests/in/quad-vert.spv | Bin 0 -> 968 bytes tests/snapshots.rs | 6 +++++ 4 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 tests/in/quad-vert.spv diff --git a/src/front/spv/function.rs b/src/front/spv/function.rs index 8bd683a1b6..082c9ff170 100644 --- a/src/front/spv/function.rs +++ b/src/front/spv/function.rs @@ -235,20 +235,47 @@ impl> super::Parser { for &v_id in ep.variable_ids.iter() { let lvar = self.lookup_variable.lookup(v_id)?; if let super::Variable::Output(ref result) = lvar.inner { - members.push(crate::StructMember { - name: None, - ty: result.ty, - binding: result.binding.clone(), - size: None, - align: None, - }); - // populate just the globals first, then do `Load` in a - // separate step, so that we can get a range. - components.push( - function - .expressions - .append(crate::Expression::GlobalVariable(lvar.handle)), - ); + let expr_handle = function + .expressions + .append(crate::Expression::GlobalVariable(lvar.handle)); + match module.types[result.ty].inner { + crate::TypeInner::Struct { + members: ref sub_members, + .. + } => { + for (index, sm) in sub_members.iter().enumerate() { + if sm.binding.is_none() { + // unrecognized binding, skip + continue; + } + members.push(crate::StructMember { + name: sm.name.clone(), + ty: sm.ty, + binding: sm.binding.clone(), + size: None, + align: None, + }); + components.push(function.expressions.append( + crate::Expression::AccessIndex { + base: expr_handle, + index: index as u32, + }, + )); + } + } + _ => { + members.push(crate::StructMember { + name: None, + ty: result.ty, + binding: result.binding.clone(), + size: None, + align: None, + }); + // populate just the globals first, then do `Load` in a + // separate step, so that we can get a range. + components.push(expr_handle); + } + } } } diff --git a/src/front/spv/mod.rs b/src/front/spv/mod.rs index 46e1453ff9..6bcab546a8 100644 --- a/src/front/spv/mod.rs +++ b/src/front/spv/mod.rs @@ -2414,10 +2414,11 @@ impl> Parser { .future_member_decor .remove(&(id, i)) .unwrap_or_default(); + let binding = decor.io_binding().ok(); members.push(crate::StructMember { name: decor.name, ty, - binding: None, + binding, size: None, //TODO align: None, }); @@ -2871,7 +2872,8 @@ impl> Parser { (inner, var) } ExtendedClass::Output => { - let binding = dec.io_binding()?; + // For output interface blocks. this would be a structure. + let binding = dec.io_binding().ok(); let var = crate::GlobalVariable { name: dec.name, class: crate::StorageClass::Private, @@ -2882,7 +2884,7 @@ impl> Parser { }; let inner = Variable::Output(crate::FunctionResult { ty: effective_ty, - binding: Some(binding), + binding, }); (inner, var) } diff --git a/tests/in/quad-vert.spv b/tests/in/quad-vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..eaf03d2fbe057ec0046f3fcaf1f351eec0d6f569 GIT binary patch literal 968 zcmYk3%}c{T5XIMiq_tIRt!@3NHR4ey9#jNT5rul_p;GW#f(8l1v@~fEPyT`aL0$yk zFLtXFCbRF&?9AKUZ04|F%#taYqS-gURy7$h#*~ed#%^!W>%_@(=j8O5iZzo>3#qA? z<#e6X|J4g308Ck4lQ-m9eHq11ZOEIPzQ0;9^|Rr0rjX{@>n*Tjs=_bfubvB0<6!t7d`ol948|;4Z}q)Fa4Ya zLoa9YhT~DJ*q!Tdlaztc4@Seic37S8nB~aB{jWnC96D?rYdG$$s|@|9V-{NM?3!5k z1J$sHbwevh(Umt zqBT8Q!t09E!?m^IEVc(ZoVgo{XdsU+FmC|IoJ~bnPG9DL>vD{GbaFQ~&&(}3Mm=~t zMIYD9+tZrfXgSlHaX*|1gZ~nfSG*L