[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