mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 12:00:05 +00:00
HLSL: Broaden solution for #940, editing integer input for 'flat'.
This commit is contained in:
parent
f0bc598dd7
commit
4329d555ad
@ -35,22 +35,22 @@ gl_FragCoord origin is upper left
|
|||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:5 move second child to first child ( temp double)
|
0:5 move second child to first child ( temp double)
|
||||||
0:? 'inDV1a' ( temp double)
|
0:? 'inDV1a' ( temp double)
|
||||||
0:? 'inDV1a' (layout( location=0) in double)
|
0:? 'inDV1a' (layout( location=0) flat in double)
|
||||||
0:5 move second child to first child ( temp double)
|
0:5 move second child to first child ( temp double)
|
||||||
0:? 'inDV1b' ( temp double)
|
0:? 'inDV1b' ( temp double)
|
||||||
0:? 'inDV1b' (layout( location=1) in double)
|
0:? 'inDV1b' (layout( location=1) flat in double)
|
||||||
0:5 move second child to first child ( temp double)
|
0:5 move second child to first child ( temp double)
|
||||||
0:? 'inDV1c' ( temp double)
|
0:? 'inDV1c' ( temp double)
|
||||||
0:? 'inDV1c' (layout( location=2) in double)
|
0:? 'inDV1c' (layout( location=2) flat in double)
|
||||||
0:5 move second child to first child ( temp 2-component vector of double)
|
0:5 move second child to first child ( temp 2-component vector of double)
|
||||||
0:? 'inDV2' ( temp 2-component vector of double)
|
0:? 'inDV2' ( temp 2-component vector of double)
|
||||||
0:? 'inDV2' (layout( location=3) in 2-component vector of double)
|
0:? 'inDV2' (layout( location=3) flat in 2-component vector of double)
|
||||||
0:5 move second child to first child ( temp 3-component vector of double)
|
0:5 move second child to first child ( temp 3-component vector of double)
|
||||||
0:? 'inDV3' ( temp 3-component vector of double)
|
0:? 'inDV3' ( temp 3-component vector of double)
|
||||||
0:? 'inDV3' (layout( location=4) in 3-component vector of double)
|
0:? 'inDV3' (layout( location=4) flat in 3-component vector of double)
|
||||||
0:5 move second child to first child ( temp 4-component vector of double)
|
0:5 move second child to first child ( temp 4-component vector of double)
|
||||||
0:? 'inDV4' ( temp 4-component vector of double)
|
0:? 'inDV4' ( temp 4-component vector of double)
|
||||||
0:? 'inDV4' (layout( location=6) in 4-component vector of double)
|
0:? 'inDV4' (layout( location=6) flat in 4-component vector of double)
|
||||||
0:5 move second child to first child ( temp uint)
|
0:5 move second child to first child ( temp uint)
|
||||||
0:? 'inU1a' ( temp uint)
|
0:? 'inU1a' ( temp uint)
|
||||||
0:? 'inU1a' (layout( location=8) flat in uint)
|
0:? 'inU1a' (layout( location=8) flat in uint)
|
||||||
@ -70,12 +70,12 @@ gl_FragCoord origin is upper left
|
|||||||
0:? 'inU1b' ( temp uint)
|
0:? 'inU1b' ( temp uint)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? '@entryPointOutput' (layout( location=0) out float)
|
0:? '@entryPointOutput' (layout( location=0) out float)
|
||||||
0:? 'inDV1a' (layout( location=0) in double)
|
0:? 'inDV1a' (layout( location=0) flat in double)
|
||||||
0:? 'inDV1b' (layout( location=1) in double)
|
0:? 'inDV1b' (layout( location=1) flat in double)
|
||||||
0:? 'inDV1c' (layout( location=2) in double)
|
0:? 'inDV1c' (layout( location=2) flat in double)
|
||||||
0:? 'inDV2' (layout( location=3) in 2-component vector of double)
|
0:? 'inDV2' (layout( location=3) flat in 2-component vector of double)
|
||||||
0:? 'inDV3' (layout( location=4) in 3-component vector of double)
|
0:? 'inDV3' (layout( location=4) flat in 3-component vector of double)
|
||||||
0:? 'inDV4' (layout( location=6) in 4-component vector of double)
|
0:? 'inDV4' (layout( location=6) flat in 4-component vector of double)
|
||||||
0:? 'inU1a' (layout( location=8) flat in uint)
|
0:? 'inU1a' (layout( location=8) flat in uint)
|
||||||
0:? 'inU1b' (layout( location=9) flat in uint)
|
0:? 'inU1b' (layout( location=9) flat in uint)
|
||||||
|
|
||||||
@ -119,22 +119,22 @@ gl_FragCoord origin is upper left
|
|||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:5 move second child to first child ( temp double)
|
0:5 move second child to first child ( temp double)
|
||||||
0:? 'inDV1a' ( temp double)
|
0:? 'inDV1a' ( temp double)
|
||||||
0:? 'inDV1a' (layout( location=0) in double)
|
0:? 'inDV1a' (layout( location=0) flat in double)
|
||||||
0:5 move second child to first child ( temp double)
|
0:5 move second child to first child ( temp double)
|
||||||
0:? 'inDV1b' ( temp double)
|
0:? 'inDV1b' ( temp double)
|
||||||
0:? 'inDV1b' (layout( location=1) in double)
|
0:? 'inDV1b' (layout( location=1) flat in double)
|
||||||
0:5 move second child to first child ( temp double)
|
0:5 move second child to first child ( temp double)
|
||||||
0:? 'inDV1c' ( temp double)
|
0:? 'inDV1c' ( temp double)
|
||||||
0:? 'inDV1c' (layout( location=2) in double)
|
0:? 'inDV1c' (layout( location=2) flat in double)
|
||||||
0:5 move second child to first child ( temp 2-component vector of double)
|
0:5 move second child to first child ( temp 2-component vector of double)
|
||||||
0:? 'inDV2' ( temp 2-component vector of double)
|
0:? 'inDV2' ( temp 2-component vector of double)
|
||||||
0:? 'inDV2' (layout( location=3) in 2-component vector of double)
|
0:? 'inDV2' (layout( location=3) flat in 2-component vector of double)
|
||||||
0:5 move second child to first child ( temp 3-component vector of double)
|
0:5 move second child to first child ( temp 3-component vector of double)
|
||||||
0:? 'inDV3' ( temp 3-component vector of double)
|
0:? 'inDV3' ( temp 3-component vector of double)
|
||||||
0:? 'inDV3' (layout( location=4) in 3-component vector of double)
|
0:? 'inDV3' (layout( location=4) flat in 3-component vector of double)
|
||||||
0:5 move second child to first child ( temp 4-component vector of double)
|
0:5 move second child to first child ( temp 4-component vector of double)
|
||||||
0:? 'inDV4' ( temp 4-component vector of double)
|
0:? 'inDV4' ( temp 4-component vector of double)
|
||||||
0:? 'inDV4' (layout( location=6) in 4-component vector of double)
|
0:? 'inDV4' (layout( location=6) flat in 4-component vector of double)
|
||||||
0:5 move second child to first child ( temp uint)
|
0:5 move second child to first child ( temp uint)
|
||||||
0:? 'inU1a' ( temp uint)
|
0:? 'inU1a' ( temp uint)
|
||||||
0:? 'inU1a' (layout( location=8) flat in uint)
|
0:? 'inU1a' (layout( location=8) flat in uint)
|
||||||
@ -154,12 +154,12 @@ gl_FragCoord origin is upper left
|
|||||||
0:? 'inU1b' ( temp uint)
|
0:? 'inU1b' ( temp uint)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? '@entryPointOutput' (layout( location=0) out float)
|
0:? '@entryPointOutput' (layout( location=0) out float)
|
||||||
0:? 'inDV1a' (layout( location=0) in double)
|
0:? 'inDV1a' (layout( location=0) flat in double)
|
||||||
0:? 'inDV1b' (layout( location=1) in double)
|
0:? 'inDV1b' (layout( location=1) flat in double)
|
||||||
0:? 'inDV1c' (layout( location=2) in double)
|
0:? 'inDV1c' (layout( location=2) flat in double)
|
||||||
0:? 'inDV2' (layout( location=3) in 2-component vector of double)
|
0:? 'inDV2' (layout( location=3) flat in 2-component vector of double)
|
||||||
0:? 'inDV3' (layout( location=4) in 3-component vector of double)
|
0:? 'inDV3' (layout( location=4) flat in 3-component vector of double)
|
||||||
0:? 'inDV4' (layout( location=6) in 4-component vector of double)
|
0:? 'inDV4' (layout( location=6) flat in 4-component vector of double)
|
||||||
0:? 'inU1a' (layout( location=8) flat in uint)
|
0:? 'inU1a' (layout( location=8) flat in uint)
|
||||||
0:? 'inU1b' (layout( location=9) flat in uint)
|
0:? 'inU1b' (layout( location=9) flat in uint)
|
||||||
|
|
||||||
@ -211,11 +211,17 @@ gl_FragCoord origin is upper left
|
|||||||
Name 83 "param"
|
Name 83 "param"
|
||||||
Name 85 "param"
|
Name 85 "param"
|
||||||
Name 87 "param"
|
Name 87 "param"
|
||||||
|
Decorate 44(inDV1a) Flat
|
||||||
Decorate 44(inDV1a) Location 0
|
Decorate 44(inDV1a) Location 0
|
||||||
|
Decorate 47(inDV1b) Flat
|
||||||
Decorate 47(inDV1b) Location 1
|
Decorate 47(inDV1b) Location 1
|
||||||
|
Decorate 50(inDV1c) Flat
|
||||||
Decorate 50(inDV1c) Location 2
|
Decorate 50(inDV1c) Location 2
|
||||||
|
Decorate 54(inDV2) Flat
|
||||||
Decorate 54(inDV2) Location 3
|
Decorate 54(inDV2) Location 3
|
||||||
|
Decorate 58(inDV3) Flat
|
||||||
Decorate 58(inDV3) Location 4
|
Decorate 58(inDV3) Location 4
|
||||||
|
Decorate 62(inDV4) Flat
|
||||||
Decorate 62(inDV4) Location 6
|
Decorate 62(inDV4) Location 6
|
||||||
Decorate 66(inU1a) Flat
|
Decorate 66(inU1a) Flat
|
||||||
Decorate 66(inU1a) Location 8
|
Decorate 66(inU1a) Location 8
|
||||||
|
@ -79,7 +79,7 @@ gl_FragCoord origin is upper left
|
|||||||
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
||||||
0:40 Constant:
|
0:40 Constant:
|
||||||
0:40 4 (const int)
|
0:40 4 (const int)
|
||||||
0:? 's_ff1' ( in bool Face)
|
0:? 's_ff1' ( flat in bool Face)
|
||||||
0:40 move second child to first child ( temp bool)
|
0:40 move second child to first child ( temp bool)
|
||||||
0:40 ff2: direct index for structure ( temp bool)
|
0:40 ff2: direct index for structure ( temp bool)
|
||||||
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
||||||
@ -118,7 +118,7 @@ gl_FragCoord origin is upper left
|
|||||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
0:? 'input' (layout( location=0) in 4-component vector of float)
|
0:? 'input' (layout( location=0) in 4-component vector of float)
|
||||||
0:? 's' (layout( location=1) in structure{ smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, flat temp bool ff2, flat temp bool ff3, temp 4-component vector of float ff4})
|
0:? 's' (layout( location=1) in structure{ smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, flat temp bool ff2, flat temp bool ff3, temp 4-component vector of float ff4})
|
||||||
0:? 's_ff1' ( in bool Face)
|
0:? 's_ff1' ( flat in bool Face)
|
||||||
|
|
||||||
|
|
||||||
Linked fragment stage:
|
Linked fragment stage:
|
||||||
@ -200,7 +200,7 @@ gl_FragCoord origin is upper left
|
|||||||
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
||||||
0:40 Constant:
|
0:40 Constant:
|
||||||
0:40 4 (const int)
|
0:40 4 (const int)
|
||||||
0:? 's_ff1' ( in bool Face)
|
0:? 's_ff1' ( flat in bool Face)
|
||||||
0:40 move second child to first child ( temp bool)
|
0:40 move second child to first child ( temp bool)
|
||||||
0:40 ff2: direct index for structure ( temp bool)
|
0:40 ff2: direct index for structure ( temp bool)
|
||||||
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
0:? 's' ( temp structure{ temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
|
||||||
@ -239,7 +239,7 @@ gl_FragCoord origin is upper left
|
|||||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
0:? 'input' (layout( location=0) in 4-component vector of float)
|
0:? 'input' (layout( location=0) in 4-component vector of float)
|
||||||
0:? 's' (layout( location=1) in structure{ smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, flat temp bool ff2, flat temp bool ff3, temp 4-component vector of float ff4})
|
0:? 's' (layout( location=1) in structure{ smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, flat temp bool ff2, flat temp bool ff3, temp 4-component vector of float ff4})
|
||||||
0:? 's_ff1' ( in bool Face)
|
0:? 's_ff1' ( flat in bool Face)
|
||||||
|
|
||||||
// Module Version 10000
|
// Module Version 10000
|
||||||
// Generated by (magic number): 80001
|
// Generated by (magic number): 80001
|
||||||
@ -309,6 +309,7 @@ gl_FragCoord origin is upper left
|
|||||||
MemberDecorate 54(IN_S) 4 Flat
|
MemberDecorate 54(IN_S) 4 Flat
|
||||||
MemberDecorate 54(IN_S) 5 Flat
|
MemberDecorate 54(IN_S) 5 Flat
|
||||||
Decorate 56(s) Location 1
|
Decorate 56(s) Location 1
|
||||||
|
Decorate 79(s_ff1) Flat
|
||||||
Decorate 79(s_ff1) BuiltIn FrontFacing
|
Decorate 79(s_ff1) BuiltIn FrontFacing
|
||||||
Decorate 94(@entryPointOutput) Location 0
|
Decorate 94(@entryPointOutput) Location 0
|
||||||
MemberDecorate 101(myS) 0 Offset 0
|
MemberDecorate 101(myS) 0 Offset 0
|
||||||
|
151
Test/baseResults/hlsl.synthesizeInput.frag.out
Executable file
151
Test/baseResults/hlsl.synthesizeInput.frag.out
Executable file
@ -0,0 +1,151 @@
|
|||||||
|
hlsl.synthesizeInput.frag
|
||||||
|
Shader version: 500
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:7 Function Definition: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
|
||||||
|
0:7 Function Parameters:
|
||||||
|
0:7 'input' ( in structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? Sequence
|
||||||
|
0:8 Branch: Return with expression
|
||||||
|
0:? Construct vec4 ( temp 4-component vector of float)
|
||||||
|
0:8 Convert uint to float ( temp float)
|
||||||
|
0:8 no_interp: direct index for structure ( temp uint)
|
||||||
|
0:8 'input' ( in structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 1 (const int)
|
||||||
|
0:8 interp: direct index for structure ( temp float)
|
||||||
|
0:8 'input' ( in structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 0 (const int)
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 0.000000
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 1.000000
|
||||||
|
0:7 Function Definition: main( ( temp void)
|
||||||
|
0:7 Function Parameters:
|
||||||
|
0:? Sequence
|
||||||
|
0:7 move second child to first child ( temp structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? 'input' ( temp structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? 'input' (layout( location=0) in structure{ temp float interp, flat temp uint no_interp})
|
||||||
|
0:7 move second child to first child ( temp 4-component vector of float)
|
||||||
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
|
0:7 Function Call: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
|
||||||
|
0:? 'input' ( temp structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? Linker Objects
|
||||||
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
|
0:? 'input' (layout( location=0) in structure{ temp float interp, flat temp uint no_interp})
|
||||||
|
|
||||||
|
|
||||||
|
Linked fragment stage:
|
||||||
|
|
||||||
|
|
||||||
|
Shader version: 500
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:7 Function Definition: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
|
||||||
|
0:7 Function Parameters:
|
||||||
|
0:7 'input' ( in structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? Sequence
|
||||||
|
0:8 Branch: Return with expression
|
||||||
|
0:? Construct vec4 ( temp 4-component vector of float)
|
||||||
|
0:8 Convert uint to float ( temp float)
|
||||||
|
0:8 no_interp: direct index for structure ( temp uint)
|
||||||
|
0:8 'input' ( in structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 1 (const int)
|
||||||
|
0:8 interp: direct index for structure ( temp float)
|
||||||
|
0:8 'input' ( in structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 0 (const int)
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 0.000000
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 1.000000
|
||||||
|
0:7 Function Definition: main( ( temp void)
|
||||||
|
0:7 Function Parameters:
|
||||||
|
0:? Sequence
|
||||||
|
0:7 move second child to first child ( temp structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? 'input' ( temp structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? 'input' (layout( location=0) in structure{ temp float interp, flat temp uint no_interp})
|
||||||
|
0:7 move second child to first child ( temp 4-component vector of float)
|
||||||
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
|
0:7 Function Call: @main(struct-PSInput-f1-u11; ( temp 4-component vector of float)
|
||||||
|
0:? 'input' ( temp structure{ temp float interp, temp uint no_interp})
|
||||||
|
0:? Linker Objects
|
||||||
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
|
0:? 'input' (layout( location=0) in structure{ temp float interp, flat temp uint no_interp})
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 44
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 33 40
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 500
|
||||||
|
Name 4 "main"
|
||||||
|
Name 8 "PSInput"
|
||||||
|
MemberName 8(PSInput) 0 "interp"
|
||||||
|
MemberName 8(PSInput) 1 "no_interp"
|
||||||
|
Name 13 "@main(struct-PSInput-f1-u11;"
|
||||||
|
Name 12 "input"
|
||||||
|
Name 30 "input"
|
||||||
|
Name 31 "PSInput"
|
||||||
|
MemberName 31(PSInput) 0 "interp"
|
||||||
|
MemberName 31(PSInput) 1 "no_interp"
|
||||||
|
Name 33 "input"
|
||||||
|
Name 40 "@entryPointOutput"
|
||||||
|
Name 41 "param"
|
||||||
|
MemberDecorate 31(PSInput) 1 Flat
|
||||||
|
Decorate 33(input) Location 0
|
||||||
|
Decorate 40(@entryPointOutput) Location 0
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeInt 32 0
|
||||||
|
8(PSInput): TypeStruct 6(float) 7(int)
|
||||||
|
9: TypePointer Function 8(PSInput)
|
||||||
|
10: TypeVector 6(float) 4
|
||||||
|
11: TypeFunction 10(fvec4) 9(ptr)
|
||||||
|
15: TypeInt 32 1
|
||||||
|
16: 15(int) Constant 1
|
||||||
|
17: TypePointer Function 7(int)
|
||||||
|
21: 15(int) Constant 0
|
||||||
|
22: TypePointer Function 6(float)
|
||||||
|
25: 6(float) Constant 0
|
||||||
|
26: 6(float) Constant 1065353216
|
||||||
|
31(PSInput): TypeStruct 6(float) 7(int)
|
||||||
|
32: TypePointer Input 31(PSInput)
|
||||||
|
33(input): 32(ptr) Variable Input
|
||||||
|
39: TypePointer Output 10(fvec4)
|
||||||
|
40(@entryPointOutput): 39(ptr) Variable Output
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
30(input): 9(ptr) Variable Function
|
||||||
|
41(param): 9(ptr) Variable Function
|
||||||
|
34: 31(PSInput) Load 33(input)
|
||||||
|
35: 6(float) CompositeExtract 34 0
|
||||||
|
36: 22(ptr) AccessChain 30(input) 21
|
||||||
|
Store 36 35
|
||||||
|
37: 7(int) CompositeExtract 34 1
|
||||||
|
38: 17(ptr) AccessChain 30(input) 16
|
||||||
|
Store 38 37
|
||||||
|
42: 8(PSInput) Load 30(input)
|
||||||
|
Store 41(param) 42
|
||||||
|
43: 10(fvec4) FunctionCall 13(@main(struct-PSInput-f1-u11;) 41(param)
|
||||||
|
Store 40(@entryPointOutput) 43
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
13(@main(struct-PSInput-f1-u11;): 10(fvec4) Function None 11
|
||||||
|
12(input): 9(ptr) FunctionParameter
|
||||||
|
14: Label
|
||||||
|
18: 17(ptr) AccessChain 12(input) 16
|
||||||
|
19: 7(int) Load 18
|
||||||
|
20: 6(float) ConvertUToF 19
|
||||||
|
23: 22(ptr) AccessChain 12(input) 21
|
||||||
|
24: 6(float) Load 23
|
||||||
|
27: 10(fvec4) CompositeConstruct 20 24 25 26
|
||||||
|
ReturnValue 27
|
||||||
|
FunctionEnd
|
9
Test/hlsl.synthesizeInput.frag
Normal file
9
Test/hlsl.synthesizeInput.frag
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
struct PSInput {
|
||||||
|
float interp;
|
||||||
|
uint no_interp;
|
||||||
|
};
|
||||||
|
|
||||||
|
float4 main(PSInput input : INPUT) : SV_TARGET
|
||||||
|
{
|
||||||
|
return float4(float(input.no_interp), input.interp, 0, 1);
|
||||||
|
}
|
@ -275,6 +275,7 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
{"hlsl.structin.vert", "main"},
|
{"hlsl.structin.vert", "main"},
|
||||||
{"hlsl.structIoFourWay.frag", "main"},
|
{"hlsl.structIoFourWay.frag", "main"},
|
||||||
{"hlsl.structStructName.frag", "main"},
|
{"hlsl.structStructName.frag", "main"},
|
||||||
|
{"hlsl.synthesizeInput.frag", "main"},
|
||||||
{"hlsl.texture.subvec4.frag", "main"},
|
{"hlsl.texture.subvec4.frag", "main"},
|
||||||
{"hlsl.this.frag", "main"},
|
{"hlsl.this.frag", "main"},
|
||||||
{"hlsl.intrinsics.vert", "VertexShaderFunction"},
|
{"hlsl.intrinsics.vert", "VertexShaderFunction"},
|
||||||
|
@ -1527,8 +1527,6 @@ void HlslParseContext::fixBuiltInIoType(TType& type)
|
|||||||
// Variables that correspond to the user-interface in and out of a stage
|
// Variables that correspond to the user-interface in and out of a stage
|
||||||
// (not the built-in interface) are
|
// (not the built-in interface) are
|
||||||
// - assigned locations
|
// - assigned locations
|
||||||
// - corrected for interpolation
|
|
||||||
// * non-floating point values must be nointerpolation
|
|
||||||
// - registered as a linkage node (part of the stage's external interface).
|
// - registered as a linkage node (part of the stage's external interface).
|
||||||
// Assumes it is called in the order in which locations should be assigned.
|
// Assumes it is called in the order in which locations should be assigned.
|
||||||
void HlslParseContext::assignToInterface(TVariable& variable)
|
void HlslParseContext::assignToInterface(TVariable& variable)
|
||||||
@ -1554,21 +1552,6 @@ void HlslParseContext::assignToInterface(TVariable& variable)
|
|||||||
nextOutLocation += size;
|
nextOutLocation += size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (qualifier.storage == EvqVaryingIn && language == EShLangFragment) {
|
|
||||||
// Going into the fragment stage, integer-based stuff must be flat/nointerpolation
|
|
||||||
const auto fixQualifier = [](TType& type) {
|
|
||||||
if (type.getQualifier().builtIn == EbvNone &&
|
|
||||||
(type.isIntegerDomain() || type.getBasicType() == EbtBool)) {
|
|
||||||
type.getQualifier().clearInterpolation();
|
|
||||||
type.getQualifier().flat = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (type.isStruct())
|
|
||||||
for (auto mem = (*type.getStruct()).begin(); mem != (*type.getStruct()).end(); ++mem)
|
|
||||||
fixQualifier(*mem->type);
|
|
||||||
else
|
|
||||||
fixQualifier(type);
|
|
||||||
}
|
|
||||||
trackLinkage(variable);
|
trackLinkage(variable);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -2134,12 +2117,63 @@ void HlslParseContext::handleFunctionBody(const TSourceLoc& loc, TFunction& func
|
|||||||
void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& returnValue,
|
void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& returnValue,
|
||||||
TVector<TVariable*>& inputs, TVector<TVariable*>& outputs)
|
TVector<TVariable*>& inputs, TVector<TVariable*>& outputs)
|
||||||
{
|
{
|
||||||
|
// We might have in input structure type with no decorations that caused it
|
||||||
|
// to look like an input type, yet it has (e.g.) interpolation types that
|
||||||
|
// must be modified that turn it into an input type.
|
||||||
|
// Hence, a missing ioTypeMap for 'input' might need to be synthesized.
|
||||||
|
const auto synthesizeEditedInput = [this](TType& type) {
|
||||||
|
// True if a type needs to be 'flat'
|
||||||
|
const auto needsFlat = [](const TType& type) {
|
||||||
|
return type.containsBasicType(EbtInt) ||
|
||||||
|
type.containsBasicType(EbtUint) ||
|
||||||
|
type.containsBasicType(EbtInt64) ||
|
||||||
|
type.containsBasicType(EbtUint64) ||
|
||||||
|
type.containsBasicType(EbtBool) ||
|
||||||
|
type.containsBasicType(EbtDouble);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (language == EShLangFragment && needsFlat(type)) {
|
||||||
|
if (type.isStruct()) {
|
||||||
|
TTypeList* finalList = nullptr;
|
||||||
|
auto it = ioTypeMap.find(type.getStruct());
|
||||||
|
if (it == ioTypeMap.end() || it->second.input == nullptr) {
|
||||||
|
// Getting here means we have no input struct, but we need one.
|
||||||
|
auto list = new TTypeList;
|
||||||
|
for (auto member = type.getStruct()->begin(); member != type.getStruct()->end(); ++member) {
|
||||||
|
TType* newType = new TType;
|
||||||
|
newType->shallowCopy(*member->type);
|
||||||
|
TTypeLoc typeLoc = { newType, member->loc };
|
||||||
|
list->push_back(typeLoc);
|
||||||
|
}
|
||||||
|
// install the new input type
|
||||||
|
if (it == ioTypeMap.end()) {
|
||||||
|
tIoKinds newLists = { list, nullptr, nullptr };
|
||||||
|
ioTypeMap[type.getStruct()] = newLists;
|
||||||
|
} else
|
||||||
|
it->second.input = list;
|
||||||
|
finalList = list;
|
||||||
|
} else
|
||||||
|
finalList = it->second.input;
|
||||||
|
// edit for 'flat'
|
||||||
|
for (auto member = finalList->begin(); member != finalList->end(); ++member) {
|
||||||
|
if (needsFlat(*member->type)) {
|
||||||
|
member->type->getQualifier().clearInterpolation();
|
||||||
|
member->type->getQualifier().flat = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
type.getQualifier().clearInterpolation();
|
||||||
|
type.getQualifier().flat = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Do the actual work to make a type be a shader input or output variable,
|
// Do the actual work to make a type be a shader input or output variable,
|
||||||
// and clear the original to be non-IO (for use as a normal function parameter/return).
|
// and clear the original to be non-IO (for use as a normal function parameter/return).
|
||||||
const auto makeIoVariable = [this](const char* name, TType& type, TStorageQualifier storage) -> TVariable* {
|
const auto makeIoVariable = [this](const char* name, TType& type, TStorageQualifier storage) -> TVariable* {
|
||||||
TVariable* ioVariable = makeInternalVariable(name, type);
|
TVariable* ioVariable = makeInternalVariable(name, type);
|
||||||
clearUniformInputOutput(type.getQualifier());
|
clearUniformInputOutput(type.getQualifier());
|
||||||
if (type.getStruct() != nullptr) {
|
if (type.isStruct()) {
|
||||||
auto newLists = ioTypeMap.find(ioVariable->getType().getStruct());
|
auto newLists = ioTypeMap.find(ioVariable->getType().getStruct());
|
||||||
if (newLists != ioTypeMap.end()) {
|
if (newLists != ioTypeMap.end()) {
|
||||||
if (storage == EvqVaryingIn && newLists->second.input)
|
if (storage == EvqVaryingIn && newLists->second.input)
|
||||||
@ -2192,6 +2226,7 @@ void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& return
|
|||||||
for (int i = 0; i < function.getParamCount(); i++) {
|
for (int i = 0; i < function.getParamCount(); i++) {
|
||||||
TType& paramType = *function[i].type;
|
TType& paramType = *function[i].type;
|
||||||
if (paramType.getQualifier().isParamInput()) {
|
if (paramType.getQualifier().isParamInput()) {
|
||||||
|
synthesizeEditedInput(paramType);
|
||||||
TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingIn);
|
TVariable* argAsGlobal = makeIoVariable(function[i].name->c_str(), paramType, EvqVaryingIn);
|
||||||
inputs.push_back(argAsGlobal);
|
inputs.push_back(argAsGlobal);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user