mesa: use binary search for MESA_EXTENSION_OVERRIDE
authorEric Engestrom <eric.engestrom@intel.com>
Tue, 20 Nov 2018 09:57:41 +0000 (09:57 +0000)
committerEric Engestrom <eric.engestrom@intel.com>
Sun, 30 Jun 2019 00:45:36 +0000 (01:45 +0100)
Not a hot path obviously, but the table still has 425 extensions, which
you can go through in just 9 steps with a binary search.

The table is already sorted, as required by other parts of the code and
enforced by mesa's `main-test`.

Signed-off-by: Eric Engestrom <eric.engestrom@intel.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
src/mesa/main/extensions.c

index 4d95a072793fa4c13b69eb12b00c383fbb370b9f..0aeda39cc22152073f52e41582fb83174c4b4a42 100644 (file)
@@ -48,6 +48,13 @@ static char *unrecognized_extensions = NULL;
  */
 #define o(x) offsetof(struct gl_extensions, x)
 
+static int
+extension_name_compare(const void *name, const void *elem)
+{
+   const struct mesa_extension *entry = elem;
+   return strcmp(name, entry->name);
+}
+
 /**
  * Given an extension name, lookup up the corresponding member of struct
  * gl_extensions and return that member's index.  If the name is
@@ -59,15 +66,18 @@ static char *unrecognized_extensions = NULL;
 static int
 name_to_index(const char* name)
 {
-   unsigned i;
+   const struct mesa_extension *entry;
 
-   if (name == 0)
+   if (!name)
       return -1;
 
-   for (i = 0; i < MESA_EXTENSION_COUNT; ++i) {
-      if (strcmp(name, _mesa_extension_table[i].name) == 0)
-        return i;
-   }
+   entry = bsearch(name,
+                   _mesa_extension_table, MESA_EXTENSION_COUNT,
+                   sizeof(_mesa_extension_table[0]),
+                   extension_name_compare);
+
+   if (entry)
+      return entry - _mesa_extension_table;
 
    return -1;
 }