main: Fake entry point for glClearNamedFramebufferfi.
[mesa.git] / src / mapi / glapi / gen / gl_enums.py
index 0bf8b0a9c61e6b4d255870c133872f76a70f4398..f45782df85f168d83898af2cacd37bead386733f 100644 (file)
@@ -43,13 +43,12 @@ class PrintGlEnums(gl_XML.gl_print_base):
 
     def printRealHeader(self):
         print '#include "main/glheader.h"'
-        print '#include "main/mfeatures.h"'
         print '#include "main/enums.h"'
         print '#include "main/imports.h"'
         print '#include "main/mtypes.h"'
         print ''
-        print 'typedef struct {'
-        print '   size_t offset;'
+        print 'typedef struct PACKED {'
+        print '   uint16_t offset;'
         print '   int n;'
         print '} enum_elt;'
         print ''
@@ -60,33 +59,18 @@ class PrintGlEnums(gl_XML.gl_print_base):
 typedef int (*cfunc)(const void *, const void *);
 
 /**
- * Compare a key name to an element in the \c all_enums array.
+ * Compare a key enum value to an element in the \c enum_string_table_offsets array.
  *
  * \c bsearch always passes the key as the first parameter and the pointer
  * to the array element as the second parameter.  We can elimiate some
  * extra work by taking advantage of that fact.
  *
  * \param a  Pointer to the desired enum name.
- * \param b  Pointer to an element of the \c all_enums array.
+ * \param b  Pointer into the \c enum_string_table_offsets array.
  */
-static int compar_name( const char *a, const enum_elt *b )
+static int compar_nr( const int *a, enum_elt *b )
 {
-   return strcmp( a, & enum_string_table[ b->offset ] );
-}
-
-/**
- * Compare a key enum value to an element in the \c all_enums array.
- *
- * \c bsearch always passes the key as the first parameter and the pointer
- * to the array element as the second parameter.  We can elimiate some
- * extra work by taking advantage of that fact.
- *
- * \param a  Pointer to the desired enum name.
- * \param b  Pointer to an index into the \c all_enums array.
- */
-static int compar_nr( const int *a, const unsigned *b )
-{
-   return a[0] - all_enums[*b].n;
+   return a[0] - b->n;
 }
 
 
@@ -94,15 +78,17 @@ static char token_tmp[20];
 
 const char *_mesa_lookup_enum_by_nr( int nr )
 {
-   unsigned * i;
+   enum_elt *elt;
+
+   STATIC_ASSERT(sizeof(enum_string_table) < (1 << 16));
 
-   i = (unsigned *) _mesa_bsearch(& nr, reduced_enums,
-                                  Elements(reduced_enums),
-                                  sizeof(reduced_enums[0]),
-                                  (cfunc) compar_nr);
+   elt = bsearch(& nr, enum_string_table_offsets,
+                 ARRAY_SIZE(enum_string_table_offsets),
+                 sizeof(enum_string_table_offsets[0]),
+                 (cfunc) compar_nr);
 
-   if ( i != NULL ) {
-      return & enum_string_table[ all_enums[ *i ].offset ];
+   if (elt != NULL) {
+      return &enum_string_table[elt->offset];
    }
    else {
       /* this is not re-entrant safe, no big deal here */
@@ -115,7 +101,7 @@ const char *_mesa_lookup_enum_by_nr( int nr )
 /**
  * Primitive names
  */
-static const char *prim_names[PRIM_UNKNOWN + 1] = {
+static const char *prim_names[PRIM_MAX+3] = {
    "GL_POINTS",
    "GL_LINES",
    "GL_LINE_LOOP",
@@ -126,8 +112,11 @@ static const char *prim_names[PRIM_UNKNOWN + 1] = {
    "GL_QUADS",
    "GL_QUAD_STRIP",
    "GL_POLYGON",
+   "GL_LINES_ADJACENCY",
+   "GL_LINE_STRIP_ADJACENCY",
+   "GL_TRIANGLES_ADJACENCY",
+   "GL_TRIANGLE_STRIP_ADJACENCY",
    "outside begin/end",
-   "inside unknown primitive",
    "unknown state"
 };
 
@@ -138,27 +127,13 @@ static const char *prim_names[PRIM_UNKNOWN + 1] = {
 const char *
 _mesa_lookup_prim_by_nr(GLuint nr)
 {
-   if (nr < Elements(prim_names))
+   if (nr < ARRAY_SIZE(prim_names))
       return prim_names[nr];
    else
       return "invalid mode";
 }
 
 
-int _mesa_lookup_enum_by_name( const char *symbol )
-{
-   enum_elt * f = NULL;
-
-   if ( symbol != NULL ) {
-      f = (enum_elt *) _mesa_bsearch(symbol, all_enums,
-                                     Elements(all_enums),
-                                     sizeof( enum_elt ),
-                                     (cfunc) compar_name);
-   }
-
-   return (f != NULL) ? f->n : -1;
-}
-
 """
         return
 
@@ -168,56 +143,43 @@ int _mesa_lookup_enum_by_name( const char *symbol )
         for api in api_list:
             self.process_enums( api )
 
-        keys = self.enum_table.keys()
-        keys.sort()
-
-        name_table = []
-        enum_table = {}
+        enum_table = []
 
-        for enum in keys:
+        for enum in sorted(self.enum_table.keys()):
             low_pri = 9
+            best_name = ''
             for [name, pri] in self.enum_table[ enum ]:
-                name_table.append( [name, enum] )
-
                 if pri < low_pri:
                     low_pri = pri
-                    enum_table[enum] = name
+                    best_name = name
 
-
-        name_table.sort()
+            enum_table.append((enum, best_name))
 
         string_offsets = {}
         i = 0;
+        print '#if defined(__GNUC__)'
+        print '# define LONGSTRING __extension__'
+        print '#else'
+        print '# define LONGSTRING'
+        print '#endif'
+        print ''
         print 'LONGSTRING static const char enum_string_table[] = '
-        for [name, enum] in name_table:
+        for enum, name in enum_table:
             print '   "%s\\0"' % (name)
-            string_offsets[ name ] = i
+            string_offsets[ enum ] = i
             i += len(name) + 1
 
         print '   ;'
         print ''
 
 
-        print 'static const enum_elt all_enums[%u] =' % (len(name_table))
+        print 'static const enum_elt enum_string_table_offsets[%u] =' % (len(enum_table))
         print '{'
-        for [name, enum] in name_table:
-            print '   { %5u, 0x%08X }, /* %s */' % (string_offsets[name], enum, name)
+        for enum, name in enum_table:
+            print '   { %5u, 0x%08X }, /* %s */' % (string_offsets[enum], enum, name)
         print '};'
         print ''
 
-        print 'static const unsigned reduced_enums[%u] =' % (len(keys))
-        print '{'
-        for enum in keys:
-            name = enum_table[ enum ]
-            if [name, enum] not in name_table:
-                print '      /* Error! %s, 0x%04x */ 0,' % (name, enum)
-            else:
-                i = name_table.index( [name, enum] )
-
-                print '      %4u, /* %s */' % (i, name)
-        print '};'
-
-
         self.print_code()
         return