
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.
338 lines
17 KiB
Plaintext
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
|