[Mesa-dev] [PATCH 5/7] main/extensions: Create extra extensions override string
Ian Romanick
idr at freedesktop.org
Mon Jun 9 17:50:21 PDT 2014
On 06/08/2014 03:17 PM, Jordan Justen wrote:
> 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 at intel.com>
> ---
> src/mesa/main/extensions.c | 38 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
>
> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
> index 4e2205d..2617ca9 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,
> @@ -589,6 +590,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.
> @@ -599,8 +613,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);
I have some recollection that we could not use atexit. Maybe it was
incompatible with some applications or something? I can't remember the
details, but I'd swear we had a problem with this in the past...
> +
> memset(&_mesa_extension_override_enables, 0, sizeof(struct gl_extensions));
> memset(&_mesa_extension_override_disables, 0, sizeof(struct gl_extensions));
>
> @@ -608,10 +625,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;
> @@ -629,10 +650,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';
> + }
> }
>
>
>
More information about the mesa-dev
mailing list