[Mesa-dev] [PATCH 05/11] glsl: enable types for EXT_gpu_shader4

Marek Olšák maraeo at gmail.com
Tue Aug 21 03:53:36 UTC 2018


On Mon, Aug 13, 2018 at 1:42 PM Ian Romanick <idr at freedesktop.org> wrote:
>
> On 08/07/2018 10:42 PM, Marek Olšák wrote:
> > From: Chris Forbes <chrisf at ijw.co.nz>
> >
> > ---
> >  src/compiler/glsl/builtin_types.cpp | 32 ++++++++++++++++++
> >  src/compiler/glsl/glsl_lexer.ll     | 50 ++++++++++++++---------------
> >  2 files changed, 57 insertions(+), 25 deletions(-)
> >
> > diff --git a/src/compiler/glsl/builtin_types.cpp b/src/compiler/glsl/builtin_types.cpp
> > index 7a01cb48bc8..2e141447252 100644
> > --- a/src/compiler/glsl/builtin_types.cpp
> > +++ b/src/compiler/glsl/builtin_types.cpp
> > @@ -317,20 +317,52 @@ _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
> >        add_type(symbols, glsl_type::sampler2DMSArray_type);
> >        add_type(symbols, glsl_type::isampler2DMSArray_type);
> >        add_type(symbols, glsl_type::usampler2DMSArray_type);
> >     }
> >
> >     if (state->ARB_texture_rectangle_enable) {
> >        add_type(symbols, glsl_type::sampler2DRect_type);
> >        add_type(symbols, glsl_type::sampler2DRectShadow_type);
> >     }
> >
> > +   if (state->EXT_gpu_shader4_enable) {
> > +      add_type(symbols, glsl_type::uint_type);
> > +      add_type(symbols, glsl_type::uvec2_type);
> > +      add_type(symbols, glsl_type::uvec3_type);
> > +      add_type(symbols, glsl_type::uvec4_type);
> > +
> > +      add_type(symbols, glsl_type::sampler1DArray_type);
> > +      add_type(symbols, glsl_type::sampler2DArray_type);
> > +      add_type(symbols, glsl_type::sampler1DArrayShadow_type);
> > +      add_type(symbols, glsl_type::sampler2DArrayShadow_type);
> > +      add_type(symbols, glsl_type::samplerCubeShadow_type);
> > +      add_type(symbols, glsl_type::samplerBuffer_type);
> > +
> > +      add_type(symbols, glsl_type::isampler1D_type);
> > +      add_type(symbols, glsl_type::isampler2D_type);
> > +      add_type(symbols, glsl_type::isampler3D_type);
> > +      add_type(symbols, glsl_type::isamplerCube_type);
> > +      add_type(symbols, glsl_type::isampler2DRect_type);
> > +      add_type(symbols, glsl_type::isampler1DArray_type);
> > +      add_type(symbols, glsl_type::isampler2DArray_type);
> > +      add_type(symbols, glsl_type::isamplerBuffer_type);
> > +
> > +      add_type(symbols, glsl_type::usampler1D_type);
> > +      add_type(symbols, glsl_type::usampler2D_type);
> > +      add_type(symbols, glsl_type::usampler3D_type);
> > +      add_type(symbols, glsl_type::usamplerCube_type);
> > +      add_type(symbols, glsl_type::usampler2DRect_type);
> > +      add_type(symbols, glsl_type::usampler1DArray_type);
> > +      add_type(symbols, glsl_type::usampler2DArray_type);
> > +      add_type(symbols, glsl_type::usamplerBuffer_type);
> > +   }
> > +
> >     if (state->EXT_texture_array_enable) {
> >        add_type(symbols, glsl_type::sampler1DArray_type);
> >        add_type(symbols, glsl_type::sampler2DArray_type);
> >        add_type(symbols, glsl_type::sampler1DArrayShadow_type);
> >        add_type(symbols, glsl_type::sampler2DArrayShadow_type);
> >     }
> >
> >     if (state->OES_EGL_image_external_enable ||
> >         state->OES_EGL_image_external_essl3_enable) {
> >        add_type(symbols, glsl_type::samplerExternalOES_type);
> > diff --git a/src/compiler/glsl/glsl_lexer.ll b/src/compiler/glsl/glsl_lexer.ll
> > index 65c5b414a2d..67c33d6f1c9 100644
> > --- a/src/compiler/glsl/glsl_lexer.ll
> > +++ b/src/compiler/glsl/glsl_lexer.ll
> > @@ -347,23 +347,23 @@ for             return FOR;
> >  if           return IF;
> >  discard              return DISCARD;
> >  return               return RETURN;
> >
> >  bvec2                { yylval->type = glsl_type::bvec2_type; return BASIC_TYPE_TOK; }
> >  bvec3                { yylval->type = glsl_type::bvec3_type; return BASIC_TYPE_TOK; }
> >  bvec4                { yylval->type = glsl_type::bvec4_type; return BASIC_TYPE_TOK; }
> >  ivec2                { yylval->type = glsl_type::ivec2_type; return BASIC_TYPE_TOK; }
> >  ivec3                { yylval->type = glsl_type::ivec3_type; return BASIC_TYPE_TOK; }
> >  ivec4                { yylval->type = glsl_type::ivec4_type; return BASIC_TYPE_TOK; }
> > -uvec2                TYPE(130, 300, 130, 300, glsl_type::uvec2_type);
> > -uvec3                TYPE(130, 300, 130, 300, glsl_type::uvec3_type);
> > -uvec4                TYPE(130, 300, 130, 300, glsl_type::uvec4_type);
> > +uvec2                TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::uvec2_type);
> > +uvec3                TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::uvec3_type);
> > +uvec4                TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::uvec4_type);
> >  vec2         { yylval->type = glsl_type::vec2_type; return BASIC_TYPE_TOK; }
> >  vec3         { yylval->type = glsl_type::vec3_type; return BASIC_TYPE_TOK; }
> >  vec4         { yylval->type = glsl_type::vec4_type; return BASIC_TYPE_TOK; }
> >  mat2         { yylval->type = glsl_type::mat2_type; return BASIC_TYPE_TOK; }
> >  mat3         { yylval->type = glsl_type::mat3_type; return BASIC_TYPE_TOK; }
> >  mat4         { yylval->type = glsl_type::mat4_type; return BASIC_TYPE_TOK; }
> >  mat2x2               TYPE(120, 300, 120, 300, glsl_type::mat2_type);
> >  mat2x3               TYPE(120, 300, 120, 300, glsl_type::mat2x3_type);
> >  mat2x4               TYPE(120, 300, 120, 300, glsl_type::mat2x4_type);
> >  mat3x2               TYPE(120, 300, 120, 300, glsl_type::mat3x2_type);
> > @@ -383,39 +383,39 @@ centroid        KEYWORD_WITH_ALT(120, 300, 120, 300, yyextra->EXT_gpu_shader4_enable, C
> >  invariant    KEYWORD(120, 100, 120, 100, INVARIANT);
> >  flat         KEYWORD_WITH_ALT(130, 100, 130, 300, yyextra->EXT_gpu_shader4_enable, FLAT);
> >  smooth               KEYWORD(130, 300, 130, 300, SMOOTH);
> >  noperspective        KEYWORD_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable, NOPERSPECTIVE);
> >  patch                KEYWORD_WITH_ALT(0, 300, 400, 320, yyextra->has_tessellation_shader(), PATCH);
> >
> >  sampler1D    DEPRECATED_ES_TYPE(glsl_type::sampler1D_type);
> >  sampler2D    { yylval->type = glsl_type::sampler2D_type; return BASIC_TYPE_TOK; }
> >  sampler3D    { yylval->type = glsl_type::sampler3D_type; return BASIC_TYPE_TOK; }
> >  samplerCube  { yylval->type = glsl_type::samplerCube_type; return BASIC_TYPE_TOK; }
> > -sampler1DArray       TYPE(130, 300, 130, 0, glsl_type::sampler1DArray_type);
> > -sampler2DArray       TYPE(130, 300, 130, 300, glsl_type::sampler2DArray_type);
> > +sampler1DArray       TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable, glsl_type::sampler1DArray_type);
> > +sampler2DArray       TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::sampler2DArray_type);
> >  sampler1DShadow      DEPRECATED_ES_TYPE(glsl_type::sampler1DShadow_type);
> >  sampler2DShadow      { yylval->type = glsl_type::sampler2DShadow_type; return BASIC_TYPE_TOK; }
> > -samplerCubeShadow    TYPE(130, 300, 130, 300, glsl_type::samplerCubeShadow_type);
> > -sampler1DArrayShadow TYPE(130, 300, 130, 0, glsl_type::sampler1DArrayShadow_type);
> > -sampler2DArrayShadow TYPE(130, 300, 130, 300, glsl_type::sampler2DArrayShadow_type);
> > -isampler1D           TYPE(130, 300, 130, 0, glsl_type::isampler1D_type);
> > -isampler2D           TYPE(130, 300, 130, 300, glsl_type::isampler2D_type);
> > -isampler3D           TYPE(130, 300, 130, 300, glsl_type::isampler3D_type);
> > -isamplerCube         TYPE(130, 300, 130, 300, glsl_type::isamplerCube_type);
> > -isampler1DArray              TYPE(130, 300, 130, 0, glsl_type::isampler1DArray_type);
> > -isampler2DArray              TYPE(130, 300, 130, 300, glsl_type::isampler2DArray_type);
> > -usampler1D           TYPE(130, 300, 130, 0, glsl_type::usampler1D_type);
> > -usampler2D           TYPE(130, 300, 130, 300, glsl_type::usampler2D_type);
> > -usampler3D           TYPE(130, 300, 130, 300, glsl_type::usampler3D_type);
> > -usamplerCube         TYPE(130, 300, 130, 300, glsl_type::usamplerCube_type);
> > -usampler1DArray              TYPE(130, 300, 130, 0, glsl_type::usampler1DArray_type);
> > -usampler2DArray              TYPE(130, 300, 130, 300, glsl_type::usampler2DArray_type);
> > +samplerCubeShadow    TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::samplerCubeShadow_type);
> > +sampler1DArrayShadow TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable, glsl_type::sampler1DArrayShadow_type);
> > +sampler2DArrayShadow TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::sampler2DArrayShadow_type);
> > +isampler1D           TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable, glsl_type::isampler1D_type);
> > +isampler2D           TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::isampler2D_type);
> > +isampler3D           TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::isampler3D_type);
> > +isamplerCube         TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::isamplerCube_type);
> > +isampler1DArray              TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable, glsl_type::isampler1DArray_type);
> > +isampler2DArray              TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::isampler2DArray_type);
> > +usampler1D           TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable, glsl_type::usampler1D_type);
> > +usampler2D           TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::usampler2D_type);
> > +usampler3D           TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::usampler3D_type);
> > +usamplerCube         TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::usamplerCube_type);
> > +usampler1DArray              TYPE_WITH_ALT(130, 300, 130, 0, yyextra->EXT_gpu_shader4_enable, glsl_type::usampler1DArray_type);
> > +usampler2DArray              TYPE_WITH_ALT(130, 300, 130, 300, yyextra->EXT_gpu_shader4_enable, glsl_type::usampler2DArray_type);
> >
> >     /* additional keywords in ARB_texture_multisample, included in GLSL 1.50 */
> >     /* these are reserved but not defined in GLSL 3.00 */
> >     /* [iu]sampler2DMS are defined in GLSL ES 3.10 */
> >  sampler2DMS        TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, glsl_type::sampler2DMS_type);
> >  isampler2DMS       TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, glsl_type::isampler2DMS_type);
> >  usampler2DMS       TYPE_WITH_ALT(150, 300, 150, 310, yyextra->ARB_texture_multisample_enable, glsl_type::usampler2DMS_type);
> >  sampler2DMSArray   TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, glsl_type::sampler2DMSArray_type);
> >  isampler2DMSArray  TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, glsl_type::isampler2DMSArray_type);
> >  usampler2DMSArray  TYPE_WITH_ALT(150, 300, 150, 320, yyextra->ARB_texture_multisample_enable || yyextra->OES_texture_storage_multisample_2d_array_enable, glsl_type::usampler2DMSArray_type);
> > @@ -640,29 +640,29 @@ lowp            KEYWORD(120, 100, 130, 100, LOWP);
> >  mediump              KEYWORD(120, 100, 130, 100, MEDIUMP);
> >  highp                KEYWORD(120, 100, 130, 100, HIGHP);
> >  precision    KEYWORD(120, 100, 130, 100, PRECISION);
> >
> >      /* Additional reserved words in GLSL 1.30. */
> >  case         KEYWORD(130, 300, 130, 300, CASE);
> >  common               KEYWORD(130, 300, 0, 0, COMMON);
> >  partition    KEYWORD(130, 300, 0, 0, PARTITION);
> >  active               KEYWORD(130, 300, 0, 0, ACTIVE);
> >  superp               KEYWORD(130, 100, 0, 0, SUPERP);
> > -samplerBuffer        TYPE_WITH_ALT(130, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, glsl_type::samplerBuffer_type);
> > +samplerBuffer        TYPE_WITH_ALT(130, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable || yyextra->EXT_gpu_shader4_enable, glsl_type::samplerBuffer_type);
>
> I don't think this change is correct.  The EXT_gpu_shader4 spec says:
>
> Interactions with EXT_texture_buffer_object
>
>     If EXT_texture_buffer_object is not supported, references to buffer
>     textures, as well as the texelFetchBuffer and texelSizeBuffer lookup
>     functions and samplerBuffer types, need to be removed
>
> So I think it's correct as-is, even when destkop OpenGL
> EXT_texture_buffer is added.

We need the "GL_EXT_gpu_shader4 : enable" statement for allowing the
samplerBuffer type. EXT_texture_buffer is only for GLES, which can't
be enabled in desktop GL.

Marek


More information about the mesa-dev mailing list