glsl: Explicitly specify a type when reading/printing ir_texture.
[mesa.git] / src / glsl / builtins / tools / texture_builtins.py
1 #!/usr/bin/python
2
3 import sys
4 import StringIO
5
6 # Bitfield constants for the 'variant' argument to generate_sigs
7 Proj = 1
8 Offset = 2
9 Single = 4
10
11 def vec_type(g, size):
12 if size == 1:
13 if g == "i":
14 return "int"
15 elif g == "u":
16 return "uint"
17 return "float"
18 return g + "vec" + str(size)
19
20 # Get the sampler dimension - i.e. sampler3D gives 3
21 def get_sampler_dim(sampler_type):
22 if sampler_type[0].isdigit():
23 sampler_dim = int(sampler_type[0])
24 elif sampler_type.startswith("Cube"):
25 sampler_dim = 3
26 else:
27 assert False ("coord_dim: invalid sampler_type: " + sampler_type)
28 return sampler_dim
29
30 # Get the coordinate dimension for a given sampler type.
31 # Array samplers also get +1 here since the layer is really an extra coordinate
32 def get_coord_dim(sampler_type):
33 coord_dim = get_sampler_dim(sampler_type)
34 if sampler_type.find("Array") != -1:
35 coord_dim += 1
36 return coord_dim
37
38 # Get the number of extra vector components (i.e. shadow comparitor)
39 def get_extra_dim(sampler_type, use_proj, unused_fields):
40 extra_dim = unused_fields
41 if sampler_type.find("Shadow") != -1:
42 extra_dim += 1
43 if use_proj:
44 extra_dim += 1
45 return extra_dim
46
47 def generate_sigs(g, tex_inst, sampler_type, variant = 0, unused_fields = 0):
48 coord_dim = get_coord_dim(sampler_type)
49 extra_dim = get_extra_dim(sampler_type, variant & Proj, unused_fields)
50 offset_dim = get_sampler_dim(sampler_type)
51
52 if variant & Single:
53 return_type = "float"
54 else:
55 return_type = g + "vec4"
56
57 # Print parameters
58 print " (signature", return_type
59 print " (parameters"
60 print " (declare (in) " + g + "sampler" + sampler_type + " sampler)"
61 print " (declare (in) " + vec_type("i" if tex_inst == "txf" else "", coord_dim + extra_dim) + " P)",
62 if tex_inst == "txl":
63 print "\n (declare (in) float lod)",
64 elif tex_inst == "txf":
65 print "\n (declare (in) int lod)",
66 elif tex_inst == "txd":
67 grad_type = vec_type("", coord_dim)
68 print "\n (declare (in) " + grad_type + " dPdx)",
69 print "\n (declare (in) " + grad_type + " dPdy)",
70
71 if variant & Offset:
72 print "\n (declare (const_in) " + vec_type("i", offset_dim) + " offset)",
73 if tex_inst == "txb":
74 print "\n (declare (in) float bias)",
75
76 print ")\n ((return (" + tex_inst, return_type, "(var_ref sampler)",
77
78 # Coordinate
79 if extra_dim > 0:
80 print "(swiz " + "xyzw"[:coord_dim] + " (var_ref P))",
81 else:
82 print "(var_ref P)",
83
84 if variant & Offset:
85 print "(var_ref offset)",
86 else:
87 print "0",
88
89 if tex_inst != "txf":
90 # Projective divisor
91 if variant & Proj:
92 print "(swiz " + "xyzw"[coord_dim + extra_dim-1] + " (var_ref P))",
93 else:
94 print "1",
95
96 # Shadow comparitor
97 if sampler_type == "2DArrayShadow": # a special case:
98 print "(swiz w (var_ref P))", # ...array layer is z; shadow is w
99 elif sampler_type.endswith("Shadow"):
100 print "(swiz z (var_ref P))",
101 else:
102 print "()",
103
104 # Bias/explicit LOD/gradient:
105 if tex_inst == "txb":
106 print "(var_ref bias)",
107 elif tex_inst == "txl" or tex_inst == "txf":
108 print "(var_ref lod)",
109 elif tex_inst == "txd":
110 print "((var_ref dPdx) (var_ref dPdy))",
111 print "))))\n"
112
113 def generate_fiu_sigs(tex_inst, sampler_type, variant = 0, unused_fields = 0):
114 generate_sigs("", tex_inst, sampler_type, variant, unused_fields)
115 generate_sigs("i", tex_inst, sampler_type, variant, unused_fields)
116 generate_sigs("u", tex_inst, sampler_type, variant, unused_fields)
117
118 def start_function(name):
119 sys.stdout = StringIO.StringIO()
120 print "((function " + name
121
122 def end_function(fs, name):
123 print "))"
124 fs[name] = sys.stdout.getvalue();
125 sys.stdout.close()
126
127 # Generate all the functions and store them in the supplied dictionary.
128 # This is better than writing them to actual files since they should never be
129 # edited; it'd also be easy to confuse them with the many hand-generated files.
130 #
131 # Takes a dictionary as an argument.
132 def generate_texture_functions(fs):
133 start_function("texture")
134 generate_fiu_sigs("tex", "1D")
135 generate_fiu_sigs("tex", "2D")
136 generate_fiu_sigs("tex", "3D")
137 generate_fiu_sigs("tex", "Cube")
138 generate_fiu_sigs("tex", "1DArray")
139 generate_fiu_sigs("tex", "2DArray")
140 generate_sigs("", "tex", "1DShadow", Single, 1);
141 generate_sigs("", "tex", "2DShadow", Single);
142 generate_sigs("", "tex", "CubeShadow", Single);
143 generate_sigs("", "tex", "1DArrayShadow", Single);
144 generate_sigs("", "tex", "2DArrayShadow", Single);
145
146 generate_fiu_sigs("txb", "1D")
147 generate_fiu_sigs("txb", "2D")
148 generate_fiu_sigs("txb", "3D")
149 generate_fiu_sigs("txb", "Cube")
150 generate_fiu_sigs("txb", "1DArray")
151 generate_fiu_sigs("txb", "2DArray")
152 generate_sigs("", "txb", "1DShadow", Single, 1);
153 generate_sigs("", "txb", "2DShadow", Single);
154 generate_sigs("", "txb", "CubeShadow", Single);
155 generate_sigs("", "txb", "1DArrayShadow", Single);
156 generate_sigs("", "txb", "2DArrayShadow", Single);
157 end_function(fs, "texture")
158
159 start_function("textureProj")
160 generate_fiu_sigs("tex", "1D", Proj)
161 generate_fiu_sigs("tex", "1D", Proj, 2)
162 generate_fiu_sigs("tex", "2D", Proj)
163 generate_fiu_sigs("tex", "2D", Proj, 1)
164 generate_fiu_sigs("tex", "3D", Proj)
165 generate_sigs("", "tex", "1DShadow", Proj | Single, 1);
166 generate_sigs("", "tex", "2DShadow", Proj | Single);
167
168 generate_fiu_sigs("txb", "1D", Proj)
169 generate_fiu_sigs("txb", "1D", Proj, 2)
170 generate_fiu_sigs("txb", "2D", Proj)
171 generate_fiu_sigs("txb", "2D", Proj, 1)
172 generate_fiu_sigs("txb", "3D", Proj)
173 generate_sigs("", "txb", "1DShadow", Proj | Single, 1);
174 generate_sigs("", "txb", "2DShadow", Proj | Single);
175 end_function(fs, "textureProj")
176
177 start_function("textureLod")
178 generate_fiu_sigs("txl", "1D")
179 generate_fiu_sigs("txl", "2D")
180 generate_fiu_sigs("txl", "3D")
181 generate_fiu_sigs("txl", "Cube")
182 generate_fiu_sigs("txl", "1DArray")
183 generate_fiu_sigs("txl", "2DArray")
184 generate_sigs("", "txl", "1DShadow", Single, 1);
185 generate_sigs("", "txl", "2DShadow", Single);
186 generate_sigs("", "txl", "1DArrayShadow", Single);
187 end_function(fs, "textureLod")
188
189 start_function("textureLodOffset")
190 generate_fiu_sigs("txl", "1D", Offset)
191 generate_fiu_sigs("txl", "2D", Offset)
192 generate_fiu_sigs("txl", "3D", Offset)
193 generate_fiu_sigs("txl", "1DArray", Offset)
194 generate_fiu_sigs("txl", "2DArray", Offset)
195 generate_sigs("", "txl", "1DShadow", Offset | Single, 1);
196 generate_sigs("", "txl", "2DShadow", Offset | Single);
197 generate_sigs("", "txl", "1DArrayShadow", Offset | Single);
198 end_function(fs, "textureLodOffset")
199
200 start_function("textureOffset")
201 generate_fiu_sigs("tex", "1D", Offset)
202 generate_fiu_sigs("tex", "2D", Offset)
203 generate_fiu_sigs("tex", "3D", Offset)
204 generate_fiu_sigs("tex", "1DArray", Offset)
205 generate_fiu_sigs("tex", "2DArray", Offset)
206 generate_sigs("", "tex", "1DShadow", Offset | Single, 1);
207 generate_sigs("", "tex", "2DShadow", Offset | Single);
208 generate_sigs("", "tex", "1DArrayShadow", Offset | Single);
209
210 generate_fiu_sigs("txb", "1D", Offset)
211 generate_fiu_sigs("txb", "2D", Offset)
212 generate_fiu_sigs("txb", "3D", Offset)
213 generate_fiu_sigs("txb", "1DArray", Offset)
214 generate_fiu_sigs("txb", "2DArray", Offset)
215 generate_sigs("", "txb", "1DShadow", Offset | Single, 1);
216 generate_sigs("", "txb", "2DShadow", Offset | Single);
217 generate_sigs("", "txb", "1DArrayShadow", Offset | Single);
218 end_function(fs, "textureOffset")
219
220 start_function("texelFetch")
221 generate_fiu_sigs("txf", "1D")
222 generate_fiu_sigs("txf", "2D")
223 generate_fiu_sigs("txf", "3D")
224 generate_fiu_sigs("txf", "1DArray")
225 generate_fiu_sigs("txf", "2DArray")
226 end_function(fs, "texelFetch")
227
228 start_function("texelFetchOffset")
229 generate_fiu_sigs("txf", "1D", Offset)
230 generate_fiu_sigs("txf", "2D", Offset)
231 generate_fiu_sigs("txf", "3D", Offset)
232 generate_fiu_sigs("txf", "1DArray", Offset)
233 generate_fiu_sigs("txf", "2DArray", Offset)
234 end_function(fs, "texelFetchOffset")
235
236 start_function("textureProjOffset")
237 generate_fiu_sigs("tex", "1D", Proj | Offset)
238 generate_fiu_sigs("tex", "1D", Proj | Offset, 2)
239 generate_fiu_sigs("tex", "2D", Proj | Offset)
240 generate_fiu_sigs("tex", "2D", Proj | Offset, 1)
241 generate_fiu_sigs("tex", "3D", Proj | Offset)
242 generate_sigs("", "tex", "1DShadow", Proj | Offset | Single, 1);
243 generate_sigs("", "tex", "2DShadow", Proj | Offset | Single);
244
245 generate_fiu_sigs("txb", "1D", Proj | Offset)
246 generate_fiu_sigs("txb", "1D", Proj | Offset, 2)
247 generate_fiu_sigs("txb", "2D", Proj | Offset)
248 generate_fiu_sigs("txb", "2D", Proj | Offset, 1)
249 generate_fiu_sigs("txb", "3D", Proj | Offset)
250 generate_sigs("", "txb", "1DShadow", Proj | Offset | Single, 1);
251 generate_sigs("", "txb", "2DShadow", Proj | Offset | Single);
252 end_function(fs, "textureProjOffset")
253
254 start_function("textureProjLod")
255 generate_fiu_sigs("txl", "1D", Proj)
256 generate_fiu_sigs("txl", "1D", Proj, 2)
257 generate_fiu_sigs("txl", "2D", Proj)
258 generate_fiu_sigs("txl", "2D", Proj, 1)
259 generate_fiu_sigs("txl", "3D", Proj)
260 generate_sigs("", "txl", "1DShadow", Proj | Single, 1);
261 generate_sigs("", "txl", "2DShadow", Proj | Single);
262 end_function(fs, "textureProjLod")
263
264 start_function("textureProjLodOffset")
265 generate_fiu_sigs("txl", "1D", Proj | Offset)
266 generate_fiu_sigs("txl", "1D", Proj | Offset, 2)
267 generate_fiu_sigs("txl", "2D", Proj | Offset)
268 generate_fiu_sigs("txl", "2D", Proj | Offset, 1)
269 generate_fiu_sigs("txl", "3D", Proj | Offset)
270 generate_sigs("", "txl", "1DShadow", Proj | Offset | Single, 1);
271 generate_sigs("", "txl", "2DShadow", Proj | Offset | Single);
272 end_function(fs, "textureProjLodOffset")
273
274 start_function("textureGrad")
275 generate_fiu_sigs("txd", "1D")
276 generate_fiu_sigs("txd", "2D")
277 generate_fiu_sigs("txd", "3D")
278 generate_fiu_sigs("txd", "Cube")
279 generate_fiu_sigs("txd", "1DArray")
280 generate_fiu_sigs("txd", "2DArray")
281 generate_sigs("", "txd", "1DShadow", Single, 1);
282 generate_sigs("", "txd", "2DShadow", Single);
283 generate_sigs("", "txd", "CubeShadow", Single);
284 generate_sigs("", "txd", "1DArrayShadow", Single);
285 generate_sigs("", "txd", "2DArrayShadow", Single);
286 end_function(fs, "textureGrad")
287
288 start_function("textureGradOffset")
289 generate_fiu_sigs("txd", "1D", Offset)
290 generate_fiu_sigs("txd", "2D", Offset)
291 generate_fiu_sigs("txd", "3D", Offset)
292 generate_fiu_sigs("txd", "Cube", Offset)
293 generate_fiu_sigs("txd", "1DArray", Offset)
294 generate_fiu_sigs("txd", "2DArray", Offset)
295 generate_sigs("", "txd", "1DShadow", Offset | Single, 1);
296 generate_sigs("", "txd", "2DShadow", Offset | Single);
297 generate_sigs("", "txd", "1DArrayShadow", Offset | Single);
298 generate_sigs("", "txd", "2DArrayShadow", Offset | Single);
299 end_function(fs, "textureGradOffset")
300
301 start_function("textureProjGrad")
302 generate_fiu_sigs("txd", "1D", Proj)
303 generate_fiu_sigs("txd", "1D", Proj, 2)
304 generate_fiu_sigs("txd", "2D", Proj)
305 generate_fiu_sigs("txd", "2D", Proj, 1)
306 generate_fiu_sigs("txd", "3D", Proj)
307 generate_sigs("", "txd", "1DShadow", Proj | Single, 1);
308 generate_sigs("", "txd", "2DShadow", Proj | Single);
309 end_function(fs, "textureProjGrad")
310
311 start_function("textureProjGradOffset")
312 generate_fiu_sigs("txd", "1D", Proj | Offset)
313 generate_fiu_sigs("txd", "1D", Proj | Offset, 2)
314 generate_fiu_sigs("txd", "2D", Proj | Offset)
315 generate_fiu_sigs("txd", "2D", Proj | Offset, 1)
316 generate_fiu_sigs("txd", "3D", Proj | Offset)
317 generate_sigs("", "txd", "1DShadow", Proj | Offset | Single, 1);
318 generate_sigs("", "txd", "2DShadow", Proj | Offset | Single);
319 end_function(fs, "textureProjGradOffset")
320
321
322 # ARB_texture_rectangle extension
323 start_function("texture2DRect")
324 generate_sigs("", "tex", "2DRect")
325 end_function(fs, "texture2DRect")
326
327 start_function("texture2DRectProj")
328 generate_sigs("", "tex", "2DRect", Proj)
329 generate_sigs("", "tex", "2DRect", Proj, 1)
330 end_function(fs, "texture2DRectProj")
331
332 start_function("shadow2DRect")
333 generate_sigs("", "tex", "2DRectShadow")
334 end_function(fs, "shadow2DRect")
335
336 start_function("shadow2DRectProj")
337 generate_sigs("", "tex", "2DRectShadow", Proj)
338 end_function(fs, "shadow2DRectProj")
339
340 # EXT_texture_array extension
341 start_function("texture1DArray")
342 generate_sigs("", "tex", "1DArray")
343 generate_sigs("", "txb", "1DArray")
344 end_function(fs, "texture1DArray")
345
346 start_function("texture1DArrayLod")
347 generate_sigs("", "txl", "1DArray")
348 end_function(fs, "texture1DArrayLod")
349
350 start_function("texture2DArray")
351 generate_sigs("", "tex", "2DArray")
352 generate_sigs("", "txb", "2DArray")
353 end_function(fs, "texture2DArray")
354
355 start_function("texture2DArrayLod")
356 generate_sigs("", "txl", "2DArray")
357 end_function(fs, "texture2DArrayLod")
358
359 start_function("shadow1DArray")
360 generate_sigs("", "tex", "1DArrayShadow")
361 generate_sigs("", "txb", "1DArrayShadow")
362 end_function(fs, "shadow1DArray")
363
364 start_function("shadow1DArrayLod")
365 generate_sigs("", "txl", "1DArrayShadow")
366 end_function(fs, "shadow1DArrayLod")
367
368 start_function("shadow2DArray")
369 generate_sigs("", "tex", "2DArrayShadow")
370 end_function(fs, "shadow2DArray")
371
372 # Deprecated (110/120 style) functions with silly names:
373 start_function("texture1D")
374 generate_sigs("", "tex", "1D")
375 generate_sigs("", "txb", "1D")
376 end_function(fs, "texture1D")
377
378 start_function("texture1DLod")
379 generate_sigs("", "txl", "1D")
380 end_function(fs, "texture1DLod")
381
382 start_function("texture1DProj")
383 generate_sigs("", "tex", "1D", Proj)
384 generate_sigs("", "tex", "1D", Proj, 2)
385 generate_sigs("", "txb", "1D", Proj)
386 generate_sigs("", "txb", "1D", Proj, 2)
387 end_function(fs, "texture1DProj")
388
389 start_function("texture1DProjLod")
390 generate_sigs("", "txl", "1D", Proj)
391 generate_sigs("", "txl", "1D", Proj, 2)
392 end_function(fs, "texture1DProjLod")
393
394 start_function("texture2D")
395 generate_sigs("", "tex", "2D")
396 generate_sigs("", "txb", "2D")
397 end_function(fs, "texture2D")
398
399 start_function("texture2DLod")
400 generate_sigs("", "txl", "2D")
401 end_function(fs, "texture2DLod")
402
403 start_function("texture2DProj")
404 generate_sigs("", "tex", "2D", Proj)
405 generate_sigs("", "tex", "2D", Proj, 1)
406 generate_sigs("", "txb", "2D", Proj)
407 generate_sigs("", "txb", "2D", Proj, 1)
408 end_function(fs, "texture2DProj")
409
410 start_function("texture2DProjLod")
411 generate_sigs("", "txl", "2D", Proj)
412 generate_sigs("", "txl", "2D", Proj, 1)
413 end_function(fs, "texture2DProjLod")
414
415 start_function("texture3D")
416 generate_sigs("", "tex", "3D")
417 generate_sigs("", "txb", "3D")
418 end_function(fs, "texture3D")
419
420 start_function("texture3DLod")
421 generate_sigs("", "txl", "3D")
422 end_function(fs, "texture3DLod")
423
424 start_function("texture3DProj")
425 generate_sigs("", "tex", "3D", Proj)
426 generate_sigs("", "txb", "3D", Proj)
427 end_function(fs, "texture3DProj")
428
429 start_function("texture3DProjLod")
430 generate_sigs("", "txl", "3D", Proj)
431 end_function(fs, "texture3DProjLod")
432
433 start_function("textureCube")
434 generate_sigs("", "tex", "Cube")
435 generate_sigs("", "txb", "Cube")
436 end_function(fs, "textureCube")
437
438 start_function("textureCubeLod")
439 generate_sigs("", "txl", "Cube")
440 end_function(fs, "textureCubeLod")
441
442 start_function("shadow1D")
443 generate_sigs("", "tex", "1DShadow", False, 1)
444 generate_sigs("", "txb", "1DShadow", False, 1)
445 end_function(fs, "shadow1D")
446
447 start_function("shadow1DLod")
448 generate_sigs("", "txl", "1DShadow", False, 1)
449 end_function(fs, "shadow1DLod")
450
451 start_function("shadow1DProj")
452 generate_sigs("", "tex", "1DShadow", Proj, 1)
453 generate_sigs("", "txb", "1DShadow", Proj, 1)
454 end_function(fs, "shadow1DProj")
455
456 start_function("shadow1DProjLod")
457 generate_sigs("", "txl", "1DShadow", Proj, 1)
458 end_function(fs, "shadow1DProjLod")
459
460 start_function("shadow2D")
461 generate_sigs("", "tex", "2DShadow")
462 generate_sigs("", "txb", "2DShadow")
463 end_function(fs, "shadow2D")
464
465 start_function("shadow2DLod")
466 generate_sigs("", "txl", "2DShadow")
467 end_function(fs, "shadow2DLod")
468
469 start_function("shadow2DProj")
470 generate_sigs("", "tex", "2DShadow", Proj)
471 generate_sigs("", "txb", "2DShadow", Proj)
472 end_function(fs, "shadow2DProj")
473
474 start_function("shadow2DProjLod")
475 generate_sigs("", "txl", "2DShadow", Proj)
476 end_function(fs, "shadow2DProjLod")
477
478 sys.stdout = sys.__stdout__
479 return fs
480
481 # If you actually run this script, it'll print out all the functions.
482 if __name__ == "__main__":
483 fs = {}
484 generate_texture_functions(fs);
485 for k, v in fs.iteritems():
486 print v