From 2903816aadb281716b6c59a5a48aeadb84a08f50 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sun, 23 Oct 2011 18:51:06 +0800 Subject: [PATCH] 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 Acked-by: Jakob Bornecrantz Reviewed-by: Ian Romanick --- src/glsl/ast.h | 1 + src/glsl/ast_type.cpp | 1 + src/glsl/builtin_types.h | 10 ++++++++++ .../profiles/OES_EGL_image_external.frag | 6 ++++++ .../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 deletion(-) 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 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 TYPE_IDENTIFIER NEW_IDENTIFIER %type 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 @@ -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); + } } 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; -- 2.30.2