On 10/30/2011 12:07 PM, Chia-I Wu wrote:
From: Chia-I Wu<o...@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.roman...@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;


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to