SPV: Implement GLSL built-in bitcast functions.
This commit is contained in:
parent
ea0cb2eb11
commit
cbc426ee62
@ -2531,6 +2531,13 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv:
|
|||||||
unaryOp = spv::OpIsInf;
|
unaryOp = spv::OpIsInf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case glslang::EOpFloatBitsToInt:
|
||||||
|
case glslang::EOpFloatBitsToUint:
|
||||||
|
case glslang::EOpIntBitsToFloat:
|
||||||
|
case glslang::EOpUintBitsToFloat:
|
||||||
|
unaryOp = spv::OpBitcast;
|
||||||
|
break;
|
||||||
|
|
||||||
case glslang::EOpPackSnorm2x16:
|
case glslang::EOpPackSnorm2x16:
|
||||||
libCall = spv::GLSLstd450PackSnorm2x16;
|
libCall = spv::GLSLstd450PackSnorm2x16;
|
||||||
break;
|
break;
|
||||||
|
232
Test/baseResults/spv.bitCast.frag.out
Normal file
232
Test/baseResults/spv.bitCast.frag.out
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
spv.bitCast.frag
|
||||||
|
Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
|
||||||
|
|
||||||
|
|
||||||
|
Linked fragment stage:
|
||||||
|
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 172
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 154
|
||||||
|
ExecutionMode 4 OriginLowerLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "idata"
|
||||||
|
Name 14 "f1"
|
||||||
|
Name 26 "f2"
|
||||||
|
Name 37 "f3"
|
||||||
|
Name 48 "f4"
|
||||||
|
Name 55 "udata"
|
||||||
|
Name 85 "fdata"
|
||||||
|
Name 89 "i1"
|
||||||
|
Name 98 "i2"
|
||||||
|
Name 107 "i3"
|
||||||
|
Name 116 "i4"
|
||||||
|
Name 122 "u1"
|
||||||
|
Name 130 "u2"
|
||||||
|
Name 139 "u3"
|
||||||
|
Name 148 "u4"
|
||||||
|
Name 154 "fragColor"
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeInt 32 1
|
||||||
|
7: TypeVector 6(int) 4
|
||||||
|
8: TypePointer Function 7(ivec4)
|
||||||
|
10: 6(int) Constant 0
|
||||||
|
11: 7(ivec4) ConstantComposite 10 10 10 10
|
||||||
|
12: TypeFloat 32
|
||||||
|
13: TypePointer UniformConstant 12(float)
|
||||||
|
14(f1): 13(ptr) Variable UniformConstant
|
||||||
|
17: TypeInt 32 0
|
||||||
|
18: 17(int) Constant 0
|
||||||
|
19: TypePointer Function 6(int)
|
||||||
|
24: TypeVector 12(float) 2
|
||||||
|
25: TypePointer UniformConstant 24(fvec2)
|
||||||
|
26(f2): 25(ptr) Variable UniformConstant
|
||||||
|
28: TypeVector 6(int) 2
|
||||||
|
35: TypeVector 12(float) 3
|
||||||
|
36: TypePointer UniformConstant 35(fvec3)
|
||||||
|
37(f3): 36(ptr) Variable UniformConstant
|
||||||
|
39: TypeVector 6(int) 3
|
||||||
|
46: TypeVector 12(float) 4
|
||||||
|
47: TypePointer UniformConstant 46(fvec4)
|
||||||
|
48(f4): 47(ptr) Variable UniformConstant
|
||||||
|
53: TypeVector 17(int) 4
|
||||||
|
54: TypePointer Function 53(ivec4)
|
||||||
|
56: 53(ivec4) ConstantComposite 18 18 18 18
|
||||||
|
59: TypePointer Function 17(int)
|
||||||
|
65: TypeVector 17(int) 2
|
||||||
|
73: TypeVector 17(int) 3
|
||||||
|
84: TypePointer Function 46(fvec4)
|
||||||
|
86: 12(float) Constant 0
|
||||||
|
87: 46(fvec4) ConstantComposite 86 86 86 86
|
||||||
|
88: TypePointer UniformConstant 6(int)
|
||||||
|
89(i1): 88(ptr) Variable UniformConstant
|
||||||
|
92: TypePointer Function 12(float)
|
||||||
|
97: TypePointer UniformConstant 28(ivec2)
|
||||||
|
98(i2): 97(ptr) Variable UniformConstant
|
||||||
|
106: TypePointer UniformConstant 39(ivec3)
|
||||||
|
107(i3): 106(ptr) Variable UniformConstant
|
||||||
|
115: TypePointer UniformConstant 7(ivec4)
|
||||||
|
116(i4): 115(ptr) Variable UniformConstant
|
||||||
|
121: TypePointer UniformConstant 17(int)
|
||||||
|
122(u1): 121(ptr) Variable UniformConstant
|
||||||
|
129: TypePointer UniformConstant 65(ivec2)
|
||||||
|
130(u2): 129(ptr) Variable UniformConstant
|
||||||
|
138: TypePointer UniformConstant 73(ivec3)
|
||||||
|
139(u3): 138(ptr) Variable UniformConstant
|
||||||
|
147: TypePointer UniformConstant 53(ivec4)
|
||||||
|
148(u4): 147(ptr) Variable UniformConstant
|
||||||
|
153: TypePointer Output 46(fvec4)
|
||||||
|
154(fragColor): 153(ptr) Variable Output
|
||||||
|
159: TypeBool
|
||||||
|
160: TypeVector 159(bool) 4
|
||||||
|
168: 12(float) Constant 1045220557
|
||||||
|
169: 46(fvec4) ConstantComposite 168 168 168 168
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
9(idata): 8(ptr) Variable Function
|
||||||
|
55(udata): 54(ptr) Variable Function
|
||||||
|
85(fdata): 84(ptr) Variable Function
|
||||||
|
155: 84(ptr) Variable Function
|
||||||
|
Store 9(idata) 11
|
||||||
|
15: 12(float) Load 14(f1)
|
||||||
|
16: 6(int) Bitcast 15
|
||||||
|
20: 19(ptr) AccessChain 9(idata) 18
|
||||||
|
21: 6(int) Load 20
|
||||||
|
22: 6(int) IAdd 21 16
|
||||||
|
23: 19(ptr) AccessChain 9(idata) 18
|
||||||
|
Store 23 22
|
||||||
|
27: 24(fvec2) Load 26(f2)
|
||||||
|
29: 28(ivec2) Bitcast 27
|
||||||
|
30: 7(ivec4) Load 9(idata)
|
||||||
|
31: 28(ivec2) VectorShuffle 30 30 0 1
|
||||||
|
32: 28(ivec2) IAdd 31 29
|
||||||
|
33: 7(ivec4) Load 9(idata)
|
||||||
|
34: 7(ivec4) VectorShuffle 33 32 4 5 2 3
|
||||||
|
Store 9(idata) 34
|
||||||
|
38: 35(fvec3) Load 37(f3)
|
||||||
|
40: 39(ivec3) Bitcast 38
|
||||||
|
41: 7(ivec4) Load 9(idata)
|
||||||
|
42: 39(ivec3) VectorShuffle 41 41 0 1 2
|
||||||
|
43: 39(ivec3) IAdd 42 40
|
||||||
|
44: 7(ivec4) Load 9(idata)
|
||||||
|
45: 7(ivec4) VectorShuffle 44 43 4 5 6 3
|
||||||
|
Store 9(idata) 45
|
||||||
|
49: 46(fvec4) Load 48(f4)
|
||||||
|
50: 7(ivec4) Bitcast 49
|
||||||
|
51: 7(ivec4) Load 9(idata)
|
||||||
|
52: 7(ivec4) IAdd 51 50
|
||||||
|
Store 9(idata) 52
|
||||||
|
Store 55(udata) 56
|
||||||
|
57: 12(float) Load 14(f1)
|
||||||
|
58: 17(int) Bitcast 57
|
||||||
|
60: 59(ptr) AccessChain 55(udata) 18
|
||||||
|
61: 17(int) Load 60
|
||||||
|
62: 17(int) IAdd 61 58
|
||||||
|
63: 59(ptr) AccessChain 55(udata) 18
|
||||||
|
Store 63 62
|
||||||
|
64: 24(fvec2) Load 26(f2)
|
||||||
|
66: 65(ivec2) Bitcast 64
|
||||||
|
67: 53(ivec4) Load 55(udata)
|
||||||
|
68: 65(ivec2) VectorShuffle 67 67 0 1
|
||||||
|
69: 65(ivec2) IAdd 68 66
|
||||||
|
70: 53(ivec4) Load 55(udata)
|
||||||
|
71: 53(ivec4) VectorShuffle 70 69 4 5 2 3
|
||||||
|
Store 55(udata) 71
|
||||||
|
72: 35(fvec3) Load 37(f3)
|
||||||
|
74: 73(ivec3) Bitcast 72
|
||||||
|
75: 53(ivec4) Load 55(udata)
|
||||||
|
76: 73(ivec3) VectorShuffle 75 75 0 1 2
|
||||||
|
77: 73(ivec3) IAdd 76 74
|
||||||
|
78: 53(ivec4) Load 55(udata)
|
||||||
|
79: 53(ivec4) VectorShuffle 78 77 4 5 6 3
|
||||||
|
Store 55(udata) 79
|
||||||
|
80: 46(fvec4) Load 48(f4)
|
||||||
|
81: 53(ivec4) Bitcast 80
|
||||||
|
82: 53(ivec4) Load 55(udata)
|
||||||
|
83: 53(ivec4) IAdd 82 81
|
||||||
|
Store 55(udata) 83
|
||||||
|
Store 85(fdata) 87
|
||||||
|
90: 6(int) Load 89(i1)
|
||||||
|
91: 12(float) Bitcast 90
|
||||||
|
93: 92(ptr) AccessChain 85(fdata) 18
|
||||||
|
94: 12(float) Load 93
|
||||||
|
95: 12(float) FAdd 94 91
|
||||||
|
96: 92(ptr) AccessChain 85(fdata) 18
|
||||||
|
Store 96 95
|
||||||
|
99: 28(ivec2) Load 98(i2)
|
||||||
|
100: 24(fvec2) Bitcast 99
|
||||||
|
101: 46(fvec4) Load 85(fdata)
|
||||||
|
102: 24(fvec2) VectorShuffle 101 101 0 1
|
||||||
|
103: 24(fvec2) FAdd 102 100
|
||||||
|
104: 46(fvec4) Load 85(fdata)
|
||||||
|
105: 46(fvec4) VectorShuffle 104 103 4 5 2 3
|
||||||
|
Store 85(fdata) 105
|
||||||
|
108: 39(ivec3) Load 107(i3)
|
||||||
|
109: 35(fvec3) Bitcast 108
|
||||||
|
110: 46(fvec4) Load 85(fdata)
|
||||||
|
111: 35(fvec3) VectorShuffle 110 110 0 1 2
|
||||||
|
112: 35(fvec3) FAdd 111 109
|
||||||
|
113: 46(fvec4) Load 85(fdata)
|
||||||
|
114: 46(fvec4) VectorShuffle 113 112 4 5 6 3
|
||||||
|
Store 85(fdata) 114
|
||||||
|
117: 7(ivec4) Load 116(i4)
|
||||||
|
118: 46(fvec4) Bitcast 117
|
||||||
|
119: 46(fvec4) Load 85(fdata)
|
||||||
|
120: 46(fvec4) FAdd 119 118
|
||||||
|
Store 85(fdata) 120
|
||||||
|
123: 17(int) Load 122(u1)
|
||||||
|
124: 12(float) Bitcast 123
|
||||||
|
125: 92(ptr) AccessChain 85(fdata) 18
|
||||||
|
126: 12(float) Load 125
|
||||||
|
127: 12(float) FAdd 126 124
|
||||||
|
128: 92(ptr) AccessChain 85(fdata) 18
|
||||||
|
Store 128 127
|
||||||
|
131: 65(ivec2) Load 130(u2)
|
||||||
|
132: 24(fvec2) Bitcast 131
|
||||||
|
133: 46(fvec4) Load 85(fdata)
|
||||||
|
134: 24(fvec2) VectorShuffle 133 133 0 1
|
||||||
|
135: 24(fvec2) FAdd 134 132
|
||||||
|
136: 46(fvec4) Load 85(fdata)
|
||||||
|
137: 46(fvec4) VectorShuffle 136 135 4 5 2 3
|
||||||
|
Store 85(fdata) 137
|
||||||
|
140: 73(ivec3) Load 139(u3)
|
||||||
|
141: 35(fvec3) Bitcast 140
|
||||||
|
142: 46(fvec4) Load 85(fdata)
|
||||||
|
143: 35(fvec3) VectorShuffle 142 142 0 1 2
|
||||||
|
144: 35(fvec3) FAdd 143 141
|
||||||
|
145: 46(fvec4) Load 85(fdata)
|
||||||
|
146: 46(fvec4) VectorShuffle 145 144 4 5 6 3
|
||||||
|
Store 85(fdata) 146
|
||||||
|
149: 53(ivec4) Load 148(u4)
|
||||||
|
150: 46(fvec4) Bitcast 149
|
||||||
|
151: 46(fvec4) Load 85(fdata)
|
||||||
|
152: 46(fvec4) FAdd 151 150
|
||||||
|
Store 85(fdata) 152
|
||||||
|
156: 7(ivec4) Load 9(idata)
|
||||||
|
157: 53(ivec4) Bitcast 156
|
||||||
|
158: 53(ivec4) Load 55(udata)
|
||||||
|
161: 160(bvec4) IEqual 157 158
|
||||||
|
162: 159(bool) All 161
|
||||||
|
SelectionMerge 164 None
|
||||||
|
BranchConditional 162 163 166
|
||||||
|
163: Label
|
||||||
|
165: 46(fvec4) Load 85(fdata)
|
||||||
|
Store 155 165
|
||||||
|
Branch 164
|
||||||
|
166: Label
|
||||||
|
167: 46(fvec4) Load 85(fdata)
|
||||||
|
170: 46(fvec4) FAdd 167 169
|
||||||
|
Store 155 170
|
||||||
|
Branch 164
|
||||||
|
164: Label
|
||||||
|
171: 46(fvec4) Load 155
|
||||||
|
Store 154(fragColor) 171
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
45
Test/spv.bitCast.frag
Normal file
45
Test/spv.bitCast.frag
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
uniform int i1;
|
||||||
|
uniform ivec2 i2;
|
||||||
|
uniform ivec3 i3;
|
||||||
|
uniform ivec4 i4;
|
||||||
|
|
||||||
|
uniform uint u1;
|
||||||
|
uniform uvec2 u2;
|
||||||
|
uniform uvec3 u3;
|
||||||
|
uniform uvec4 u4;
|
||||||
|
|
||||||
|
uniform float f1;
|
||||||
|
uniform vec2 f2;
|
||||||
|
uniform vec3 f3;
|
||||||
|
uniform vec4 f4;
|
||||||
|
|
||||||
|
out vec4 fragColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec4 idata = ivec4(0);
|
||||||
|
idata.x += floatBitsToInt(f1);
|
||||||
|
idata.xy += floatBitsToInt(f2);
|
||||||
|
idata.xyz += floatBitsToInt(f3);
|
||||||
|
idata += floatBitsToInt(f4);
|
||||||
|
|
||||||
|
uvec4 udata = uvec4(0);
|
||||||
|
udata.x += floatBitsToUint(f1);
|
||||||
|
udata.xy += floatBitsToUint(f2);
|
||||||
|
udata.xyz += floatBitsToUint(f3);
|
||||||
|
udata += floatBitsToUint(f4);
|
||||||
|
|
||||||
|
vec4 fdata = vec4(0.0);
|
||||||
|
fdata.x += intBitsToFloat(i1);
|
||||||
|
fdata.xy += intBitsToFloat(i2);
|
||||||
|
fdata.xyz += intBitsToFloat(i3);
|
||||||
|
fdata += intBitsToFloat(i4);
|
||||||
|
fdata.x += uintBitsToFloat(u1);
|
||||||
|
fdata.xy += uintBitsToFloat(u2);
|
||||||
|
fdata.xyz += uintBitsToFloat(u3);
|
||||||
|
fdata += uintBitsToFloat(u4);
|
||||||
|
|
||||||
|
fragColor = (idata == udata) ? fdata : fdata + vec4(0.2);
|
||||||
|
}
|
@ -30,6 +30,7 @@ spv.accessChain.frag
|
|||||||
spv.aggOps.frag
|
spv.aggOps.frag
|
||||||
spv.always-discard.frag
|
spv.always-discard.frag
|
||||||
spv.always-discard2.frag
|
spv.always-discard2.frag
|
||||||
|
spv.bitCast.frag
|
||||||
spv.bool.vert
|
spv.bool.vert
|
||||||
spv.conditionalDiscard.frag
|
spv.conditionalDiscard.frag
|
||||||
spv.conversion.frag
|
spv.conversion.frag
|
||||||
|
Loading…
x
Reference in New Issue
Block a user