From: John Kessenich Date: Sun, 11 Sep 2016 18:33:43 +0000 (-0600) Subject: SPV: Fix issue #506: generalize struct deep copy to include arrays. X-Git-Tag: upstream/11.4.0~1513 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b3e24e4359dc65639f52e178088c9363c9dcb9bb;p=platform%2Fupstream%2Fglslang.git SPV: Fix issue #506: generalize struct deep copy to include arrays. --- diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 788dd63..4513df8 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -2283,13 +2283,13 @@ void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::I // Implicitly uses the existing builder.accessChain as the storage target. void TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id rValue) { - // we only do the complex path here if it's a structure - if (! type.isStruct()) { + // we only do the complex path here if it's an aggregate + if (! type.isStruct() && ! type.isArray()) { accessChainStore(type, rValue); return; } - // and, it has to be a case of structure type aliasing + // and, it has to be a case of type aliasing spv::Id rType = builder.getTypeId(rValue); spv::Id lValue = builder.accessChainGetLValue(); spv::Id lType = builder.getContainedTypeId(builder.getTypeId(lValue)); @@ -2298,26 +2298,46 @@ void TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id return; } - // Recursively (as needed) copy a struct type to a different struct type, + // Recursively (as needed) copy an aggregate type to a different aggregate type, // where the two types were the same type in GLSL. This requires member // by member copy, recursively. - // loop over members - const glslang::TTypeList& members = *type.getStruct(); - for (int m = 0; m < (int)members.size(); ++m) { - const glslang::TType& glslangMemberType = *members[m].type; + // If an array, copy element by element. + if (type.isArray()) { + glslang::TType glslangElementType(type, 0); + spv::Id elementRType = builder.getContainedTypeId(rType); + for (int index = 0; index < type.getOuterArraySize(); ++index) { + // get the source member + spv::Id elementRValue = builder.createCompositeExtract(rValue, elementRType, index); - // get the source member - spv::Id memberRType = builder.getContainedTypeId(rType, m); - spv::Id memberRValue = builder.createCompositeExtract(rValue, memberRType, m); + // set up the target storage + builder.clearAccessChain(); + builder.setAccessChainLValue(lValue); + builder.accessChainPush(builder.makeIntConstant(index)); - // set up the target storage - builder.clearAccessChain(); - builder.setAccessChainLValue(lValue); - builder.accessChainPush(builder.makeIntConstant(m)); + // store the member + multiTypeStore(glslangElementType, elementRValue); + } + } else { + assert(type.isStruct()); - // store the member - multiTypeStore(glslangMemberType, memberRValue); + // loop over structure members + const glslang::TTypeList& members = *type.getStruct(); + for (int m = 0; m < (int)members.size(); ++m) { + const glslang::TType& glslangMemberType = *members[m].type; + + // get the source member + spv::Id memberRType = builder.getContainedTypeId(rType, m); + spv::Id memberRValue = builder.createCompositeExtract(rValue, memberRType, m); + + // set up the target storage + builder.clearAccessChain(); + builder.setAccessChainLValue(lValue); + builder.accessChainPush(builder.makeIntConstant(m)); + + // store the member + multiTypeStore(glslangMemberType, memberRValue); + } } } diff --git a/Test/baseResults/spv.multiStruct.comp.out b/Test/baseResults/spv.multiStruct.comp.out index a2ab8f8..28402ce 100755 --- a/Test/baseResults/spv.multiStruct.comp.out +++ b/Test/baseResults/spv.multiStruct.comp.out @@ -7,7 +7,7 @@ Linked compute stage: // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 97 +// Id's are bound by 157 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -16,177 +16,253 @@ Linked compute stage: ExecutionMode 4 LocalSize 1 1 1 Source GLSL 450 Name 4 "main" - Name 9 "MyStruct" - MemberName 9(MyStruct) 0 "foo" - MemberName 9(MyStruct) 1 "sb" - Name 11 "t" - Name 13 "MyStruct" - MemberName 13(MyStruct) 0 "foo" - MemberName 13(MyStruct) 1 "sb" - Name 14 "SSBO0" - MemberName 14(SSBO0) 0 "a" - Name 16 "inBuf" - Name 29 "SSBO1" - MemberName 29(SSBO1) 0 "b" - Name 31 "outBuf" - Name 43 "MyStruct" - MemberName 43(MyStruct) 0 "foo" - MemberName 43(MyStruct) 1 "sb" - Name 44 "UBO" - MemberName 44(UBO) 0 "c" - Name 46 "uBuf" - Name 61 "Nested" - MemberName 61(Nested) 0 "f" - MemberName 61(Nested) 1 "S" - Name 63 "n" - Name 64 "Nested" - MemberName 64(Nested) 0 "f" - MemberName 64(Nested) 1 "S" - Name 65 "UBON" - MemberName 65(UBON) 0 "N1" - Name 67 "uBufN" - Name 80 "Nested" - MemberName 80(Nested) 0 "f" - MemberName 80(Nested) 1 "S" - Name 81 "SSBO1N" - MemberName 81(SSBO1N) 0 "N2" - Name 83 "outBufN" - MemberDecorate 13(MyStruct) 0 Offset 0 - MemberDecorate 13(MyStruct) 1 Offset 16 - MemberDecorate 14(SSBO0) 0 Offset 0 - Decorate 14(SSBO0) BufferBlock - Decorate 16(inBuf) DescriptorSet 0 - Decorate 16(inBuf) Binding 0 - MemberDecorate 29(SSBO1) 0 Offset 0 - Decorate 29(SSBO1) BufferBlock - Decorate 31(outBuf) DescriptorSet 0 - Decorate 31(outBuf) Binding 1 - MemberDecorate 43(MyStruct) 0 Offset 0 - MemberDecorate 43(MyStruct) 1 Offset 16 - MemberDecorate 44(UBO) 0 Offset 0 - Decorate 44(UBO) Block - Decorate 46(uBuf) DescriptorSet 0 - Decorate 46(uBuf) Binding 2 - MemberDecorate 64(Nested) 0 Offset 0 - MemberDecorate 64(Nested) 1 Offset 16 - MemberDecorate 65(UBON) 0 Offset 0 - Decorate 65(UBON) Block - Decorate 67(uBufN) DescriptorSet 0 - Decorate 67(uBufN) Binding 2 - MemberDecorate 80(Nested) 0 Offset 0 - MemberDecorate 80(Nested) 1 Offset 16 - MemberDecorate 81(SSBO1N) 0 Offset 0 - Decorate 81(SSBO1N) BufferBlock - Decorate 83(outBufN) DescriptorSet 0 - Decorate 83(outBufN) Binding 1 + Name 12 "MyStruct" + MemberName 12(MyStruct) 0 "foo" + MemberName 12(MyStruct) 1 "sb" + Name 14 "t" + Name 16 "MyStruct" + MemberName 16(MyStruct) 0 "foo" + MemberName 16(MyStruct) 1 "sb" + Name 17 "SSBO0" + MemberName 17(SSBO0) 0 "a" + Name 19 "inBuf" + Name 37 "SSBO1" + MemberName 37(SSBO1) 0 "b" + Name 39 "outBuf" + Name 57 "MyStruct" + MemberName 57(MyStruct) 0 "foo" + MemberName 57(MyStruct) 1 "sb" + Name 58 "UBO" + MemberName 58(UBO) 0 "c" + Name 60 "uBuf" + Name 84 "Nested" + MemberName 84(Nested) 0 "f" + MemberName 84(Nested) 1 "S" + Name 86 "n" + Name 88 "Nested" + MemberName 88(Nested) 0 "f" + MemberName 88(Nested) 1 "S" + Name 89 "UBON" + MemberName 89(UBON) 0 "N1" + Name 91 "uBufN" + Name 122 "Nested" + MemberName 122(Nested) 0 "f" + MemberName 122(Nested) 1 "S" + Name 123 "SSBO1N" + MemberName 123(SSBO1N) 0 "N2" + Name 125 "outBufN" + Decorate 15 ArrayStride 8 + MemberDecorate 16(MyStruct) 0 Offset 0 + MemberDecorate 16(MyStruct) 1 Offset 16 + MemberDecorate 17(SSBO0) 0 Offset 0 + Decorate 17(SSBO0) BufferBlock + Decorate 19(inBuf) DescriptorSet 0 + Decorate 19(inBuf) Binding 0 + MemberDecorate 37(SSBO1) 0 Offset 0 + Decorate 37(SSBO1) BufferBlock + Decorate 39(outBuf) DescriptorSet 0 + Decorate 39(outBuf) Binding 1 + Decorate 56 ArrayStride 16 + MemberDecorate 57(MyStruct) 0 Offset 0 + MemberDecorate 57(MyStruct) 1 Offset 32 + MemberDecorate 58(UBO) 0 Offset 0 + Decorate 58(UBO) Block + Decorate 60(uBuf) DescriptorSet 0 + Decorate 60(uBuf) Binding 2 + Decorate 87 ArrayStride 48 + MemberDecorate 88(Nested) 0 Offset 0 + MemberDecorate 88(Nested) 1 Offset 16 + MemberDecorate 89(UBON) 0 Offset 0 + Decorate 89(UBON) Block + Decorate 91(uBufN) DescriptorSet 0 + Decorate 91(uBufN) Binding 2 + Decorate 121 ArrayStride 24 + MemberDecorate 122(Nested) 0 Offset 0 + MemberDecorate 122(Nested) 1 Offset 8 + MemberDecorate 123(SSBO1N) 0 Offset 0 + Decorate 123(SSBO1N) BufferBlock + Decorate 125(outBufN) DescriptorSet 0 + Decorate 125(outBufN) Binding 1 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 - 7: TypeVector 6(float) 4 - 8: TypeBool - 9(MyStruct): TypeStruct 7(fvec4) 8(bool) - 10: TypePointer Function 9(MyStruct) - 12: TypeInt 32 0 - 13(MyStruct): TypeStruct 7(fvec4) 12(int) - 14(SSBO0): TypeStruct 13(MyStruct) - 15: TypePointer Uniform 14(SSBO0) - 16(inBuf): 15(ptr) Variable Uniform - 17: TypeInt 32 1 - 18: 17(int) Constant 0 - 19: TypePointer Uniform 13(MyStruct) - 23: TypePointer Function 7(fvec4) - 26: 17(int) Constant 1 - 27: TypePointer Function 8(bool) - 29(SSBO1): TypeStruct 13(MyStruct) - 30: TypePointer Uniform 29(SSBO1) - 31(outBuf): 30(ptr) Variable Uniform - 35: TypePointer Uniform 7(fvec4) - 38: 12(int) Constant 0 - 39: 12(int) Constant 1 - 41: TypePointer Uniform 12(int) - 43(MyStruct): TypeStruct 7(fvec4) 12(int) - 44(UBO): TypeStruct 43(MyStruct) - 45: TypePointer Uniform 44(UBO) - 46(uBuf): 45(ptr) Variable Uniform - 47: TypePointer Uniform 43(MyStruct) - 61(Nested): TypeStruct 6(float) 9(MyStruct) - 62: TypePointer Function 61(Nested) - 64(Nested): TypeStruct 6(float) 43(MyStruct) - 65(UBON): TypeStruct 64(Nested) - 66: TypePointer Uniform 65(UBON) - 67(uBufN): 66(ptr) Variable Uniform - 68: TypePointer Uniform 64(Nested) - 72: TypePointer Function 6(float) - 80(Nested): TypeStruct 6(float) 13(MyStruct) - 81(SSBO1N): TypeStruct 80(Nested) - 82: TypePointer Uniform 81(SSBO1N) - 83(outBufN): 82(ptr) Variable Uniform - 85: TypePointer Uniform 80(Nested) - 88: TypePointer Uniform 6(float) + 7: TypeVector 6(float) 2 + 8: TypeInt 32 0 + 9: 8(int) Constant 2 + 10: TypeArray 7(fvec2) 9 + 11: TypeBool + 12(MyStruct): TypeStruct 10 11(bool) + 13: TypePointer Function 12(MyStruct) + 15: TypeArray 7(fvec2) 9 + 16(MyStruct): TypeStruct 15 8(int) + 17(SSBO0): TypeStruct 16(MyStruct) + 18: TypePointer Uniform 17(SSBO0) + 19(inBuf): 18(ptr) Variable Uniform + 20: TypeInt 32 1 + 21: 20(int) Constant 0 + 22: TypePointer Uniform 16(MyStruct) + 26: TypePointer Function 10 + 29: TypePointer Function 7(fvec2) + 32: 20(int) Constant 1 + 35: TypePointer Function 11(bool) + 37(SSBO1): TypeStruct 16(MyStruct) + 38: TypePointer Uniform 37(SSBO1) + 39(outBuf): 38(ptr) Variable Uniform + 43: TypePointer Uniform 15 + 46: TypePointer Uniform 7(fvec2) + 51: 8(int) Constant 0 + 52: 8(int) Constant 1 + 54: TypePointer Uniform 8(int) + 56: TypeArray 7(fvec2) 9 + 57(MyStruct): TypeStruct 56 8(int) + 58(UBO): TypeStruct 57(MyStruct) + 59: TypePointer Uniform 58(UBO) + 60(uBuf): 59(ptr) Variable Uniform + 61: TypePointer Uniform 57(MyStruct) + 83: TypeArray 12(MyStruct) 9 + 84(Nested): TypeStruct 6(float) 83 + 85: TypePointer Function 84(Nested) + 87: TypeArray 57(MyStruct) 9 + 88(Nested): TypeStruct 6(float) 87 + 89(UBON): TypeStruct 88(Nested) + 90: TypePointer Uniform 89(UBON) + 91(uBufN): 90(ptr) Variable Uniform + 92: TypePointer Uniform 88(Nested) + 96: TypePointer Function 6(float) + 99: TypePointer Function 83 + 121: TypeArray 16(MyStruct) 9 + 122(Nested): TypeStruct 6(float) 121 + 123(SSBO1N): TypeStruct 122(Nested) + 124: TypePointer Uniform 123(SSBO1N) + 125(outBufN): 124(ptr) Variable Uniform + 127: TypePointer Uniform 122(Nested) + 130: TypePointer Uniform 6(float) + 133: TypePointer Uniform 121 4(main): 2 Function None 3 5: Label - 11(t): 10(ptr) Variable Function - 63(n): 62(ptr) Variable Function - 20: 19(ptr) AccessChain 16(inBuf) 18 - 21:13(MyStruct) Load 20 - 22: 7(fvec4) CompositeExtract 21 0 - 24: 23(ptr) AccessChain 11(t) 18 - Store 24 22 - 25: 12(int) CompositeExtract 21 1 - 28: 27(ptr) AccessChain 11(t) 26 - Store 28 25 - 32: 9(MyStruct) Load 11(t) - 33: 19(ptr) AccessChain 31(outBuf) 18 - 34: 7(fvec4) CompositeExtract 32 0 - 36: 35(ptr) AccessChain 33 18 + 14(t): 13(ptr) Variable Function + 86(n): 85(ptr) Variable Function + 23: 22(ptr) AccessChain 19(inBuf) 21 + 24:16(MyStruct) Load 23 + 25: 15 CompositeExtract 24 0 + 27: 26(ptr) AccessChain 14(t) 21 + 28: 7(fvec2) CompositeExtract 25 0 + 30: 29(ptr) AccessChain 27 21 + Store 30 28 + 31: 7(fvec2) CompositeExtract 25 1 + 33: 29(ptr) AccessChain 27 32 + Store 33 31 + 34: 8(int) CompositeExtract 24 1 + 36: 35(ptr) AccessChain 14(t) 32 Store 36 34 - 37: 8(bool) CompositeExtract 32 1 - 40: 12(int) Select 37 39 38 - 42: 41(ptr) AccessChain 33 26 - Store 42 40 - 48: 47(ptr) AccessChain 46(uBuf) 18 - 49:43(MyStruct) Load 48 - 50: 7(fvec4) CompositeExtract 49 0 - 51: 23(ptr) AccessChain 11(t) 18 - Store 51 50 - 52: 12(int) CompositeExtract 49 1 - 53: 27(ptr) AccessChain 11(t) 26 - Store 53 52 - 54: 9(MyStruct) Load 11(t) - 55: 19(ptr) AccessChain 31(outBuf) 18 - 56: 7(fvec4) CompositeExtract 54 0 - 57: 35(ptr) AccessChain 55 18 - Store 57 56 - 58: 8(bool) CompositeExtract 54 1 - 59: 12(int) Select 58 39 38 - 60: 41(ptr) AccessChain 55 26 - Store 60 59 - 69: 68(ptr) AccessChain 67(uBufN) 18 - 70: 64(Nested) Load 69 - 71: 6(float) CompositeExtract 70 0 - 73: 72(ptr) AccessChain 63(n) 18 - Store 73 71 - 74:43(MyStruct) CompositeExtract 70 1 - 75: 10(ptr) AccessChain 63(n) 26 - 76: 7(fvec4) CompositeExtract 74 0 - 77: 23(ptr) AccessChain 75 18 + 40:12(MyStruct) Load 14(t) + 41: 22(ptr) AccessChain 39(outBuf) 21 + 42: 10 CompositeExtract 40 0 + 44: 43(ptr) AccessChain 41 21 + 45: 7(fvec2) CompositeExtract 42 0 + 47: 46(ptr) AccessChain 44 21 + Store 47 45 + 48: 7(fvec2) CompositeExtract 42 1 + 49: 46(ptr) AccessChain 44 32 + Store 49 48 + 50: 11(bool) CompositeExtract 40 1 + 53: 8(int) Select 50 52 51 + 55: 54(ptr) AccessChain 41 32 + Store 55 53 + 62: 61(ptr) AccessChain 60(uBuf) 21 + 63:57(MyStruct) Load 62 + 64: 56 CompositeExtract 63 0 + 65: 26(ptr) AccessChain 14(t) 21 + 66: 7(fvec2) CompositeExtract 64 0 + 67: 29(ptr) AccessChain 65 21 + Store 67 66 + 68: 7(fvec2) CompositeExtract 64 1 + 69: 29(ptr) AccessChain 65 32 + Store 69 68 + 70: 8(int) CompositeExtract 63 1 + 71: 35(ptr) AccessChain 14(t) 32 + Store 71 70 + 72:12(MyStruct) Load 14(t) + 73: 22(ptr) AccessChain 39(outBuf) 21 + 74: 10 CompositeExtract 72 0 + 75: 43(ptr) AccessChain 73 21 + 76: 7(fvec2) CompositeExtract 74 0 + 77: 46(ptr) AccessChain 75 21 Store 77 76 - 78: 12(int) CompositeExtract 74 1 - 79: 27(ptr) AccessChain 75 26 + 78: 7(fvec2) CompositeExtract 74 1 + 79: 46(ptr) AccessChain 75 32 Store 79 78 - 84: 61(Nested) Load 63(n) - 86: 85(ptr) AccessChain 83(outBufN) 18 - 87: 6(float) CompositeExtract 84 0 - 89: 88(ptr) AccessChain 86 18 - Store 89 87 - 90: 9(MyStruct) CompositeExtract 84 1 - 91: 19(ptr) AccessChain 86 26 - 92: 7(fvec4) CompositeExtract 90 0 - 93: 35(ptr) AccessChain 91 18 - Store 93 92 - 94: 8(bool) CompositeExtract 90 1 - 95: 12(int) Select 94 39 38 - 96: 41(ptr) AccessChain 91 26 - Store 96 95 + 80: 11(bool) CompositeExtract 72 1 + 81: 8(int) Select 80 52 51 + 82: 54(ptr) AccessChain 73 32 + Store 82 81 + 93: 92(ptr) AccessChain 91(uBufN) 21 + 94: 88(Nested) Load 93 + 95: 6(float) CompositeExtract 94 0 + 97: 96(ptr) AccessChain 86(n) 21 + Store 97 95 + 98: 87 CompositeExtract 94 1 + 100: 99(ptr) AccessChain 86(n) 32 + 101:57(MyStruct) CompositeExtract 98 0 + 102: 13(ptr) AccessChain 100 21 + 103: 56 CompositeExtract 101 0 + 104: 26(ptr) AccessChain 102 21 + 105: 7(fvec2) CompositeExtract 103 0 + 106: 29(ptr) AccessChain 104 21 + Store 106 105 + 107: 7(fvec2) CompositeExtract 103 1 + 108: 29(ptr) AccessChain 104 32 + Store 108 107 + 109: 8(int) CompositeExtract 101 1 + 110: 35(ptr) AccessChain 102 32 + Store 110 109 + 111:57(MyStruct) CompositeExtract 98 1 + 112: 13(ptr) AccessChain 100 32 + 113: 56 CompositeExtract 111 0 + 114: 26(ptr) AccessChain 112 21 + 115: 7(fvec2) CompositeExtract 113 0 + 116: 29(ptr) AccessChain 114 21 + Store 116 115 + 117: 7(fvec2) CompositeExtract 113 1 + 118: 29(ptr) AccessChain 114 32 + Store 118 117 + 119: 8(int) CompositeExtract 111 1 + 120: 35(ptr) AccessChain 112 32 + Store 120 119 + 126: 84(Nested) Load 86(n) + 128: 127(ptr) AccessChain 125(outBufN) 21 + 129: 6(float) CompositeExtract 126 0 + 131: 130(ptr) AccessChain 128 21 + Store 131 129 + 132: 83 CompositeExtract 126 1 + 134: 133(ptr) AccessChain 128 32 + 135:12(MyStruct) CompositeExtract 132 0 + 136: 22(ptr) AccessChain 134 21 + 137: 10 CompositeExtract 135 0 + 138: 43(ptr) AccessChain 136 21 + 139: 7(fvec2) CompositeExtract 137 0 + 140: 46(ptr) AccessChain 138 21 + Store 140 139 + 141: 7(fvec2) CompositeExtract 137 1 + 142: 46(ptr) AccessChain 138 32 + Store 142 141 + 143: 11(bool) CompositeExtract 135 1 + 144: 8(int) Select 143 52 51 + 145: 54(ptr) AccessChain 136 32 + Store 145 144 + 146:12(MyStruct) CompositeExtract 132 1 + 147: 22(ptr) AccessChain 134 32 + 148: 10 CompositeExtract 146 0 + 149: 43(ptr) AccessChain 147 21 + 150: 7(fvec2) CompositeExtract 148 0 + 151: 46(ptr) AccessChain 149 21 + Store 151 150 + 152: 7(fvec2) CompositeExtract 148 1 + 153: 46(ptr) AccessChain 149 32 + Store 153 152 + 154: 11(bool) CompositeExtract 146 1 + 155: 8(int) Select 154 52 51 + 156: 54(ptr) AccessChain 147 32 + Store 156 155 Return FunctionEnd diff --git a/Test/spv.multiStruct.comp b/Test/spv.multiStruct.comp index de27ccb..7462da4 100644 --- a/Test/spv.multiStruct.comp +++ b/Test/spv.multiStruct.comp @@ -2,7 +2,7 @@ struct MyStruct { - vec4 foo; + vec2 foo[2]; bool sb; }; @@ -23,7 +23,7 @@ layout(binding = 2, std140) uniform UBO struct Nested { float f; - MyStruct S; + MyStruct S[2]; }; layout(binding = 2, std140) uniform UBON diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 41f9a70..3370391 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -3,4 +3,4 @@ // For the date, it uses the current date (when then script is run). #define GLSLANG_REVISION "Overload400-PrecQual.1481" -#define GLSLANG_DATE "10-Sep-2016" +#define GLSLANG_DATE "11-Sep-2016"