summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/extensions.c
diff options
context:
space:
mode:
authorJordan Justen <[email protected]>2014-06-08 13:26:11 -0700
committerJordan Justen <[email protected]>2014-06-16 09:54:52 -0700
commit863f57ee1b9418f8e3a1ac433c5bbaa2f13f57c7 (patch)
tree54ac70d52988cf15b6db7f7d14d305c7baf0f0a0 /src/mesa/main/extensions.c
parent10e03b4401b025f84b97f7e578a716a63c687196 (diff)
main/extensions: Create extra extensions override string
This will allow us to utilize the early MESA_EXTENSION_OVERRIDE parsing at the later extension string initialization step. Signed-off-by: Jordan Justen <[email protected]> Reviewed-by: Anuj Phogat <[email protected]>
Diffstat (limited to 'src/mesa/main/extensions.c')
-rw-r--r--src/mesa/main/extensions.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
index 4659bac686a..0a1a7c5c36f 100644
--- a/src/mesa/main/extensions.c
+++ b/src/mesa/main/extensions.c
@@ -39,6 +39,7 @@
struct gl_extensions _mesa_extension_override_enables;
struct gl_extensions _mesa_extension_override_disables;
+static char *extra_extensions = NULL;
enum {
DISABLE = 0,
@@ -591,6 +592,19 @@ get_extension_override( struct gl_context *ctx )
/**
+ * \brief Free extra_extensions string
+ *
+ * This string is allocated early during the first context creation by
+ * _mesa_one_time_init_extension_overrides.
+ */
+static void
+free_unknown_extensions_strings(void)
+{
+ free(extra_extensions);
+}
+
+
+/**
* \brief Initialize extension override tables.
*
* This should be called one time early during first context initialization.
@@ -601,8 +615,11 @@ _mesa_one_time_init_extension_overrides(void)
const char *env_const = _mesa_getenv("MESA_EXTENSION_OVERRIDE");
char *env;
char *ext;
+ int len;
size_t offset;
+ atexit(free_unknown_extensions_strings);
+
memset(&_mesa_extension_override_enables, 0, sizeof(struct gl_extensions));
memset(&_mesa_extension_override_disables, 0, sizeof(struct gl_extensions));
@@ -610,10 +627,14 @@ _mesa_one_time_init_extension_overrides(void)
return;
}
+ /* extra_exts: List of unrecognized extensions. */
+ extra_extensions = calloc(ALIGN(strlen(env_const) + 2, 4), sizeof(char));
+
/* Copy env_const because strtok() is destructive. */
env = strdup(env_const);
for (ext = strtok(env, " "); ext != NULL; ext = strtok(NULL, " ")) {
int enable;
+ bool recognized;
switch (ext[0]) {
case '+':
enable = 1;
@@ -631,10 +652,27 @@ _mesa_one_time_init_extension_overrides(void)
offset = set_extension(&_mesa_extension_override_enables, ext, enable);
if (offset != 0 && (offset != o(dummy_true) || enable != GL_FALSE)) {
((GLboolean *) &_mesa_extension_override_disables)[offset] = !enable;
+ recognized = true;
+ } else {
+ recognized = false;
+ }
+
+ if (!recognized && enable) {
+ strcat(extra_extensions, ext);
+ strcat(extra_extensions, " ");
}
}
free(env);
+
+ /* Remove trailing space, and free if unused. */
+ len = strlen(extra_extensions);
+ if (len == 0) {
+ free(extra_extensions);
+ extra_extensions = NULL;
+ } else if (extra_extensions[len - 1] == ' ') {
+ extra_extensions[len - 1] = '\0';
+ }
}