[Mesa-dev] [PATCH] glsl: reuse main extension table to appropriate restrict extensions

Eric Engestrom eric.engestrom at imgtec.com
Mon Jun 13 11:08:24 UTC 2016


On Sun, Jun 12, 2016 at 07:23:41PM -0400, Ilia Mirkin wrote:
> Previously we were only restricting based on ES/non-ES-ness and whether
> the overall enable bit had been flipped on. However we have been adding
> more fine-grained restrictions, such as based on compat profiles, as
> well as specific ES versions. Most of the time this doesn't matter, but
> it can create awkward situations and duplication of logic.
> 
> Here we separate the main extension table into a separate object file,
> linked to the glsl compiler, which makes use of it with a custom
> function which takes the ES-ness of the shader into account (thus
> allowing desktop shaders to properly use ES extensions that would
> otherwise have been disallowed.)
> 
> The effect of this change should be nil in most cases.
> 
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---

[snip]

> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
> index fa50cb6..3dc9c50 100644
> --- a/src/mesa/main/extensions.c
> +++ b/src/mesa/main/extensions.c
> @@ -49,25 +49,15 @@ static char *extra_extensions = NULL;
>  #define o(x) offsetof(struct gl_extensions, x)
>  
>  
> -/**
> - * \brief Table of supported OpenGL extensions for all API's.
> - */
> -const struct mesa_extension _mesa_extension_table[] = {
> +static bool extension_table_size[] = {
>  #define EXT(name_str, driver_cap, gll_ver, glc_ver, gles_ver, gles2_ver, yyyy) \
> -        { .name = "GL_" #name_str, .offset = o(driver_cap), \
> -          .version = { \
> -            [API_OPENGL_COMPAT] = gll_ver, \
> -            [API_OPENGL_CORE]   = glc_ver, \
> -            [API_OPENGLES]      = gles_ver, \
> -            [API_OPENGLES2]     = gles2_ver, \
> -           }, \
> -           .year = yyyy \
> -        },
> +   0,
> +
>  #include "extensions_table.h"
>  #undef EXT
>  };
>  
> -static bool disabled_extensions[ARRAY_SIZE(_mesa_extension_table)];
> +static bool disabled_extensions[ARRAY_SIZE(extension_table_size)];

/me thinks `extension_table_size` should contain the extension table size...

Maybe this?

	static bool extension_table_for_size[] = {
		/* ... */
	};
	static enum { extension_table_size = ARRAY_SIZE(extension_table_for_size) };
	static bool disabled_extensions[extension_table_size];

>  
>  /**
>   * Given an extension name, lookup up the corresponding member of struct
> @@ -85,7 +75,7 @@ name_to_index(const char* name)
>     if (name == 0)
>        return -1;
>  
> -   for (i = 0; i < ARRAY_SIZE(_mesa_extension_table); ++i) {
> +   for (i = 0; i < ARRAY_SIZE(extension_table_size); ++i) {

This (and following) is now simply:

	for (i = 0; i < extension_table_size; ++i) {

>        if (strcmp(name, _mesa_extension_table[i].name) == 0)
>  	 return i;
>     }

[snip]

> diff --git a/src/mesa/main/extensions_table.c b/src/mesa/main/extensions_table.c
> new file mode 100644
> index 0000000..1e37fbc
> --- /dev/null
> +++ b/src/mesa/main/extensions_table.c
> @@ -0,0 +1,51 @@
> +/*
> + * Mesa 3-D graphics library
> + *
> + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
> + * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included
> + * in all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "main/mtypes.h"
> +#include "main/extensions.h"
> +
> +/**
> + * Given a member \c x of struct gl_extensions, return offset of
> + * \c x in bytes.
> + */
> +#define o(x) offsetof(struct gl_extensions, x)
> +
> +/**
> + * \brief Table of supported OpenGL extensions for all API's.
> + */
> +const struct mesa_extension _mesa_extension_table[] = {
> +#define EXT(name_str, driver_cap, gll_ver, glc_ver, gles_ver, gles2_ver, yyyy) \
> +        { .name = "GL_" #name_str, .offset = o(driver_cap), \
> +          .version = { \
> +            [API_OPENGL_COMPAT] = gll_ver, \
> +            [API_OPENGL_CORE]   = glc_ver, \
> +            [API_OPENGLES]      = gles_ver, \
> +            [API_OPENGLES2]     = gles2_ver, \
> +           }, \
> +           .year = yyyy \
> +        },
> +#include "extensions_table.h"
> +#undef EXT

I'm not sure this macro is useful in the first place, but:

	#undef o


With these issues fixed:
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>

> +};
> -- 
> 2.7.3


More information about the mesa-dev mailing list