1use{
2 std::collections::HashMap,
3 crate::{
4 makepad_live_id::{LiveId, live_id},
5 shader_ast::{Ident, ShaderTy}
6 },
7};
8type Ty = ShaderTy;
9
10macro_rules! builtin {
11 ($f:ident, [$(($($a:path),*) -> $b:path),*]) => {
12 (
13 Builtin2 {
14 id: live_id!($f),
15 maps: &[$(
16 (
17 &[
18 $($a),*
19 ],
20 $b
21 )
22 ),*]
23 }
24 )
25 }
26}
27
28pub struct Builtin2<'a>{
29 id: LiveId,
30 maps: &'a [(&'a [Ty], Ty)]
31}
32
33#[derive(Clone, Debug)]
34pub struct Builtin {
35 pub return_tys: HashMap<Vec<Ty>, Ty>,
36}
37
38pub fn generate_builtins()-> HashMap<Ident, Builtin>{
39 fn generate_builtins(x:&[Builtin2])->HashMap<Ident, Builtin>{
40 let mut map = HashMap::new();
41 for b in x{
42 let mut map2 = HashMap::new();
43 for item in b.maps{
44 map2.insert(item.0.to_vec(), item.1.clone());
45 }
46 map.insert(Ident(b.id), Builtin{
47 return_tys: map2
48 });
49 }
50 map
51 }
52 let x = [
53 builtin!(abs, [
54 (Ty::Float) -> Ty::Float,
55 (Ty::Vec2) -> Ty::Vec2,
56 (Ty::Vec3) -> Ty::Vec3,
57 (Ty::Vec4) -> Ty::Vec4,
58 (Ty::Int) -> Ty::Int,
59 (Ty::Ivec2) -> Ty::Ivec2,
60 (Ty::Ivec3) -> Ty::Ivec3,
61 (Ty::Ivec4) -> Ty::Ivec4
62 ]),
63 builtin!(acos, [
64 (Ty::Float) -> Ty::Float,
65 (Ty::Vec2) -> Ty::Vec2,
66 (Ty::Vec3) -> Ty::Vec3,
67 (Ty::Vec4) -> Ty::Vec4
68 ]),
69 builtin!(acos, [
70 (Ty::Float) -> Ty::Float,
71 (Ty::Vec2) -> Ty::Vec2,
72 (Ty::Vec3) -> Ty::Vec3,
73 (Ty::Vec4) -> Ty::Vec4
74 ]),
75 builtin!(all, [
76 (Ty::Bvec2) -> Ty::Bool,
77 (Ty::Bvec3) -> Ty::Bool,
78 (Ty::Bvec4) -> Ty::Bool
79 ]),
80 builtin!(any, [
81 (Ty::Bvec2) -> Ty::Bool,
82 (Ty::Bvec3) -> Ty::Bool,
83 (Ty::Bvec4) -> Ty::Bool
84 ]),
85 builtin!(asin, [
86 (Ty::Float) -> Ty::Float,
87 (Ty::Vec2) -> Ty::Vec2,
88 (Ty::Vec3) -> Ty::Vec3,
89 (Ty::Vec4) -> Ty::Vec4
90 ]),
91 builtin!(atan, [
92 (Ty::Float) -> Ty::Float,
93 (Ty::Vec2) -> Ty::Vec2,
94 (Ty::Vec3) -> Ty::Vec3,
95 (Ty::Vec4) -> Ty::Vec4,
96 (Ty::Float, Ty::Float) -> Ty::Float,
97 (Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
98 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
99 (Ty::Vec4, Ty::Vec4) -> Ty::Vec4
100 ]),
101 builtin!(ceil, [
102 (Ty::Float) -> Ty::Float,
103 (Ty::Vec2) -> Ty::Vec2,
104 (Ty::Vec3) -> Ty::Vec3,
105 (Ty::Vec4) -> Ty::Vec4
106 ]),
107 builtin!(clamp, [
108 (Ty::Float, Ty::Float, Ty::Float) -> Ty::Float,
109 (Ty::Vec2, Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
110 (Ty::Vec3, Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
111 (Ty::Vec4, Ty::Vec4, Ty::Vec4) -> Ty::Vec4,
112 (Ty::Vec2, Ty::Float, Ty::Float) -> Ty::Vec2,
113 (Ty::Vec3, Ty::Float, Ty::Float) -> Ty::Vec3,
114 (Ty::Vec4, Ty::Float, Ty::Float) -> Ty::Vec4
115 ]),
116 builtin!(cos, [
117 (Ty::Float) -> Ty::Float,
118 (Ty::Vec2) -> Ty::Vec2,
119 (Ty::Vec3) -> Ty::Vec3,
120 (Ty::Vec4) -> Ty::Vec4
121 ]),
122 builtin!(cross, [
123 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3
124 ]),
125 builtin!(degrees, [
126 (Ty::Float) -> Ty::Float,
127 (Ty::Vec2) -> Ty::Vec2,
128 (Ty::Vec3) -> Ty::Vec3,
129 (Ty::Vec4) -> Ty::Vec4
130 ]),
131 builtin!(dFdx, [
132 (Ty::Float) -> Ty::Float,
133 (Ty::Vec2) -> Ty::Vec2,
134 (Ty::Vec3) -> Ty::Vec3,
135 (Ty::Vec4) -> Ty::Vec4
136 ]),
137 builtin!(dFdy, [
138 (Ty::Float) -> Ty::Float,
139 (Ty::Vec2) -> Ty::Vec2,
140 (Ty::Vec3) -> Ty::Vec3,
141 (Ty::Vec4) -> Ty::Vec4
142 ]),
143 builtin!(distance, [
144 (Ty::Float, Ty::Float) -> Ty::Float,
145 (Ty::Vec2, Ty::Vec2) -> Ty::Float,
146 (Ty::Vec3, Ty::Vec3) -> Ty::Float,
147 (Ty::Vec4, Ty::Vec4) -> Ty::Float
148 ]),
149 builtin!(dot, [
150 (Ty::Float, Ty::Float) -> Ty::Float,
151 (Ty::Vec2, Ty::Vec2) -> Ty::Float,
152 (Ty::Vec3, Ty::Vec3) -> Ty::Float,
153 (Ty::Vec4, Ty::Vec4) -> Ty::Float
154 ]),
155 builtin!(equal, [
156 (Ty::Bvec2, Ty::Bvec2) -> Ty::Bvec2,
157 (Ty::Bvec3, Ty::Bvec3) -> Ty::Bvec3,
158 (Ty::Bvec4, Ty::Bvec4) -> Ty::Bvec4,
159 (Ty::Ivec2, Ty::Ivec2) -> Ty::Bvec2,
160 (Ty::Ivec3, Ty::Ivec3) -> Ty::Bvec3,
161 (Ty::Ivec4, Ty::Ivec4) -> Ty::Bvec4,
162 (Ty::Vec2, Ty::Vec2) -> Ty::Bvec2,
163 (Ty::Vec3, Ty::Vec3) -> Ty::Bvec3,
164 (Ty::Vec4, Ty::Vec4) -> Ty::Bvec4
165 ]),
166 builtin!(exp, [
167 (Ty::Float) -> Ty::Float,
168 (Ty::Vec2) -> Ty::Vec2,
169 (Ty::Vec3) -> Ty::Vec3,
170 (Ty::Vec4) -> Ty::Vec4
171 ]),
172 builtin!(exp2, [
173 (Ty::Float) -> Ty::Float,
174 (Ty::Vec2) -> Ty::Vec2,
175 (Ty::Vec3) -> Ty::Vec3,
176 (Ty::Vec4) -> Ty::Vec4
177 ]),
178 builtin!(faceforward, [
179 (Ty::Float, Ty::Float, Ty::Float) -> Ty::Float,
180 (Ty::Vec2, Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
181 (Ty::Vec3, Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
182 (Ty::Vec4, Ty::Vec4, Ty::Vec4) -> Ty::Vec4
183 ]),
184 builtin!(floor, [
185 (Ty::Float) -> Ty::Float,
186 (Ty::Vec2) -> Ty::Vec2,
187 (Ty::Vec3) -> Ty::Vec3,
188 (Ty::Vec4) -> Ty::Vec4
189 ]),
190 builtin!(fract, [
191 (Ty::Float) -> Ty::Float,
192 (Ty::Vec2) -> Ty::Vec2,
193 (Ty::Vec3) -> Ty::Vec3,
194 (Ty::Vec4) -> Ty::Vec4
195 ]),
196 builtin!(greaterThan, [
197 (Ty::Ivec2, Ty::Ivec2) -> Ty::Bvec2,
198 (Ty::Ivec3, Ty::Ivec3) -> Ty::Bvec3,
199 (Ty::Ivec4, Ty::Ivec4) -> Ty::Bvec4,
200 (Ty::Vec2, Ty::Vec2) -> Ty::Bvec2,
201 (Ty::Vec3, Ty::Vec3) -> Ty::Bvec3,
202 (Ty::Vec4, Ty::Vec4) -> Ty::Bvec4
203 ]),
204 builtin!(greaterThanEqual, [
205 (Ty::Ivec2, Ty::Ivec2) -> Ty::Bvec2,
206 (Ty::Ivec3, Ty::Ivec3) -> Ty::Bvec3,
207 (Ty::Ivec4, Ty::Ivec4) -> Ty::Bvec4,
208 (Ty::Vec2, Ty::Vec2) -> Ty::Bvec2,
209 (Ty::Vec3, Ty::Vec3) -> Ty::Bvec3,
210 (Ty::Vec4, Ty::Vec4) -> Ty::Bvec4
211 ]),
212 builtin!(inversesqrt, [
213 (Ty::Float) -> Ty::Float,
214 (Ty::Vec2) -> Ty::Vec2,
215 (Ty::Vec3) -> Ty::Vec3,
216 (Ty::Vec4) -> Ty::Vec4
217 ]),
218 builtin!(inverse, [
219 (Ty::Mat4) -> Ty::Mat4
220 ]),
221 builtin!(length, [
222 (Ty::Float) -> Ty::Float,
223 (Ty::Vec2) -> Ty::Float,
224 (Ty::Vec3) -> Ty::Float,
225 (Ty::Vec4) -> Ty::Float
226 ]),
227 builtin!(lessThan, [
228 (Ty::Ivec2, Ty::Ivec2) -> Ty::Bvec2,
229 (Ty::Ivec3, Ty::Ivec3) -> Ty::Bvec3,
230 (Ty::Ivec4, Ty::Ivec4) -> Ty::Bvec4,
231 (Ty::Vec2, Ty::Vec2) -> Ty::Bvec2,
232 (Ty::Vec3, Ty::Vec3) -> Ty::Bvec3,
233 (Ty::Vec4, Ty::Vec4) -> Ty::Bvec4
234 ]),
235 builtin!(lessThanEqual, [
236 (Ty::Ivec2, Ty::Ivec2) -> Ty::Bvec2,
237 (Ty::Ivec3, Ty::Ivec3) -> Ty::Bvec3,
238 (Ty::Ivec4, Ty::Ivec4) -> Ty::Bvec4,
239 (Ty::Vec2, Ty::Vec2) -> Ty::Bvec2,
240 (Ty::Vec3, Ty::Vec3) -> Ty::Bvec3,
241 (Ty::Vec4, Ty::Vec4) -> Ty::Bvec4
242 ]),
243 builtin!(log, [
244 (Ty::Float) -> Ty::Float,
245 (Ty::Vec2) -> Ty::Vec2,
246 (Ty::Vec3) -> Ty::Vec3,
247 (Ty::Vec4) -> Ty::Vec4
248 ]),
249 builtin!(log2, [
250 (Ty::Float) -> Ty::Float,
251 (Ty::Vec2) -> Ty::Vec2,
252 (Ty::Vec3) -> Ty::Vec3,
253 (Ty::Vec4) -> Ty::Vec4
254 ]),
255 builtin!(matrixCompMult, [
256 (Ty::Mat2, Ty::Mat2) -> Ty::Mat2,
257 (Ty::Mat3, Ty::Mat3) -> Ty::Mat3,
258 (Ty::Mat4, Ty::Mat4) -> Ty::Mat4
259 ]),
260 builtin!(max, [
261 (Ty::Float, Ty::Float) -> Ty::Float,
262 (Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
263 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
264 (Ty::Vec4, Ty::Vec4) -> Ty::Vec4,
265 (Ty::Vec2, Ty::Float) -> Ty::Vec2,
266 (Ty::Vec3, Ty::Float) -> Ty::Vec3,
267 (Ty::Vec4, Ty::Float) -> Ty::Vec4
268 ]),
269 builtin!(min, [
270 (Ty::Float, Ty::Float) -> Ty::Float,
271 (Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
272 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
273 (Ty::Vec4, Ty::Vec4) -> Ty::Vec4,
274 (Ty::Vec2, Ty::Float) -> Ty::Vec2,
275 (Ty::Vec3, Ty::Float) -> Ty::Vec3,
276 (Ty::Vec4, Ty::Float) -> Ty::Vec4
277 ]),
278 builtin!(mix, [
279 (Ty::Float, Ty::Float, Ty::Float) -> Ty::Float,
280 (Ty::Vec2, Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
281 (Ty::Vec3, Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
282 (Ty::Vec4, Ty::Vec4, Ty::Vec4) -> Ty::Vec4,
283 (Ty::Vec2, Ty::Vec2, Ty::Float) -> Ty::Vec2,
284 (Ty::Vec3, Ty::Vec3, Ty::Float) -> Ty::Vec3,
285 (Ty::Vec4, Ty::Vec4, Ty::Float) -> Ty::Vec4
286 ]),
287 builtin!(mod, [
288 (Ty::Float, Ty::Float) -> Ty::Float,
289 (Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
290 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
291 (Ty::Vec4, Ty::Vec4) -> Ty::Vec4,
292 (Ty::Vec2, Ty::Float) -> Ty::Vec2,
293 (Ty::Vec3, Ty::Float) -> Ty::Vec3,
294 (Ty::Vec4, Ty::Float) -> Ty::Vec4
295 ]),
296 builtin!(normalize, [
297 (Ty::Float) -> Ty::Float,
298 (Ty::Vec2) -> Ty::Vec2,
299 (Ty::Vec3) -> Ty::Vec3,
300 (Ty::Vec4) -> Ty::Vec4
301 ]),
302 builtin!(not, [
303 (Ty::Bvec2) -> Ty::Bvec2,
304 (Ty::Bvec3) -> Ty::Bvec3,
305 (Ty::Bvec4) -> Ty::Bvec4
306 ]),
307 builtin!(notEqual, [
308 (Ty::Bvec2, Ty::Bvec2) -> Ty::Bvec2,
309 (Ty::Bvec3, Ty::Bvec3) -> Ty::Bvec3,
310 (Ty::Bvec4, Ty::Bvec4) -> Ty::Bvec4,
311 (Ty::Ivec2, Ty::Ivec2) -> Ty::Bvec2,
312 (Ty::Ivec3, Ty::Ivec3) -> Ty::Bvec3,
313 (Ty::Ivec4, Ty::Ivec4) -> Ty::Bvec4,
314 (Ty::Vec2, Ty::Vec2) -> Ty::Bvec2,
315 (Ty::Vec3, Ty::Vec3) -> Ty::Bvec3,
316 (Ty::Vec4, Ty::Vec4) -> Ty::Bvec4
317 ]),
318 builtin!(pow, [
319 (Ty::Float, Ty::Float) -> Ty::Float,
320 (Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
321 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
322 (Ty::Vec4, Ty::Vec4) -> Ty::Vec4
323 ]),
324 builtin!(radians, [
325 (Ty::Float) -> Ty::Float,
326 (Ty::Vec2) -> Ty::Vec2,
327 (Ty::Vec3) -> Ty::Vec3,
328 (Ty::Vec4) -> Ty::Vec4
329 ]),
330 builtin!(reflect, [
331 (Ty::Float, Ty::Float) -> Ty::Float,
332 (Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
333 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
334 (Ty::Vec4, Ty::Vec4) -> Ty::Vec4
335 ]),
336 builtin!(refract, [
337 (Ty::Float, Ty::Float, Ty::Float) -> Ty::Float,
338 (Ty::Vec2, Ty::Vec2, Ty::Float) -> Ty::Vec2,
339 (Ty::Vec3, Ty::Vec3, Ty::Float) -> Ty::Vec3,
340 (Ty::Vec4, Ty::Vec4, Ty::Float) -> Ty::Vec4
341 ]),
342 builtin!(sample2d, [
343 (Ty::Texture2D, Ty::Vec2) -> Ty::Vec4
344 ]),
345 builtin!(sample2d_rt, [
346 (Ty::Texture2D, Ty::Vec2) -> Ty::Vec4
347 ]),
348 builtin!(sample2dOES, [
349 (Ty::TextureOES, Ty::Vec2) -> Ty::Vec4
350 ]),
351 builtin!(depth_clip, [
352 (Ty::Vec4, Ty::Vec4, Ty::Float) -> Ty::Vec4
353 ]),
354 builtin!(sign, [
355 (Ty::Float) -> Ty::Float,
356 (Ty::Vec2) -> Ty::Vec2,
357 (Ty::Vec3) -> Ty::Vec3,
358 (Ty::Vec4) -> Ty::Vec4
359 ]),
360 builtin!(sin, [
361 (Ty::Float) -> Ty::Float,
362 (Ty::Vec2) -> Ty::Vec2,
363 (Ty::Vec3) -> Ty::Vec3,
364 (Ty::Vec4) -> Ty::Vec4
365 ]),
366 builtin!(smoothstep, [
367 (Ty::Float, Ty::Float, Ty::Float) -> Ty::Float,
368 (Ty::Vec2, Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
369 (Ty::Vec3, Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
370 (Ty::Vec4, Ty::Vec4, Ty::Vec4) -> Ty::Vec4,
371 (Ty::Float, Ty::Float, Ty::Vec2) -> Ty::Vec2,
372 (Ty::Float, Ty::Float, Ty::Vec3) -> Ty::Vec3,
373 (Ty::Float, Ty::Float, Ty::Vec4) -> Ty::Vec4
374 ]),
375 builtin!(sqrt, [
376 (Ty::Float) -> Ty::Float,
377 (Ty::Vec2) -> Ty::Vec2,
378 (Ty::Vec3) -> Ty::Vec3,
379 (Ty::Vec4) -> Ty::Vec4
380 ]),
381 builtin!(step, [
382 (Ty::Float, Ty::Float) -> Ty::Float,
383 (Ty::Float, Ty::Vec2) -> Ty::Vec2,
384 (Ty::Float, Ty::Vec3) -> Ty::Vec3,
385 (Ty::Float, Ty::Vec4) -> Ty::Vec4,
386 (Ty::Vec2, Ty::Vec2) -> Ty::Vec2,
387 (Ty::Vec3, Ty::Vec3) -> Ty::Vec3,
388 (Ty::Vec4, Ty::Vec4) -> Ty::Vec4
389 ]),
390 builtin!(tan, [
391 (Ty::Float) -> Ty::Float,
392 (Ty::Vec2) -> Ty::Vec2,
393 (Ty::Vec3) -> Ty::Vec3,
394 (Ty::Vec4) -> Ty::Vec4
395 ]),
396 builtin!(transpose, [
397 (Ty::Mat4) -> Ty::Mat4,
398 (Ty::Mat3) -> Ty::Mat3
399 ]),
400
401 ];
402 generate_builtins(&x)
403}