diff --git a/Test/baseResults/hlsl.flattenOpaqueInit.vert.out b/Test/baseResults/hlsl.flattenOpaqueInit.vert.out index 99f6512cde56321f3e8df7cb78786a565a635595..4bd316186d44438b1dceecb5e90af48e23714101 100755 --- a/Test/baseResults/hlsl.flattenOpaqueInit.vert.out +++ b/Test/baseResults/hlsl.flattenOpaqueInit.vert.out @@ -1,4 +1,6 @@ hlsl.flattenOpaqueInit.vert +WARNING: 0:20: '=' : cannot do member-wise aliasing for opaque members with this initializer + Shader version: 500 0:? Sequence 0:5 Function Definition: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float) @@ -14,19 +16,43 @@ Shader version: 500 0:? Constant: 0:? 0.300000 0:? 0.400000 -0:10 Function Definition: @main( ( temp 4-component vector of float) +0:10 Function Definition: fillOpaque( ( temp structure{ temp sampler smpl, temp texture2D tex}) 0:10 Function Parameters: 0:? Sequence -0:12 Branch: Return with expression -0:12 Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float) +0:12 'g_tInputTexture_sampler' ( uniform sampler) +0:13 'g_tInputTexture' ( uniform texture2D) +0:14 Branch: Return with expression +0:14 't' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:18 Function Definition: @main( ( temp 4-component vector of float) +0:18 Function Parameters: +0:? Sequence +0:20 Sequence +0:20 Sequence +0:20 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 Function Call: fillOpaque( ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 move second child to first child ( temp sampler) +0:? 'tex2.smpl' ( temp sampler) +0:20 smpl: direct index for structure ( temp sampler) +0:20 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 Constant: +0:20 0 (const int) +0:20 move second child to first child ( temp texture2D) +0:? 'tex2.tex' ( temp texture2D) +0:20 tex: direct index for structure ( temp texture2D) +0:20 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 Constant: +0:20 1 (const int) +0:21 Branch: Return with expression +0:21 Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float) 0:? 'g_tInputTexture_sampler' ( uniform sampler) 0:? 'g_tInputTexture' ( uniform texture2D) -0:10 Function Definition: main( ( temp void) -0:10 Function Parameters: +0:18 Function Definition: main( ( temp void) +0:18 Function Parameters: 0:? Sequence -0:10 move second child to first child ( temp 4-component vector of float) +0:18 move second child to first child ( temp 4-component vector of float) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) -0:10 Function Call: @main( ( temp 4-component vector of float) +0:18 Function Call: @main( ( temp 4-component vector of float) 0:? Linker Objects 0:? 'g_tInputTexture_sampler' ( uniform sampler) 0:? 'g_tInputTexture' ( uniform texture2D) @@ -51,19 +77,43 @@ Shader version: 500 0:? Constant: 0:? 0.300000 0:? 0.400000 -0:10 Function Definition: @main( ( temp 4-component vector of float) +0:10 Function Definition: fillOpaque( ( temp structure{ temp sampler smpl, temp texture2D tex}) 0:10 Function Parameters: 0:? Sequence -0:12 Branch: Return with expression -0:12 Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float) +0:12 'g_tInputTexture_sampler' ( uniform sampler) +0:13 'g_tInputTexture' ( uniform texture2D) +0:14 Branch: Return with expression +0:14 't' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:18 Function Definition: @main( ( temp 4-component vector of float) +0:18 Function Parameters: +0:? Sequence +0:20 Sequence +0:20 Sequence +0:20 move second child to first child ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 Function Call: fillOpaque( ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 move second child to first child ( temp sampler) +0:? 'tex2.smpl' ( temp sampler) +0:20 smpl: direct index for structure ( temp sampler) +0:20 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 Constant: +0:20 0 (const int) +0:20 move second child to first child ( temp texture2D) +0:? 'tex2.tex' ( temp texture2D) +0:20 tex: direct index for structure ( temp texture2D) +0:20 'flattenTemp' ( temp structure{ temp sampler smpl, temp texture2D tex}) +0:20 Constant: +0:20 1 (const int) +0:21 Branch: Return with expression +0:21 Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float) 0:? 'g_tInputTexture_sampler' ( uniform sampler) 0:? 'g_tInputTexture' ( uniform texture2D) -0:10 Function Definition: main( ( temp void) -0:10 Function Parameters: +0:18 Function Definition: main( ( temp void) +0:18 Function Parameters: 0:? Sequence -0:10 move second child to first child ( temp 4-component vector of float) +0:18 move second child to first child ( temp 4-component vector of float) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) -0:10 Function Call: @main( ( temp 4-component vector of float) +0:18 Function Call: @main( ( temp 4-component vector of float) 0:? Linker Objects 0:? 'g_tInputTexture_sampler' ( uniform sampler) 0:? 'g_tInputTexture' ( uniform texture2D) @@ -71,24 +121,32 @@ Shader version: 500 // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 40 +// Id's are bound by 60 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Vertex 4 "main" 38 + EntryPoint Vertex 4 "main" 58 Source HLSL 500 Name 4 "main" Name 15 "lookUp(struct-FxaaTex-p1-t211;" Name 13 "tex.smpl" Name 14 "tex.tex" - Name 18 "@main(" - Name 32 "g_tInputTexture_sampler" - Name 33 "g_tInputTexture" - Name 38 "@entryPointOutput" - Decorate 32(g_tInputTexture_sampler) DescriptorSet 0 - Decorate 33(g_tInputTexture) DescriptorSet 0 - Decorate 38(@entryPointOutput) Location 0 + Name 17 "FxaaTex" + MemberName 17(FxaaTex) 0 "smpl" + MemberName 17(FxaaTex) 1 "tex" + Name 19 "fillOpaque(" + Name 22 "@main(" + Name 36 "g_tInputTexture_sampler" + Name 37 "g_tInputTexture" + Name 39 "t" + Name 43 "flattenTemp" + Name 45 "tex2.smpl" + Name 50 "tex2.tex" + Name 58 "@entryPointOutput" + Decorate 36(g_tInputTexture_sampler) DescriptorSet 0 + Decorate 37(g_tInputTexture) DescriptorSet 0 + Decorate 58(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeSampler @@ -98,35 +156,58 @@ Shader version: 500 10: TypePointer UniformConstant 9 11: TypeVector 8(float) 4 12: TypeFunction 11(fvec4) 7(ptr) 10(ptr) - 17: TypeFunction 11(fvec4) - 22: TypeSampledImage 9 - 24: TypeVector 8(float) 2 - 25: 8(float) Constant 1050253722 - 26: 8(float) Constant 1053609165 - 27: 24(fvec2) ConstantComposite 25 26 - 28: 8(float) Constant 0 -32(g_tInputTexture_sampler): 7(ptr) Variable UniformConstant -33(g_tInputTexture): 10(ptr) Variable UniformConstant - 37: TypePointer Output 11(fvec4) -38(@entryPointOutput): 37(ptr) Variable Output + 17(FxaaTex): TypeStruct 6 9 + 18: TypeFunction 17(FxaaTex) + 21: TypeFunction 11(fvec4) + 26: TypeSampledImage 9 + 28: TypeVector 8(float) 2 + 29: 8(float) Constant 1050253722 + 30: 8(float) Constant 1053609165 + 31: 28(fvec2) ConstantComposite 29 30 + 32: 8(float) Constant 0 +36(g_tInputTexture_sampler): 7(ptr) Variable UniformConstant +37(g_tInputTexture): 10(ptr) Variable UniformConstant + 38: TypePointer UniformConstant 17(FxaaTex) + 39(t): 38(ptr) Variable UniformConstant + 43(flattenTemp): 38(ptr) Variable UniformConstant + 45(tex2.smpl): 7(ptr) Variable UniformConstant + 46: TypeInt 32 1 + 47: 46(int) Constant 0 + 50(tex2.tex): 10(ptr) Variable UniformConstant + 51: 46(int) Constant 1 + 57: TypePointer Output 11(fvec4) +58(@entryPointOutput): 57(ptr) Variable Output 4(main): 2 Function None 3 5: Label - 39: 11(fvec4) FunctionCall 18(@main() - Store 38(@entryPointOutput) 39 + 59: 11(fvec4) FunctionCall 22(@main() + Store 58(@entryPointOutput) 59 Return FunctionEnd 15(lookUp(struct-FxaaTex-p1-t211;): 11(fvec4) Function None 12 13(tex.smpl): 7(ptr) FunctionParameter 14(tex.tex): 10(ptr) FunctionParameter 16: Label - 20: 9 Load 14(tex.tex) - 21: 6 Load 13(tex.smpl) - 23: 22 SampledImage 20 21 - 29: 11(fvec4) ImageSampleExplicitLod 23 27 Lod 28 - ReturnValue 29 + 24: 9 Load 14(tex.tex) + 25: 6 Load 13(tex.smpl) + 27: 26 SampledImage 24 25 + 33: 11(fvec4) ImageSampleExplicitLod 27 31 Lod 32 + ReturnValue 33 + FunctionEnd + 19(fillOpaque(): 17(FxaaTex) Function None 18 + 20: Label + 40: 17(FxaaTex) Load 39(t) + ReturnValue 40 FunctionEnd - 18(@main(): 11(fvec4) Function None 17 - 19: Label - 34: 11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 32(g_tInputTexture_sampler) 33(g_tInputTexture) - ReturnValue 34 + 22(@main(): 11(fvec4) Function None 21 + 23: Label + 44: 17(FxaaTex) FunctionCall 19(fillOpaque() + Store 43(flattenTemp) 44 + 48: 7(ptr) AccessChain 43(flattenTemp) 47 + 49: 6 Load 48 + Store 45(tex2.smpl) 49 + 52: 10(ptr) AccessChain 43(flattenTemp) 51 + 53: 9 Load 52 + Store 50(tex2.tex) 53 + 54: 11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 36(g_tInputTexture_sampler) 37(g_tInputTexture) + ReturnValue 54 FunctionEnd diff --git a/Test/hlsl.flattenOpaqueInit.vert b/Test/hlsl.flattenOpaqueInit.vert index 5efb02edc46ffa28d31db85ffe844ef5eedcab9a..75d28a9a77d8a49e11fa664e1038f04404d34a71 100644 --- a/Test/hlsl.flattenOpaqueInit.vert +++ b/Test/hlsl.flattenOpaqueInit.vert @@ -6,8 +6,17 @@ float4 lookUp(FxaaTex tex) return tex.tex.Sample(tex.smpl, float2(0.3, 0.4)); } +FxaaTex fillOpaque() +{ + FxaaTex t; + t.smpl = g_tInputTexture_sampler; + t.tex = g_tInputTexture; + return t; +} + float4 main() : SV_TARGET0 { - FxaaTex tex = { g_tInputTexture_sampler, g_tInputTexture }; - return lookUp(tex); + FxaaTex tex1 = { g_tInputTexture_sampler, g_tInputTexture }; + FxaaTex tex2 = fillOpaque(); + return lookUp(tex1); } \ No newline at end of file diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 911adb9a493d9408ca3374a8124ab3a860e889df..9bc217de7767573384c590f2346b560cd7dca214 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -2416,17 +2416,23 @@ TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc // and possibly contains opaque values, such that the initializer should never exist // as emitted code, because even creating the initializer would write opaques. // -// Decompose this into individual member-wise assignments, which themselves are -// expected to then not exist for opaque types, because they will turn into aliases. +// If possible, decompose this into individual member-wise assignments, which themselves +// are expected to then not exist for opaque types, because they will turn into aliases. // // Return a node that contains the non-aliased assignments that must continue to exist. -TIntermAggregate* HlslParseContext::executeFlattenedInitializer(const TSourceLoc& loc, TIntermSymbol* symbol, - const TIntermAggregate& initializer) +TIntermTyped* HlslParseContext::executeFlattenedInitializer(const TSourceLoc& loc, TIntermSymbol* symbol, + TIntermAggregate& initializer) { + // We need individual RHS initializers per member to do this + const TTypeList* typeList = symbol->getType().getStruct(); + if (typeList == nullptr || initializer.getSequence().size() != typeList->size()) { + warn(loc, "cannot do member-wise aliasing for opaque members with this initializer", "=", ""); + return handleAssign(loc, EOpAssign, symbol, &initializer); + } + TIntermAggregate* initList = nullptr; // synthesize an access to each member, and then an assignment to it - const TTypeList& typeList = *symbol->getType().getStruct(); - for (int member = 0; member < (int)typeList.size(); ++member) { + for (int member = 0; member < (int)typeList->size(); ++member) { TIntermTyped* memberInitializer = initializer.getSequence()[member]->getAsTyped(); TIntermTyped* flattenedMember = flattenAccess(symbol, member); if (flattenedMember->getType().containsOpaque()) diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index b743136eaa61d857c701045c2aa3db52a7ad0024..9febc079ce8de4822c5cbc09b4d6ab0a40a2c0e4 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -89,7 +89,7 @@ public: void remapNonEntryPointIO(TFunction& function); TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*); void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg); - TIntermAggregate* executeFlattenedInitializer(const TSourceLoc&, TIntermSymbol*, const TIntermAggregate&); + TIntermTyped* executeFlattenedInitializer(const TSourceLoc&, TIntermSymbol*, TIntermAggregate&); TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); TIntermTyped* handleAssignToMatrixSwizzle(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*);