[Mesa-dev] [RFC-PATCH 07/11] glsl: add support for GL_OES_EGL_image_external

Ian Romanick idr at freedesktop.org
Mon Oct 31 14:25:32 PDT 2011


On 10/30/2011 12:07 PM, Chia-I Wu wrote:
> From: Chia-I Wu<olv at lunarg.com>
>
> This extension introduces a new sampler type: samplerExternalOES.
> texture2D (and texture2DProj) can be used to do a texture look up in an
> external texture.

I haven't reviewed the rest of the series yet, but this patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> ---
>   src/glsl/ast.h                                     |    1 +
>   src/glsl/ast_type.cpp                              |    1 +
>   src/glsl/builtin_types.h                           |   10 ++++++++++
>   .../builtins/profiles/OES_EGL_image_external.frag  |    6 ++++++
>   .../builtins/profiles/OES_EGL_image_external.vert  |    6 ++++++
>   src/glsl/builtins/tools/generate_builtins.py       |    1 +
>   src/glsl/builtins/tools/texture_builtins.py        |    7 +++++++
>   src/glsl/glcpp/glcpp-parse.y                       |    3 +++
>   src/glsl/glsl_lexer.ll                             |    7 +++++++
>   src/glsl/glsl_parser.yy                            |    2 ++
>   src/glsl/glsl_parser_extras.cpp                    |    1 +
>   src/glsl/glsl_parser_extras.h                      |    2 ++
>   src/glsl/glsl_types.cpp                            |   18 ++++++++++++++++++
>   src/glsl/glsl_types.h                              |    5 ++++-
>   src/glsl/standalone_scaffolding.cpp                |    1 +
>   15 files changed, 70 insertions(+), 1 deletions(-)
>   create mode 100644 src/glsl/builtins/profiles/OES_EGL_image_external.frag
>   create mode 100644 src/glsl/builtins/profiles/OES_EGL_image_external.vert
>
> diff --git a/src/glsl/ast.h b/src/glsl/ast.h
> index 532347d..9fe6c41 100644
> --- a/src/glsl/ast.h
> +++ b/src/glsl/ast.h
> @@ -437,6 +437,7 @@ enum ast_types {
>      ast_sampler2drect,
>      ast_sampler3d,
>      ast_samplercube,
> +   ast_samplerexternaloes,
>      ast_sampler1dshadow,
>      ast_sampler2dshadow,
>      ast_sampler2drectshadow,
> diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp
> index c680ae5..79c43ee 100644
> --- a/src/glsl/ast_type.cpp
> +++ b/src/glsl/ast_type.cpp
> @@ -83,6 +83,7 @@ ast_type_specifier::ast_type_specifier(int specifier)
>         "sampler2DRect",
>         "sampler3D",
>         "samplerCube",
> +      "samplerExternalOES",
>         "sampler1DShadow",
>         "sampler2DShadow",
>         "sampler2DRectShadow",
> diff --git a/src/glsl/builtin_types.h b/src/glsl/builtin_types.h
> index 58b9a81..cc99b1b 100644
> --- a/src/glsl/builtin_types.h
> +++ b/src/glsl/builtin_types.h
> @@ -300,3 +300,13 @@ const glsl_type glsl_type::builtin_EXT_texture_buffer_object_types[] = {
>   	     GLSL_SAMPLER_DIM_BUF, 0, 0,  GLSL_TYPE_UINT, "usamplerBuffer"),
>   };
>   /*@}*/
> +
> +/** \name Sampler types added by GL_OES_EGL_image_external
> + */
> +/*@{*/
> +
> +const glsl_type glsl_type::builtin_OES_EGL_image_external_types[] = {
> +   glsl_type(GL_SAMPLER_EXTERNAL_OES,
> +	     GLSL_SAMPLER_DIM_EXTERNAL, 0, 0, GLSL_TYPE_FLOAT, "samplerExternalOES"),
> +};
> +/*@}*/
> diff --git a/src/glsl/builtins/profiles/OES_EGL_image_external.frag b/src/glsl/builtins/profiles/OES_EGL_image_external.frag
> new file mode 100644
> index 0000000..71e6af9
> --- /dev/null
> +++ b/src/glsl/builtins/profiles/OES_EGL_image_external.frag
> @@ -0,0 +1,6 @@
> +#version 100
> +#extension GL_OES_EGL_image_external : enable
> +
> +vec4 texture2D(samplerExternalOES sampler, vec2 coord);
> +vec4 texture2DProj(samplerExternalOES sampler, vec3 coord);
> +vec4 texture2DProj(samplerExternalOES sampler, vec4 coord);
> diff --git a/src/glsl/builtins/profiles/OES_EGL_image_external.vert b/src/glsl/builtins/profiles/OES_EGL_image_external.vert
> new file mode 100644
> index 0000000..71e6af9
> --- /dev/null
> +++ b/src/glsl/builtins/profiles/OES_EGL_image_external.vert
> @@ -0,0 +1,6 @@
> +#version 100
> +#extension GL_OES_EGL_image_external : enable
> +
> +vec4 texture2D(samplerExternalOES sampler, vec2 coord);
> +vec4 texture2DProj(samplerExternalOES sampler, vec3 coord);
> +vec4 texture2DProj(samplerExternalOES sampler, vec4 coord);
> diff --git a/src/glsl/builtins/tools/generate_builtins.py b/src/glsl/builtins/tools/generate_builtins.py
> index 8ce2b70..bc1b6d8 100755
> --- a/src/glsl/builtins/tools/generate_builtins.py
> +++ b/src/glsl/builtins/tools/generate_builtins.py
> @@ -158,6 +158,7 @@ read_builtins(GLenum target, const char *protos, const char **functions, unsigne
>      st->symbols->language_version = 130;
>      st->ARB_texture_rectangle_enable = true;
>      st->EXT_texture_array_enable = true;
> +   st->OES_EGL_image_external_enable = true;
>      _mesa_glsl_initialize_types(st);
>
>      sh->ir = new(sh) exec_list;
> diff --git a/src/glsl/builtins/tools/texture_builtins.py b/src/glsl/builtins/tools/texture_builtins.py
> index 7e569bf..62bad70 100755
> --- a/src/glsl/builtins/tools/texture_builtins.py
> +++ b/src/glsl/builtins/tools/texture_builtins.py
> @@ -23,6 +23,8 @@ def get_sampler_dim(sampler_type):
>           sampler_dim = int(sampler_type[0])
>       elif sampler_type.startswith("Cube"):
>           sampler_dim = 3
> +    elif sampler_type == "ExternalOES":
> +        sampler_dim = 2
>       else:
>           assert False ("coord_dim: invalid sampler_type: " + sampler_type)
>       return sampler_dim
> @@ -480,6 +482,8 @@ def generate_texture_functions(fs):
>       start_function("texture2D")
>       generate_sigs("", "tex", "2D")
>       generate_sigs("", "txb", "2D")
> +    # OES_EGL_image_external
> +    generate_sigs("", "tex", "ExternalOES")
>       end_function(fs, "texture2D")
>
>       start_function("texture2DLod")
> @@ -491,6 +495,9 @@ def generate_texture_functions(fs):
>       generate_sigs("", "tex", "2D", Proj, 1)
>       generate_sigs("", "txb", "2D", Proj)
>       generate_sigs("", "txb", "2D", Proj, 1)
> +    # OES_EGL_image_external
> +    generate_sigs("", "tex", "ExternalOES", Proj)
> +    generate_sigs("", "tex", "ExternalOES", Proj, 1)
>       end_function(fs, "texture2DProj")
>
>       start_function("texture2DProjLod")
> diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
> index 17941a9..1b17ff4 100644
> --- a/src/glsl/glcpp/glcpp-parse.y
> +++ b/src/glsl/glcpp/glcpp-parse.y
> @@ -1136,6 +1136,9 @@ glcpp_parser_create (const struct gl_extensions *extensions, int api)
>   	      add_builtin_define(parser, "GL_AMD_conservative_depth", 1);
>   	      add_builtin_define(parser, "GL_ARB_conservative_depth", 1);
>   	   }
> +
> +	   if (extensions->OES_EGL_image_external)
> +	      add_builtin_define(parser, "GL_OES_EGL_image_external", 1);
>   	}
>
>   	language_version = 110;
> diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll
> index 5364841..49f3bc8 100644
> --- a/src/glsl/glsl_lexer.ll
> +++ b/src/glsl/glsl_lexer.ll
> @@ -296,6 +296,13 @@ usamplerCube		KEYWORD(130, 130, USAMPLERCUBE);
>   usampler1DArray		KEYWORD(130, 130, USAMPLER1DARRAY);
>   usampler2DArray		KEYWORD(130, 130, USAMPLER2DARRAY);
>
> +samplerExternalOES	{
> +			  if (yyextra->OES_EGL_image_external_enable)
> +			     return SAMPLEREXTERNALOES;
> +			  else
> +			     return IDENTIFIER;
> +			}
> +
>
>   struct		return STRUCT;
>   void		return VOID_TOK;
> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> index 25d02fb..d32d6e4 100644
> --- a/src/glsl/glsl_parser.yy
> +++ b/src/glsl/glsl_parser.yy
> @@ -92,6 +92,7 @@
>   %token SAMPLER2DARRAYSHADOW ISAMPLER1D ISAMPLER2D ISAMPLER3D ISAMPLERCUBE
>   %token ISAMPLER1DARRAY ISAMPLER2DARRAY USAMPLER1D USAMPLER2D USAMPLER3D
>   %token USAMPLERCUBE USAMPLER1DARRAY USAMPLER2DARRAY
> +%token SAMPLEREXTERNALOES
>   %token STRUCT VOID_TOK WHILE
>   %token<identifier>  IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER
>   %type<identifier>  any_identifier
> @@ -1368,6 +1369,7 @@ basic_type_specifier_nonarray:
>   	| SAMPLER2DRECT		{ $$ = ast_sampler2drect; }
>   	| SAMPLER3D		{ $$ = ast_sampler3d; }
>   	| SAMPLERCUBE		{ $$ = ast_samplercube; }
> +	| SAMPLEREXTERNALOES	{ $$ = ast_samplerexternaloes; }
>   	| SAMPLER1DSHADOW	{ $$ = ast_sampler1dshadow; }
>   	| SAMPLER2DSHADOW	{ $$ = ast_sampler2dshadow; }
>   	| SAMPLER2DRECTSHADOW	{ $$ = ast_sampler2drectshadow; }
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index e2112fe..e627dab 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -267,6 +267,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
>      EXT(AMD_conservative_depth,         true,  false, true,  true,  false,     AMD_conservative_depth),
>      EXT(AMD_shader_stencil_export,      false, false, true,  true,  false,     ARB_shader_stencil_export),
>      EXT(OES_texture_3D,                 true,  false, true,  false, true,      EXT_texture3D),
> +   EXT(OES_EGL_image_external,         true,  false, true,  false, true,      OES_EGL_image_external),
>   };
>
>   #undef EXT
> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
> index dc6911d..1f3404c 100644
> --- a/src/glsl/glsl_parser_extras.h
> +++ b/src/glsl/glsl_parser_extras.h
> @@ -186,6 +186,8 @@ struct _mesa_glsl_parse_state {
>      bool AMD_shader_stencil_export_warn;
>      bool OES_texture_3D_enable;
>      bool OES_texture_3D_warn;
> +   bool OES_EGL_image_external_enable;
> +   bool OES_EGL_image_external_warn;
>      /*@}*/
>
>      /** Extensions supported by the OpenGL implementation. */
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index c94aec0..f930cc7 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -203,6 +203,15 @@ glsl_type::generate_OES_texture_3D_types(glsl_symbol_table *symtab, bool warn)
>
>
>   void
> +glsl_type::generate_OES_EGL_image_external_types(glsl_symbol_table *symtab,
> +						 bool warn)
> +{
> +   add_types_to_symbol_table(symtab, builtin_OES_EGL_image_external_types,
> +			     Elements(builtin_OES_EGL_image_external_types),
> +			     warn);
> +}
> +
> +void
>   _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
>   {
>      switch (state->language_version) {
> @@ -238,6 +247,15 @@ _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
>         glsl_type::generate_EXT_texture_array_types(state->symbols,
>   				       state->EXT_texture_array_warn);
>      }
> +
> +   /* We cannot check for language_version == 100 here because we need the
> +    * types to support fixed-function program generation.  But this is fine
> +    * since the extension is never enabled for OpenGL contexts.
> +    */
> +   if (state->OES_EGL_image_external_enable) {
> +      glsl_type::generate_OES_EGL_image_external_types(state->symbols,
> +					       state->OES_EGL_image_external_warn);
> +   }
>   }
>
>
> diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
> index 0486966..287b2e6 100644
> --- a/src/glsl/glsl_types.h
> +++ b/src/glsl/glsl_types.h
> @@ -62,7 +62,8 @@ enum glsl_sampler_dim {
>      GLSL_SAMPLER_DIM_3D,
>      GLSL_SAMPLER_DIM_CUBE,
>      GLSL_SAMPLER_DIM_RECT,
> -   GLSL_SAMPLER_DIM_BUF
> +   GLSL_SAMPLER_DIM_BUF,
> +   GLSL_SAMPLER_DIM_EXTERNAL
>   };
>
>
> @@ -478,6 +479,7 @@ private:
>      static const glsl_type builtin_ARB_texture_rectangle_types[];
>      static const glsl_type builtin_EXT_texture_array_types[];
>      static const glsl_type builtin_EXT_texture_buffer_object_types[];
> +   static const glsl_type builtin_OES_EGL_image_external_types[];
>      /*@}*/
>
>      /**
> @@ -496,6 +498,7 @@ private:
>      static void generate_ARB_texture_rectangle_types(glsl_symbol_table *, bool);
>      static void generate_EXT_texture_array_types(glsl_symbol_table *, bool);
>      static void generate_OES_texture_3D_types(glsl_symbol_table *, bool);
> +   static void generate_OES_EGL_image_external_types(glsl_symbol_table *, bool);
>      /*@}*/
>
>      /**
> diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp
> index 5cc6c98..24cc64a 100644
> --- a/src/glsl/standalone_scaffolding.cpp
> +++ b/src/glsl/standalone_scaffolding.cpp
> @@ -72,6 +72,7 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api)
>      ctx->Extensions.EXT_texture_array = true;
>      ctx->Extensions.NV_texture_rectangle = true;
>      ctx->Extensions.EXT_texture3D = true;
> +   ctx->Extensions.OES_EGL_image_external = true;
>
>      ctx->Const.GLSLVersion = 120;
>



More information about the mesa-dev mailing list