summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2011-10-23 18:51:06 +0800
committerChia-I Wu <[email protected]>2011-11-03 15:09:44 +0800
commit2903816aadb281716b6c59a5a48aeadb84a08f50 (patch)
tree23f372e51fdf5da3e37f3c3d8051458e340beed7 /src/glsl
parentdb73264e1471a594d49ca0bc397cbb6746ee1dce (diff)
glsl: add support for GL_OES_EGL_image_external
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 <[email protected]> Acked-by: Jakob Bornecrantz <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/ast.h1
-rw-r--r--src/glsl/ast_type.cpp1
-rw-r--r--src/glsl/builtin_types.h10
-rw-r--r--src/glsl/builtins/profiles/OES_EGL_image_external.frag6
-rw-r--r--src/glsl/builtins/profiles/OES_EGL_image_external.vert6
-rwxr-xr-xsrc/glsl/builtins/tools/generate_builtins.py1
-rwxr-xr-xsrc/glsl/builtins/tools/texture_builtins.py7
-rw-r--r--src/glsl/glcpp/glcpp-parse.y3
-rw-r--r--src/glsl/glsl_lexer.ll7
-rw-r--r--src/glsl/glsl_parser.yy2
-rw-r--r--src/glsl/glsl_parser_extras.cpp1
-rw-r--r--src/glsl/glsl_parser_extras.h2
-rw-r--r--src/glsl/glsl_types.cpp18
-rw-r--r--src/glsl/glsl_types.h5
-rw-r--r--src/glsl/standalone_scaffolding.cpp1
15 files changed, 70 insertions, 1 deletions
diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index 532347df4bd..9fe6c41252e 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 c680ae5f671..79c43eefbc5 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 58b9a81273a..cc99b1bdeda 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 00000000000..71e6af9d351
--- /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 00000000000..71e6af9d351
--- /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 b8c12bc3659..72d12bb2a9a 100755
--- a/src/glsl/builtins/tools/generate_builtins.py
+++ b/src/glsl/builtins/tools/generate_builtins.py
@@ -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;
diff --git a/src/glsl/builtins/tools/texture_builtins.py b/src/glsl/builtins/tools/texture_builtins.py
index 7e569bf562b..62bad70ca26 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 17941a9be8a..1b17ff43adb 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 5364841ecd3..49f3bc82eb8 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 25d02fb1eaf..d32d6e4e1ce 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 e2112fe6dd0..e627dabf773 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 dc6911d1c9a..1f3404c9deb 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 03e99879e8e..8587da0a3a2 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 2f849afba70..56b8efe7baa 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
};
@@ -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);
/*@}*/
/**
diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp
index 5cc6c98799b..24cc64ad97b 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;