diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index ff96b6d529e4749c9f01d8389563b99cf847ad4f..c7febc4a8c77a2f1694d32bf939b7dba08fdda2e 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -2272,7 +2272,9 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF for (int p = 0; p < (int)parameters.size(); ++p) { const glslang::TType& paramType = parameters[p]->getAsTyped()->getType(); spv::Id typeId = convertGlslangToSpvType(paramType); - if (paramType.getQualifier().storage != glslang::EvqConstReadOnly) + if (paramType.isOpaque()) + typeId = builder.makePointer(TranslateStorageClass(paramType), typeId); + else if (paramType.getQualifier().storage != glslang::EvqConstReadOnly) typeId = builder.makePointer(spv::StorageClassFunction, typeId); else constReadOnlyParameters.insert(parameters[p]->getAsSymbolNode()->getId()); @@ -2688,8 +2690,8 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg builder.clearAccessChain(); glslangArgs[a]->traverse(this); argTypes.push_back(¶mType); - // keep outputs as and samplers l-values, evaluate input-only as r-values - if (qualifiers[a] != glslang::EvqConstReadOnly || paramType.getBasicType() == glslang::EbtSampler) { + // keep outputs as and opaque objects l-values, evaluate input-only as r-values + if (qualifiers[a] != glslang::EvqConstReadOnly || paramType.isOpaque()) { // save l-value lValues.push_back(builder.getAccessChain()); } else { @@ -2708,7 +2710,7 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg for (int a = 0; a < (int)glslangArgs.size(); ++a) { const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType(); spv::Id arg; - if (paramType.getBasicType() == glslang::EbtSampler) { + if (paramType.isOpaque()) { builder.setAccessChain(lValues[lValueCount]); arg = builder.accessChainGetLValue(); ++lValueCount; diff --git a/Test/baseResults/spv.subpass.frag.out b/Test/baseResults/spv.subpass.frag.out index 4b972aca77ab3e8da37a544c2235e63828246da2..93d680c71ab26bbaac8112249d3ea3c72a49b076 100644 --- a/Test/baseResults/spv.subpass.frag.out +++ b/Test/baseResults/spv.subpass.frag.out @@ -7,13 +7,13 @@ Linked fragment stage: // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 68 +// Id's are bound by 67 Capability Shader Capability InputAttachment 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 15 27 54 + EntryPoint Fragment 4 "main" 15 27 53 ExecutionMode 4 OriginUpperLeft Source GLSL 400 Name 4 "main" @@ -24,27 +24,27 @@ Linked fragment stage: Name 30 "sub" Name 35 "subMS" Name 42 "isub" - Name 46 "isubMS" - Name 54 "ucolor" - Name 57 "usub" - Name 62 "usubMS" + Name 45 "isubMS" + Name 53 "ucolor" + Name 56 "usub" + Name 61 "usubMS" Decorate 30(sub) DescriptorSet 0 Decorate 30(sub) InputAttachmentIndex 1 Decorate 35(subMS) DescriptorSet 0 Decorate 35(subMS) InputAttachmentIndex 2 Decorate 42(isub) DescriptorSet 0 Decorate 42(isub) InputAttachmentIndex 3 - Decorate 46(isubMS) DescriptorSet 0 - Decorate 46(isubMS) InputAttachmentIndex 4 - Decorate 57(usub) DescriptorSet 0 - Decorate 57(usub) InputAttachmentIndex 5 - Decorate 62(usubMS) DescriptorSet 0 - Decorate 62(usubMS) InputAttachmentIndex 6 + Decorate 45(isubMS) DescriptorSet 0 + Decorate 45(isubMS) InputAttachmentIndex 4 + Decorate 56(usub) DescriptorSet 0 + Decorate 56(usub) InputAttachmentIndex 5 + Decorate 61(usubMS) DescriptorSet 0 + Decorate 61(usubMS) InputAttachmentIndex 6 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 1 7: TypeImage 6(int) SubpassData multi-sampled nonsampled format:Unknown - 8: TypePointer Function 7 + 8: TypePointer UniformConstant 7 9: TypeFunction 2 8(ptr) 13: TypeVector 6(int) 4 14: TypePointer Output 13(ivec4) @@ -66,18 +66,17 @@ Linked fragment stage: 40: TypeImage 6(int) SubpassData nonsampled format:Unknown 41: TypePointer UniformConstant 40 42(isub): 41(ptr) Variable UniformConstant - 45: TypePointer UniformConstant 7 - 46(isubMS): 45(ptr) Variable UniformConstant - 51: TypeInt 32 0 - 52: TypeVector 51(int) 4 - 53: TypePointer Output 52(ivec4) - 54(ucolor): 53(ptr) Variable Output - 55: TypeImage 51(int) SubpassData nonsampled format:Unknown - 56: TypePointer UniformConstant 55 - 57(usub): 56(ptr) Variable UniformConstant - 60: TypeImage 51(int) SubpassData multi-sampled nonsampled format:Unknown - 61: TypePointer UniformConstant 60 - 62(usubMS): 61(ptr) Variable UniformConstant + 45(isubMS): 8(ptr) Variable UniformConstant + 50: TypeInt 32 0 + 51: TypeVector 50(int) 4 + 52: TypePointer Output 51(ivec4) + 53(ucolor): 52(ptr) Variable Output + 54: TypeImage 50(int) SubpassData nonsampled format:Unknown + 55: TypePointer UniformConstant 54 + 56(usub): 55(ptr) Variable UniformConstant + 59: TypeImage 50(int) SubpassData multi-sampled nonsampled format:Unknown + 60: TypePointer UniformConstant 59 + 61(usubMS): 60(ptr) Variable UniformConstant 4(main): 2 Function None 3 5: Label 31: 28 Load 30(sub) @@ -91,20 +90,20 @@ Linked fragment stage: 43: 40 Load 42(isub) 44: 13(ivec4) ImageRead 43 20 Store 15(icolor) 44 - 47: 7 Load 46(isubMS) - 48: 13(ivec4) ImageRead 47 20 Sample 17 - 49: 13(ivec4) Load 15(icolor) - 50: 13(ivec4) IAdd 49 48 - Store 15(icolor) 50 - 58: 55 Load 57(usub) - 59: 52(ivec4) ImageRead 58 20 - Store 54(ucolor) 59 - 63: 60 Load 62(usubMS) - 64: 52(ivec4) ImageRead 63 20 Sample 17 - 65: 52(ivec4) Load 54(ucolor) - 66: 52(ivec4) IAdd 65 64 - Store 54(ucolor) 66 - 67: 2 FunctionCall 11(foo(iIPM1;) 46(isubMS) + 46: 7 Load 45(isubMS) + 47: 13(ivec4) ImageRead 46 20 Sample 17 + 48: 13(ivec4) Load 15(icolor) + 49: 13(ivec4) IAdd 48 47 + Store 15(icolor) 49 + 57: 54 Load 56(usub) + 58: 51(ivec4) ImageRead 57 20 + Store 53(ucolor) 58 + 62: 59 Load 61(usubMS) + 63: 51(ivec4) ImageRead 62 20 Sample 17 + 64: 51(ivec4) Load 53(ucolor) + 65: 51(ivec4) IAdd 64 63 + Store 53(ucolor) 65 + 66: 2 FunctionCall 11(foo(iIPM1;) 45(isubMS) Return FunctionEnd 11(foo(iIPM1;): 2 Function None 9