Merge pull request #2841 from greg-lunarg/i2244a
Fix --hlsl-dx-position-w to work for SV_Position embedded in struct
This commit is contained in:
		
						commit
						2dff16cd3c
					
				
							
								
								
									
										305
									
								
								Test/baseResults/hlsl.w-recip2.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								Test/baseResults/hlsl.w-recip2.frag.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,305 @@ | |||||||
|  | hlsl.w-recip2.frag | ||||||
|  | Shader version: 500 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:13  Function Definition: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float) | ||||||
|  | 0:13    Function Parameters:  | ||||||
|  | 0:13      'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:14      Test condition and select ( temp void) | ||||||
|  | 0:14        Condition | ||||||
|  | 0:14        Compare Less Than ( temp bool) | ||||||
|  | 0:14          direct index ( temp float) | ||||||
|  | 0:14            PositionPS: direct index for structure ( temp 4-component vector of float) | ||||||
|  | 0:14              'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                0 (const int) | ||||||
|  | 0:14            Constant: | ||||||
|  | 0:14              0 (const int) | ||||||
|  | 0:14          Constant: | ||||||
|  | 0:14            400.000000 | ||||||
|  | 0:14        true case | ||||||
|  | 0:15        Branch: Return with expression | ||||||
|  | 0:15          AmbientColor: direct index for structure ( uniform 4-component vector of float) | ||||||
|  | 0:15            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2}) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              0 (const uint) | ||||||
|  | 0:14        false case | ||||||
|  | 0:17        Branch: Return with expression | ||||||
|  | 0:17          AmbientColor2: direct index for structure ( uniform 4-component vector of float) | ||||||
|  | 0:17            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2}) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              1 (const uint) | ||||||
|  | 0:13  Function Definition: main( ( temp void) | ||||||
|  | 0:13    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      Sequence | ||||||
|  | 0:13        Sequence | ||||||
|  | 0:13          move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:13            '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:?             'VSOut.PositionPS' ( in 4-component vector of float FragCoord) | ||||||
|  | 0:13          move second child to first child ( temp float) | ||||||
|  | 0:13            direct index ( in float FragCoord) | ||||||
|  | 0:13              '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                3 (const int) | ||||||
|  | 0:13            divide ( temp float) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                1.000000 | ||||||
|  | 0:13              direct index ( in float FragCoord) | ||||||
|  | 0:13                '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:13                Constant: | ||||||
|  | 0:13                  3 (const int) | ||||||
|  | 0:13          move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:13            PositionPS: direct index for structure ( temp 4-component vector of float) | ||||||
|  | 0:?               'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                0 (const int) | ||||||
|  | 0:13            '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:13        move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:13          PosInLightViewSpace: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const int) | ||||||
|  | 0:?           'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float) | ||||||
|  | 0:13        move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:13          NormalWS: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              2 (const int) | ||||||
|  | 0:?           'VSOut.NormalWS' (layout( location=1) in 3-component vector of float) | ||||||
|  | 0:13        move second child to first child ( temp 2-component vector of float) | ||||||
|  | 0:13          TexCoord: direct index for structure ( temp 2-component vector of float) | ||||||
|  | 0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              3 (const int) | ||||||
|  | 0:?           'VSOut.TexCoord' (layout( location=2) in 2-component vector of float) | ||||||
|  | 0:13      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float) | ||||||
|  | 0:13        Function Call: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float) | ||||||
|  | 0:?           'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float) | ||||||
|  | 0:?     'VSOut.PositionPS' ( in 4-component vector of float FragCoord) | ||||||
|  | 0:?     'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float) | ||||||
|  | 0:?     'VSOut.NormalWS' (layout( location=1) in 3-component vector of float) | ||||||
|  | 0:?     'VSOut.TexCoord' (layout( location=2) in 2-component vector of float) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Linked fragment stage: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Shader version: 500 | ||||||
|  | gl_FragCoord origin is upper left | ||||||
|  | 0:? Sequence | ||||||
|  | 0:13  Function Definition: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float) | ||||||
|  | 0:13    Function Parameters:  | ||||||
|  | 0:13      'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:14      Test condition and select ( temp void) | ||||||
|  | 0:14        Condition | ||||||
|  | 0:14        Compare Less Than ( temp bool) | ||||||
|  | 0:14          direct index ( temp float) | ||||||
|  | 0:14            PositionPS: direct index for structure ( temp 4-component vector of float) | ||||||
|  | 0:14              'VSOut' ( in structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:14              Constant: | ||||||
|  | 0:14                0 (const int) | ||||||
|  | 0:14            Constant: | ||||||
|  | 0:14              0 (const int) | ||||||
|  | 0:14          Constant: | ||||||
|  | 0:14            400.000000 | ||||||
|  | 0:14        true case | ||||||
|  | 0:15        Branch: Return with expression | ||||||
|  | 0:15          AmbientColor: direct index for structure ( uniform 4-component vector of float) | ||||||
|  | 0:15            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2}) | ||||||
|  | 0:15            Constant: | ||||||
|  | 0:15              0 (const uint) | ||||||
|  | 0:14        false case | ||||||
|  | 0:17        Branch: Return with expression | ||||||
|  | 0:17          AmbientColor2: direct index for structure ( uniform 4-component vector of float) | ||||||
|  | 0:17            'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2}) | ||||||
|  | 0:17            Constant: | ||||||
|  | 0:17              1 (const uint) | ||||||
|  | 0:13  Function Definition: main( ( temp void) | ||||||
|  | 0:13    Function Parameters:  | ||||||
|  | 0:?     Sequence | ||||||
|  | 0:13      Sequence | ||||||
|  | 0:13        Sequence | ||||||
|  | 0:13          move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:13            '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:?             'VSOut.PositionPS' ( in 4-component vector of float FragCoord) | ||||||
|  | 0:13          move second child to first child ( temp float) | ||||||
|  | 0:13            direct index ( in float FragCoord) | ||||||
|  | 0:13              '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                3 (const int) | ||||||
|  | 0:13            divide ( temp float) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                1.000000 | ||||||
|  | 0:13              direct index ( in float FragCoord) | ||||||
|  | 0:13                '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:13                Constant: | ||||||
|  | 0:13                  3 (const int) | ||||||
|  | 0:13          move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:13            PositionPS: direct index for structure ( temp 4-component vector of float) | ||||||
|  | 0:?               'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13              Constant: | ||||||
|  | 0:13                0 (const int) | ||||||
|  | 0:13            '@fragcoord' ( temp 4-component vector of float) | ||||||
|  | 0:13        move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:13          PosInLightViewSpace: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              1 (const int) | ||||||
|  | 0:?           'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float) | ||||||
|  | 0:13        move second child to first child ( temp 3-component vector of float) | ||||||
|  | 0:13          NormalWS: direct index for structure ( temp 3-component vector of float) | ||||||
|  | 0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              2 (const int) | ||||||
|  | 0:?           'VSOut.NormalWS' (layout( location=1) in 3-component vector of float) | ||||||
|  | 0:13        move second child to first child ( temp 2-component vector of float) | ||||||
|  | 0:13          TexCoord: direct index for structure ( temp 2-component vector of float) | ||||||
|  | 0:?             'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:13            Constant: | ||||||
|  | 0:13              3 (const int) | ||||||
|  | 0:?           'VSOut.TexCoord' (layout( location=2) in 2-component vector of float) | ||||||
|  | 0:13      move second child to first child ( temp 4-component vector of float) | ||||||
|  | 0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float) | ||||||
|  | 0:13        Function Call: @main(struct-VSOutput-vf4-vf3-vf3-vf21; ( temp 4-component vector of float) | ||||||
|  | 0:?           'VSOut' ( temp structure{ temp 4-component vector of float PositionPS,  temp 3-component vector of float PosInLightViewSpace,  temp 3-component vector of float NormalWS,  temp 2-component vector of float TexCoord}) | ||||||
|  | 0:?   Linker Objects | ||||||
|  | 0:?     'anon@0' (layout( row_major std140) uniform block{ uniform 4-component vector of float AmbientColor,  uniform 4-component vector of float AmbientColor2}) | ||||||
|  | 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float) | ||||||
|  | 0:?     'VSOut.PositionPS' ( in 4-component vector of float FragCoord) | ||||||
|  | 0:?     'VSOut.PosInLightViewSpace' (layout( location=0) in 3-component vector of float) | ||||||
|  | 0:?     'VSOut.NormalWS' (layout( location=1) in 3-component vector of float) | ||||||
|  | 0:?     'VSOut.TexCoord' (layout( location=2) in 2-component vector of float) | ||||||
|  | 
 | ||||||
