From 6138e4ddd34977f10fdc342c980eb7cd0099429f Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Sun, 31 Jan 2021 18:02:55 -0500 Subject: [PATCH] [spv] fix block decoration on nested structs --- src/back/spv/writer.rs | 35 ++++++++++++------- tests/snapshots/snapshots__boids.spvasm.snap | 1 - tests/snapshots/snapshots__shadow.spvasm.snap | 1 - 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/back/spv/writer.rs b/src/back/spv/writer.rs index bb5c2323ec..faae633714 100644 --- a/src/back/spv/writer.rs +++ b/src/back/spv/writer.rs @@ -180,7 +180,9 @@ pub struct Writer { lookup_constant: crate::FastHashMap, Word>, lookup_global_variable: crate::FastHashMap, (Word, spirv::StorageClass)>, - storage_type_handles: crate::FastHashMap, crate::StorageAccess>, + // TODO: this is a type property that depends on the global variable that uses it + // so it may require us to duplicate the type! + struct_type_handles: crate::FastHashMap, crate::StorageAccess>, gl450_ext_inst_id: Word, layouter: Layouter, } @@ -209,7 +211,7 @@ impl Writer { lookup_function_type: crate::FastHashMap::default(), lookup_constant: crate::FastHashMap::default(), lookup_global_variable: crate::FastHashMap::default(), - storage_type_handles: crate::FastHashMap::default(), + struct_type_handles: crate::FastHashMap::default(), gl450_ext_inst_id: 0, layouter: Layouter::default(), } @@ -677,16 +679,23 @@ impl Writer { ref members, } => { //TODO: put NonWritable/NonReadable on the global variable instead? - let (decoration, storage_access) = match self.storage_type_handles.get(&handle) { - Some(&access) => (spirv::Decoration::BufferBlock, access), - None => (spirv::Decoration::Block, crate::StorageAccess::empty()), + let storage_access = match self.struct_type_handles.get(&handle) { + Some(&access) => { + let decoration = if access.is_empty() { + spirv::Decoration::Block + } else { + spirv::Decoration::BufferBlock + }; + self.annotations + .push(super::instructions::instruction_decorate( + id, + decoration, + &[], + )); + access + } + None => crate::StorageAccess::empty(), }; - self.annotations - .push(super::instructions::instruction_decorate( - id, - decoration, - &[], - )); let mut current_offset = 0; let mut member_ids = Vec::with_capacity(members.len()); @@ -2323,8 +2332,8 @@ impl Writer { } for (_, var) in ir_module.global_variables.iter() { - if !var.storage_access.is_empty() { - self.storage_type_handles.insert(var.ty, var.storage_access); + if let crate::TypeInner::Struct { .. } = ir_module.types[var.ty].inner { + self.struct_type_handles.insert(var.ty, var.storage_access); } } diff --git a/tests/snapshots/snapshots__boids.spvasm.snap b/tests/snapshots/snapshots__boids.spvasm.snap index dc2eea87a3..d98c8e7433 100644 --- a/tests/snapshots/snapshots__boids.spvasm.snap +++ b/tests/snapshots/snapshots__boids.spvasm.snap @@ -15,7 +15,6 @@ OpDecorate %34 BuiltIn GlobalInvocationId OpDecorate %48 BufferBlock OpMemberDecorate %48 0 Offset 0 OpDecorate %49 ArrayStride 16 -OpDecorate %50 Block OpMemberDecorate %50 0 Offset 0 OpMemberDecorate %50 1 Offset 8 OpDecorate %47 DescriptorSet 0 diff --git a/tests/snapshots/snapshots__shadow.spvasm.snap b/tests/snapshots/snapshots__shadow.spvasm.snap index 6e7ae4f4f7..c0f1f29a2f 100644 --- a/tests/snapshots/snapshots__shadow.spvasm.snap +++ b/tests/snapshots/snapshots__shadow.spvasm.snap @@ -23,7 +23,6 @@ OpDecorate %98 BufferBlock OpMemberDecorate %98 0 Offset 0 OpMemberDecorate %98 0 NonWritable OpDecorate %99 ArrayStride 96 -OpDecorate %100 Block OpMemberDecorate %100 0 Offset 0 OpMemberDecorate %100 0 ColMajor OpMemberDecorate %100 0 MatrixStride 16