1 #!/usr/bin/python 2 3 import sys 4 import StringIO 5 6 def vec_type(g, size): 7 if size == 1: 8 if g == "i": 9 return "int" 10 elif g == "u": 11 return "uint" 12 return "float" 13 return g + "vec" + str(size) 14 15 # Get the base dimension - i.e. sampler3D gives 3 16 # Array samplers also get +1 here since the layer is really an extra coordinate 17 def get_coord_dim(sampler_type): 18 if sampler_type[0].isdigit(): 19 coord_dim = int(sampler_type[0]) 20 elif sampler_type.startswith("Cube"): 21 coord_dim = 3 22 else: 23 assert False ("coord_dim: invalid sampler_type: " + sampler_type) 24 25 if sampler_type.find("Array") != -1: 26 coord_dim += 1 27 return coord_dim 28 29 # Get the number of extra vector components (i.e. shadow comparitor) 30 def get_extra_dim(sampler_type, use_proj, unused_fields): 31 extra_dim = unused_fields 32 if sampler_type.find("Shadow") != -1: 33 extra_dim += 1 34 if use_proj: 35 extra_dim += 1 36 return extra_dim 37 38 def generate_sigs(g, tex_inst, sampler_type, use_proj = False, unused_fields = 0): 39 coord_dim = get_coord_dim(sampler_type) 40 extra_dim = get_extra_dim(sampler_type, use_proj, unused_fields) 41 42 # Print parameters 43 print " (signature " + g + "vec4" 44 print " (parameters" 45 print " (declare (in) " + g + "sampler" + sampler_type + " sampler)" 46 print " (declare (in) " + vec_type("i" if tex_inst == "txf" else "", coord_dim + extra_dim) + " P)", 47 if tex_inst == "txb": 48 print "\n (declare (in) float bias)", 49 elif tex_inst == "txl": 50 print "\n (declare (in) float lod)", 51 elif tex_inst == "txf": 52 print "\n (declare (in) int lod)", 53 elif tex_inst == "txd": 54 grad_type = vec_type("", coord_dim) 55 print "\n (declare (in) " + grad_type + " dPdx)", 56 print "\n (declare (in) " + grad_type + " dPdy)", 57 58 print ")\n ((return (" + tex_inst + " (var_ref sampler)", 59 60 # Coordinate 61 if extra_dim > 0: 62 print "(swiz " + "xyzw"[:coord_dim] + " (var_ref P))", 63 else: 64 print "(var_ref P)", 65 66 # Offset 67 print "(0 0 0)", 68 69 if tex_inst != "txf": 70 # Projective divisor 71 if use_proj: 72 print "(swiz " + "xyzw"[coord_dim + extra_dim-1] + " (var_ref P))", 73 else: 74 print "1", 75 76 # Shadow comparitor 77 if sampler_type == "2DArrayShadow": # a special case: 78 print "(swiz w (var_ref P))", # ...array layer is z; shadow is w 79 elif sampler_type.endswith("Shadow"): 80 print "(swiz z (var_ref P))", 81 else: 82 print "()", 83 84 # Bias/explicit LOD/gradient: 85 if tex_inst == "txb": 86 print "(var_ref bias)", 87 elif tex_inst == "txl" or tex_inst == "txf": 88 print "(var_ref lod)", 89 elif tex_inst == "txd": 90 print "((var_ref dPdx) (var_ref dPdy))", 91 print "))))\n" 92 93 def generate_fiu_sigs(tex_inst, sampler_type, use_proj = False, unused_fields = 0): 94 generate_sigs("", tex_inst, sampler_type, use_proj, unused_fields) 95 generate_sigs("i", tex_inst, sampler_type, use_proj, unused_fields) 96 generate_sigs("u", tex_inst, sampler_type, use_proj, unused_fields) 97 98 def start_function(name): 99 sys.stdout = StringIO.StringIO() 100 print "((function " + name 101 102 def end_function(fs, name): 103 print "))" 104 fs[name] = sys.stdout.getvalue(); 105 sys.stdout.close() 106 107 # Generate all the functions and store them in the supplied dictionary. 108 # This is better than writing them to actual files since they should never be 109 # edited; it'd also be easy to confuse them with the many hand-generated files. 110 # 111 # Takes a dictionary as an argument. 112 def generate_texture_functions(fs): 113 start_function("texture") 114 generate_fiu_sigs("tex", "1D") 115 generate_fiu_sigs("tex", "2D") 116 generate_fiu_sigs("tex", "3D") 117 generate_fiu_sigs("tex", "Cube") 118 generate_fiu_sigs("tex", "1DArray") 119 generate_fiu_sigs("tex", "2DArray") 120 121 generate_fiu_sigs("txb", "1D") 122 generate_fiu_sigs("txb", "2D") 123 generate_fiu_sigs("txb", "3D") 124 generate_fiu_sigs("txb", "Cube") 125 generate_fiu_sigs("txb", "1DArray") 126 generate_fiu_sigs("txb", "2DArray") 127 end_function(fs, "texture") 128 129 start_function("textureProj") 130 generate_fiu_sigs("tex", "1D", True) 131 generate_fiu_sigs("tex", "1D", True, 2) 132 generate_fiu_sigs("tex", "2D", True) 133 generate_fiu_sigs("tex", "2D", True, 1) 134 generate_fiu_sigs("tex", "3D", True) 135 136 generate_fiu_sigs("txb", "1D", True) 137 generate_fiu_sigs("txb", "1D", True, 2) 138 generate_fiu_sigs("txb", "2D", True) 139 generate_fiu_sigs("txb", "2D", True, 1) 140 generate_fiu_sigs("txb", "3D", True) 141 end_function(fs, "textureProj") 142 143 start_function("textureLod") 144 generate_fiu_sigs("txl", "1D") 145 generate_fiu_sigs("txl", "2D") 146 generate_fiu_sigs("txl", "3D") 147 generate_fiu_sigs("txl", "Cube") 148 generate_fiu_sigs("txl", "1DArray") 149 generate_fiu_sigs("txl", "2DArray") 150 end_function(fs, "textureLod") 151 152 start_function("texelFetch") 153 generate_fiu_sigs("txf", "1D") 154 generate_fiu_sigs("txf", "2D") 155 generate_fiu_sigs("txf", "3D") 156 generate_fiu_sigs("txf", "1DArray") 157 generate_fiu_sigs("txf", "2DArray") 158 end_function(fs, "texelFetch") 159 160 start_function("textureProjLod") 161 generate_fiu_sigs("txl", "1D", True) 162 generate_fiu_sigs("txl", "1D", True, 2) 163 generate_fiu_sigs("txl", "2D", True) 164 generate_fiu_sigs("txl", "2D", True, 1) 165 generate_fiu_sigs("txl", "3D", True) 166 end_function(fs, "textureProjLod") 167 168 start_function("textureGrad") 169 generate_fiu_sigs("txd", "1D") 170 generate_fiu_sigs("txd", "2D") 171 generate_fiu_sigs("txd", "3D") 172 generate_fiu_sigs("txd", "Cube") 173 generate_fiu_sigs("txd", "1DArray") 174 generate_fiu_sigs("txd", "2DArray") 175 end_function(fs, "textureGrad") 176 177 start_function("textureProjGrad") 178 generate_fiu_sigs("txd", "1D", True) 179 generate_fiu_sigs("txd", "1D", True, 2) 180 generate_fiu_sigs("txd", "2D", True) 181 generate_fiu_sigs("txd", "2D", True, 1) 182 generate_fiu_sigs("txd", "3D", True) 183 end_function(fs, "textureProjGrad") 184 185 # ARB_texture_rectangle extension 186 start_function("texture2DRect") 187 generate_sigs("", "tex", "2DRect") 188 end_function(fs, "texture2DRect") 189 190 start_function("texture2DRectProj") 191 generate_sigs("", "tex", "2DRect", True) 192 generate_sigs("", "tex", "2DRect", True, 1) 193 end_function(fs, "texture2DRectProj") 194 195 start_function("shadow2DRect") 196 generate_sigs("", "tex", "2DRectShadow") 197 end_function(fs, "shadow2DRect") 198 199 start_function("shadow2DRectProj") 200 generate_sigs("", "tex", "2DRectShadow", True) 201 end_function(fs, "shadow2DRectProj") 202 203 # EXT_texture_array extension 204 start_function("texture1DArray") 205 generate_sigs("", "tex", "1DArray") 206 generate_sigs("", "txb", "1DArray") 207 end_function(fs, "texture1DArray") 208 209 start_function("texture1DArrayLod") 210 generate_sigs("", "txl", "1DArray") 211 end_function(fs, "texture1DArrayLod") 212 213 start_function("texture2DArray") 214 generate_sigs("", "tex", "2DArray") 215 generate_sigs("", "txb", "2DArray") 216 end_function(fs, "texture2DArray") 217 218 start_function("texture2DArrayLod") 219 generate_sigs("", "txl", "2DArray") 220 end_function(fs, "texture2DArrayLod") 221 222 start_function("shadow1DArray") 223 generate_sigs("", "tex", "1DArrayShadow") 224 generate_sigs("", "txb", "1DArrayShadow") 225 end_function(fs, "shadow1DArray") 226 227 start_function("shadow1DArrayLod") 228 generate_sigs("", "txl", "1DArrayShadow") 229 end_function(fs, "shadow1DArrayLod") 230 231 start_function("shadow2DArray") 232 generate_sigs("", "tex", "2DArrayShadow") 233 end_function(fs, "shadow2DArray") 234 235 # Deprecated (110/120 style) functions with silly names: 236 start_function("texture1D") 237 generate_sigs("", "tex", "1D") 238 generate_sigs("", "txb", "1D") 239 end_function(fs, "texture1D") 240 241 start_function("texture1DLod") 242 generate_sigs("", "txl", "1D") 243 end_function(fs, "texture1DLod") 244 245 start_function("texture1DProj") 246 generate_sigs("", "tex", "1D", True) 247 generate_sigs("", "tex", "1D", True, 2) 248 generate_sigs("", "txb", "1D", True) 249 generate_sigs("", "txb", "1D", True, 2) 250 end_function(fs, "texture1DProj") 251 252 start_function("texture1DProjLod") 253 generate_sigs("", "txl", "1D", True) 254 generate_sigs("", "txl", "1D", True, 2) 255 end_function(fs, "texture1DProjLod") 256 257 start_function("texture2D") 258 generate_sigs("", "tex", "2D") 259 generate_sigs("", "txb", "2D") 260 end_function(fs, "texture2D") 261 262 start_function("texture2DLod") 263 generate_sigs("", "txl", "2D") 264 end_function(fs, "texture2DLod") 265 266 start_function("texture2DProj") 267 generate_sigs("", "tex", "2D", True) 268 generate_sigs("", "tex", "2D", True, 1) 269 generate_sigs("", "txb", "2D", True) 270 generate_sigs("", "txb", "2D", True, 1) 271 end_function(fs, "texture2DProj") 272 273 start_function("texture2DProjLod") 274 generate_sigs("", "txl", "2D", True) 275 generate_sigs("", "txl", "2D", True, 1) 276 end_function(fs, "texture2DProjLod") 277 278 start_function("texture3D") 279 generate_sigs("", "tex", "3D") 280 generate_sigs("", "txb", "3D") 281 end_function(fs, "texture3D") 282 283 start_function("texture3DLod") 284 generate_sigs("", "txl", "3D") 285 end_function(fs, "texture3DLod") 286 287 start_function("texture3DProj") 288 generate_sigs("", "tex", "3D", True) 289 generate_sigs("", "txb", "3D", True) 290 end_function(fs, "texture3DProj") 291 292 start_function("texture3DProjLod") 293 generate_sigs("", "txl", "3D", True) 294 end_function(fs, "texture3DProjLod") 295 296 start_function("textureCube") 297 generate_sigs("", "tex", "Cube") 298 generate_sigs("", "txb", "Cube") 299 end_function(fs, "textureCube") 300 301 start_function("textureCubeLod") 302 generate_sigs("", "txl", "Cube") 303 end_function(fs, "textureCubeLod") 304 305 start_function("shadow1D") 306 generate_sigs("", "tex", "1DShadow", False, 1) 307 generate_sigs("", "txb", "1DShadow", False, 1) 308 end_function(fs, "shadow1D") 309 310 start_function("shadow1DLod") 311 generate_sigs("", "txl", "1DShadow", False, 1) 312 end_function(fs, "shadow1DLod") 313 314 start_function("shadow1DProj") 315 generate_sigs("", "tex", "1DShadow", True, 1) 316 generate_sigs("", "txb", "1DShadow", True, 1) 317 end_function(fs, "shadow1DProj") 318 319 start_function("shadow1DProjLod") 320 generate_sigs("", "txl", "1DShadow", True, 1) 321 end_function(fs, "shadow1DProjLod") 322 323 start_function("shadow2D") 324 generate_sigs("", "tex", "2DShadow") 325 generate_sigs("", "txb", "2DShadow") 326 end_function(fs, "shadow2D") 327 328 start_function("shadow2DLod") 329 generate_sigs("", "txl", "2DShadow") 330 end_function(fs, "shadow2DLod") 331 332 start_function("shadow2DProj") 333 generate_sigs("", "tex", "2DShadow", True) 334 generate_sigs("", "txb", "2DShadow", True) 335 end_function(fs, "shadow2DProj") 336 337 start_function("shadow2DProjLod") 338 generate_sigs("", "txl", "2DShadow", True) 339 end_function(fs, "shadow2DProjLod") 340 341 sys.stdout = sys.__stdout__ 342 return fs 343 344 # If you actually run this script, it'll print out all the functions. 345 if __name__ == "__main__": 346 fs = {} 347 generate_texture_functions(fs); 348 for k, v in fs.iteritems(): 349 print v 350