diff --git a/Test/baseResults/hlsl.entry-out.frag.out b/Test/baseResults/hlsl.entry-out.frag.out index d15741f72271b9d1154a311b9b1bea7651234a98..ad7518e3301c9aa3709116a35613660e86bffc94 100755 --- a/Test/baseResults/hlsl.entry-out.frag.out +++ b/Test/baseResults/hlsl.entry-out.frag.out @@ -2,60 +2,83 @@ hlsl.entry-out.frag Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:7 Function Definition: PixelShaderFunction(vf4;vf4;struct-OutParam-vf2-vi21;struct-OutParam-vf2-vi21; (temp 4-component vector of float) +0:7 Function Definition: fun(struct-OutParam-vf2-vi21; (temp void) 0:7 Function Parameters: -0:7 'input' (layout(location=0 ) in 4-component vector of float) -0:7 'out1' (layout(location=1 ) out 4-component vector of float) -0:7 'out2' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:7 'out3' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:7 'op' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) 0:? Sequence -0:8 move second child to first child (temp 4-component vector of float) -0:8 'out1' (layout(location=1 ) out 4-component vector of float) -0:8 'input' (layout(location=0 ) in 4-component vector of float) -0:9 move second child to first child (temp 2-component vector of float) -0:? 'v' (layout(location=2 ) out 2-component vector of float) +0:8 move second child to first child (temp 2-component vector of float) +0:8 v: direct index for structure (temp 2-component vector of float) +0:8 'op' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:8 Constant: +0:8 0 (const int) +0:8 Constant: +0:8 0.400000 +0:8 0.400000 +0:9 move second child to first child (temp 2-component vector of int) +0:9 i: direct index for structure (temp 2-component vector of int) +0:9 'op' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:9 Constant: +0:9 1 (const int) 0:9 Constant: -0:9 2.000000 -0:9 2.000000 -0:10 move second child to first child (temp 2-component vector of int) +0:9 7 (const int) +0:9 7 (const int) +0:13 Function Definition: PixelShaderFunction(vf4;vf4;struct-OutParam-vf2-vi21;struct-OutParam-vf2-vi21; (temp 4-component vector of float) +0:13 Function Parameters: +0:13 'input' (layout(location=0 ) in 4-component vector of float) +0:13 'out1' (layout(location=1 ) out 4-component vector of float) +0:13 'out2' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:13 'out3' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:? Sequence +0:14 move second child to first child (temp 4-component vector of float) +0:14 'out1' (layout(location=1 ) out 4-component vector of float) +0:14 'input' (layout(location=0 ) in 4-component vector of float) +0:15 move second child to first child (temp 2-component vector of float) +0:? 'v' (layout(location=2 ) out 2-component vector of float) +0:15 Constant: +0:15 2.000000 +0:15 2.000000 +0:16 move second child to first child (temp 2-component vector of int) 0:? 'i' (layout(location=3 ) out 2-component vector of int) -0:10 Constant: -0:10 3 (const int) -0:10 3 (const int) -0:12 move second child to first child (temp 2-component vector of float) -0:12 v: direct index for structure (temp 2-component vector of float) -0:12 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:12 Constant: -0:12 0 (const int) -0:12 Constant: -0:12 12.000000 -0:12 12.000000 -0:13 move second child to first child (temp 2-component vector of int) -0:13 i: direct index for structure (temp 2-component vector of int) -0:13 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:13 Constant: -0:13 1 (const int) -0:13 Constant: -0:13 13 (const int) -0:13 13 (const int) -0:? Sequence -0:14 move second child to first child (temp 2-component vector of float) -0:? 'v' (layout(location=4 ) out 2-component vector of float) -0:14 v: direct index for structure (temp 2-component vector of float) -0:14 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:14 Constant: -0:14 0 (const int) -0:14 move second child to first child (temp 2-component vector of int) -0:? 'i' (layout(location=5 ) out 2-component vector of int) -0:14 i: direct index for structure (temp 2-component vector of int) -0:14 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:14 Constant: -0:14 1 (const int) -0:16 Sequence -0:16 move second child to first child (temp 4-component vector of float) +0:16 Constant: +0:16 3 (const int) +0:16 3 (const int) +0:18 move second child to first child (temp 2-component vector of float) +0:18 v: direct index for structure (temp 2-component vector of float) +0:18 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:18 Constant: +0:18 0 (const int) +0:18 Constant: +0:18 12.000000 +0:18 12.000000 +0:19 move second child to first child (temp 2-component vector of int) +0:19 i: direct index for structure (temp 2-component vector of int) +0:19 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:19 Constant: +0:19 1 (const int) +0:19 Constant: +0:19 13 (const int) +0:19 13 (const int) +0:20 Comma (temp void) +0:20 Function Call: fun(struct-OutParam-vf2-vi21; (temp void) +0:20 'tempArg' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:? Sequence +0:20 move second child to first child (temp 2-component vector of float) +0:? 'v' (layout(location=4 ) out 2-component vector of float) +0:20 v: direct index for structure (temp 2-component vector of float) +0:20 'tempArg' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:20 Constant: +0:20 0 (const int) +0:20 move second child to first child (temp 2-component vector of int) +0:? 'i' (layout(location=5 ) out 2-component vector of int) +0:20 i: direct index for structure (temp 2-component vector of int) +0:20 'tempArg' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:20 Constant: +0:20 1 (const int) +0:22 Sequence +0:22 move second child to first child (temp 4-component vector of float) 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) -0:16 'out1' (layout(location=1 ) out 4-component vector of float) -0:16 Branch: Return +0:22 'out1' (layout(location=1 ) out 4-component vector of float) +0:22 Branch: Return 0:? Linker Objects 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) 0:? 'input' (layout(location=0 ) in 4-component vector of float) @@ -72,60 +95,83 @@ Linked fragment stage: Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:7 Function Definition: PixelShaderFunction(vf4;vf4;struct-OutParam-vf2-vi21;struct-OutParam-vf2-vi21; (temp 4-component vector of float) +0:7 Function Definition: fun(struct-OutParam-vf2-vi21; (temp void) 0:7 Function Parameters: -0:7 'input' (layout(location=0 ) in 4-component vector of float) -0:7 'out1' (layout(location=1 ) out 4-component vector of float) -0:7 'out2' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:7 'out3' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:7 'op' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) 0:? Sequence -0:8 move second child to first child (temp 4-component vector of float) -0:8 'out1' (layout(location=1 ) out 4-component vector of float) -0:8 'input' (layout(location=0 ) in 4-component vector of float) -0:9 move second child to first child (temp 2-component vector of float) -0:? 'v' (layout(location=2 ) out 2-component vector of float) +0:8 move second child to first child (temp 2-component vector of float) +0:8 v: direct index for structure (temp 2-component vector of float) +0:8 'op' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:8 Constant: +0:8 0 (const int) +0:8 Constant: +0:8 0.400000 +0:8 0.400000 +0:9 move second child to first child (temp 2-component vector of int) +0:9 i: direct index for structure (temp 2-component vector of int) +0:9 'op' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:9 Constant: +0:9 1 (const int) 0:9 Constant: -0:9 2.000000 -0:9 2.000000 -0:10 move second child to first child (temp 2-component vector of int) +0:9 7 (const int) +0:9 7 (const int) +0:13 Function Definition: PixelShaderFunction(vf4;vf4;struct-OutParam-vf2-vi21;struct-OutParam-vf2-vi21; (temp 4-component vector of float) +0:13 Function Parameters: +0:13 'input' (layout(location=0 ) in 4-component vector of float) +0:13 'out1' (layout(location=1 ) out 4-component vector of float) +0:13 'out2' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:13 'out3' (out structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:? Sequence +0:14 move second child to first child (temp 4-component vector of float) +0:14 'out1' (layout(location=1 ) out 4-component vector of float) +0:14 'input' (layout(location=0 ) in 4-component vector of float) +0:15 move second child to first child (temp 2-component vector of float) +0:? 'v' (layout(location=2 ) out 2-component vector of float) +0:15 Constant: +0:15 2.000000 +0:15 2.000000 +0:16 move second child to first child (temp 2-component vector of int) 0:? 'i' (layout(location=3 ) out 2-component vector of int) -0:10 Constant: -0:10 3 (const int) -0:10 3 (const int) -0:12 move second child to first child (temp 2-component vector of float) -0:12 v: direct index for structure (temp 2-component vector of float) -0:12 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:12 Constant: -0:12 0 (const int) -0:12 Constant: -0:12 12.000000 -0:12 12.000000 -0:13 move second child to first child (temp 2-component vector of int) -0:13 i: direct index for structure (temp 2-component vector of int) -0:13 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:13 Constant: -0:13 1 (const int) -0:13 Constant: -0:13 13 (const int) -0:13 13 (const int) -0:? Sequence -0:14 move second child to first child (temp 2-component vector of float) -0:? 'v' (layout(location=4 ) out 2-component vector of float) -0:14 v: direct index for structure (temp 2-component vector of float) -0:14 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:14 Constant: -0:14 0 (const int) -0:14 move second child to first child (temp 2-component vector of int) -0:? 'i' (layout(location=5 ) out 2-component vector of int) -0:14 i: direct index for structure (temp 2-component vector of int) -0:14 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) -0:14 Constant: -0:14 1 (const int) -0:16 Sequence -0:16 move second child to first child (temp 4-component vector of float) +0:16 Constant: +0:16 3 (const int) +0:16 3 (const int) +0:18 move second child to first child (temp 2-component vector of float) +0:18 v: direct index for structure (temp 2-component vector of float) +0:18 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:18 Constant: +0:18 0 (const int) +0:18 Constant: +0:18 12.000000 +0:18 12.000000 +0:19 move second child to first child (temp 2-component vector of int) +0:19 i: direct index for structure (temp 2-component vector of int) +0:19 'local' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:19 Constant: +0:19 1 (const int) +0:19 Constant: +0:19 13 (const int) +0:19 13 (const int) +0:20 Comma (temp void) +0:20 Function Call: fun(struct-OutParam-vf2-vi21; (temp void) +0:20 'tempArg' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:? Sequence +0:20 move second child to first child (temp 2-component vector of float) +0:? 'v' (layout(location=4 ) out 2-component vector of float) +0:20 v: direct index for structure (temp 2-component vector of float) +0:20 'tempArg' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:20 Constant: +0:20 0 (const int) +0:20 move second child to first child (temp 2-component vector of int) +0:? 'i' (layout(location=5 ) out 2-component vector of int) +0:20 i: direct index for structure (temp 2-component vector of int) +0:20 'tempArg' (temp structure{temp 2-component vector of float v, temp 2-component vector of int i}) +0:20 Constant: +0:20 1 (const int) +0:22 Sequence +0:22 move second child to first child (temp 4-component vector of float) 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) -0:16 'out1' (layout(location=1 ) out 4-component vector of float) -0:16 Branch: Return +0:22 'out1' (layout(location=1 ) out 4-component vector of float) +0:22 Branch: Return 0:? Linker Objects 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) 0:? 'input' (layout(location=0 ) in 4-component vector of float) @@ -137,82 +183,105 @@ gl_FragCoord origin is upper left // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 46 +// Id's are bound by 60 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "PixelShaderFunction" 9 11 15 21 37 40 43 + EntryPoint Fragment 4 "PixelShaderFunction" 28 30 33 37 51 54 57 ExecutionMode 4 OriginUpperLeft Name 4 "PixelShaderFunction" - Name 9 "out1" - Name 11 "input" - Name 15 "v" - Name 21 "i" - Name 24 "OutParam" - MemberName 24(OutParam) 0 "v" - MemberName 24(OutParam) 1 "i" - Name 26 "local" - Name 37 "v" - Name 40 "i" - Name 43 "@entryPointOutput" - Decorate 9(out1) Location 1 - Decorate 11(input) Location 0 - Decorate 15(v) Location 2 - Decorate 21(i) Location 3 - Decorate 37(v) Location 4 - Decorate 40(i) Location 5 - Decorate 43(@entryPointOutput) Location 0 + Name 10 "OutParam" + MemberName 10(OutParam) 0 "v" + MemberName 10(OutParam) 1 "i" + Name 14 "fun(struct-OutParam-vf2-vi21;" + Name 13 "op" + Name 28 "out1" + Name 30 "input" + Name 33 "v" + Name 37 "i" + Name 40 "local" + Name 47 "tempArg" + Name 48 "param" + Name 51 "v" + Name 54 "i" + Name 57 "@entryPointOutput" + Decorate 28(out1) Location 1 + Decorate 30(input) Location 0 + Decorate 33(v) Location 2 + Decorate 37(i) Location 3 + Decorate 51(v) Location 4 + Decorate 54(i) Location 5 + Decorate 57(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 - 7: TypeVector 6(float) 4 - 8: TypePointer Output 7(fvec4) - 9(out1): 8(ptr) Variable Output - 10: TypePointer Input 7(fvec4) - 11(input): 10(ptr) Variable Input - 13: TypeVector 6(float) 2 - 14: TypePointer Output 13(fvec2) - 15(v): 14(ptr) Variable Output - 16: 6(float) Constant 1073741824 - 17: 13(fvec2) ConstantComposite 16 16 - 18: TypeInt 32 1 - 19: TypeVector 18(int) 2 - 20: TypePointer Output 19(ivec2) - 21(i): 20(ptr) Variable Output - 22: 18(int) Constant 3 - 23: 19(ivec2) ConstantComposite 22 22 - 24(OutParam): TypeStruct 13(fvec2) 19(ivec2) - 25: TypePointer Function 24(OutParam) - 27: 18(int) Constant 0 - 28: 6(float) Constant 1094713344 - 29: 13(fvec2) ConstantComposite 28 28 - 30: TypePointer Function 13(fvec2) - 32: 18(int) Constant 1 - 33: 18(int) Constant 13 - 34: 19(ivec2) ConstantComposite 33 33 - 35: TypePointer Function 19(ivec2) - 37(v): 14(ptr) Variable Output - 40(i): 20(ptr) Variable Output -43(@entryPointOutput): 8(ptr) Variable Output + 7: TypeVector 6(float) 2 + 8: TypeInt 32 1 + 9: TypeVector 8(int) 2 + 10(OutParam): TypeStruct 7(fvec2) 9(ivec2) + 11: TypePointer Function 10(OutParam) + 12: TypeFunction 2 11(ptr) + 16: 8(int) Constant 0 + 17: 6(float) Constant 1053609165 + 18: 7(fvec2) ConstantComposite 17 17 + 19: TypePointer Function 7(fvec2) + 21: 8(int) Constant 1 + 22: 8(int) Constant 7 + 23: 9(ivec2) ConstantComposite 22 22 + 24: TypePointer Function 9(ivec2) + 26: TypeVector 6(float) 4 + 27: TypePointer Output 26(fvec4) + 28(out1): 27(ptr) Variable Output + 29: TypePointer Input 26(fvec4) + 30(input): 29(ptr) Variable Input + 32: TypePointer Output 7(fvec2) + 33(v): 32(ptr) Variable Output + 34: 6(float) Constant 1073741824 + 35: 7(fvec2) ConstantComposite 34 34 + 36: TypePointer Output 9(ivec2) + 37(i): 36(ptr) Variable Output + 38: 8(int) Constant 3 + 39: 9(ivec2) ConstantComposite 38 38 + 41: 6(float) Constant 1094713344 + 42: 7(fvec2) ConstantComposite 41 41 + 44: 8(int) Constant 13 + 45: 9(ivec2) ConstantComposite 44 44 + 51(v): 32(ptr) Variable Output + 54(i): 36(ptr) Variable Output +57(@entryPointOutput): 27(ptr) Variable Output 4(PixelShaderFunction): 2 Function None 3 5: Label - 26(local): 25(ptr) Variable Function - 12: 7(fvec4) Load 11(input) - Store 9(out1) 12 - Store 15(v) 17 - Store 21(i) 23 - 31: 30(ptr) AccessChain 26(local) 27 - Store 31 29 - 36: 35(ptr) AccessChain 26(local) 32 - Store 36 34 - 38: 30(ptr) AccessChain 26(local) 27 - 39: 13(fvec2) Load 38 - Store 37(v) 39 - 41: 35(ptr) AccessChain 26(local) 32 - 42: 19(ivec2) Load 41 - Store 40(i) 42 - 44: 7(fvec4) Load 9(out1) - Store 43(@entryPointOutput) 44 + 40(local): 11(ptr) Variable Function + 47(tempArg): 11(ptr) Variable Function + 48(param): 11(ptr) Variable Function + 31: 26(fvec4) Load 30(input) + Store 28(out1) 31 + Store 33(v) 35 + Store 37(i) 39 + 43: 19(ptr) AccessChain 40(local) 16 + Store 43 42 + 46: 24(ptr) AccessChain 40(local) 21 + Store 46 45 + 49: 2 FunctionCall 14(fun(struct-OutParam-vf2-vi21;) 48(param) + 50:10(OutParam) Load 48(param) + Store 47(tempArg) 50 + 52: 19(ptr) AccessChain 47(tempArg) 16 + 53: 7(fvec2) Load 52 + Store 51(v) 53 + 55: 24(ptr) AccessChain 47(tempArg) 21 + 56: 9(ivec2) Load 55 + Store 54(i) 56 + 58: 26(fvec4) Load 28(out1) + Store 57(@entryPointOutput) 58 + Return + FunctionEnd +14(fun(struct-OutParam-vf2-vi21;): 2 Function None 12 + 13(op): 11(ptr) FunctionParameter + 15: Label + 20: 19(ptr) AccessChain 13(op) 16 + Store 20 18 + 25: 24(ptr) AccessChain 13(op) 21 + Store 25 23 Return FunctionEnd diff --git a/Test/hlsl.entry-out.frag b/Test/hlsl.entry-out.frag index 14f0e45959b60f313bc77eb25aebba081c23f256..27b4dd6428cde5293d2a908eafab4c0510bc4bf6 100644 --- a/Test/hlsl.entry-out.frag +++ b/Test/hlsl.entry-out.frag @@ -3,6 +3,12 @@ struct OutParam { int2 i; }; +void fun(out OutParam op) +{ + op.v = float2(0.4); + op.i = int2(7); +} + float4 PixelShaderFunction(float4 input, out float4 out1, out OutParam out2, out OutParam out3) : COLOR0 { out1 = input; @@ -11,7 +17,7 @@ float4 PixelShaderFunction(float4 input, out float4 out1, out OutParam out2, out OutParam local; local.v = 12.0; local.i = 13; - out3 = local; + fun(out3); return out1; } diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 589c8812cb6449fd4a5000a29f9ba7167f4fc679..0db44dca898aff56d0783b0fdb8a120c23e7c3c0 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // For the version, it uses the latest git tag followed by the number of commits. // For the date, it uses the current date (when then script is run). -#define GLSLANG_REVISION "Overload400-PrecQual.1543" +#define GLSLANG_REVISION "Overload400-PrecQual.1544" #define GLSLANG_DATE "01-Oct-2016" diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 42b57b91ec1ceeb542f995e3d6da4fd0494b2ea5..63d9c3d7e9834dd8b80d68e59305bf197918237a 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -2246,21 +2246,9 @@ TIntermTyped* HlslParseContext::handleFunctionCall(const TSourceLoc& loc, TFunct if (builtIn && fnCandidate->getNumExtensions()) requireExtensions(loc, fnCandidate->getNumExtensions(), fnCandidate->getExtensions(), fnCandidate->getName().c_str()); - if (arguments) { - // Make sure qualifications work for these arguments. - //TIntermAggregate* aggregate = arguments->getAsAggregate(); - //for (int i = 0; i < fnCandidate->getParamCount(); ++i) { - // // At this early point there is a slight ambiguity between whether an aggregate 'arguments' - // // is the single argument itself or its children are the arguments. Only one argument - // // means take 'arguments' itself as the one argument. - // TIntermNode* arg = fnCandidate->getParamCount() == 1 ? arguments : (aggregate ? aggregate->getSequence()[i] : arguments); - // TQualifier& formalQualifier = (*fnCandidate)[i].type->getQualifier(); - // TQualifier& argQualifier = arg->getAsTyped()->getQualifier(); - //} - - // Convert 'in' arguments - addInputArgumentConversions(*fnCandidate, arguments); // arguments may be modified if it's just a single argument node - } + // Convert 'in' arguments + if (arguments) + addInputArgumentConversions(*fnCandidate, arguments); op = fnCandidate->getBuiltInOp(); if (builtIn && op != EOpNull) { @@ -2390,7 +2378,9 @@ void HlslParseContext::addInputArgumentConversions(const TFunction& function, TI // At this early point there is a slight ambiguity between whether an aggregate 'arguments' // is the single argument itself or its children are the arguments. Only one argument // means take 'arguments' itself as the one argument. - TIntermTyped* arg = function.getParamCount() == 1 ? arguments->getAsTyped() : (aggregate ? aggregate->getSequence()[i]->getAsTyped() : arguments->getAsTyped()); + TIntermTyped* arg = function.getParamCount() == 1 + ? arguments->getAsTyped() + : (aggregate ? aggregate->getSequence()[i]->getAsTyped() : arguments->getAsTyped()); if (*function[i].type != arg->getType()) { // In-qualified arguments just need an extra node added above the argument to // convert to the correct type. @@ -2401,9 +2391,9 @@ void HlslParseContext::addInputArgumentConversions(const TFunction& function, TI if (shouldFlatten(arg->getType())) { // Will make a two-level subtree. // The deepest will copy member-by-member to build the structure to pass. - // The level above that will be an two-operand EOpComma sequence that follows the copy by the + // The level above that will be a two-operand EOpComma sequence that follows the copy by the // object itself. - TSourceLoc dummyLoc; + TSourceLoc dummyLoc; // ?? fix these everywhere to be arguments[i]->getLoc()? dummyLoc.init(); TVariable* internalAggregate = makeInternalVariable("aggShadow", *function[i].type); internalAggregate->getWritableType().getQualifier().makeTemporary(); @@ -2433,11 +2423,16 @@ void HlslParseContext::addInputArgumentConversions(const TFunction& function, TI TIntermTyped* HlslParseContext::addOutputArgumentConversions(const TFunction& function, TIntermAggregate& intermNode) const { TIntermSequence& arguments = intermNode.getSequence(); + const auto needsConversion = [&](int argNum) { + return function[argNum].type->getQualifier().isParamOutput() && + (*function[argNum].type != arguments[argNum]->getAsTyped()->getType() || + shouldFlatten(arguments[argNum]->getAsTyped()->getType())); + }; // Will there be any output conversions? bool outputConversions = false; for (int i = 0; i < function.getParamCount(); ++i) { - if (*function[i].type != arguments[i]->getAsTyped()->getType() && function[i].type->getQualifier().isParamOutput()) { + if (needsConversion(i)) { outputConversions = true; break; } @@ -2468,18 +2463,21 @@ TIntermTyped* HlslParseContext::addOutputArgumentConversions(const TFunction& fu // Process each argument's conversion for (int i = 0; i < function.getParamCount(); ++i) { - if (*function[i].type != arguments[i]->getAsTyped()->getType()) { - if (function[i].type->getQualifier().isParamOutput()) { - // Out-qualified arguments need to use the topology set up above. - // do the " ...(tempArg, ...), arg = tempArg" bit from above - TVariable* tempArg = makeInternalVariable("tempArg", *function[i].type); - tempArg->getWritableType().getQualifier().makeTemporary(); - TIntermSymbol* tempArgNode = intermediate.addSymbol(*tempArg, intermNode.getLoc()); - TIntermTyped* tempAssign = intermediate.addAssign(EOpAssign, arguments[i]->getAsTyped(), tempArgNode, arguments[i]->getLoc()); - conversionTree = intermediate.growAggregate(conversionTree, tempAssign, arguments[i]->getLoc()); - // replace the argument with another node for the same tempArg variable - arguments[i] = intermediate.addSymbol(*tempArg, intermNode.getLoc()); - } + if (needsConversion(i)) { + // Out-qualified arguments needing conversion need to use the topology setup above. + // Do the " ...(tempArg, ...), arg = tempArg" bit from above. + + // Make a temporary for what the function expects the argument to look like. + TVariable* tempArg = makeInternalVariable("tempArg", *function[i].type); + tempArg->getWritableType().getQualifier().makeTemporary(); + TIntermSymbol* tempArgNode = intermediate.addSymbol(*tempArg, intermNode.getLoc()); + + // This makes the deepest level, the member-wise copy + TIntermTyped* tempAssign = handleAssign(arguments[i]->getLoc(), EOpAssign, arguments[i]->getAsTyped(), tempArgNode)->getAsAggregate(); + conversionTree = intermediate.growAggregate(conversionTree, tempAssign, arguments[i]->getLoc()); + + // replace the argument with another node for the same tempArg variable + arguments[i] = intermediate.addSymbol(*tempArg, intermNode.getLoc()); } }