X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fextensions.c;h=5c8bd7a874136afdf9e1d3a33048704603ed867a;hb=66673bef941af344314fe9c91cad8cd330b245eb;hp=87f60d58c679828eee339be9ac29a07d4c575d08;hpb=e4cdce50585edbbbe9b6fe0d3f7215a67b989309;p=mesa.git diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index 87f60d58c67..5c8bd7a8741 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -39,7 +39,7 @@ struct gl_extensions _mesa_extension_override_enables; struct gl_extensions _mesa_extension_override_disables; -static char *extra_extensions = NULL; +static char *unrecognized_extensions = NULL; /** @@ -129,9 +129,7 @@ _mesa_enable_sw_extensions(struct gl_context *ctx) ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE; ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE; ctx->Extensions.ARB_texture_filter_anisotropic = GL_TRUE; -#ifdef TEXTURE_FLOAT_ENABLED ctx->Extensions.ARB_texture_float = GL_TRUE; -#endif ctx->Extensions.ARB_texture_mirror_clamp_to_edge = GL_TRUE; ctx->Extensions.ARB_texture_non_power_of_two = GL_TRUE; ctx->Extensions.ARB_texture_rg = GL_TRUE; @@ -196,33 +194,17 @@ set_extension(struct gl_extensions *ext, int i, GLboolean state) return offset; } -/** - * The unrecognized extensions from \c MESA_EXTENSION_OVERRIDE. - * Must be freed, does not return \c NULL. - */ -static char * -get_extension_override( struct gl_context *ctx ) -{ - if (extra_extensions == NULL) { - return calloc(1, sizeof(char)); - } else { - _mesa_problem(ctx, "Trying to enable unknown extensions: %s", - extra_extensions); - return strdup(extra_extensions); - } -} - /** - * \brief Free extra_extensions string + * \brief Free string pointed by unrecognized_extensions * - * These strings are allocated early during the first context creation by + * 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); + free(unrecognized_extensions); } @@ -239,15 +221,13 @@ free_unknown_extensions_strings(void) * - Collect unrecognized extension names in a new string. */ void -_mesa_one_time_init_extension_overrides(void) +_mesa_one_time_init_extension_overrides(struct gl_context *ctx) { const char *env_const = getenv("MESA_EXTENSION_OVERRIDE"); char *env; char *ext; - int len; size_t offset; - - atexit(free_unknown_extensions_strings); + unsigned unknown_ext = 0; memset(&_mesa_extension_override_enables, 0, sizeof(struct gl_extensions)); memset(&_mesa_extension_override_disables, 0, sizeof(struct gl_extensions)); @@ -256,18 +236,11 @@ _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); - if (env == NULL || - extra_extensions == NULL) { - free(env); - free(extra_extensions); + if (env == NULL) return; - } for (ext = strtok(env, " "); ext != NULL; ext = strtok(NULL, " ")) { int enable; @@ -289,28 +262,36 @@ _mesa_one_time_init_extension_overrides(void) i = name_to_index(ext); offset = set_extension(&_mesa_extension_override_enables, i, enable); - if (offset != 0 && (offset != o(dummy_true) || enable != GL_FALSE)) { - ((GLboolean *) &_mesa_extension_override_disables)[offset] = !enable; + offset = set_extension(&_mesa_extension_override_disables, i, !enable); + if (offset != 0) recognized = true; - } else { + else recognized = false; - } if (!recognized && enable) { - strcat(extra_extensions, ext); - strcat(extra_extensions, " "); + if (unknown_ext >= MAX_UNRECOGNIZED_EXTENSIONS) { + static bool warned; + + if (!warned) { + warned = true; + _mesa_problem(ctx, "Trying to enable too many unknown extension. " + "Only the first %d will be honoured", + MAX_UNRECOGNIZED_EXTENSIONS); + } + } else { + ctx->Extensions.unrecognized_extensions[unknown_ext] = ext; + unknown_ext++; + + _mesa_problem(ctx, "Trying to enable unknown extension: %s", ext); + } } } - 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'; + if (!unknown_ext) { + free(env); + } else { + unrecognized_extensions = env; + atexit(free_unknown_extensions_strings); } } @@ -355,30 +336,6 @@ _mesa_extension_supported(const struct gl_context *ctx, extension_index i) return (ctx->Version >= ext->version[ctx->API]) && base[ext->offset]; } -/** - * Compare two entries of the extensions table. Sorts first by year, - * then by name. - * - * Arguments are indices into _mesa_extension_table. - */ -static int -extension_compare(const void *p1, const void *p2) -{ - extension_index i1 = * (const extension_index *) p1; - extension_index i2 = * (const extension_index *) p2; - const struct mesa_extension *e1 = &_mesa_extension_table[i1]; - const struct mesa_extension *e2 = &_mesa_extension_table[i2]; - int res; - - res = (int)e1->year - (int)e2->year; - - if (res == 0) { - res = strcmp(e1->name, e2->name); - } - - return res; -} - /** * Construct the GL_EXTENSIONS string. Called the first time that @@ -394,9 +351,7 @@ _mesa_make_extension_string(struct gl_context *ctx) /* Number of extensions */ unsigned count; /* Indices of the extensions sorted by year */ - extension_index *extension_indices; - /* String of extra extensions. */ - char *extra_extensions = get_extension_override(ctx); + extension_index extension_indices[MESA_EXTENSION_COUNT]; unsigned k; unsigned j; unsigned maxYear = ~0; @@ -418,42 +373,19 @@ _mesa_make_extension_string(struct gl_context *ctx) if (i->year <= maxYear && _mesa_extension_supported(ctx, k)) { - length += strlen(i->name) + 1; /* +1 for space */ - ++count; + length += strlen(i->name) + 1; /* +1 for space */ + extension_indices[count++] = k; } } - if (extra_extensions != NULL) - length += 1 + strlen(extra_extensions); /* +1 for space */ + 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 */ exts = calloc(ALIGN(length + 1, 4), sizeof(char)); if (exts == NULL) { - free(extra_extensions); return NULL; } - extension_indices = malloc(count * sizeof(extension_index)); - if (extension_indices == NULL) { - free(exts); - free(extra_extensions); - return NULL; - } - - /* Sort extensions in chronological order because certain old applications - * (e.g., Quake3 demo) store the extension list in a static size buffer so - * chronologically order ensure that the extensions that such applications - * expect will fit into that buffer. - */ - j = 0; - for (k = 0; k < MESA_EXTENSION_COUNT; ++k) { - if (_mesa_extension_table[k].year <= maxYear && - _mesa_extension_supported(ctx, k)) { - extension_indices[j++] = k; - } - } - assert(j == count); - qsort(extension_indices, count, - sizeof *extension_indices, extension_compare); - /* Build the extension string.*/ for (j = 0; j < count; ++j) { const struct mesa_extension *i = &_mesa_extension_table[extension_indices[j]]; @@ -461,10 +393,11 @@ _mesa_make_extension_string(struct gl_context *ctx) strcat(exts, i->name); strcat(exts, " "); } - free(extension_indices); - if (extra_extensions != 0) { - strcat(exts, extra_extensions); - free(extra_extensions); + for (j = 0; j < MAX_UNRECOGNIZED_EXTENSIONS; j++) { + if (ctx->Extensions.unrecognized_extensions[j]) { + strcat(exts, ctx->Extensions.unrecognized_extensions[j]); + strcat(exts, " "); + } } return (GLubyte *) exts; @@ -486,6 +419,11 @@ _mesa_get_extension_count(struct gl_context *ctx) if (_mesa_extension_supported(ctx, k)) ctx->Extensions.Count++; } + + for (k = 0; k < MAX_UNRECOGNIZED_EXTENSIONS; ++k) { + if (ctx->Extensions.unrecognized_extensions[k]) + ctx->Extensions.Count++; + } return ctx->Extensions.Count; } @@ -507,5 +445,13 @@ _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 (n == index) + return (const GLubyte*) ctx->Extensions.unrecognized_extensions[i]; + else + ++n; + } + } return NULL; }