Add a python script to generate texture builtins.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 8 Jun 2010 02:28:19 +0000 (19:28 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 9 Jun 2010 18:14:58 +0000 (11:14 -0700)
builtins/tools/texture_builtins.py [new file with mode: 0755]

diff --git a/builtins/tools/texture_builtins.py b/builtins/tools/texture_builtins.py
new file mode 100755 (executable)
index 0000000..49c620e
--- /dev/null
@@ -0,0 +1,229 @@
+#!/usr/bin/python
+
+from os import path
+import sys
+
+def vec_type(g, size):
+    if size == 1:
+        if g == "i":
+            return "int"
+        elif g == "u":
+            return "unsigned"
+        return "float"
+    return g + "vec" + str(size)
+
+# Get the base dimension - i.e. sampler3D gives 3
+def get_coord_dim(sampler_type):
+    if sampler_type[0].isdigit():
+        return int(sampler_type[0])
+    elif sampler_type.startswith("Cube"):
+        return 3
+    assert False ("coord_dim: invalid sampler_type: " + sampler_type)
+
+# Get the number of extra vector components (i.e. shadow comparitor)
+def get_extra_dim(sampler_type, use_proj, unused_fields):
+    extra_dim = unused_fields
+    if sampler_type.find("Shadow") != -1:
+        extra_dim += 1
+    if sampler_type.find("Array") != -1:
+        extra_dim += 1
+    if use_proj:
+        extra_dim += 1
+    return extra_dim
+
+def generate_sigs(g, tex_inst, sampler_type, use_proj = False, unused_fields = 0):
+    coord_dim = get_coord_dim(sampler_type)
+    extra_dim = get_extra_dim(sampler_type, use_proj, unused_fields)
+
+    # Print parameters
+    print "   (signature " + g + "vec4"
+    print "     (parameters"
+    print "       (declare (in) " + g + "sampler" + sampler_type + " sampler)"
+    print "       (declare (in) " + vec_type("i" if tex_inst == "txf" else "", coord_dim + extra_dim) + " P)",
+    if tex_inst == "txb":
+        print "\n       (declare (in) float bias)",
+    elif tex_inst == "txl":
+        print "\n       (declare (in) float lod)",
+    elif tex_inst == "txf":
+        print "\n       (declare (in) int lod)",
+    elif tex_inst == "txd":
+        grad_type = vec_type("", coord_dim)
+        print "\n       (declare (in) " + grad_type + " dPdx)",
+        print "\n       (declare (in) " + grad_type + " dPdy)",
+
+    print ")\n     ((return (" + tex_inst + " (var_ref sampler)",
+
+    # Coordinate
+    if extra_dim > 0:
+        print "(swiz " + "xyzw"[:coord_dim] + " (var_ref P))",
+    else:
+        print "(var_ref P)",
+
+    # Offset
+    print "(0 0 0)",
+
+    if tex_inst != "txf":
+        # Projective divisor
+        if use_proj:
+            print "(swiz " + "xyzw"[coord_dim + extra_dim-1] + " (var_ref P))",
+        else:
+            print "1",
+
+        # Shadow comparitor
+        if sampler_type.endswith("Shadow"):
+            print "(swiz z (var_ref P))",
+        else:
+            print "()",
+
+    # Bias/explicit LOD/gradient:
+    if tex_inst == "txb":
+        print "(var_ref bias)",
+    elif tex_inst == "txl" or tex_inst == "txf":
+        print "(var_ref lod)",
+    elif tex_inst == "txd":
+        print "((var_ref dPdx) (var_ref dPdy))",
+    print "))))\n"
+
+def generate_fiu_sigs(tex_inst, sampler_type, use_proj = False, unused_fields = 0):
+    generate_sigs("",  tex_inst, sampler_type, use_proj, unused_fields)
+    generate_sigs("i", tex_inst, sampler_type, use_proj, unused_fields)
+    generate_sigs("u", tex_inst, sampler_type, use_proj, unused_fields)
+
+builtins_dir = path.join(path.dirname(path.abspath(__file__)), "..")
+
+with open(path.join(builtins_dir, "130", "texture"), 'w') as sys.stdout:
+    print "((function texture"
+    generate_fiu_sigs("tex", "1D")
+    generate_fiu_sigs("tex", "2D")
+    generate_fiu_sigs("tex", "3D")
+    generate_fiu_sigs("tex", "Cube")
+    generate_fiu_sigs("tex", "1DArray")
+    generate_fiu_sigs("tex", "2DArray")
+    print "))"
+
+# txb variants are only allowed within a fragment shader (GLSL 1.30 p. 86)
+with open(path.join(builtins_dir, "130_fs", "texture"), 'w') as sys.stdout:
+    print "((function texture"
+    generate_fiu_sigs("txb", "1D")
+    generate_fiu_sigs("txb", "2D")
+    generate_fiu_sigs("txb", "3D")
+    generate_fiu_sigs("txb", "Cube")
+    generate_fiu_sigs("txb", "1DArray")
+    generate_fiu_sigs("txb", "2DArray")
+    print "))"
+
+with open(path.join(builtins_dir, "130", "textureLod"), 'w') as sys.stdout:
+    print "((function textureLod"
+    generate_fiu_sigs("txl", "1D")
+    generate_fiu_sigs("txl", "2D")
+    generate_fiu_sigs("txl", "3D")
+    generate_fiu_sigs("txl", "Cube")
+    generate_fiu_sigs("txl", "1DArray")
+    generate_fiu_sigs("txl", "2DArray")
+    print "))"
+
+with open(path.join(builtins_dir, "130", "texelFetch"), 'w') as sys.stdout:
+    print "((function texelFetch"
+    generate_fiu_sigs("txf", "1D")
+    generate_fiu_sigs("txf", "2D")
+    generate_fiu_sigs("txf", "3D")
+    generate_fiu_sigs("txf", "1DArray")
+    generate_fiu_sigs("txf", "2DArray")
+    print "))"
+
+with open(path.join(builtins_dir, "130", "textureGrad"), 'w') as sys.stdout:
+    print "((function textureGrad"
+    generate_fiu_sigs("txd", "1D")
+    generate_fiu_sigs("txd", "2D")
+    generate_fiu_sigs("txd", "3D")
+    generate_fiu_sigs("txd", "Cube")
+    generate_fiu_sigs("txd", "1DArray")
+    generate_fiu_sigs("txd", "2DArray")
+    print ")\n)"
+
+# ARB_texture_rectangle extension
+with open(path.join(builtins_dir, "ARB_texture_rectangle", "textures"), 'w') as sys.stdout:
+    print "((function texture2DRect"
+    generate_sigs("", "tex", "2DRect")
+    print ")\n (function shadow2DRect"
+    generate_sigs("", "tex", "2DRectShadow")
+    print "))"
+
+# Deprecated (110/120 style) functions with silly names:
+with open(path.join(builtins_dir, "110", "textures"), 'w') as sys.stdout:
+    print "((function texture1D"
+    generate_sigs("", "tex", "1D")
+    print ")\n (function texture1DLod"
+    generate_sigs("", "txl", "1D")
+    print ")\n (function texture1DProj"
+    generate_sigs("", "tex", "1D", True)
+    generate_sigs("", "tex", "1D", True, 2)
+    print ")\n (function texture1DProjLod"
+    generate_sigs("", "txl", "1D", True)
+    generate_sigs("", "txl", "1D", True, 2)
+    print ")\n (function texture2D"
+    generate_sigs("", "tex", "2D")
+    print ")\n(function texture2DLod"
+    generate_sigs("", "txl", "2D")
+    print ")\n (function texture2DProj"
+    generate_sigs("", "tex", "2D", True)
+    generate_sigs("", "tex", "2D", True, 1)
+    print ")\n (function texture2DProjLod"
+    generate_sigs("", "txl", "2D", True)
+    generate_sigs("", "txl", "2D", True, 1)
+    print ")\n (function texture3D"
+    generate_sigs("", "tex", "3D")
+    print ")\n (function texture3DLod"
+    generate_sigs("", "txl", "3D")
+    print ")\n (function texture3DProj"
+    generate_sigs("", "tex", "3D", True)
+    print ")\n (function texture3DProjLod"
+    generate_sigs("", "txl", "3D", True)
+    print ")\n (function textureCube"
+    generate_sigs("", "tex", "Cube")
+    print ")\n (function textureCubeLod"
+    generate_sigs("", "txl", "Cube")
+    print ")\n (function shadow1D"
+    generate_sigs("", "tex", "1DShadow", False, 1)
+    print ")\n (function shadow1DLod"
+    generate_sigs("", "txl", "1DShadow", False, 1)
+    print ")\n (function shadow1DProj"
+    generate_sigs("", "tex", "1DShadow", True, 1)
+    print ")\n (function shadow1DProjLod"
+    generate_sigs("", "txl", "1DShadow", True, 1)
+    print ")\n (function shadow2D"
+    generate_sigs("", "tex", "2DShadow")
+    print ")\n (function shadow2DLod"
+    generate_sigs("", "txl", "2DShadow")
+    print ")\n (function shadow2DProj"
+    generate_sigs("", "tex", "2DShadow", True)
+    print ")\n (function shadow2DProjLod"
+    generate_sigs("", "txl", "2DShadow", True)
+    print "))"
+
+with open(path.join(builtins_dir, "110_fs", "textures"), 'w') as sys.stdout:
+    print "((function texture1D"
+    generate_sigs("", "txb", "1D")
+    print ")\n (function texture1DProj"
+    generate_sigs("", "txb", "1D", True)
+    generate_sigs("", "txb", "1D", True, 2)
+    print ")\n (function texture2D"
+    generate_sigs("", "txb", "2D")
+    print ")\n (function texture2DProj"
+    generate_sigs("", "txb", "2D", True)
+    generate_sigs("", "txb", "2D", True, 1)
+    print ")\n (function texture3D"
+    generate_sigs("", "txb", "3D")
+    print ")\n (function texture3DProj"
+    generate_sigs("", "txb", "3D", True)
+    print ")\n (function textureCube"
+    generate_sigs("", "txb", "Cube")
+    print ")\n (function shadow1D"
+    generate_sigs("", "txb", "1DShadow", False, 1)
+    print ")\n (function shadow1DProj"
+    generate_sigs("", "txb", "1DShadow", True, 1)
+    print ")\n (function shadow2D"
+    generate_sigs("", "txb", "2DShadow")
+    print ")\n (function shadow2DProj"
+    generate_sigs("", "txb", "2DShadow", True)
+    print "))"