From: John Kessenich Date: Wed, 10 Jun 2020 13:15:24 +0000 (-0600) Subject: Fix #2264: OpEntryPoint incorrectly including function parameters. X-Git-Tag: upstream/11.4.0~205 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c30d3353775038c49bbae21bd02a4eaa4e98293e;p=platform%2Fupstream%2Fglslang.git Fix #2264: OpEntryPoint incorrectly including function parameters. --- diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 3e420aa..f8a7e49 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1711,16 +1711,19 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) spv::Id id = getSymbolId(symbol); if (builder.isPointer(id)) { - // Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction - // Consider adding to the OpEntryPoint interface list. - // Only looking at structures if they have at least one member. - if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) { - spv::StorageClass sc = builder.getStorageClass(id); - // Before SPIR-V 1.4, we only want to include Input and Output. - // Starting with SPIR-V 1.4, we want all globals. - if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && sc != spv::StorageClassFunction) || - (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) { - iOSet.insert(id); + if (!symbol->getType().getQualifier().isParamInput() && + !symbol->getType().getQualifier().isParamOutput()) { + // Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction + // Consider adding to the OpEntryPoint interface list. + // Only looking at structures if they have at least one member. + if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) { + spv::StorageClass sc = builder.getStorageClass(id); + // Before SPIR-V 1.4, we only want to include Input and Output. + // Starting with SPIR-V 1.4, we want all globals. + if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && sc != spv::StorageClassFunction) || + (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) { + iOSet.insert(id); + } } } diff --git a/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out b/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out new file mode 100755 index 0000000..a29ccb8 --- /dev/null +++ b/Test/baseResults/spv.1.4.OpEntryPoint.opaqueParams.vert.out @@ -0,0 +1,72 @@ +spv.1.4.OpEntryPoint.opaqueParams.vert +// Module Version 10400 +// Generated by (magic number): 80008 +// Id's are bound by 45 + + Capability Shader + Capability ImageQuery + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 41 42 43 + Source GLSL 450 + Name 4 "main" + Name 18 "funOpaque(s21;t21;p1;" + Name 15 "s2D" + Name 16 "t2D" + Name 17 "s" + Name 40 "size" + Name 41 "s2D" + Name 42 "t2D" + Name 43 "s" + Decorate 41(s2D) DescriptorSet 0 + Decorate 41(s2D) Binding 0 + Decorate 42(t2D) DescriptorSet 0 + Decorate 42(t2D) Binding 1 + Decorate 43(s) DescriptorSet 0 + Decorate 43(s) Binding 3 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeImage 6(float) 2D sampled format:Unknown + 8: TypeSampledImage 7 + 9: TypePointer UniformConstant 8 + 10: TypePointer UniformConstant 7 + 11: TypeSampler + 12: TypePointer UniformConstant 11 + 13: TypeVector 6(float) 2 + 14: TypeFunction 13(fvec2) 9(ptr) 10(ptr) 12(ptr) + 21: TypeInt 32 1 + 22: 21(int) Constant 0 + 24: TypeVector 21(int) 2 + 30: 6(float) Constant 1056964608 + 31: 13(fvec2) ConstantComposite 30 30 + 32: TypeVector 6(float) 4 + 33: 6(float) Constant 0 + 39: TypePointer Function 13(fvec2) + 41(s2D): 9(ptr) Variable UniformConstant + 42(t2D): 10(ptr) Variable UniformConstant + 43(s): 12(ptr) Variable UniformConstant + 4(main): 2 Function None 3 + 5: Label + 40(size): 39(ptr) Variable Function + 44: 13(fvec2) FunctionCall 18(funOpaque(s21;t21;p1;) 41(s2D) 42(t2D) 43(s) + Store 40(size) 44 + Return + FunctionEnd +18(funOpaque(s21;t21;p1;): 13(fvec2) Function None 14 + 15(s2D): 9(ptr) FunctionParameter + 16(t2D): 10(ptr) FunctionParameter + 17(s): 12(ptr) FunctionParameter + 19: Label + 20: 8 Load 15(s2D) + 23: 7 Image 20 + 25: 24(ivec2) ImageQuerySizeLod 23 22 + 26: 13(fvec2) ConvertSToF 25 + 27: 7 Load 16(t2D) + 28: 11 Load 17(s) + 29: 8 SampledImage 27 28 + 34: 32(fvec4) ImageSampleExplicitLod 29 31 Lod 33 + 35: 13(fvec2) VectorShuffle 34 34 0 1 + 36: 13(fvec2) FMul 26 35 + ReturnValue 36 + FunctionEnd diff --git a/Test/spv.1.4.OpEntryPoint.opaqueParams.vert b/Test/spv.1.4.OpEntryPoint.opaqueParams.vert new file mode 100644 index 0000000..71c287d --- /dev/null +++ b/Test/spv.1.4.OpEntryPoint.opaqueParams.vert @@ -0,0 +1,15 @@ +#version 450 + +layout(binding = 0) uniform sampler2D s2D; +layout(binding = 1) uniform texture2D t2D; +layout(binding = 3) uniform sampler s; + +vec2 funOpaque(in sampler2D s2D, texture2D t2D, sampler s) +{ + return textureSize(s2D, 0) * texture(sampler2D(t2D, s), vec2(0.5)).xy; +} + +void main() +{ + vec2 size = funOpaque(s2D, t2D, s); +} \ No newline at end of file diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index 5c9fb9b..e1d9735 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -534,6 +534,7 @@ INSTANTIATE_TEST_CASE_P( "spv.1.4.LoopControl.frag", "spv.1.4.NonWritable.frag", "spv.1.4.OpEntryPoint.frag", + "spv.1.4.OpEntryPoint.opaqueParams.vert", "spv.1.4.OpSelect.frag", "spv.1.4.OpCopyLogical.comp", "spv.1.4.OpCopyLogicalBool.comp",