|  | // Module Version 10000 | ||||||
|  | // Generated by (magic number): 8000a | ||||||
|  | // Id's are bound by 75 | ||||||
|  | 
 | ||||||
|  |                               Capability Shader | ||||||
|  |                1:             ExtInstImport  "GLSL.std.450" | ||||||
|  |                               MemoryModel Logical GLSL450 | ||||||
|  |                               EntryPoint Fragment 4  "main" 44 56 61 66 71 | ||||||
|  |                               ExecutionMode 4 OriginUpperLeft | ||||||
|  |                               Source HLSL 500 | ||||||
|  |                               Name 4  "main" | ||||||
|  |                               Name 10  "VSOutput" | ||||||
|  |                               MemberName 10(VSOutput) 0  "PositionPS" | ||||||
|  |                               MemberName 10(VSOutput) 1  "PosInLightViewSpace" | ||||||
|  |                               MemberName 10(VSOutput) 2  "NormalWS" | ||||||
|  |                               MemberName 10(VSOutput) 3  "TexCoord" | ||||||
|  |                               Name 14  "@main(struct-VSOutput-vf4-vf3-vf3-vf21;" | ||||||
|  |                               Name 13  "VSOut" | ||||||
|  |                               Name 28  "$Global" | ||||||
|  |                               MemberName 28($Global) 0  "AmbientColor" | ||||||
|  |                               MemberName 28($Global) 1  "AmbientColor2" | ||||||
|  |                               Name 30  "" | ||||||
|  |                               Name 42  "@fragcoord" | ||||||
|  |                               Name 44  "VSOut.PositionPS" | ||||||
|  |                               Name 52  "VSOut" | ||||||
|  |                               Name 56  "VSOut.PosInLightViewSpace" | ||||||
|  |                               Name 61  "VSOut.NormalWS" | ||||||
|  |                               Name 66  "VSOut.TexCoord" | ||||||
|  |                               Name 71  "@entryPointOutput" | ||||||
|  |                               Name 72  "param" | ||||||
|  |                               MemberDecorate 28($Global) 0 Offset 0 | ||||||
|  |                               MemberDecorate 28($Global) 1 Offset 16 | ||||||
|  |                               Decorate 28($Global) Block | ||||||
|  |                               Decorate 30 DescriptorSet 0 | ||||||
|  |                               Decorate 30 Binding 0 | ||||||
|  |                               Decorate 44(VSOut.PositionPS) BuiltIn FragCoord | ||||||
|  |                               Decorate 56(VSOut.PosInLightViewSpace) Location 0 | ||||||
|  |                               Decorate 61(VSOut.NormalWS) Location 1 | ||||||
|  |                               Decorate 66(VSOut.TexCoord) Location 2 | ||||||
|  |                               Decorate 71(@entryPointOutput) Location 0 | ||||||
|  |                2:             TypeVoid | ||||||
|  |                3:             TypeFunction 2 | ||||||
|  |                6:             TypeFloat 32 | ||||||
|  |                7:             TypeVector 6(float) 4 | ||||||
|  |                8:             TypeVector 6(float) 3 | ||||||
|  |                9:             TypeVector 6(float) 2 | ||||||
|  |     10(VSOutput):             TypeStruct 7(fvec4) 8(fvec3) 8(fvec3) 9(fvec2) | ||||||
|  |               11:             TypePointer Function 10(VSOutput) | ||||||
|  |               12:             TypeFunction 7(fvec4) 11(ptr) | ||||||
|  |               16:             TypeInt 32 1 | ||||||
|  |               17:     16(int) Constant 0 | ||||||
|  |               18:             TypeInt 32 0 | ||||||
|  |               19:     18(int) Constant 0 | ||||||
|  |               20:             TypePointer Function 6(float) | ||||||
|  |               23:    6(float) Constant 1137180672 | ||||||
|  |               24:             TypeBool | ||||||
|  |      28($Global):             TypeStruct 7(fvec4) 7(fvec4) | ||||||
|  |               29:             TypePointer Uniform 28($Global) | ||||||
|  |               30:     29(ptr) Variable Uniform | ||||||
|  |               31:             TypePointer Uniform 7(fvec4) | ||||||
|  |               36:     16(int) Constant 1 | ||||||
|  |               41:             TypePointer Function 7(fvec4) | ||||||
|  |               43:             TypePointer Input 7(fvec4) | ||||||
|  | 44(VSOut.PositionPS):     43(ptr) Variable Input | ||||||
|  |               46:    6(float) Constant 1065353216 | ||||||
|  |               47:     18(int) Constant 3 | ||||||
|  |               55:             TypePointer Input 8(fvec3) | ||||||
|  | 56(VSOut.PosInLightViewSpace):     55(ptr) Variable Input | ||||||
|  |               58:             TypePointer Function 8(fvec3) | ||||||
|  |               60:     16(int) Constant 2 | ||||||
|  | 61(VSOut.NormalWS):     55(ptr) Variable Input | ||||||
|  |               64:     16(int) Constant 3 | ||||||
|  |               65:             TypePointer Input 9(fvec2) | ||||||
|  | 66(VSOut.TexCoord):     65(ptr) Variable Input | ||||||
|  |               68:             TypePointer Function 9(fvec2) | ||||||
|  |               70:             TypePointer Output 7(fvec4) | ||||||
|  | 71(@entryPointOutput):     70(ptr) Variable Output | ||||||
|  |          4(main):           2 Function None 3 | ||||||
|  |                5:             Label | ||||||
|  |   42(@fragcoord):     41(ptr) Variable Function | ||||||
|  |        52(VSOut):     11(ptr) Variable Function | ||||||
|  |        72(param):     11(ptr) Variable Function | ||||||
|  |               45:    7(fvec4) Load 44(VSOut.PositionPS) | ||||||
|  |                               Store 42(@fragcoord) 45 | ||||||
|  |               48:     20(ptr) AccessChain 42(@fragcoord) 47 | ||||||
|  |               49:    6(float) Load 48 | ||||||
|  |               50:    6(float) FDiv 46 49 | ||||||
|  |               51:     20(ptr) AccessChain 42(@fragcoord) 47 | ||||||
|  |                               Store 51 50 | ||||||
|  |               53:    7(fvec4) Load 42(@fragcoord) | ||||||
|  |               54:     41(ptr) AccessChain 52(VSOut) 17 | ||||||
|  |                               Store 54 53 | ||||||
|  |               57:    8(fvec3) Load 56(VSOut.PosInLightViewSpace) | ||||||
|  |               59:     58(ptr) AccessChain 52(VSOut) 36 | ||||||
|  |                               Store 59 57 | ||||||
|  |               62:    8(fvec3) Load 61(VSOut.NormalWS) | ||||||
|  |               63:     58(ptr) AccessChain 52(VSOut) 60 | ||||||
|  |                               Store 63 62 | ||||||
|  |               67:    9(fvec2) Load 66(VSOut.TexCoord) | ||||||
|  |               69:     68(ptr) AccessChain 52(VSOut) 64 | ||||||
|  |                               Store 69 67 | ||||||
|  |               73:10(VSOutput) Load 52(VSOut) | ||||||
|  |                               Store 72(param) 73 | ||||||
|  |               74:    7(fvec4) FunctionCall 14(@main(struct-VSOutput-vf4-vf3-vf3-vf21;) 72(param) | ||||||
|  |                               Store 71(@entryPointOutput) 74 | ||||||
|  |                               Return | ||||||
|  |                               FunctionEnd | ||||||
|  | 14(@main(struct-VSOutput-vf4-vf3-vf3-vf21;):    7(fvec4) Function None 12 | ||||||
|  |        13(VSOut):     11(ptr) FunctionParameter | ||||||
|  |               15:             Label | ||||||
|  |               21:     20(ptr) AccessChain 13(VSOut) 17 19 | ||||||
|  |               22:    6(float) Load 21 | ||||||
|  |               25:    24(bool) FOrdLessThan 22 23 | ||||||
|  |                               SelectionMerge 27 None | ||||||
|  |                               BranchConditional 25 26 35 | ||||||
|  |               26:               Label | ||||||
|  |               32:     31(ptr)   AccessChain 30 17 | ||||||
|  |               33:    7(fvec4)   Load 32 | ||||||
|  |                                 ReturnValue 33 | ||||||
|  |               35:               Label | ||||||
|  |               37:     31(ptr)   AccessChain 30 36 | ||||||
|  |               38:    7(fvec4)   Load 37 | ||||||
|  |                                 ReturnValue 38 | ||||||
|  |               27:             Label | ||||||
|  |                               Unreachable | ||||||
|  |                               FunctionEnd | ||||||
							
								
								
									
										19
									
								
								Test/hlsl.w-recip2.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Test/hlsl.w-recip2.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | struct VSOutput | ||||||
|  | { | ||||||
|  |     float4 PositionPS 	        : SV_Position; | ||||||
|  |     float3 PosInLightViewSpace 	: LIGHT_SPACE_POS; | ||||||
|  |     float3 NormalWS 	        : NORMALWS; | ||||||
|  |     float2 TexCoord 	        : TEXCOORD; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | float4 AmbientColor = float4(1, 0.5, 0, 1); | ||||||
|  | float4 AmbientColor2 = float4(0.5, 1, 0, 0); | ||||||
|  | 
 | ||||||
|  | float4 main(VSOutput VSOut) : SV_TARGET | ||||||
|  | { | ||||||
|  |     if (VSOut.PositionPS.x < 400) | ||||||
|  |         return AmbientColor; | ||||||
|  |     else | ||||||
|  |         return AmbientColor2; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -260,6 +260,8 @@ diff -b $BASEDIR/hlsl.y-negate-3.vert.out $TARGETDIR/hlsl.y-negate-3.vert.out || | |||||||
| echo "Testing position W reciprocal" | echo "Testing position W reciprocal" | ||||||
| run -H -e main -V -D -Od -H -i --hlsl-dx-position-w hlsl.w-recip.frag > $TARGETDIR/hlsl.w-recip.frag.out | run -H -e main -V -D -Od -H -i --hlsl-dx-position-w hlsl.w-recip.frag > $TARGETDIR/hlsl.w-recip.frag.out | ||||||
| diff -b $BASEDIR/hlsl.w-recip.frag.out $TARGETDIR/hlsl.w-recip.frag.out || HASERROR=1 | diff -b $BASEDIR/hlsl.w-recip.frag.out $TARGETDIR/hlsl.w-recip.frag.out || HASERROR=1 | ||||||
|  | run -H -e main -V -D -Od -H -i --hlsl-dx-position-w hlsl.w-recip2.frag > $TARGETDIR/hlsl.w-recip2.frag.out | ||||||
|  | diff -b $BASEDIR/hlsl.w-recip2.frag.out $TARGETDIR/hlsl.w-recip2.frag.out || HASERROR=1 | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
| # Testing hlsl_functionality1 | # Testing hlsl_functionality1 | ||||||
|  | |||||||
| @ -2465,6 +2465,62 @@ void HlslParseContext::handleFunctionArgument(TFunction* function, | |||||||
|         arguments = newArg; |         arguments = newArg; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // FragCoord may require special loading: we can optionally reciprocate W.
 | ||||||
|  | TIntermTyped* HlslParseContext::assignFromFragCoord(const TSourceLoc& loc, TOperator op, | ||||||
|  |                                                     TIntermTyped* left, TIntermTyped* right) | ||||||
|  | { | ||||||
|  |     // If we are not asked for reciprocal W, use a plain old assign.
 | ||||||
|  |     if (!intermediate.getDxPositionW()) | ||||||
|  |         return intermediate.addAssign(op, left, right, loc); | ||||||
|  | 
 | ||||||
|  |     // If we get here, we should reciprocate W.
 | ||||||
|  |     TIntermAggregate* assignList = nullptr; | ||||||
|  | 
 | ||||||
|  |     // If this is a complex rvalue, we don't want to dereference it many times.  Create a temporary.
 | ||||||
|  |     TVariable* rhsTempVar = nullptr; | ||||||
|  |     rhsTempVar = makeInternalVariable("@fragcoord", right->getType()); | ||||||
|  |     rhsTempVar->getWritableType().getQualifier().makeTemporary(); | ||||||
|  | 
 | ||||||
|  |     { | ||||||
|  |         TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc); | ||||||
|  |         assignList = intermediate.growAggregate(assignList, | ||||||
|  |             intermediate.addAssign(EOpAssign, rhsTempSym, right, loc), loc); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // tmp.w = 1.0 / tmp.w
 | ||||||
|  |     { | ||||||
|  |         const int W = 3; | ||||||
|  | 
 | ||||||
|  |         TIntermTyped* tempSymL = intermediate.addSymbol(*rhsTempVar, loc); | ||||||
|  |         TIntermTyped* tempSymR = intermediate.addSymbol(*rhsTempVar, loc); | ||||||
|  |         TIntermTyped* index = intermediate.addConstantUnion(W, loc); | ||||||
|  | 
 | ||||||
|  |         TIntermTyped* lhsElement = intermediate.addIndex(EOpIndexDirect, tempSymL, index, loc); | ||||||
|  |         TIntermTyped* rhsElement = intermediate.addIndex(EOpIndexDirect, tempSymR, index, loc); | ||||||
|  | 
 | ||||||
|  |         const TType derefType(right->getType(), 0); | ||||||
|  | 
 | ||||||
|  |         lhsElement->setType(derefType); | ||||||
|  |         rhsElement->setType(derefType); | ||||||
|  | 
 | ||||||
|  |         auto one     = intermediate.addConstantUnion(1.0, EbtFloat, loc); | ||||||
|  |         auto recip_w = intermediate.addBinaryMath(EOpDiv, one, rhsElement, loc); | ||||||
|  | 
 | ||||||
|  |         assignList = intermediate.growAggregate(assignList, intermediate.addAssign(EOpAssign, lhsElement, recip_w, loc)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Assign the rhs temp (now with W reciprocal) to the final output
 | ||||||
|  |     { | ||||||
|  |         TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc); | ||||||
|  |         assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, left, rhsTempSym, loc)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     assert(assignList != nullptr); | ||||||
|  |     assignList->setOperator(EOpSequence); | ||||||
|  | 
 | ||||||
|  |     return assignList; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Position may require special handling: we can optionally invert Y.
 | // Position may require special handling: we can optionally invert Y.
 | ||||||
| // See: https://github.com/KhronosGroup/glslang/issues/1173
 | // See: https://github.com/KhronosGroup/glslang/issues/1173
 | ||||||
| //      https://github.com/KhronosGroup/glslang/issues/494
 | //      https://github.com/KhronosGroup/glslang/issues/494
 | ||||||
| @ -3084,6 +3140,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op | |||||||
|                                                                               subSplitLeft, subSplitRight); |                                                                               subSplitLeft, subSplitRight); | ||||||
| 
 | 
 | ||||||
|                     assignList = intermediate.growAggregate(assignList, clipCullAssign, loc); |                     assignList = intermediate.growAggregate(assignList, clipCullAssign, loc); | ||||||
|  |                 } else if (subSplitRight->getType().getQualifier().builtIn == EbvFragCoord) { | ||||||
|  |                     // FragCoord can require special handling: see comment above assignFromFragCoord
 | ||||||
|  |                     TIntermTyped* fragCoordAssign = assignFromFragCoord(loc, op, subSplitLeft, subSplitRight); | ||||||
|  |                     assignList = intermediate.growAggregate(assignList, fragCoordAssign, loc); | ||||||
|                 } else if (assignsClipPos(subSplitLeft)) { |                 } else if (assignsClipPos(subSplitLeft)) { | ||||||
|                     // Position can require special handling: see comment above assignPosition
 |                     // Position can require special handling: see comment above assignPosition
 | ||||||
|                     TIntermTyped* positionAssign = assignPosition(loc, op, subSplitLeft, subSplitRight); |                     TIntermTyped* positionAssign = assignPosition(loc, op, subSplitLeft, subSplitRight); | ||||||
|  | |||||||
| @ -94,6 +94,7 @@ public: | |||||||
|     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*); |     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*); | ||||||
|     TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, int semanticId, TIntermTyped* left, TIntermTyped* right); |     TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, int semanticId, TIntermTyped* left, TIntermTyped* right); | ||||||
|     TIntermTyped* assignPosition(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); |     TIntermTyped* assignPosition(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); | ||||||
|  |     TIntermTyped* assignFromFragCoord(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); | ||||||
|     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); |     void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); | ||||||
|     void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); |     void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); | ||||||
|     void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); |     void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Greg Fischer
						Greg Fischer