main/extensions: Build list of extensions that can't be disabled
authorJordan Justen <jordan.l.justen@intel.com>
Sun, 8 Jun 2014 20:40:31 +0000 (13:40 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Mon, 16 Jun 2014 16:54:52 +0000 (09:54 -0700)
This will allow us to utilize the early MESA_EXTENSION_OVERRIDE
parsing at the later extension string initialization step.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/mesa/main/extensions.c

index 0a1a7c5c36fdde0051577903c5d079de2087a663..6b7e94b3182f4d0b03089323fa1b4317c4276e0c 100644 (file)
@@ -40,6 +40,7 @@
 struct gl_extensions _mesa_extension_override_enables;
 struct gl_extensions _mesa_extension_override_disables;
 static char *extra_extensions = NULL;
+static char *cant_disable_extensions = NULL;
 
 enum {
    DISABLE = 0,
@@ -592,15 +593,16 @@ get_extension_override( struct gl_context *ctx )
 
 
 /**
- * \brief Free extra_extensions string
+ * \brief Free extra_extensions and cant_disable_extensions strings
  *
- * This string is allocated early during the first context creation by
+ * These strings are allocated early during the first context creation by
  * _mesa_one_time_init_extension_overrides.
  */
 static void
 free_unknown_extensions_strings(void)
 {
    free(extra_extensions);
+   free(cant_disable_extensions);
 }
 
 
@@ -629,6 +631,7 @@ _mesa_one_time_init_extension_overrides(void)
 
    /* extra_exts: List of unrecognized extensions. */
    extra_extensions = calloc(ALIGN(strlen(env_const) + 2, 4), sizeof(char));
+   cant_disable_extensions = calloc(ALIGN(strlen(env_const) + 2, 4), sizeof(char));
 
    /* Copy env_const because strtok() is destructive. */
    env = strdup(env_const);
@@ -657,9 +660,14 @@ _mesa_one_time_init_extension_overrides(void)
          recognized = false;
       }
 
-      if (!recognized && enable) {
-         strcat(extra_extensions, ext);
-         strcat(extra_extensions, " ");
+      if (!recognized) {
+         if (enable) {
+            strcat(extra_extensions, ext);
+            strcat(extra_extensions, " ");
+         } else if (offset == o(dummy_true)) {
+            strcat(cant_disable_extensions, ext);
+            strcat(cant_disable_extensions, " ");
+         }
       }
    }
 
@@ -673,6 +681,13 @@ _mesa_one_time_init_extension_overrides(void)
    } else if (extra_extensions[len - 1] == ' ') {
       extra_extensions[len - 1] = '\0';
    }
+   len = strlen(cant_disable_extensions);
+   if (len == 0) {
+      free(cant_disable_extensions);
+      cant_disable_extensions = NULL;
+   } else if (cant_disable_extensions[len - 1] == ' ') {
+      cant_disable_extensions[len - 1] = '\0';
+   }
 }