[Mesa-dev] [PATCH] Revert "mesa: remove unnecessary 'sort by year' for the GL extensions"

Roland Scheidegger sroland at vmware.com
Tue Sep 25 14:11:00 UTC 2018


Looks great to me.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>

Am 24.09.2018 um 17:19 schrieb Emil Velikov:
> This reverts commit 3d81e11b49366b5636b8524ba0f8c7076e3fdf34.
> 
> As reported by Federico, some games require the 'sort by year' since
> they truncate the extensions which do not fit the fixed size string
> array.
> 
> Seemingly I did not consider that as the documentation (both Mesa and
> Nvidia) mention about program crashes ... which are worked around by
> setting the env. variable.
> 
> This commit reinstates the workaround and enhances the documentation.
> 
> Cc: Federico Dossena <info at fdossena.com>
> Cc: Timothy Arceri <tarceri at itsqueeze.com>
> Cc: Marek Olšák <maraeo at gmail.com>
> Cc: Roland Scheidegger <sroland at vmware.com>
> Cc: Ian Romanick <idr at freedesktop.org>
> Reported-by: Federico Dossena <info at fdossena.com>
> Fixes: 3d81e11b493 ("mesa: remove unnecessary 'sort by year' for the GL
> extensions")
> ---
> UNTESTED: Resolved the revert conflicts, but I haven't done any actual
> testing. If Federico can do the honours that'll be amazing.
> 
>  src/mesa/main/extensions.c | 46 ++++++++++++++++++++++++++++++++++++--
>  1 file changed, 44 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
> index 25c3161f7d0..4d95a072793 100644
> --- a/src/mesa/main/extensions.c
> +++ b/src/mesa/main/extensions.c
> @@ -335,6 +335,30 @@ _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
> @@ -372,8 +396,8 @@ _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 */
> -         extension_indices[count++] = k;
> +	 length += strlen(i->name) + 1; /* +1 for space */
> +	 ++count;
>        }
>     }
>     for (k = 0; k < MAX_UNRECOGNIZED_EXTENSIONS; k++)
> @@ -385,6 +409,24 @@ _mesa_make_extension_string(struct gl_context *ctx)
>        return NULL;
>     }
>  
> +   /* Sort extensions in chronological order because idTech 2/3 games
> +    * (e.g., Quake3 demo) store the extension list in a fixed size buffer.
> +    * Some cases truncate, while others overflow the buffer. Resulting in
> +    * misrendering and crashes, respectively.
> +    * Address the former here, while the latter will be addressed by setting
> +    * the MESA_EXTENSION_MAX_YEAR environment variable.
> +    */
> +   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]];
> 



More information about the mesa-dev mailing list