Home | History | Annotate | Download | only in tools
      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     elif sampler_type == "ExternalOES":
     27         sampler_dim = 2
     28     elif sampler_type == "Buffer":
     29         sampler_dim = 1
     30     else:
     31         assert False ("coord_dim: invalid sampler_type: " + sampler_type)
     32     return sampler_dim
     33 
     34 # Get the coordinate dimension for a given sampler type.
     35 # Array samplers also get +1 here since the layer is really an extra coordinate
     36 def get_coord_dim(sampler_type):
     37     coord_dim = get_sampler_dim(sampler_type)
     38     if sampler_type.find("Array") != -1:
     39         coord_dim += 1
     40     return coord_dim
     41 
     42 # Get the number of extra vector components (i.e. shadow comparitor)
     43 def get_extra_dim(sampler_type, use_proj, unused_fields):
     44     extra_dim = unused_fields
     45     if sampler_type.find("Shadow") != -1:
     46         extra_dim += 1
     47     if use_proj:
     48         extra_dim += 1
     49     return extra_dim
     50 
     51 def get_txs_dim(sampler_type):
     52     if sampler_type.startswith("Cube"):
     53         return 2
     54     return get_coord_dim(sampler_type)
     55 
     56 def generate_sigs(g, tex_inst, sampler_type, variant = 0, unused_fields = 0):
     57     coord_dim = get_coord_dim(sampler_type)
     58     extra_dim = get_extra_dim(sampler_type, variant & Proj, unused_fields)
     59     sampler_dim = get_sampler_dim(sampler_type)
     60 
     61     if variant & Single:
     62         return_type = "float"
     63     elif tex_inst == "txs":
     64         return_type = vec_type("i", get_txs_dim(sampler_type))
     65     else:
     66         return_type = g + "vec4"
     67 
     68     # Print parameters
     69     print "   (signature", return_type
     70     print "     (parameters"
     71     print "       (declare (in) " + g + "sampler" + sampler_type + " sampler)",
     72     if tex_inst != "txs":
     73         print "\n       (declare (in) " + vec_type("i" if tex_inst == "txf" else "", coord_dim + extra_dim) + " P)",
     74     if tex_inst == "txl":
     75         print "\n       (declare (in) float lod)",
     76     elif ((tex_inst == "txf" or tex_inst == "txs") and "Buffer" not in sampler_type and "Rect" not in sampler_type):
     77         print "\n       (declare (in) int lod)",
     78     elif tex_inst == "txd":
     79         grad_type = vec_type("", sampler_dim)
     80         print "\n       (declare (in) " + grad_type + " dPdx)",
     81         print "\n       (declare (in) " + grad_type + " dPdy)",
     82 
     83     if variant & Offset:
     84         print "\n       (declare (const_in) " + vec_type("i", sampler_dim) + " offset)",
     85     if tex_inst == "txb":
     86         print "\n       (declare (in) float bias)",
     87 
     88     print ")\n     ((return (" + tex_inst, return_type, "(var_ref sampler)",
     89 
     90     if tex_inst != "txs":
     91         # Coordinate
     92         if extra_dim > 0:
     93             print "(swiz " + "xyzw"[:coord_dim] + " (var_ref P))",
     94         else:
     95             print "(var_ref P)",
     96 
     97         if variant & Offset:
     98             print "(var_ref offset)",
     99         else:
    100             print "0",
    101 
    102     if tex_inst != "txf" and tex_inst != "txs":
    103         # Projective divisor
    104         if variant & Proj:
    105             print "(swiz " + "xyzw"[coord_dim + extra_dim-1] + " (var_ref P))",
    106         else:
    107             print "1",
    108 
    109         # Shadow comparitor
    110         if sampler_type == "2DArrayShadow" or sampler_type == "CubeShadow": # a special case:
    111             print "(swiz w (var_ref P))",   # ...array layer is z; shadow is w
    112         elif sampler_type.endswith("Shadow"):
    113             print "(swiz z (var_ref P))",
    114         else:
    115             print "()",
    116 
    117     # Bias/explicit LOD/gradient:
    118     if tex_inst == "txb":
    119         print "(var_ref bias)",
    120     elif tex_inst == "txs" or tex_inst == "txf":
    121         if "Rect" not in sampler_type and "Buffer" not in sampler_type:
    122             print "(var_ref lod)",
    123         else:
    124             print "(constant int (0))"
    125     elif tex_inst == "txl":
    126         print "(var_ref lod)",
    127     elif tex_inst == "txd":
    128         print "((var_ref dPdx) (var_ref dPdy))",
    129     print "))))\n"
    130 
    131 def generate_fiu_sigs(tex_inst, sampler_type, variant = 0, unused_fields = 0):
    132     generate_sigs("",  tex_inst, sampler_type, variant, unused_fields)
    133     generate_sigs("i", tex_inst, sampler_type, variant, unused_fields)
    134     generate_sigs("u", tex_inst, sampler_type, variant, unused_fields)
    135 
    136 def start_function(name):
    137     sys.stdout = StringIO.StringIO()
    138     print "((function " + name
    139 
    140 def end_function(fs, name):
    141     print "))"
    142     fs[name] = sys.stdout.getvalue();
    143     sys.stdout.close()
    144 
    145 # Generate all the functions and store them in the supplied dictionary.
    146 # This is better than writing them to actual files since they should never be
    147 # edited; it'd also be easy to confuse them with the many hand-generated files.
    148 #
    149 # Takes a dictionary as an argument.
    150 def generate_texture_functions(fs):
    151     start_function("textureSize")
    152     generate_fiu_sigs("txs", "1D")
    153     generate_fiu_sigs("txs", "2D")
    154     generate_fiu_sigs("txs", "3D")
    155     generate_fiu_sigs("txs", "Cube")
    156     generate_fiu_sigs("txs", "1DArray")
    157     generate_fiu_sigs("txs", "2DArray")
    158     generate_sigs("", "txs", "1DShadow")
    159     generate_sigs("", "txs", "2DShadow")
    160     generate_sigs("", "txs", "CubeShadow")
    161     generate_sigs("", "txs", "1DArrayShadow")
    162     generate_sigs("", "txs", "2DArrayShadow")
    163     generate_fiu_sigs("txs", "2DRect")
    164     generate_sigs("", "txs", "2DRectShadow")
    165     generate_fiu_sigs("txs", "Buffer")
    166     end_function(fs, "textureSize")
    167 
    168     start_function("texture")
    169     generate_fiu_sigs("tex", "1D")
    170     generate_fiu_sigs("tex", "2D")
    171     generate_fiu_sigs("tex", "3D")
    172     generate_fiu_sigs("tex", "Cube")
    173     generate_fiu_sigs("tex", "1DArray")
    174     generate_fiu_sigs("tex", "2DArray")
    175     generate_sigs("", "tex", "1DShadow", Single, 1);
    176     generate_sigs("", "tex", "2DShadow", Single);
    177     generate_sigs("", "tex", "CubeShadow", Single);
    178     generate_sigs("", "tex", "1DArrayShadow", Single);
    179     generate_sigs("", "tex", "2DArrayShadow", Single);
    180     generate_fiu_sigs("tex", "2DRect")
    181     generate_sigs("", "tex", "2DRectShadow", Single);
    182 
    183     generate_fiu_sigs("txb", "1D")
    184     generate_fiu_sigs("txb", "2D")
    185     generate_fiu_sigs("txb", "3D")
    186     generate_fiu_sigs("txb", "Cube")
    187     generate_fiu_sigs("txb", "1DArray")
    188     generate_fiu_sigs("txb", "2DArray")
    189     generate_sigs("", "txb", "1DShadow", Single, 1);
    190     generate_sigs("", "txb", "2DShadow", Single);
    191     generate_sigs("", "txb", "CubeShadow", Single);
    192     generate_sigs("", "txb", "1DArrayShadow", Single);
    193     generate_sigs("", "txb", "2DArrayShadow", Single);
    194     end_function(fs, "texture")
    195 
    196     start_function("textureProj")
    197     generate_fiu_sigs("tex", "1D", Proj)
    198     generate_fiu_sigs("tex", "1D", Proj, 2)
    199     generate_fiu_sigs("tex", "2D", Proj)
    200     generate_fiu_sigs("tex", "2D", Proj, 1)
    201     generate_fiu_sigs("tex", "3D", Proj)
    202     generate_sigs("", "tex", "1DShadow", Proj | Single, 1);
    203     generate_sigs("", "tex", "2DShadow", Proj | Single);
    204     generate_fiu_sigs("tex", "2DRect", Proj)
    205     generate_fiu_sigs("tex", "2DRect", Proj, 1)
    206     generate_sigs("", "tex", "2DRectShadow", Proj | Single);
    207 
    208     generate_fiu_sigs("txb", "1D", Proj)
    209     generate_fiu_sigs("txb", "1D", Proj, 2)
    210     generate_fiu_sigs("txb", "2D", Proj)
    211     generate_fiu_sigs("txb", "2D", Proj, 1)
    212     generate_fiu_sigs("txb", "3D", Proj)
    213     generate_sigs("", "txb", "1DShadow", Proj | Single, 1);
    214     generate_sigs("", "txb", "2DShadow", Proj | Single);
    215     end_function(fs, "textureProj")
    216 
    217     start_function("textureLod")
    218     generate_fiu_sigs("txl", "1D")
    219     generate_fiu_sigs("txl", "2D")
    220     generate_fiu_sigs("txl", "3D")
    221     generate_fiu_sigs("txl", "Cube")
    222     generate_fiu_sigs("txl", "1DArray")
    223     generate_fiu_sigs("txl", "2DArray")
    224     generate_sigs("", "txl", "1DShadow", Single, 1);
    225     generate_sigs("", "txl", "2DShadow", Single);
    226     generate_sigs("", "txl", "1DArrayShadow", Single);
    227     end_function(fs, "textureLod")
    228 
    229     start_function("textureLodOffset")
    230     generate_fiu_sigs("txl", "1D", Offset)
    231     generate_fiu_sigs("txl", "2D", Offset)
    232     generate_fiu_sigs("txl", "3D", Offset)
    233     generate_fiu_sigs("txl", "1DArray", Offset)
    234     generate_fiu_sigs("txl", "2DArray", Offset)
    235     generate_sigs("", "txl", "1DShadow", Offset | Single, 1);
    236     generate_sigs("", "txl", "2DShadow", Offset | Single);
    237     generate_sigs("", "txl", "1DArrayShadow", Offset | Single);
    238     end_function(fs, "textureLodOffset")
    239 
    240     start_function("textureOffset")
    241     generate_fiu_sigs("tex", "1D", Offset)
    242     generate_fiu_sigs("tex", "2D", Offset)
    243     generate_fiu_sigs("tex", "3D", Offset)
    244     generate_fiu_sigs("tex", "2DRect", Offset)
    245     generate_sigs("", "tex", "2DRectShadow", Offset | Single);
    246     generate_fiu_sigs("tex", "1DArray", Offset)
    247     generate_fiu_sigs("tex", "2DArray", Offset)
    248     generate_sigs("", "tex", "1DShadow", Offset | Single, 1);
    249     generate_sigs("", "tex", "2DShadow", Offset | Single);
    250     generate_sigs("", "tex", "1DArrayShadow", Offset | Single);
    251 
    252     generate_fiu_sigs("txb", "1D", Offset)
    253     generate_fiu_sigs("txb", "2D", Offset)
    254     generate_fiu_sigs("txb", "3D", Offset)
    255     generate_fiu_sigs("txb", "1DArray", Offset)
    256     generate_fiu_sigs("txb", "2DArray", Offset)
    257     generate_sigs("", "txb", "1DShadow", Offset | Single, 1);
    258     generate_sigs("", "txb", "2DShadow", Offset | Single);
    259     generate_sigs("", "txb", "1DArrayShadow", Offset | Single);
    260     end_function(fs, "textureOffset")
    261 
    262     start_function("texelFetch")
    263     generate_fiu_sigs("txf", "1D")
    264     generate_fiu_sigs("txf", "2D")
    265     generate_fiu_sigs("txf", "3D")
    266     generate_fiu_sigs("txf", "2DRect")
    267     generate_fiu_sigs("txf", "1DArray")
    268     generate_fiu_sigs("txf", "2DArray")
    269     generate_fiu_sigs("txf", "Buffer")
    270     end_function(fs, "texelFetch")
    271 
    272     start_function("texelFetchOffset")
    273     generate_fiu_sigs("txf", "1D", Offset)
    274     generate_fiu_sigs("txf", "2D", Offset)
    275     generate_fiu_sigs("txf", "3D", Offset)
    276     generate_fiu_sigs("txf", "2DRect", Offset)
    277     generate_fiu_sigs("txf", "1DArray", Offset)
    278     generate_fiu_sigs("txf", "2DArray", Offset)
    279     end_function(fs, "texelFetchOffset")
    280 
    281     start_function("textureProjOffset")
    282     generate_fiu_sigs("tex", "1D", Proj | Offset)
    283     generate_fiu_sigs("tex", "1D", Proj | Offset, 2)
    284     generate_fiu_sigs("tex", "2D", Proj | Offset)
    285     generate_fiu_sigs("tex", "2D", Proj | Offset, 1)
    286     generate_fiu_sigs("tex", "3D", Proj | Offset)
    287     generate_fiu_sigs("tex", "2DRect", Proj | Offset)
    288     generate_fiu_sigs("tex", "2DRect", Proj | Offset, 1)
    289     generate_sigs("", "tex", "2DRectShadow", Proj | Offset | Single);
    290     generate_sigs("", "tex", "1DShadow", Proj | Offset | Single, 1);
    291     generate_sigs("", "tex", "2DShadow", Proj | Offset | Single);
    292 
    293     generate_fiu_sigs("txb", "1D", Proj | Offset)
    294     generate_fiu_sigs("txb", "1D", Proj | Offset, 2)
    295     generate_fiu_sigs("txb", "2D", Proj | Offset)
    296     generate_fiu_sigs("txb", "2D", Proj | Offset, 1)
    297     generate_fiu_sigs("txb", "3D", Proj | Offset)
    298     generate_sigs("", "txb", "1DShadow", Proj | Offset | Single, 1);
    299     generate_sigs("", "txb", "2DShadow", Proj | Offset | Single);
    300     end_function(fs, "textureProjOffset")
    301 
    302     start_function("textureProjLod")
    303     generate_fiu_sigs("txl", "1D", Proj)
    304     generate_fiu_sigs("txl", "1D", Proj, 2)
    305     generate_fiu_sigs("txl", "2D", Proj)
    306     generate_fiu_sigs("txl", "2D", Proj, 1)
    307     generate_fiu_sigs("txl", "3D", Proj)
    308     generate_sigs("", "txl", "1DShadow", Proj | Single, 1);
    309     generate_sigs("", "txl", "2DShadow", Proj | Single);
    310     end_function(fs, "textureProjLod")
    311 
    312     start_function("textureProjLodOffset")
    313     generate_fiu_sigs("txl", "1D", Proj | Offset)
    314     generate_fiu_sigs("txl", "1D", Proj | Offset, 2)
    315     generate_fiu_sigs("txl", "2D", Proj | Offset)
    316     generate_fiu_sigs("txl", "2D", Proj | Offset, 1)
    317     generate_fiu_sigs("txl", "3D", Proj | Offset)
    318     generate_sigs("", "txl", "1DShadow", Proj | Offset | Single, 1);
    319     generate_sigs("", "txl", "2DShadow", Proj | Offset | Single);
    320     end_function(fs, "textureProjLodOffset")
    321 
    322     start_function("textureGrad")
    323     generate_fiu_sigs("txd", "1D")
    324     generate_fiu_sigs("txd", "2D")
    325     generate_fiu_sigs("txd", "3D")
    326     generate_fiu_sigs("txd", "Cube")
    327     generate_fiu_sigs("txd", "1DArray")
    328     generate_fiu_sigs("txd", "2DArray")
    329     generate_fiu_sigs("txd", "2DRect")
    330     generate_sigs("", "txd", "2DRectShadow", Single);
    331     generate_sigs("", "txd", "1DShadow", Single, 1);
    332     generate_sigs("", "txd", "2DShadow", Single);
    333     generate_sigs("", "txd", "CubeShadow", Single);
    334     generate_sigs("", "txd", "1DArrayShadow", Single);
    335     generate_sigs("", "txd", "2DArrayShadow", Single);
    336     end_function(fs, "textureGrad")
    337 
    338     start_function("textureGradOffset")
    339     generate_fiu_sigs("txd", "1D", Offset)
    340     generate_fiu_sigs("txd", "2D", Offset)
    341     generate_fiu_sigs("txd", "3D", Offset)
    342     generate_fiu_sigs("txd", "2DRect", Offset)
    343     generate_sigs("", "txd", "2DRectShadow", Offset | Single);
    344     generate_fiu_sigs("txd", "1DArray", Offset)
    345     generate_fiu_sigs("txd", "2DArray", Offset)
    346     generate_sigs("", "txd", "1DShadow", Offset | Single, 1);
    347     generate_sigs("", "txd", "2DShadow", Offset | Single);
    348     generate_sigs("", "txd", "1DArrayShadow", Offset | Single);
    349     generate_sigs("", "txd", "2DArrayShadow", Offset | Single);
    350     end_function(fs, "textureGradOffset")
    351 
    352     start_function("textureProjGrad")
    353     generate_fiu_sigs("txd", "1D", Proj)
    354     generate_fiu_sigs("txd", "1D", Proj, 2)
    355     generate_fiu_sigs("txd", "2D", Proj)
    356     generate_fiu_sigs("txd", "2D", Proj, 1)
    357     generate_fiu_sigs("txd", "3D", Proj)
    358     generate_fiu_sigs("txd", "2DRect", Proj)
    359     generate_fiu_sigs("txd", "2DRect", Proj, 1)
    360     generate_sigs("", "txd", "2DRectShadow", Proj | Single);
    361     generate_sigs("", "txd", "1DShadow", Proj | Single, 1);
    362     generate_sigs("", "txd", "2DShadow", Proj | Single);
    363     end_function(fs, "textureProjGrad")
    364 
    365     start_function("textureProjGradOffset")
    366     generate_fiu_sigs("txd", "1D", Proj | Offset)
    367     generate_fiu_sigs("txd", "1D", Proj | Offset, 2)
    368     generate_fiu_sigs("txd", "2D", Proj | Offset)
    369     generate_fiu_sigs("txd", "2D", Proj | Offset, 1)
    370     generate_fiu_sigs("txd", "3D", Proj | Offset)
    371     generate_fiu_sigs("txd", "2DRect", Proj | Offset)
    372     generate_fiu_sigs("txd", "2DRect", Proj | Offset, 1)
    373     generate_sigs("", "txd", "2DRectShadow", Proj | Offset | Single);
    374     generate_sigs("", "txd", "1DShadow", Proj | Offset | Single, 1);
    375     generate_sigs("", "txd", "2DShadow", Proj | Offset | Single);
    376     end_function(fs, "textureProjGradOffset")
    377 
    378 
    379     # ARB_texture_rectangle extension
    380     start_function("texture2DRect")
    381     generate_sigs("", "tex", "2DRect")
    382     end_function(fs, "texture2DRect")
    383 
    384     start_function("texture2DRectProj")
    385     generate_sigs("", "tex", "2DRect", Proj)
    386     generate_sigs("", "tex", "2DRect", Proj, 1)
    387     end_function(fs, "texture2DRectProj")
    388 
    389     start_function("shadow2DRect")
    390     generate_sigs("", "tex", "2DRectShadow")
    391     end_function(fs, "shadow2DRect")
    392 
    393     start_function("shadow2DRectProj")
    394     generate_sigs("", "tex", "2DRectShadow", Proj)
    395     end_function(fs, "shadow2DRectProj")
    396 
    397     # EXT_texture_array extension
    398     start_function("texture1DArray")
    399     generate_sigs("", "tex", "1DArray")
    400     generate_sigs("", "txb", "1DArray")
    401     end_function(fs, "texture1DArray")
    402 
    403     start_function("texture1DArrayLod")
    404     generate_sigs("", "txl", "1DArray")
    405     end_function(fs, "texture1DArrayLod")
    406 
    407     start_function("texture2DArray")
    408     generate_sigs("", "tex", "2DArray")
    409     generate_sigs("", "txb", "2DArray")
    410     end_function(fs, "texture2DArray")
    411 
    412     start_function("texture2DArrayLod")
    413     generate_sigs("", "txl", "2DArray")
    414     end_function(fs, "texture2DArrayLod")
    415 
    416     start_function("shadow1DArray")
    417     generate_sigs("", "tex", "1DArrayShadow")
    418     generate_sigs("", "txb", "1DArrayShadow")
    419     end_function(fs, "shadow1DArray")
    420 
    421     start_function("shadow1DArrayLod")
    422     generate_sigs("", "txl", "1DArrayShadow")
    423     end_function(fs, "shadow1DArrayLod")
    424 
    425     start_function("shadow2DArray")
    426     generate_sigs("", "tex", "2DArrayShadow")
    427     end_function(fs, "shadow2DArray")
    428 
    429     # ARB_shader_texture_lod extension
    430     start_function("texture1DGradARB")
    431     generate_fiu_sigs("txd", "1D")
    432     end_function(fs, "texture1DGradARB")
    433 
    434     start_function("texture2DGradARB")
    435     generate_fiu_sigs("txd", "2D")
    436     end_function(fs, "texture2DGradARB")
    437 
    438     start_function("texture3DGradARB")
    439     generate_fiu_sigs("txd", "3D")
    440     end_function(fs, "texture3DGradARB")
    441 
    442     start_function("textureCubeGradARB")
    443     generate_fiu_sigs("txd", "Cube")
    444     end_function(fs, "textureCubeGradARB")
    445 
    446     start_function("texture1DProjGradARB")
    447     generate_fiu_sigs("txd", "1D", True)
    448     generate_fiu_sigs("txd", "1D", True, 2)
    449     end_function(fs, "texture1DProjGradARB")
    450 
    451     start_function("texture2DProjGradARB")
    452     generate_fiu_sigs("txd", "2D", True)
    453     generate_fiu_sigs("txd", "2D", True, 1)
    454     end_function(fs, "texture2DProjGradARB")
    455 
    456     start_function("texture3DProjGradARB")
    457     generate_fiu_sigs("txd", "3D", True)
    458     end_function(fs, "texture3DProjGradARB")
    459 
    460     start_function("shadow1DGradARB")
    461     generate_sigs("", "txd", "1DShadow", False, 1)
    462     end_function(fs, "shadow1DGradARB")
    463 
    464     start_function("shadow1DProjGradARB")
    465     generate_sigs("", "txd", "1DShadow", True, 1)
    466     end_function(fs, "shadow1DProjGradARB")
    467 
    468     start_function("shadow2DGradARB")
    469     generate_sigs("", "txd", "2DShadow", False)
    470     end_function(fs, "shadow2DGradARB")
    471 
    472     start_function("shadow2DProjGradARB")
    473     generate_sigs("", "txd", "2DShadow", True)
    474     end_function(fs, "shadow2DProjGradARB")
    475 
    476     start_function("texture2DRectGradARB")
    477     generate_sigs("", "txd", "2DRect")
    478     end_function(fs, "texture2DRectGradARB")
    479 
    480     start_function("texture2DRectProjGradARB")
    481     generate_sigs("", "txd", "2DRect", True)
    482     generate_sigs("", "txd", "2DRect", True, 1)
    483     end_function(fs, "texture2DRectProjGradARB")
    484 
    485     start_function("shadow2DRectGradARB")
    486     generate_sigs("", "txd", "2DRectShadow", False)
    487     end_function(fs, "shadow2DRectGradARB")
    488 
    489     start_function("shadow2DRectProjGradARB")
    490     generate_sigs("", "txd", "2DRectShadow", True)
    491     end_function(fs, "shadow2DRectProjGradARB")
    492 
    493     # Deprecated (110/120 style) functions with silly names:
    494     start_function("texture1D")
    495     generate_sigs("", "tex", "1D")
    496     generate_sigs("", "txb", "1D")
    497     end_function(fs, "texture1D")
    498 
    499     start_function("texture1DLod")
    500     generate_sigs("", "txl", "1D")
    501     end_function(fs, "texture1DLod")
    502 
    503     start_function("texture1DProj")
    504     generate_sigs("", "tex", "1D", Proj)
    505     generate_sigs("", "tex", "1D", Proj, 2)
    506     generate_sigs("", "txb", "1D", Proj)
    507     generate_sigs("", "txb", "1D", Proj, 2)
    508     end_function(fs, "texture1DProj")
    509 
    510     start_function("texture1DProjLod")
    511     generate_sigs("", "txl", "1D", Proj)
    512     generate_sigs("", "txl", "1D", Proj, 2)
    513     end_function(fs, "texture1DProjLod")
    514 
    515     start_function("texture2D")
    516     generate_sigs("", "tex", "2D")
    517     generate_sigs("", "txb", "2D")
    518     # OES_EGL_image_external
    519     generate_sigs("", "tex", "ExternalOES")
    520     end_function(fs, "texture2D")
    521 
    522     start_function("texture2DLod")
    523     generate_sigs("", "txl", "2D")
    524     end_function(fs, "texture2DLod")
    525 
    526     start_function("texture2DProj")
    527     generate_sigs("", "tex", "2D", Proj)
    528     generate_sigs("", "tex", "2D", Proj, 1)
    529     generate_sigs("", "txb", "2D", Proj)
    530     generate_sigs("", "txb", "2D", Proj, 1)
    531     # OES_EGL_image_external
    532     generate_sigs("", "tex", "ExternalOES", Proj)
    533     generate_sigs("", "tex", "ExternalOES", Proj, 1)
    534     end_function(fs, "texture2DProj")
    535 
    536     start_function("texture2DProjLod")
    537     generate_sigs("", "txl", "2D", Proj)
    538     generate_sigs("", "txl", "2D", Proj, 1)
    539     end_function(fs, "texture2DProjLod")
    540 
    541     start_function("texture3D")
    542     generate_sigs("", "tex", "3D")
    543     generate_sigs("", "txb", "3D")
    544     end_function(fs, "texture3D")
    545 
    546     start_function("texture3DLod")
    547     generate_sigs("", "txl", "3D")
    548     end_function(fs, "texture3DLod")
    549 
    550     start_function("texture3DProj")
    551     generate_sigs("", "tex", "3D", Proj)
    552     generate_sigs("", "txb", "3D", Proj)
    553     end_function(fs, "texture3DProj")
    554 
    555     start_function("texture3DProjLod")
    556     generate_sigs("", "txl", "3D", Proj)
    557     end_function(fs, "texture3DProjLod")
    558 
    559     start_function("textureCube")
    560     generate_sigs("", "tex", "Cube")
    561     generate_sigs("", "txb", "Cube")
    562     end_function(fs, "textureCube")
    563 
    564     start_function("textureCubeLod")
    565     generate_sigs("", "txl", "Cube")
    566     end_function(fs, "textureCubeLod")
    567 
    568     start_function("shadow1D")
    569     generate_sigs("", "tex", "1DShadow", False, 1)
    570     generate_sigs("", "txb", "1DShadow", False, 1)
    571     end_function(fs, "shadow1D")
    572 
    573     start_function("shadow1DLod")
    574     generate_sigs("", "txl", "1DShadow", False, 1)
    575     end_function(fs, "shadow1DLod")
    576 
    577     start_function("shadow1DProj")
    578     generate_sigs("", "tex", "1DShadow", Proj, 1)
    579     generate_sigs("", "txb", "1DShadow", Proj, 1)
    580     end_function(fs, "shadow1DProj")
    581 
    582     start_function("shadow1DProjLod")
    583     generate_sigs("", "txl", "1DShadow", Proj, 1)
    584     end_function(fs, "shadow1DProjLod")
    585 
    586     start_function("shadow2D")
    587     generate_sigs("", "tex", "2DShadow")
    588     generate_sigs("", "txb", "2DShadow")
    589     end_function(fs, "shadow2D")
    590 
    591     start_function("shadow2DLod")
    592     generate_sigs("", "txl", "2DShadow")
    593     end_function(fs, "shadow2DLod")
    594 
    595     start_function("shadow2DProj")
    596     generate_sigs("", "tex", "2DShadow", Proj)
    597     generate_sigs("", "txb", "2DShadow", Proj)
    598     end_function(fs, "shadow2DProj")
    599 
    600     start_function("shadow2DProjLod")
    601     generate_sigs("", "txl", "2DShadow", Proj)
    602     end_function(fs, "shadow2DProjLod")
    603 
    604     sys.stdout = sys.__stdout__
    605     return fs
    606 
    607 # If you actually run this script, it'll print out all the functions.
    608 if __name__ == "__main__":
    609     fs = {}
    610     generate_texture_functions(fs);
    611     for k, v in fs.iteritems():
    612         print v
    613