From 88220d507e72a15f9a6f033900cc52f33c232d49 Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Wed, 8 May 2019 10:24:46 -0500 Subject: [PATCH] For nonuniformEXT constructor, make a copy of the node to decorate --- SPIRV/GlslangToSpv.cpp | 5 + Test/baseResults/nonuniform.frag.out | 20 +- Test/baseResults/spv.nonuniform.frag.out | 572 +++++++++++---------- Test/baseResults/spv.nonuniform2.frag.out | 53 ++ Test/spv.nonuniform2.frag | 9 + glslang/Include/intermediate.h | 2 + glslang/MachineIndependent/ParseHelper.cpp | 7 +- glslang/MachineIndependent/intermOut.cpp | 1 + gtests/Spv.FromFile.cpp | 1 + 9 files changed, 374 insertions(+), 296 deletions(-) create mode 100644 Test/baseResults/spv.nonuniform2.frag.out create mode 100644 Test/spv.nonuniform2.frag diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 25ef21055..655d77b4e 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -5543,6 +5543,11 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpConstructReference: unaryOp = spv::OpBitcast; break; + + case glslang::EOpCopyObject: + unaryOp = spv::OpCopyObject; + break; + default: return 0; } diff --git a/Test/baseResults/nonuniform.frag.out b/Test/baseResults/nonuniform.frag.out index 2d4e9b011..0df8cfc39 100644 --- a/Test/baseResults/nonuniform.frag.out +++ b/Test/baseResults/nonuniform.frag.out @@ -31,11 +31,13 @@ ERROR: node is still EOpNull! 0:27 move second child to first child ( temp int) 0:27 'nu_li' ( nonuniform temp int) 0:27 add ( nonuniform temp int) -0:27 'a' ( nonuniform temp int) -0:27 component-wise multiply ( nonuniform temp int) +0:27 copy object ( nonuniform temp int) 0:27 'a' ( temp int) -0:27 Constant: -0:27 2 (const int) +0:27 copy object ( nonuniform temp int) +0:27 component-wise multiply ( temp int) +0:27 'a' ( temp int) +0:27 Constant: +0:27 2 (const int) 0:28 'nu_li' ( nonuniform temp int) 0:29 'nu_li' ( nonuniform temp int) 0:? Linker Objects @@ -72,11 +74,13 @@ ERROR: node is still EOpNull! 0:27 move second child to first child ( temp int) 0:27 'nu_li' ( nonuniform temp int) 0:27 add ( nonuniform temp int) -0:27 'a' ( nonuniform temp int) -0:27 component-wise multiply ( nonuniform temp int) +0:27 copy object ( nonuniform temp int) 0:27 'a' ( temp int) -0:27 Constant: -0:27 2 (const int) +0:27 copy object ( nonuniform temp int) +0:27 component-wise multiply ( temp int) +0:27 'a' ( temp int) +0:27 Constant: +0:27 2 (const int) 0:28 'nu_li' ( nonuniform temp int) 0:29 'nu_li' ( nonuniform temp int) 0:? Linker Objects diff --git a/Test/baseResults/spv.nonuniform.frag.out b/Test/baseResults/spv.nonuniform.frag.out index 972276a6b..f30acc9d4 100644 --- a/Test/baseResults/spv.nonuniform.frag.out +++ b/Test/baseResults/spv.nonuniform.frag.out @@ -1,7 +1,7 @@ spv.nonuniform.frag // Module Version 10000 // Generated by (magic number): 80007 -// Id's are bound by 210 +// Id's are bound by 212 Capability Shader Capability InputAttachment @@ -22,7 +22,7 @@ spv.nonuniform.frag Extension "SPV_EXT_descriptor_indexing" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 33 90 + EntryPoint Fragment 4 "main" 35 92 ExecutionMode 4 OriginUpperLeft Source GLSL 450 SourceExtension "GL_EXT_nonuniform_qualifier" @@ -34,189 +34,189 @@ spv.nonuniform.frag Name 17 "nu_li" Name 18 "param" Name 20 "param" - Name 30 "b" - Name 33 "nu_inv4" - Name 39 "nu_gf" - Name 45 "inputAttachmentDyn" - Name 46 "dyn_i" - Name 62 "uniformTexelBufferDyn" - Name 76 "storageTexelBufferDyn" - Name 85 "uname" - MemberName 85(uname) 0 "a" - Name 88 "uniformBuffer" - Name 90 "nu_ii" - Name 97 "bname" - MemberName 97(bname) 0 "b" - Name 100 "storageBuffer" - Name 110 "sampledImage" - Name 125 "storageImage" - Name 137 "inputAttachment" - Name 147 "uniformTexelBuffer" - Name 158 "storageTexelBuffer" - Name 168 "v" - Name 183 "uv" - Name 193 "m" - Name 201 "S" - MemberName 201(S) 0 "a" - Name 203 "s" + Name 32 "b" + Name 35 "nu_inv4" + Name 41 "nu_gf" + Name 47 "inputAttachmentDyn" + Name 48 "dyn_i" + Name 64 "uniformTexelBufferDyn" + Name 78 "storageTexelBufferDyn" + Name 87 "uname" + MemberName 87(uname) 0 "a" + Name 90 "uniformBuffer" + Name 92 "nu_ii" + Name 99 "bname" + MemberName 99(bname) 0 "b" + Name 102 "storageBuffer" + Name 112 "sampledImage" + Name 127 "storageImage" + Name 139 "inputAttachment" + Name 149 "uniformTexelBuffer" + Name 160 "storageTexelBuffer" + Name 170 "v" + Name 185 "uv" + Name 195 "m" + Name 203 "S" + MemberName 203(S) 0 "a" + Name 205 "s" Decorate 13 DecorationNonUniformEXT Decorate 17(nu_li) DecorationNonUniformEXT Decorate 19 DecorationNonUniformEXT - Decorate 23 DecorationNonUniformEXT - Decorate 26 DecorationNonUniformEXT - Decorate 27 DecorationNonUniformEXT - Decorate 33(nu_inv4) Location 0 - Decorate 33(nu_inv4) DecorationNonUniformEXT - Decorate 38 DecorationNonUniformEXT - Decorate 39(nu_gf) DecorationNonUniformEXT + Decorate 24 DecorationNonUniformEXT + Decorate 28 DecorationNonUniformEXT + Decorate 29 DecorationNonUniformEXT + Decorate 35(nu_inv4) Location 0 + Decorate 35(nu_inv4) DecorationNonUniformEXT Decorate 40 DecorationNonUniformEXT - Decorate 41 DecorationNonUniformEXT - Decorate 45(inputAttachmentDyn) DescriptorSet 0 - Decorate 45(inputAttachmentDyn) Binding 0 - Decorate 45(inputAttachmentDyn) InputAttachmentIndex 0 - Decorate 62(uniformTexelBufferDyn) DescriptorSet 0 - Decorate 62(uniformTexelBufferDyn) Binding 1 - Decorate 76(storageTexelBufferDyn) DescriptorSet 0 - Decorate 76(storageTexelBufferDyn) Binding 2 - MemberDecorate 85(uname) 0 Offset 0 - Decorate 85(uname) Block - Decorate 88(uniformBuffer) DescriptorSet 0 - Decorate 88(uniformBuffer) Binding 3 - Decorate 90(nu_ii) Flat - Decorate 90(nu_ii) Location 1 - Decorate 90(nu_ii) DecorationNonUniformEXT - Decorate 91 DecorationNonUniformEXT - Decorate 94 DecorationNonUniformEXT - MemberDecorate 97(bname) 0 Offset 0 - Decorate 97(bname) BufferBlock - Decorate 100(storageBuffer) DescriptorSet 0 - Decorate 100(storageBuffer) Binding 4 - Decorate 101 DecorationNonUniformEXT + Decorate 41(nu_gf) DecorationNonUniformEXT + Decorate 42 DecorationNonUniformEXT + Decorate 43 DecorationNonUniformEXT + Decorate 47(inputAttachmentDyn) DescriptorSet 0 + Decorate 47(inputAttachmentDyn) Binding 0 + Decorate 47(inputAttachmentDyn) InputAttachmentIndex 0 + Decorate 64(uniformTexelBufferDyn) DescriptorSet 0 + Decorate 64(uniformTexelBufferDyn) Binding 1 + Decorate 78(storageTexelBufferDyn) DescriptorSet 0 + Decorate 78(storageTexelBufferDyn) Binding 2 + MemberDecorate 87(uname) 0 Offset 0 + Decorate 87(uname) Block + Decorate 90(uniformBuffer) DescriptorSet 0 + Decorate 90(uniformBuffer) Binding 3 + Decorate 92(nu_ii) Flat + Decorate 92(nu_ii) Location 1 + Decorate 92(nu_ii) DecorationNonUniformEXT + Decorate 93 DecorationNonUniformEXT + Decorate 96 DecorationNonUniformEXT + MemberDecorate 99(bname) 0 Offset 0 + Decorate 99(bname) BufferBlock + Decorate 102(storageBuffer) DescriptorSet 0 + Decorate 102(storageBuffer) Binding 4 Decorate 103 DecorationNonUniformEXT - Decorate 110(sampledImage) DescriptorSet 0 - Decorate 110(sampledImage) Binding 5 - Decorate 111 DecorationNonUniformEXT - Decorate 114 DecorationNonUniformEXT - Decorate 125(storageImage) DescriptorSet 0 - Decorate 125(storageImage) Binding 6 - Decorate 126 DecorationNonUniformEXT - Decorate 129 DecorationNonUniformEXT - Decorate 137(inputAttachment) DescriptorSet 0 - Decorate 137(inputAttachment) Binding 7 - Decorate 137(inputAttachment) InputAttachmentIndex 1 - Decorate 138 DecorationNonUniformEXT + Decorate 105 DecorationNonUniformEXT + Decorate 112(sampledImage) DescriptorSet 0 + Decorate 112(sampledImage) Binding 5 + Decorate 113 DecorationNonUniformEXT + Decorate 116 DecorationNonUniformEXT + Decorate 127(storageImage) DescriptorSet 0 + Decorate 127(storageImage) Binding 6 + Decorate 128 DecorationNonUniformEXT + Decorate 131 DecorationNonUniformEXT + Decorate 139(inputAttachment) DescriptorSet 0 + Decorate 139(inputAttachment) Binding 7 + Decorate 139(inputAttachment) InputAttachmentIndex 1 Decorate 140 DecorationNonUniformEXT - Decorate 147(uniformTexelBuffer) DescriptorSet 0 - Decorate 147(uniformTexelBuffer) Binding 8 - Decorate 148 DecorationNonUniformEXT + Decorate 142 DecorationNonUniformEXT + Decorate 149(uniformTexelBuffer) DescriptorSet 0 + Decorate 149(uniformTexelBuffer) Binding 8 Decorate 150 DecorationNonUniformEXT - Decorate 158(storageTexelBuffer) DescriptorSet 0 - Decorate 158(storageTexelBuffer) Binding 9 - Decorate 159 DecorationNonUniformEXT + Decorate 152 DecorationNonUniformEXT + Decorate 160(storageTexelBuffer) DescriptorSet 0 + Decorate 160(storageTexelBuffer) Binding 9 Decorate 161 DecorationNonUniformEXT - Decorate 168(v) DecorationNonUniformEXT - Decorate 171 DecorationNonUniformEXT + Decorate 163 DecorationNonUniformEXT + Decorate 170(v) DecorationNonUniformEXT Decorate 173 DecorationNonUniformEXT - Decorate 178 DecorationNonUniformEXT + Decorate 175 DecorationNonUniformEXT Decorate 180 DecorationNonUniformEXT - Decorate 184 DecorationNonUniformEXT + Decorate 182 DecorationNonUniformEXT Decorate 186 DecorationNonUniformEXT Decorate 188 DecorationNonUniformEXT - Decorate 193(m) DecorationNonUniformEXT - Decorate 195 DecorationNonUniformEXT - Decorate 203(s) DecorationNonUniformEXT - Decorate 205 DecorationNonUniformEXT + Decorate 190 DecorationNonUniformEXT + Decorate 195(m) DecorationNonUniformEXT + Decorate 197 DecorationNonUniformEXT + Decorate 205(s) DecorationNonUniformEXT Decorate 207 DecorationNonUniformEXT + Decorate 209 DecorationNonUniformEXT 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 1 7: TypePointer Function 6(int) 8: TypeFunction 6(int) 7(ptr) 7(ptr) - 25: 6(int) Constant 2 - 28: TypeFloat 32 - 29: TypePointer Function 28(float) - 31: TypeVector 28(float) 4 - 32: TypePointer Input 31(fvec4) - 33(nu_inv4): 32(ptr) Variable Input - 34: TypeInt 32 0 - 35: 34(int) Constant 0 - 36: TypePointer Input 28(float) - 42: TypeImage 28(float) SubpassData nonsampled format:Unknown - 43: TypeRuntimeArray 42 - 44: TypePointer UniformConstant 43 -45(inputAttachmentDyn): 44(ptr) Variable UniformConstant - 48: TypePointer UniformConstant 42 - 51: 6(int) Constant 0 - 52: TypeVector 6(int) 2 - 53: 52(ivec2) ConstantComposite 51 51 - 58: TypeImage 28(float) Buffer sampled format:Unknown - 59: TypeSampledImage 58 - 60: TypeRuntimeArray 59 - 61: TypePointer UniformConstant 60 -62(uniformTexelBufferDyn): 61(ptr) Variable UniformConstant - 64: TypePointer UniformConstant 59 - 67: 6(int) Constant 1 - 73: TypeImage 28(float) Buffer nonsampled format:R32f - 74: TypeRuntimeArray 73 - 75: TypePointer UniformConstant 74 -76(storageTexelBufferDyn): 75(ptr) Variable UniformConstant - 78: TypePointer UniformConstant 73 - 85(uname): TypeStruct 28(float) - 86: TypeRuntimeArray 85(uname) - 87: TypePointer Uniform 86 -88(uniformBuffer): 87(ptr) Variable Uniform - 89: TypePointer Input 6(int) - 90(nu_ii): 89(ptr) Variable Input - 92: TypePointer Uniform 28(float) - 97(bname): TypeStruct 28(float) - 98: TypeRuntimeArray 97(bname) - 99: TypePointer Uniform 98 -100(storageBuffer): 99(ptr) Variable Uniform - 106: TypeImage 28(float) 2D sampled format:Unknown - 107: TypeSampledImage 106 - 108: TypeRuntimeArray 107 - 109: TypePointer UniformConstant 108 -110(sampledImage): 109(ptr) Variable UniformConstant - 112: TypePointer UniformConstant 107 - 115: TypeVector 28(float) 2 - 116: 28(float) Constant 1056964608 - 117: 115(fvec2) ConstantComposite 116 116 - 122: TypeImage 28(float) 2D nonsampled format:R32f - 123: TypeRuntimeArray 122 - 124: TypePointer UniformConstant 123 -125(storageImage): 124(ptr) Variable UniformConstant - 127: TypePointer UniformConstant 122 - 130: 52(ivec2) ConstantComposite 67 67 - 135: TypeRuntimeArray 42 - 136: TypePointer UniformConstant 135 -137(inputAttachment): 136(ptr) Variable UniformConstant - 145: TypeRuntimeArray 59 - 146: TypePointer UniformConstant 145 -147(uniformTexelBuffer): 146(ptr) Variable UniformConstant - 156: TypeRuntimeArray 73 - 157: TypePointer UniformConstant 156 -158(storageTexelBuffer): 157(ptr) Variable UniformConstant - 166: TypeVector 6(int) 4 - 167: TypePointer Function 166(ivec4) - 169: 34(int) Constant 1 - 176: 34(int) Constant 2 - 191: TypeMatrix 31(fvec4) 4 - 192: TypePointer Function 191 - 201(S): TypeStruct 6(int) - 202: TypePointer Function 201(S) + 26: 6(int) Constant 2 + 30: TypeFloat 32 + 31: TypePointer Function 30(float) + 33: TypeVector 30(float) 4 + 34: TypePointer Input 33(fvec4) + 35(nu_inv4): 34(ptr) Variable Input + 36: TypeInt 32 0 + 37: 36(int) Constant 0 + 38: TypePointer Input 30(float) + 44: TypeImage 30(float) SubpassData nonsampled format:Unknown + 45: TypeRuntimeArray 44 + 46: TypePointer UniformConstant 45 +47(inputAttachmentDyn): 46(ptr) Variable UniformConstant + 50: TypePointer UniformConstant 44 + 53: 6(int) Constant 0 + 54: TypeVector 6(int) 2 + 55: 54(ivec2) ConstantComposite 53 53 + 60: TypeImage 30(float) Buffer sampled format:Unknown + 61: TypeSampledImage 60 + 62: TypeRuntimeArray 61 + 63: TypePointer UniformConstant 62 +64(uniformTexelBufferDyn): 63(ptr) Variable UniformConstant + 66: TypePointer UniformConstant 61 + 69: 6(int) Constant 1 + 75: TypeImage 30(float) Buffer nonsampled format:R32f + 76: TypeRuntimeArray 75 + 77: TypePointer UniformConstant 76 +78(storageTexelBufferDyn): 77(ptr) Variable UniformConstant + 80: TypePointer UniformConstant 75 + 87(uname): TypeStruct 30(float) + 88: TypeRuntimeArray 87(uname) + 89: TypePointer Uniform 88 +90(uniformBuffer): 89(ptr) Variable Uniform + 91: TypePointer Input 6(int) + 92(nu_ii): 91(ptr) Variable Input + 94: TypePointer Uniform 30(float) + 99(bname): TypeStruct 30(float) + 100: TypeRuntimeArray 99(bname) + 101: TypePointer Uniform 100 +102(storageBuffer): 101(ptr) Variable Uniform + 108: TypeImage 30(float) 2D sampled format:Unknown + 109: TypeSampledImage 108 + 110: TypeRuntimeArray 109 + 111: TypePointer UniformConstant 110 +112(sampledImage): 111(ptr) Variable UniformConstant + 114: TypePointer UniformConstant 109 + 117: TypeVector 30(float) 2 + 118: 30(float) Constant 1056964608 + 119: 117(fvec2) ConstantComposite 118 118 + 124: TypeImage 30(float) 2D nonsampled format:R32f + 125: TypeRuntimeArray 124 + 126: TypePointer UniformConstant 125 +127(storageImage): 126(ptr) Variable UniformConstant + 129: TypePointer UniformConstant 124 + 132: 54(ivec2) ConstantComposite 69 69 + 137: TypeRuntimeArray 44 + 138: TypePointer UniformConstant 137 +139(inputAttachment): 138(ptr) Variable UniformConstant + 147: TypeRuntimeArray 61 + 148: TypePointer UniformConstant 147 +149(uniformTexelBuffer): 148(ptr) Variable UniformConstant + 158: TypeRuntimeArray 75 + 159: TypePointer UniformConstant 158 +160(storageTexelBuffer): 159(ptr) Variable UniformConstant + 168: TypeVector 6(int) 4 + 169: TypePointer Function 168(ivec4) + 171: 36(int) Constant 1 + 178: 36(int) Constant 2 + 193: TypeMatrix 33(fvec4) 4 + 194: TypePointer Function 193 + 203(S): TypeStruct 6(int) + 204: TypePointer Function 203(S) 4(main): 2 Function None 3 5: Label 16(a): 7(ptr) Variable Function 17(nu_li): 7(ptr) Variable Function 18(param): 7(ptr) Variable Function 20(param): 7(ptr) Variable Function - 30(b): 29(ptr) Variable Function - 39(nu_gf): 29(ptr) Variable Function - 46(dyn_i): 7(ptr) Variable Function - 168(v): 167(ptr) Variable Function - 183(uv): 167(ptr) Variable Function - 193(m): 192(ptr) Variable Function - 203(s): 202(ptr) Variable Function + 32(b): 31(ptr) Variable Function + 41(nu_gf): 31(ptr) Variable Function + 48(dyn_i): 7(ptr) Variable Function + 170(v): 169(ptr) Variable Function + 185(uv): 169(ptr) Variable Function + 195(m): 194(ptr) Variable Function + 205(s): 204(ptr) Variable Function 19: 6(int) Load 17(nu_li) Store 18(param) 19 21: 6(int) FunctionCall 11(foo(i1;i1;) 18(param) 20(param) @@ -224,130 +224,132 @@ spv.nonuniform.frag Store 17(nu_li) 22 Store 16(a) 21 23: 6(int) Load 16(a) - 24: 6(int) Load 16(a) - 26: 6(int) IMul 24 25 - 27: 6(int) IAdd 23 26 - Store 17(nu_li) 27 - 37: 36(ptr) AccessChain 33(nu_inv4) 35 - 38: 28(float) Load 37 - 40: 28(float) Load 39(nu_gf) - 41: 28(float) FMul 38 40 - Store 30(b) 41 - 47: 6(int) Load 46(dyn_i) - 49: 48(ptr) AccessChain 45(inputAttachmentDyn) 47 - 50: 42 Load 49 - 54: 31(fvec4) ImageRead 50 53 - 55: 28(float) CompositeExtract 54 0 - 56: 28(float) Load 30(b) - 57: 28(float) FAdd 56 55 - Store 30(b) 57 - 63: 6(int) Load 46(dyn_i) - 65: 64(ptr) AccessChain 62(uniformTexelBufferDyn) 63 - 66: 59 Load 65 - 68: 58 Image 66 - 69: 31(fvec4) ImageFetch 68 67 - 70: 28(float) CompositeExtract 69 0 - 71: 28(float) Load 30(b) - 72: 28(float) FAdd 71 70 - Store 30(b) 72 - 77: 6(int) Load 46(dyn_i) - 79: 78(ptr) AccessChain 76(storageTexelBufferDyn) 77 - 80: 73 Load 79 - 81: 31(fvec4) ImageRead 80 67 - 82: 28(float) CompositeExtract 81 0 - 83: 28(float) Load 30(b) - 84: 28(float) FAdd 83 82 - Store 30(b) 84 - 91: 6(int) Load 90(nu_ii) - 93: 92(ptr) AccessChain 88(uniformBuffer) 91 51 - 94: 28(float) Load 93 - 95: 28(float) Load 30(b) - 96: 28(float) FAdd 95 94 - Store 30(b) 96 - 101: 6(int) Load 90(nu_ii) - 102: 92(ptr) AccessChain 100(storageBuffer) 101 51 - 103: 28(float) Load 102 - 104: 28(float) Load 30(b) - 105: 28(float) FAdd 104 103 - Store 30(b) 105 - 111: 6(int) Load 90(nu_ii) - 113: 112(ptr) AccessChain 110(sampledImage) 111 - 114: 107 Load 113 - 118: 31(fvec4) ImageSampleImplicitLod 114 117 - 119: 28(float) CompositeExtract 118 0 - 120: 28(float) Load 30(b) - 121: 28(float) FAdd 120 119 - Store 30(b) 121 - 126: 6(int) Load 90(nu_ii) - 128: 127(ptr) AccessChain 125(storageImage) 126 - 129: 122 Load 128 - 131: 31(fvec4) ImageRead 129 130 - 132: 28(float) CompositeExtract 131 0 - 133: 28(float) Load 30(b) - 134: 28(float) FAdd 133 132 - Store 30(b) 134 - 138: 6(int) Load 90(nu_ii) - 139: 48(ptr) AccessChain 137(inputAttachment) 138 - 140: 42 Load 139 - 141: 31(fvec4) ImageRead 140 53 - 142: 28(float) CompositeExtract 141 0 - 143: 28(float) Load 30(b) - 144: 28(float) FAdd 143 142 - Store 30(b) 144 - 148: 6(int) Load 90(nu_ii) - 149: 64(ptr) AccessChain 147(uniformTexelBuffer) 148 - 150: 59 Load 149 - 151: 58 Image 150 - 152: 31(fvec4) ImageFetch 151 67 - 153: 28(float) CompositeExtract 152 0 - 154: 28(float) Load 30(b) - 155: 28(float) FAdd 154 153 - Store 30(b) 155 - 159: 6(int) Load 90(nu_ii) - 160: 78(ptr) AccessChain 158(storageTexelBuffer) 159 - 161: 73 Load 160 - 162: 31(fvec4) ImageRead 161 67 - 163: 28(float) CompositeExtract 162 0 - 164: 28(float) Load 30(b) - 165: 28(float) FAdd 164 163 - Store 30(b) 165 - 170: 7(ptr) AccessChain 168(v) 169 - 171: 6(int) Load 170 - 172: 92(ptr) AccessChain 88(uniformBuffer) 171 51 - 173: 28(float) Load 172 - 174: 28(float) Load 30(b) - 175: 28(float) FAdd 174 173 - Store 30(b) 175 - 177: 7(ptr) AccessChain 168(v) 176 - 178: 6(int) Load 177 - 179: 92(ptr) AccessChain 88(uniformBuffer) 178 51 - 180: 28(float) Load 179 - 181: 28(float) Load 30(b) - 182: 28(float) FAdd 181 180 - Store 30(b) 182 - 184: 6(int) Load 90(nu_ii) - 185: 7(ptr) AccessChain 183(uv) 184 - 186: 6(int) Load 185 - 187: 92(ptr) AccessChain 88(uniformBuffer) 186 51 - 188: 28(float) Load 187 - 189: 28(float) Load 30(b) - 190: 28(float) FAdd 189 188 - Store 30(b) 190 - 194: 29(ptr) AccessChain 193(m) 25 176 - 195: 28(float) Load 194 - 196: 6(int) ConvertFToS 195 - 197: 92(ptr) AccessChain 88(uniformBuffer) 196 51 - 198: 28(float) Load 197 - 199: 28(float) Load 30(b) - 200: 28(float) FAdd 199 198 - Store 30(b) 200 - 204: 7(ptr) AccessChain 203(s) 51 - 205: 6(int) Load 204 - 206: 92(ptr) AccessChain 88(uniformBuffer) 205 51 - 207: 28(float) Load 206 - 208: 28(float) Load 30(b) - 209: 28(float) FAdd 208 207 - Store 30(b) 209 + 24: 6(int) CopyObject 23 + 25: 6(int) Load 16(a) + 27: 6(int) IMul 25 26 + 28: 6(int) CopyObject 27 + 29: 6(int) IAdd 24 28 + Store 17(nu_li) 29 + 39: 38(ptr) AccessChain 35(nu_inv4) 37 + 40: 30(float) Load 39 + 42: 30(float) Load 41(nu_gf) + 43: 30(float) FMul 40 42 + Store 32(b) 43 + 49: 6(int) Load 48(dyn_i) + 51: 50(ptr) AccessChain 47(inputAttachmentDyn) 49 + 52: 44 Load 51 + 56: 33(fvec4) ImageRead 52 55 + 57: 30(float) CompositeExtract 56 0 + 58: 30(float) Load 32(b) + 59: 30(float) FAdd 58 57 + Store 32(b) 59 + 65: 6(int) Load 48(dyn_i) + 67: 66(ptr) AccessChain 64(uniformTexelBufferDyn) 65 + 68: 61 Load 67 + 70: 60 Image 68 + 71: 33(fvec4) ImageFetch 70 69 + 72: 30(float) CompositeExtract 71 0 + 73: 30(float) Load 32(b) + 74: 30(float) FAdd 73 72 + Store 32(b) 74 + 79: 6(int) Load 48(dyn_i) + 81: 80(ptr) AccessChain 78(storageTexelBufferDyn) 79 + 82: 75 Load 81 + 83: 33(fvec4) ImageRead 82 69 + 84: 30(float) CompositeExtract 83 0 + 85: 30(float) Load 32(b) + 86: 30(float) FAdd 85 84 + Store 32(b) 86 + 93: 6(int) Load 92(nu_ii) + 95: 94(ptr) AccessChain 90(uniformBuffer) 93 53 + 96: 30(float) Load 95 + 97: 30(float) Load 32(b) + 98: 30(float) FAdd 97 96 + Store 32(b) 98 + 103: 6(int) Load 92(nu_ii) + 104: 94(ptr) AccessChain 102(storageBuffer) 103 53 + 105: 30(float) Load 104 + 106: 30(float) Load 32(b) + 107: 30(float) FAdd 106 105 + Store 32(b) 107 + 113: 6(int) Load 92(nu_ii) + 115: 114(ptr) AccessChain 112(sampledImage) 113 + 116: 109 Load 115 + 120: 33(fvec4) ImageSampleImplicitLod 116 119 + 121: 30(float) CompositeExtract 120 0 + 122: 30(float) Load 32(b) + 123: 30(float) FAdd 122 121 + Store 32(b) 123 + 128: 6(int) Load 92(nu_ii) + 130: 129(ptr) AccessChain 127(storageImage) 128 + 131: 124 Load 130 + 133: 33(fvec4) ImageRead 131 132 + 134: 30(float) CompositeExtract 133 0 + 135: 30(float) Load 32(b) + 136: 30(float) FAdd 135 134 + Store 32(b) 136 + 140: 6(int) Load 92(nu_ii) + 141: 50(ptr) AccessChain 139(inputAttachment) 140 + 142: 44 Load 141 + 143: 33(fvec4) ImageRead 142 55 + 144: 30(float) CompositeExtract 143 0 + 145: 30(float) Load 32(b) + 146: 30(float) FAdd 145 144 + Store 32(b) 146 + 150: 6(int) Load 92(nu_ii) + 151: 66(ptr) AccessChain 149(uniformTexelBuffer) 150 + 152: 61 Load 151 + 153: 60 Image 152 + 154: 33(fvec4) ImageFetch 153 69 + 155: 30(float) CompositeExtract 154 0 + 156: 30(float) Load 32(b) + 157: 30(float) FAdd 156 155 + Store 32(b) 157 + 161: 6(int) Load 92(nu_ii) + 162: 80(ptr) AccessChain 160(storageTexelBuffer) 161 + 163: 75 Load 162 + 164: 33(fvec4) ImageRead 163 69 + 165: 30(float) CompositeExtract 164 0 + 166: 30(float) Load 32(b) + 167: 30(float) FAdd 166 165 + Store 32(b) 167 + 172: 7(ptr) AccessChain 170(v) 171 + 173: 6(int) Load 172 + 174: 94(ptr) AccessChain 90(uniformBuffer) 173 53 + 175: 30(float) Load 174 + 176: 30(float) Load 32(b) + 177: 30(float) FAdd 176 175 + Store 32(b) 177 + 179: 7(ptr) AccessChain 170(v) 178 + 180: 6(int) Load 179 + 181: 94(ptr) AccessChain 90(uniformBuffer) 180 53 + 182: 30(float) Load 181 + 183: 30(float) Load 32(b) + 184: 30(float) FAdd 183 182 + Store 32(b) 184 + 186: 6(int) Load 92(nu_ii) + 187: 7(ptr) AccessChain 185(uv) 186 + 188: 6(int) Load 187 + 189: 94(ptr) AccessChain 90(uniformBuffer) 188 53 + 190: 30(float) Load 189 + 191: 30(float) Load 32(b) + 192: 30(float) FAdd 191 190 + Store 32(b) 192 + 196: 31(ptr) AccessChain 195(m) 26 178 + 197: 30(float) Load 196 + 198: 6(int) ConvertFToS 197 + 199: 94(ptr) AccessChain 90(uniformBuffer) 198 53 + 200: 30(float) Load 199 + 201: 30(float) Load 32(b) + 202: 30(float) FAdd 201 200 + Store 32(b) 202 + 206: 7(ptr) AccessChain 205(s) 53 + 207: 6(int) Load 206 + 208: 94(ptr) AccessChain 90(uniformBuffer) 207 53 + 209: 30(float) Load 208 + 210: 30(float) Load 32(b) + 211: 30(float) FAdd 210 209 + Store 32(b) 211 Return FunctionEnd 11(foo(i1;i1;): 6(int) Function None 8 diff --git a/Test/baseResults/spv.nonuniform2.frag.out b/Test/baseResults/spv.nonuniform2.frag.out new file mode 100644 index 000000000..38cdf3529 --- /dev/null +++ b/Test/baseResults/spv.nonuniform2.frag.out @@ -0,0 +1,53 @@ +spv.nonuniform2.frag +// Module Version 10000 +// Generated by (magic number): 80007 +// Id's are bound by 24 + + Capability Shader + Capability ImageBuffer + Capability CapabilityShaderNonUniformEXT + Capability CapabilityRuntimeDescriptorArrayEXT + Capability CapabilityStorageTexelBufferArrayNonUniformIndexingEXT + Extension "SPV_EXT_descriptor_indexing" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 9 16 + ExecutionMode 4 OriginUpperLeft + Source GLSL 450 + SourceExtension "GL_EXT_nonuniform_qualifier" + Name 4 "main" + Name 9 "FragColor" + Name 13 "data" + Name 16 "rIndex" + Decorate 9(FragColor) Location 0 + Decorate 13(data) DescriptorSet 0 + Decorate 13(data) Binding 4 + Decorate 16(rIndex) Flat + Decorate 16(rIndex) Location 3 + Decorate 18 DecorationNonUniformEXT + Decorate 21 DecorationNonUniformEXT + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypePointer Output 7(fvec4) + 9(FragColor): 8(ptr) Variable Output + 10: TypeImage 6(float) Buffer nonsampled format:Rgba32f + 11: TypeRuntimeArray 10 + 12: TypePointer UniformConstant 11 + 13(data): 12(ptr) Variable UniformConstant + 14: TypeInt 32 1 + 15: TypePointer Input 14(int) + 16(rIndex): 15(ptr) Variable Input + 19: TypePointer UniformConstant 10 + 22: 14(int) Constant 0 + 4(main): 2 Function None 3 + 5: Label + 17: 14(int) Load 16(rIndex) + 18: 14(int) CopyObject 17 + 20: 19(ptr) AccessChain 13(data) 18 + 21: 10 Load 20 + 23: 7(fvec4) ImageRead 21 22 + Store 9(FragColor) 23 + Return + FunctionEnd diff --git a/Test/spv.nonuniform2.frag b/Test/spv.nonuniform2.frag new file mode 100644 index 000000000..9bb7eaa37 --- /dev/null +++ b/Test/spv.nonuniform2.frag @@ -0,0 +1,9 @@ +#version 450 +#extension GL_EXT_nonuniform_qualifier : require +layout(set=0,binding=4,rgba32f) uniform imageBuffer data[]; +layout(location = 0) out vec4 FragColor; +layout(location = 3) in flat int rIndex; +void main() +{ + FragColor = imageLoad(data[nonuniformEXT(rIndex)], 0); +} diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h index 32e684cda..a20490422 100644 --- a/glslang/Include/intermediate.h +++ b/glslang/Include/intermediate.h @@ -85,6 +85,8 @@ enum TOperator { EOpPreIncrement, EOpPreDecrement, + EOpCopyObject, + // (u)int* -> bool EOpConvInt8ToBool, EOpConvUint8ToBool, diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 1aa466c15..6a8d379b0 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -6951,9 +6951,10 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T break; case EOpConstructNonuniform: - node->getWritableType().getQualifier().nonUniform = true; - return node; - break; + // Make a nonuniform copy of node + newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpCopyObject, true, node, node->getType()); + newNode->getWritableType().getQualifier().nonUniform = true; + return newNode; case EOpConstructReference: // construct reference from reference diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp index a2c362716..5e2eed16e 100644 --- a/glslang/MachineIndependent/intermOut.cpp +++ b/glslang/MachineIndependent/intermOut.cpp @@ -237,6 +237,7 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) case EOpPostDecrement: out.debug << "Post-Decrement"; break; case EOpPreIncrement: out.debug << "Pre-Increment"; break; case EOpPreDecrement: out.debug << "Pre-Decrement"; break; + case EOpCopyObject: out.debug << "copy object"; break; // * -> bool case EOpConvInt8ToBool: out.debug << "Convert int8_t to bool"; break; diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index a1797fdac..009fc7bc1 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -335,6 +335,7 @@ INSTANTIATE_TEST_CASE_P( "spv.noDeadDecorations.vert", "spv.nonSquare.vert", "spv.nonuniform.frag", + "spv.nonuniform2.frag", "spv.noWorkgroup.comp", "spv.offsets.frag", "spv.Operations.frag",