[Mesa-dev] [PATCH V3 02/11] glsl: add texture gather changes

Ian Romanick idr at freedesktop.org
Mon Sep 30 17:00:00 PDT 2013


On 09/15/2013 02:58 AM, Chris Forbes wrote:
> From: Maxence Le Dore <maxence.ledore at gmail.com>
> 
> V2 [Chris Forbes]:
>    - Add new pattern, fixup parameter reading.
> 
> V3: Rebase onto new builtins machinery
> 
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/glsl/builtin_functions.cpp      | 35 +++++++++++++++++++++++++++++++++++
>  src/glsl/glcpp/glcpp-parse.y        |  3 +++
>  src/glsl/glsl_parser_extras.cpp     |  1 +
>  src/glsl/glsl_parser_extras.h       |  2 ++
>  src/glsl/ir.cpp                     |  2 +-
>  src/glsl/ir.h                       |  4 +++-
>  src/glsl/ir_clone.cpp               |  1 +
>  src/glsl/ir_hv_accept.cpp           |  1 +
>  src/glsl/ir_print_visitor.cpp       |  3 ++-
>  src/glsl/ir_reader.cpp              |  6 +++++-
>  src/glsl/ir_rvalue_visitor.cpp      |  1 +
>  src/glsl/opt_tree_grafting.cpp      |  1 +
>  src/glsl/standalone_scaffolding.cpp |  1 +
>  src/mesa/program/ir_to_mesa.cpp     |  5 +++++
>  14 files changed, 62 insertions(+), 4 deletions(-)
> 
> diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp
> index 528af0d..a7d454c 100644
> --- a/src/glsl/builtin_functions.cpp
> +++ b/src/glsl/builtin_functions.cpp
> @@ -262,6 +262,13 @@ texture_query_lod(const _mesa_glsl_parse_state *state)
>            state->ARB_texture_query_lod_enable;
>  }
>  
> +static bool
> +texture_gather(const _mesa_glsl_parse_state *state)
> +{
> +   return state->is_version(400, 0) ||
> +          state->ARB_texture_gather_enable;
> +}
> +
>  /* Desktop GL or OES_standard_derivatives + fragment shader only */
>  static bool
>  fs_oes_derivatives(const _mesa_glsl_parse_state *state)
> @@ -1807,6 +1814,34 @@ builtin_builder::create_builtins()
>                  _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type,  glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
>                  NULL);
>  
> +   add_function("textureGather",
> +                _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
> +
> +                _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
> +
> +                _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
> +
> +                _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
> +                _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
> +                NULL);
> +
> +   add_function("textureGatherOffset",
> +                _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
> +                _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
> +                _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
> +
> +                _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
> +                _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
> +                _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
> +                NULL);
> +
>     F(dFdx)
>     F(dFdy)
>     F(fwidth)
> diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
> index 6eaa5f9..c7ad3e9 100644
> --- a/src/glsl/glcpp/glcpp-parse.y
> +++ b/src/glsl/glcpp/glcpp-parse.y
> @@ -1248,6 +1248,9 @@ glcpp_parser_create (const struct gl_extensions *extensions, int api)
>  
>  	      if (extensions->EXT_shader_integer_mix)
>  	         add_builtin_define(parser, "GL_EXT_shader_integer_mix", 1);
> +
> +	      if (extensions->ARB_texture_gather)
> +	         add_builtin_define(parser, "GL_ARB_texture_gather", 1);
>  	   }
>  	}
>  
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index cac5a18..aca0f5c 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -518,6 +518,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
>     EXT(ARB_gpu_shader5,                true,  false,     ARB_gpu_shader5),
>     EXT(AMD_vertex_shader_layer,        true,  false,     AMD_vertex_shader_layer),
>     EXT(EXT_shader_integer_mix,         true,  true,      EXT_shader_integer_mix),
> +   EXT(ARB_texture_gather,             true,  false,     ARB_texture_gather),
>  };
>  
>  #undef EXT
> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
> index 2e2440a..914071a 100644
> --- a/src/glsl/glsl_parser_extras.h
> +++ b/src/glsl/glsl_parser_extras.h
> @@ -279,6 +279,8 @@ struct _mesa_glsl_parse_state {
>     bool ARB_fragment_coord_conventions_warn;
>     bool ARB_texture_rectangle_enable;
>     bool ARB_texture_rectangle_warn;
> +   bool ARB_texture_gather_enable;
> +   bool ARB_texture_gather_warn;
>     bool EXT_texture_array_enable;
>     bool EXT_texture_array_warn;
>     bool ARB_shader_texture_lod_enable;
> diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
> index 1b17999..05f8f44 100644
> --- a/src/glsl/ir.cpp
> +++ b/src/glsl/ir.cpp
> @@ -1360,7 +1360,7 @@ ir_dereference::is_lvalue() const
>  }
>  
>  
> -static const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod" };
> +static const char *tex_opcode_strs[] = { "tex", "txb", "txl", "txd", "txf", "txf_ms", "txs", "lod", "tg4" };
>  
>  const char *ir_texture::opcode_string()
>  {
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index 2637b40..940eb01 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -1552,7 +1552,8 @@ enum ir_texture_opcode {
>     ir_txf,		/**< Texel fetch with explicit LOD */
>     ir_txf_ms,           /**< Multisample texture fetch */
>     ir_txs,		/**< Texture size */
> -   ir_lod		/**< Texture lod query */
> +   ir_lod,		/**< Texture lod query */
> +   ir_tg4		/**< Texture gather */
>  };
>  
>  
> @@ -1577,6 +1578,7 @@ enum ir_texture_opcode {
>   *      <type> <sampler> <coordinate>         <sample_index>)
>   * (txs <type> <sampler> <lod>)
>   * (lod <type> <sampler> <coordinate>)
> + * (tg4 <type> <sampler> <coordinate> 0)
>   */
>  class ir_texture : public ir_rvalue {
>  public:
> diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
> index fb303b0..fe531a8 100644
> --- a/src/glsl/ir_clone.cpp
> +++ b/src/glsl/ir_clone.cpp
> @@ -248,6 +248,7 @@ ir_texture::clone(void *mem_ctx, struct hash_table *ht) const
>     switch (this->op) {
>     case ir_tex:
>     case ir_lod:
> +   case ir_tg4:
>        break;
>     case ir_txb:
>        new_tex->lod_info.bias = this->lod_info.bias->clone(mem_ctx, ht);
> diff --git a/src/glsl/ir_hv_accept.cpp b/src/glsl/ir_hv_accept.cpp
> index 76a607d..3877e72 100644
> --- a/src/glsl/ir_hv_accept.cpp
> +++ b/src/glsl/ir_hv_accept.cpp
> @@ -214,6 +214,7 @@ ir_texture::accept(ir_hierarchical_visitor *v)
>     switch (this->op) {
>     case ir_tex:
>     case ir_lod:
> +   case ir_tg4:
>        break;
>     case ir_txb:
>        s = this->lod_info.bias->accept(v);
> diff --git a/src/glsl/ir_print_visitor.cpp b/src/glsl/ir_print_visitor.cpp
> index b518310..2c06b95 100644
> --- a/src/glsl/ir_print_visitor.cpp
> +++ b/src/glsl/ir_print_visitor.cpp
> @@ -266,7 +266,7 @@ void ir_print_visitor::visit(ir_texture *ir)
>        printf(" ");
>     }
>  
> -   if (ir->op != ir_txf && ir->op != ir_txf_ms && ir->op != ir_txs) {
> +   if (ir->op != ir_txf && ir->op != ir_txf_ms && ir->op != ir_txs && ir->op != ir_tg4) {
>        if (ir->projector)
>  	 ir->projector->accept(this);
>        else
> @@ -285,6 +285,7 @@ void ir_print_visitor::visit(ir_texture *ir)
>     {
>     case ir_tex:
>     case ir_lod:
> +   case ir_tg4:
>        break;
>     case ir_txb:
>        ir->lod_info.bias->accept(this);
> diff --git a/src/glsl/ir_reader.cpp b/src/glsl/ir_reader.cpp
> index ec35b68..ab3aa3a 100644
> --- a/src/glsl/ir_reader.cpp
> +++ b/src/glsl/ir_reader.cpp
> @@ -943,6 +943,8 @@ ir_reader::read_texture(s_expression *expr)
>        { "txf_ms", s_type, s_sampler, s_coord, s_sample_index };
>     s_pattern txs_pattern[] =
>        { "txs", s_type, s_sampler, s_lod };
> +   s_pattern tg4_pattern[] =
> +      { "tg4", s_type, s_sampler, s_coord, s_offset };
>     s_pattern other_pattern[] =
>        { tag, s_type, s_sampler, s_coord, s_offset, s_proj, s_shadow, s_lod };
>  
> @@ -956,6 +958,8 @@ ir_reader::read_texture(s_expression *expr)
>        op = ir_txf_ms;
>     } else if (MATCH(expr, txs_pattern)) {
>        op = ir_txs;
> +   } else if (MATCH(expr, tg4_pattern)) {
> +      op = ir_tg4;
>     } else if (MATCH(expr, other_pattern)) {
>        op = ir_texture::get_opcode(tag->value());
>        if (op == -1)
> @@ -1006,7 +1010,7 @@ ir_reader::read_texture(s_expression *expr)
>        }
>     }
>  
> -   if (op != ir_txf && op != ir_txf_ms && op != ir_txs && op != ir_lod) {
> +   if (op != ir_txf && op != ir_txf_ms && op != ir_txs && op != ir_lod && op != ir_tg4) {
>        s_int *proj_as_int = SX_AS_INT(s_proj);
>        if (proj_as_int && proj_as_int->value() == 1) {
>  	 tex->projector = NULL;
> diff --git a/src/glsl/ir_rvalue_visitor.cpp b/src/glsl/ir_rvalue_visitor.cpp
> index 8eb1c62..4c3d813 100644
> --- a/src/glsl/ir_rvalue_visitor.cpp
> +++ b/src/glsl/ir_rvalue_visitor.cpp
> @@ -57,6 +57,7 @@ ir_rvalue_base_visitor::rvalue_visit(ir_texture *ir)
>     switch (ir->op) {
>     case ir_tex:
>     case ir_lod:
> +   case ir_tg4:
>        break;
>     case ir_txb:
>        handle_rvalue(&ir->lod_info.bias);
> diff --git a/src/glsl/opt_tree_grafting.cpp b/src/glsl/opt_tree_grafting.cpp
> index 9aceb13..03b920d 100644
> --- a/src/glsl/opt_tree_grafting.cpp
> +++ b/src/glsl/opt_tree_grafting.cpp
> @@ -275,6 +275,7 @@ ir_tree_grafting_visitor::visit_enter(ir_texture *ir)
>     switch (ir->op) {
>     case ir_tex:
>     case ir_lod:
> +   case ir_tg4:
>        break;
>     case ir_txb:
>        if (do_graft(&ir->lod_info.bias))
> diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp
> index 11cd6cd..22ee649 100644
> --- a/src/glsl/standalone_scaffolding.cpp
> +++ b/src/glsl/standalone_scaffolding.cpp
> @@ -105,6 +105,7 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api)
>     ctx->Extensions.ARB_texture_multisample = true;
>     ctx->Extensions.ARB_texture_query_lod = true;
>     ctx->Extensions.ARB_gpu_shader5 = true;
> +   ctx->Extensions.ARB_texture_gather = true;
>  
>     ctx->Const.GLSLVersion = 120;
>  
> diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
> index 510235c..0a09d69 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -2067,6 +2067,11 @@ ir_to_mesa_visitor::visit(ir_texture *ir)
>     case ir_lod:
>        assert(!"Unexpected ir_lod opcode");
>        break;
> +   case ir_tg4:
> +      assert(!"Unexpected ir_tg4 opcode");
> +      break;
> +   default:
> +     assert(!"Invalid texture opcode.");

I'd rather leave the default case off so that the compiler will yell at
us... even though every additional case will be an assertion.

>     }
>  
>     const glsl_type *sampler_type = ir->sampler->type;
> 



More information about the mesa-dev mailing list