makepad_shader_compiler/
builtin.rs

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}