glsl: add support for GL_OES_EGL_image_external
authorChia-I Wu <olv@lunarg.com>
Sun, 23 Oct 2011 10:51:06 +0000 (18:51 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Thu, 3 Nov 2011 07:09:44 +0000 (15:09 +0800)
This extension introduces a new sampler type: samplerExternalOES.
texture2D (and texture2DProj) can be used to do a texture look up in an
external texture.

Reviewed-by: Brian Paul <brianp@vmware.com>
Acked-by: Jakob Bornecrantz <jakob@vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
15 files changed:
src/glsl/ast.h
src/glsl/ast_type.cpp
src/glsl/builtin_types.h
src/glsl/builtins/profiles/OES_EGL_image_external.frag [new file with mode: 0644]
src/glsl/builtins/profiles/OES_EGL_image_external.vert [new file with mode: 0644]
src/glsl/builtins/tools/generate_builtins.py
src/glsl/builtins/tools/texture_builtins.py
src/glsl/glcpp/glcpp-parse.y
src/glsl/glsl_lexer.ll
src/glsl/glsl_parser.yy
src/glsl/glsl_parser_extras.cpp
src/glsl/glsl_parser_extras.h
src/glsl/glsl_types.cpp
src/glsl/glsl_types.h
src/glsl/standalone_scaffolding.cpp

index 532347df4bd724b46131fe554b057233f4bccbbe..9fe6c41252e40a2276c97096090f33caf9907e07 100644 (file)
@@ -437,6 +437,7 @@ enum ast_types {
    ast_sampler2drect,
    ast_sampler3d,
    ast_samplercube,
+   ast_samplerexternaloes,
    ast_sampler1dshadow,
    ast_sampler2dshadow,
    ast_sampler2drectshadow,
index c680ae5f67123f326f3ccf41c6b112fa817b9c51..79c43eefbc523d1246a5abdeedab0b4429984697 100644 (file)
@@ -83,6 +83,7 @@ ast_type_specifier::ast_type_specifier(int specifier)
       "sampler2DRect",
       "sampler3D",
       "samplerCube",
+      "samplerExternalOES",
       "sampler1DShadow",
       "sampler2DShadow",
       "sampler2DRectShadow",
index 58b9a81273a4805a43ab0f2f876a3d72c2821e86..cc99b1bdeda55aea04ce409525370d0888040491 100644 (file)
@@ -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 (file)
index 0000000..71e6af9
--- /dev/null
@@ -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 (file)
index 0000000..71e6af9
--- /dev/null
@@ -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);
index b8c12bc3659fd940216bb29e7d9d9aef35a03c60..72d12bb2a9a4fb6142ffb78db67f542ae91dbcc4 100755 (executable)
@@ -164,6 +164,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;
index 7e569bf562b1c457b6337710282e80c6ec565a0b..62bad70ca26238d3a545abd1fdd0c4d6eeba4a02 100755 (executable)
@@ -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")
index 17941a9be8a6b679a40e45bac6b5d2fc7971d184..1b17ff43adbdebb50e5d040e70b73437f9934987 100644 (file)
@@ -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;
index 5364841ecd335e3009f1bcadd12b53de3e02782e..49f3bc82eb89332aee6028be57d800ddc59e49a5 100644 (file)
@@ -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;
index 25d02fb1eafd43093077cfea059576124b49d81b..d32d6e4e1ceb9d326492a3ff62d7917a0bd7d1ee 100644 (file)
@@ -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; }
index e2112fe6dd0cfef3a18b1ebb2c4888e036a6cb76..e627dabf773dc504c7a2c11b132386238c79e92d 100644 (file)
@@ -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
index dc6911d1c9a0c595c5091469a8ccf57c43a81c90..1f3404c9deb1c7b0d6f8ca584afc4ea9a2b1fe23 100644 (file)
@@ -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. */
index 03e99879e8ebfa4c40228bfb42b92345dae825bb..8587da0a3a2c60025ff7719e18ed5e1c196f60ff 100644 (file)
@@ -202,6 +202,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)
 {
@@ -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);
+   }
 }
 
 
index 2f849afba709b76c0b40c0b99b29d750155b215a..56b8efe7baa68195fc849457444188839b9ac3ce 100644 (file)
@@ -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
 };
 
 
@@ -489,6 +490,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[];
    /*@}*/
 
    /**
@@ -507,6 +509,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);
    /*@}*/
 
    /**
index 5cc6c98799b0ac3e7cdfdd909e3b3e81e3217a22..24cc64ad97b172a525726e471dce394428335508 100644 (file)
@@ -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;