glslang/Test/baseResults/hlsl.intrinsics.promote.outputs.frag.out
steve-lunarg ef33ec0925 HLSL: add intrinsic function implicit promotions
This PR handles implicit promotions for intrinsics when there is no exact match,
such as for example clamp(int, bool, float).  In this case the int and bool will
be promoted to a float, and the clamp(float, float, float) form used.

These promotions can be mixed with shape conversions, e.g, clamp(int, bool2, float2).

Output conversions are handled either via the existing addOutputArgumentConversion
function, which this PR generalizes to handle either aggregates or unaries, or by
intrinsic decomposition.  If there are methods or intrinsics to be decomposed,
then decomposition is responsible for any output conversions, which turns out to
happen automatically in all current cases.  This can be revisited once inout
conversions are in place.

Some cases of actual ambiguity were fixed in several tests, e.g, spv.register.autoassign.*

Some intrinsics with only uint versions were expanded to signed ints natively, where the
underlying AST and SPIR-V supports that.  E.g, countbits.  This avoids extraneous
conversion nodes.

A new function promoteAggregate is added, and used by findFunction.  This is essentially
a generalization of the "promote 1st or 2nd arg" algorithm in promoteBinary.

The actual selection proceeds in three steps, as described in the comments in
hlslParseContext::findFunction:

1. Attempt an exact match.  If found, use it.
2. If not, obtain the operator from step 1, and promote arguments.
3. Re-select the intrinsic overload from the results of step 2.
2016-11-23 10:36:34 -07:00

338 lines
17 KiB
Plaintext

