mesa: Use correct enum conversion function.
[mesa.git] / src / mesa / main / get_hash_generator.py
index 770093cc47bad1cc5714e28200b9568e8bb55774..96bc4958797e2e886f7b4d819f7cbf494472edd5 100644 (file)
@@ -44,7 +44,7 @@ prime_factor = 89
 prime_step = 281
 hash_table_size = 1024
 
-gl_apis=set(["GL", "GL_CORE", "GLES", "GLES2"])
+gl_apis=set(["GL", "GL_CORE", "GLES", "GLES2", "GLES3"])
 
 def print_header():
    print "typedef const unsigned short table_t[%d];\n" % (hash_table_size)
@@ -61,16 +61,33 @@ def print_params(params):
 def api_name(api):
    return "API_OPEN%s" % api
 
+# This must match gl_api enum in src/mesa/main/mtypes.h
+api_enum = [
+   'GL',
+   'GLES',
+   'GLES2',
+   'GL_CORE',
+   'GLES3', # Not in gl_api enum in mtypes.h
+]
+
+def api_index(api):
+    return api_enum.index(api)
+
 def table_name(api):
    return "table_" + api_name(api)
 
 def print_table(api, table):
    print "static table_t %s = {" % (table_name(api))
 
+   # convert sparse (index, value) table into a dense table
+   dense_table = [0] * hash_table_size
+   for i, v in table:
+      dense_table[i] = v
+
    row_size = 4
-   for i in range(0, len(table), row_size):
-      row = table[i : i + row_size]
-      idx_val = ["[%4d] = %4d" % iv for iv in row]
+   for i in range(0, hash_table_size, row_size):
+      row = dense_table[i : i + row_size]
+      idx_val = ["%4d" % v for v in row]
       print " " * 4 + ", ".join(idx_val) + ","
 
    print "};\n"
@@ -79,11 +96,16 @@ def print_tables(tables):
    for table in tables:
       print_table(table["apis"][0], table["indices"])
 
-   print "static table_t *table_set[] = {"
+   dense_tables = ['NULL'] * len(api_enum)
    for table in tables:
       tname = table_name(table["apis"][0])
       for api in table["apis"]:
-         print "   [%s] = &%s," % (api_name(api), tname)
+         i = api_index(api)
+         dense_tables[i] = "&%s" % (tname)
+
+   print "static table_t *table_set[] = {"
+   for expr in dense_tables:
+      print "   %s," % expr
    print "};\n"
 
    print "#define table(api) (*table_set[api])"
@@ -145,6 +167,9 @@ def generate_hash_tables(enum_list, enabled_apis, param_descriptors):
 
          for api in valid_apis:
             add_to_hash_table(tables[api], hash_val, len(params))
+            # Also add GLES2 items to the GLES3 hash table
+            if api == "GLES2":
+               add_to_hash_table(tables["GLES3"], hash_val, len(params))
 
          params.append(["GL_" + enum_name, param[1]])
 
@@ -154,52 +179,34 @@ def generate_hash_tables(enum_list, enabled_apis, param_descriptors):
 
    return params, merge_tables(sorted_tables)
 
-def opt_to_apis(feature):
-   _map = {"ES1": "GLES", "ES2": "GLES2", "GL": "GL"}
-   if feature not in _map:
-      return None
-
-   apis = set([_map[feature]])
-   if "GL" in apis:
-      apis.add("GL_CORE")
-
-   return apis
 
 def show_usage():
    sys.stderr.write(
 """Usage: %s [OPTIONS]
   -f <file>          specify GL API XML file
-  -a [GL|ES1|ES2]    specify APIs to generate hash tables for
 """ % (program))
    exit(1)
 
 if __name__ == '__main__':
    try:
-      (opts, args) = getopt.getopt(sys.argv[1:], "f:a:")
+      (opts, args) = getopt.getopt(sys.argv[1:], "f:")
    except Exception,e:
       show_usage()
 
    if len(args) != 0:
       show_usage()
 
-   enabled_apis = set([])
    api_desc_file = ""
 
    for opt_name, opt_val in opts:
       if opt_name == "-f":
          api_desc_file = opt_val
-      if opt_name == "-a":
-         apis = opt_to_apis(opt_val.upper())
-         if not apis:
-            die("invalid API %s\n" % opt_val)
-
-         enabled_apis |= apis
 
    if not api_desc_file:
       die("missing descriptor file (-f)\n")
 
-   if len(enabled_apis) == 0:
-      die("need at least a single enabled API\n")
+   # generate the code for all APIs
+   enabled_apis = set(["GLES", "GLES2", "GLES3", "GL", "GL_CORE"])
 
    try:
       api_desc = gl_XML.parse_GL_API(api_desc_file)