mesa/main: do not store unrecognized extensions in context
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Fri, 24 Apr 2020 12:41:25 +0000 (14:41 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 27 Apr 2020 20:40:01 +0000 (20:40 +0000)
We process extension overrides only when we initialize the first
context, which means that unrecognized extensions only appear in the
first context created.

Let's instead store them in a global array, so we can apply them to all
contexts. This has the added benefit of making the initialization of the
first context less special, which allows us to clean up code a bit more.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4765>

src/mesa/main/extensions.c
src/mesa/main/mtypes.h

index 2d780c0743c6e9181653614636168e7b67a08baa..016a55a2ed7c2fcc40844542f816ea87cb1f405c 100644 (file)
 
 struct gl_extensions _mesa_extension_override_enables;
 struct gl_extensions _mesa_extension_override_disables;
-static char *unrecognized_extensions = NULL;
 
+#define MAX_UNRECOGNIZED_EXTENSIONS 16
+static struct {
+   char *env;
+   const char *names[MAX_UNRECOGNIZED_EXTENSIONS];
+} unrecognized_extensions;
 
 /**
  * Given a member \c x of struct gl_extensions, return offset of
@@ -213,7 +217,9 @@ set_extension(struct gl_extensions *ext, int i, GLboolean state)
 static void
 free_unknown_extensions_strings(void)
 {
-   free(unrecognized_extensions);
+   free(unrecognized_extensions.env);
+   for (int i = 0; i < MAX_UNRECOGNIZED_EXTENSIONS; ++i)
+      unrecognized_extensions.names[i] = NULL;
 }
 
 
@@ -288,9 +294,8 @@ _mesa_one_time_init_extension_overrides(struct gl_context *ctx)
                                   MAX_UNRECOGNIZED_EXTENSIONS);
             }
          } else {
-            ctx->Extensions.unrecognized_extensions[unknown_ext] = ext;
+            unrecognized_extensions.names[unknown_ext] = ext;
             unknown_ext++;
-
             _mesa_problem(ctx, "Trying to enable unknown extension: %s", ext);
          }
       }
@@ -299,7 +304,7 @@ _mesa_one_time_init_extension_overrides(struct gl_context *ctx)
    if (!unknown_ext) {
       free(env);
    } else {
-      unrecognized_extensions = env;
+      unrecognized_extensions.env = env;
       atexit(free_unknown_extensions_strings);
    }
 }
@@ -411,8 +416,8 @@ _mesa_make_extension_string(struct gl_context *ctx)
       }
    }
    for (k = 0; k < MAX_UNRECOGNIZED_EXTENSIONS; k++)
-      if (ctx->Extensions.unrecognized_extensions[k])
-         length += 1 + strlen(ctx->Extensions.unrecognized_extensions[k]); /* +1 for space */
+      if (unrecognized_extensions.names[k])
+         length += 1 + strlen(unrecognized_extensions.names[k]); /* +1 for space */
 
    exts = calloc(ALIGN(length + 1, 4), sizeof(char));
    if (exts == NULL) {
@@ -445,8 +450,8 @@ _mesa_make_extension_string(struct gl_context *ctx)
       strcat(exts, " ");
    }
    for (j = 0; j < MAX_UNRECOGNIZED_EXTENSIONS; j++) {
-      if (ctx->Extensions.unrecognized_extensions[j]) {
-         strcat(exts, ctx->Extensions.unrecognized_extensions[j]);
+      if (unrecognized_extensions.names[j]) {
+         strcat(exts, unrecognized_extensions.names[j]);
          strcat(exts, " ");
       }
    }
@@ -472,8 +477,8 @@ _mesa_get_extension_count(struct gl_context *ctx)
    }
 
    for (k = 0; k < MAX_UNRECOGNIZED_EXTENSIONS; ++k) {
-      if (ctx->Extensions.unrecognized_extensions[k])
-        ctx->Extensions.Count++;
+      if (unrecognized_extensions.names[k])
+         ctx->Extensions.Count++;
    }
    return ctx->Extensions.Count;
 }
@@ -497,9 +502,9 @@ _mesa_get_enabled_extension(struct gl_context *ctx, GLuint index)
    }
 
    for (i = 0; i < MAX_UNRECOGNIZED_EXTENSIONS; ++i) {
-      if (ctx->Extensions.unrecognized_extensions[i]) {
+      if (unrecognized_extensions.names[i]) {
          if (n == index)
-            return (const GLubyte*) ctx->Extensions.unrecognized_extensions[i];
+            return (const GLubyte*) unrecognized_extensions.names[i];
          else
             ++n;
       }
index a8b75b32f5246779360bbf22f1b71aff531e3a4c..0a50e929986c500b1a2161b9d346a07ed3e7c675 100644 (file)
@@ -4439,12 +4439,6 @@ struct gl_extensions
     * while meta is in progress.
     */
    GLubyte Version;
-   /**
-    * Force-enabled, yet unrecognized, extensions.
-    * See _mesa_one_time_init_extension_overrides()
-    */
-#define MAX_UNRECOGNIZED_EXTENSIONS 16
-   const char *unrecognized_extensions[MAX_UNRECOGNIZED_EXTENSIONS];
 };