hlsl.intrinsics.promote.outputs.frag
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:20 Function Definition: main( (temp structure{temp 4-component vector of float color})
0:20 Function Parameters:
0:? Sequence
0:37 clamp (temp float)
0:37 fpos: direct index for structure (layout(offset=52 ) uniform float)
0:37 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int i, layout(offset=4 ) uniform uint u, layout(offset=8 ) uniform float f, layout(offset=12 ) uniform bool b, layout(offset=16 ) uniform 2-component vector of int i2, layout(offset=24 ) uniform 2-component vector of uint u2, layout(offset=32 ) uniform 2-component vector of float f2, layout(offset=40 ) uniform 2-component vector of bool b2, layout(offset=48 ) uniform uint upos, layout(offset=52 ) uniform float fpos})
0:37 Constant:
0:37 9 (const uint)
0:37 Constant:
0:37 0.000000
0:37 Constant:
0:37 1.000000
0:40 Sequence
0:40 move second child to first child (temp uint)
0:40 'sizeQueryTemp' (temp uint)
0:40 textureSize (temp uint)
0:40 'g_tTex1df4' (uniform texture1D)
0:40 move second child to first child (temp int)
0:40 'WidthI' (temp int)
0:40 Convert uint to int (temp int)
0:40 'sizeQueryTemp' (temp uint)
0:41 Sequence
0:41 move second child to first child (temp uint)
0:41 'sizeQueryTemp' (temp uint)
0:41 textureSize (temp uint)
0:41 'g_tTex1df4' (uniform texture1D)
0:41 Constant:
0:41 6 (const uint)
0:41 move second child to first child (temp int)
0:41 'WidthI' (temp int)
0:41 Convert uint to int (temp int)
0:41 'sizeQueryTemp' (temp uint)
0:41 move second child to first child (temp uint)
0:41 'NumberOfLevelsU' (temp uint)
0:41 textureQueryLevels (temp uint)
0:41 'g_tTex1df4' (uniform texture1D)
0:42 Sequence
0:42 move second child to first child (temp uint)
0:42 'sizeQueryTemp' (temp uint)
0:42 textureSize (temp uint)
0:42 'g_tTex1df4' (uniform texture1D)
0:42 Constant:
0:42 6 (const uint)
0:42 move second child to first child (temp uint)
0:42 'WidthU' (temp uint)
0:42 'sizeQueryTemp' (temp uint)
0:42 move second child to first child (temp int)
0:42 'NumberOfLevelsI' (temp int)
0:42 Convert uint to int (temp int)
0:42 textureQueryLevels (temp uint)
0:42 'g_tTex1df4' (uniform texture1D)
0:43 Sequence
0:43 move second child to first child (temp uint)
0:43 'sizeQueryTemp' (temp uint)
0:43 textureSize (temp uint)
0:43 'g_tTex1df4' (uniform texture1D)
0:43 Constant:
0:43 6 (const uint)
0:43 move second child to first child (temp int)
0:43 'WidthI' (temp int)
0:43 Convert uint to int (temp int)
0:43 'sizeQueryTemp' (temp uint)
0:43 move second child to first child (temp int)
0:43 'NumberOfLevelsI' (temp int)
0:43 Convert uint to int (temp int)
0:43 textureQueryLevels (temp uint)
0:43 'g_tTex1df4' (uniform texture1D)
0:47 move second child to first child (temp 4-component vector of float)
0:47 color: direct index for structure (temp 4-component vector of float)
0:47 'ps_output' (temp structure{temp 4-component vector of float color})
0:47 Constant:
0:47 0 (const int)
0:47 Constant:
0:47 0.000000
0:47 0.000000
0:47 0.000000
0:47 0.000000
0:48 Sequence
0:48 Sequence
0:48 move second child to first child (temp 4-component vector of float)
0:? 'color' (layout(location=0 ) out 4-component vector of float)
0:48 color: direct index for structure (temp 4-component vector of float)
0:48 'ps_output' (temp structure{temp 4-component vector of float color})
0:48 Constant:
0:48 0 (const int)
0:48 Branch: Return
0:? Linker Objects
0:? 'color' (layout(location=0 ) out 4-component vector of float)
0:? 'g_tTexbfs' (layout(r32f ) uniform samplerBuffer)
0:? 'g_tTex1df4' (uniform texture1D)
0:? 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int i, layout(offset=4 ) uniform uint u, layout(offset=8 ) uniform float f, layout(offset=12 ) uniform bool b, layout(offset=16 ) uniform 2-component vector of int i2, layout(offset=24 ) uniform 2-component vector of uint u2, layout(offset=32 ) uniform 2-component vector of float f2, layout(offset=40 ) uniform 2-component vector of bool b2, layout(offset=48 ) uniform uint upos, layout(offset=52 ) uniform float fpos})
Linked fragment stage:
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:20 Function Definition: main( (temp structure{temp 4-component vector of float color})
0:20 Function Parameters:
0:? Sequence
0:37 clamp (temp float)
0:37 fpos: direct index for structure (layout(offset=52 ) uniform float)
0:37 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int i, layout(offset=4 ) uniform uint u, layout(offset=8 ) uniform float f, layout(offset=12 ) uniform bool b, layout(offset=16 ) uniform 2-component vector of int i2, layout(offset=24 ) uniform 2-component vector of uint u2, layout(offset=32 ) uniform 2-component vector of float f2, layout(offset=40 ) uniform 2-component vector of bool b2, layout(offset=48 ) uniform uint upos, layout(offset=52 ) uniform float fpos})
0:37 Constant:
0:37 9 (const uint)
0:37 Constant:
0:37 0.000000
0:37 Constant:
0:37 1.000000
0:40 Sequence
0:40 move second child to first child (temp uint)
0:40 'sizeQueryTemp' (temp uint)
0:40 textureSize (temp uint)
0:40 'g_tTex1df4' (uniform texture1D)
0:40 move second child to first child (temp int)
0:40 'WidthI' (temp int)
0:40 Convert uint to int (temp int)
0:40 'sizeQueryTemp' (temp uint)
0:41 Sequence
0:41 move second child to first child (temp uint)
0:41 'sizeQueryTemp' (temp uint)
0:41 textureSize (temp uint)
0:41 'g_tTex1df4' (uniform texture1D)
0:41 Constant:
0:41 6 (const uint)
0:41 move second child to first child (temp int)
0:41 'WidthI' (temp int)
0:41 Convert uint to int (temp int)
0:41 'sizeQueryTemp' (temp uint)
0:41 move second child to first child (temp uint)
0:41 'NumberOfLevelsU' (temp uint)
0:41 textureQueryLevels (temp uint)
0:41 'g_tTex1df4' (uniform texture1D)
0:42 Sequence
0:42 move second child to first child (temp uint)
0:42 'sizeQueryTemp' (temp uint)
0:42 textureSize (temp uint)
0:42 'g_tTex1df4' (uniform texture1D)
0:42 Constant:
0:42 6 (const uint)
0:42 move second child to first child (temp uint)
0:42 'WidthU' (temp uint)
0:42 'sizeQueryTemp' (temp uint)
0:42 move second child to first child (temp int)
0:42 'NumberOfLevelsI' (temp int)
0:42 Convert uint to int (temp int)
0:42 textureQueryLevels (temp uint)
0:42 'g_tTex1df4' (uniform texture1D)
0:43 Sequence
0:43 move second child to first child (temp uint)
0:43 'sizeQueryTemp' (temp uint)
0:43 textureSize (temp uint)
0:43 'g_tTex1df4' (uniform texture1D)
0:43 Constant:
0:43 6 (const uint)
0:43 move second child to first child (temp int)
0:43 'WidthI' (temp int)
0:43 Convert uint to int (temp int)
0:43 'sizeQueryTemp' (temp uint)
0:43 move second child to first child (temp int)
0:43 'NumberOfLevelsI' (temp int)
0:43 Convert uint to int (temp int)
0:43 textureQueryLevels (temp uint)
0:43 'g_tTex1df4' (uniform texture1D)
0:47 move second child to first child (temp 4-component vector of float)
0:47 color: direct index for structure (temp 4-component vector of float)
0:47 'ps_output' (temp structure{temp 4-component vector of float color})
0:47 Constant:
0:47 0 (const int)
0:47 Constant:
0:47 0.000000
0:47 0.000000
0:47 0.000000
0:47 0.000000
0:48 Sequence
0:48 Sequence
0:48 move second child to first child (temp 4-component vector of float)
0:? 'color' (layout(location=0 ) out 4-component vector of float)
0:48 color: direct index for structure (temp 4-component vector of float)
0:48 'ps_output' (temp structure{temp 4-component vector of float color})
0:48 Constant:
0:48 0 (const int)
0:48 Branch: Return
0:? Linker Objects
0:? 'color' (layout(location=0 ) out 4-component vector of float)
0:? 'g_tTexbfs' (layout(r32f ) uniform samplerBuffer)
0:? 'g_tTex1df4' (uniform texture1D)
0:? 'anon@0' (layout(row_major std140 ) uniform block{layout(offset=0 ) uniform int i, layout(offset=4 ) uniform uint u, layout(offset=8 ) uniform float f, layout(offset=12 ) uniform bool b, layout(offset=16 ) uniform 2-component vector of int i2, layout(offset=24 ) uniform 2-component vector of uint u2, layout(offset=32 ) uniform 2-component vector of float f2, layout(offset=40 ) uniform 2-component vector of bool b2, layout(offset=48 ) uniform uint upos, layout(offset=52 ) uniform float fpos})
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 76
Capability Shader
Capability Sampled1D
Capability SampledBuffer
Capability ImageQuery
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 68
ExecutionMode 4 OriginUpperLeft
Name 4 "main"
Name 12 "$Global"
MemberName 12($Global) 0 "i"
MemberName 12($Global) 1 "u"
MemberName 12($Global) 2 "f"
MemberName 12($Global) 3 "b"
MemberName 12($Global) 4 "i2"
MemberName 12($Global) 5 "u2"
MemberName 12($Global) 6 "f2"
MemberName 12($Global) 7 "b2"
MemberName 12($Global) 8 "upos"
MemberName 12($Global) 9 "fpos"
Name 14 ""
Name 23 "sizeQueryTemp"
Name 26 "g_tTex1df4"
Name 30 "WidthI"
Name 33 "sizeQueryTemp"
Name 39 "NumberOfLevelsU"
Name 42 "sizeQueryTemp"
Name 45 "WidthU"
Name 47 "NumberOfLevelsI"
Name 51 "sizeQueryTemp"
Name 60 "PS_OUTPUT"
MemberName 60(PS_OUTPUT) 0 "color"
Name 62 "ps_output"
Name 68 "color"
Name 75 "g_tTexbfs"
MemberDecorate 12($Global) 0 Offset 0
MemberDecorate 12($Global) 1 Offset 4
MemberDecorate 12($Global) 2 Offset 8
MemberDecorate 12($Global) 3 Offset 12
MemberDecorate 12($Global) 4 Offset 16
MemberDecorate 12($Global) 5 Offset 24
MemberDecorate 12($Global) 6 Offset 32
MemberDecorate 12($Global) 7 Offset 40
MemberDecorate 12($Global) 8 Offset 48
MemberDecorate 12($Global) 9 Offset 52
Decorate 12($Global) Block
Decorate 14 DescriptorSet 0
Decorate 26(g_tTex1df4) DescriptorSet 0
Decorate 68(color) Location 0
Decorate 75(g_tTexbfs) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypeInt 32 0
8: TypeFloat 32
9: TypeVector 6(int) 2
10: TypeVector 7(int) 2
11: TypeVector 8(float) 2
12($Global): TypeStruct 6(int) 7(int) 8(float) 7(int) 9(ivec2) 10(ivec2) 11(fvec2) 10(ivec2) 7(int) 8(float)
13: TypePointer Uniform 12($Global)
14: 13(ptr) Variable Uniform
15: 6(int) Constant 9
16: TypePointer Uniform 8(float)
19: 8(float) Constant 0
20: 8(float) Constant 1065353216
22: TypePointer Function 7(int)
24: TypeImage 8(float) 1D sampled format:Unknown
25: TypePointer UniformConstant 24
26(g_tTex1df4): 25(ptr) Variable UniformConstant
29: TypePointer Function 6(int)
35: 7(int) Constant 6
59: TypeVector 8(float) 4
60(PS_OUTPUT): TypeStruct 59(fvec4)
61: TypePointer Function 60(PS_OUTPUT)
63: 6(int) Constant 0
64: 59(fvec4) ConstantComposite 19 19 19 19
65: TypePointer Function 59(fvec4)
67: TypePointer Output 59(fvec4)
68(color): 67(ptr) Variable Output
72: TypeImage 8(float) Buffer sampled format:R32f
73: TypeSampledImage 72
74: TypePointer UniformConstant 73
75(g_tTexbfs): 74(ptr) Variable UniformConstant
4(main): 2 Function None 3
5: Label
23(sizeQueryTemp): 22(ptr) Variable Function
30(WidthI): 29(ptr) Variable Function
33(sizeQueryTemp): 22(ptr) Variable Function
39(NumberOfLevelsU): 22(ptr) Variable Function
42(sizeQueryTemp): 22(ptr) Variable Function
45(WidthU): 22(ptr) Variable Function
47(NumberOfLevelsI): 29(ptr) Variable Function
51(sizeQueryTemp): 22(ptr) Variable Function
62(ps_output): 61(ptr) Variable Function
17: 16(ptr) AccessChain 14 15
18: 8(float) Load 17
21: 8(float) ExtInst 1(GLSL.std.450) 43(FClamp) 18 19 20
27: 24 Load 26(g_tTex1df4)
28: 6(int) ImageQuerySize 27
Store 23(sizeQueryTemp) 28
31: 7(int) Load 23(sizeQueryTemp)
32: 6(int) Bitcast 31
Store 30(WidthI) 32
34: 24 Load 26(g_tTex1df4)
36: 6(int) ImageQuerySizeLod 34 35
Store 33(sizeQueryTemp) 36
37: 7(int) Load 33(sizeQueryTemp)
38: 6(int) Bitcast 37
Store 30(WidthI) 38
40: 24 Load 26(g_tTex1df4)
41: 6(int) ImageQueryLevels 40
Store 39(NumberOfLevelsU) 41
43: 24 Load 26(g_tTex1df4)
44: 6(int) ImageQuerySizeLod 43 35
Store 42(sizeQueryTemp) 44
46: 7(int) Load 42(sizeQueryTemp)
Store 45(WidthU) 46
48: 24 Load 26(g_tTex1df4)
49: 6(int) ImageQueryLevels 48
50: 6(int) Bitcast 49
Store 47(NumberOfLevelsI) 50
52: 24 Load 26(g_tTex1df4)
53: 6(int) ImageQuerySizeLod 52 35
Store 51(sizeQueryTemp) 53
54: 7(int) Load 51(sizeQueryTemp)
55: 6(int) Bitcast 54
Store 30(WidthI) 55
56: 24 Load 26(g_tTex1df4)
57: 6(int) ImageQueryLevels 56
58: 6(int) Bitcast 57
Store 47(NumberOfLevelsI) 58
66: 65(ptr) AccessChain 62(ps_output) 63
Store 66 64
69: 65(ptr) AccessChain 62(ps_output) 63
70: 59(fvec4) Load 69
Store 68(color) 70
Return
FunctionEnd