[Mesa-dev] [PATCH v2 06/14] glsl: Add built-in functions and constants required for ARB_shader_atomic_counters.

Ian Romanick idr at freedesktop.org
Fri Oct 25 10:50:48 PDT 2013


Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

On 10/01/2013 07:15 PM, Francisco Jerez wrote:
> v2: Represent atomics as GLSL intrinsics.
> ---
>  src/glsl/builtin_functions.cpp  | 58 +++++++++++++++++++++++++++++++++++++++++
>  src/glsl/builtin_variables.cpp  | 15 +++++++++++
>  src/glsl/glcpp/glcpp-parse.y    |  3 +++
>  src/glsl/glsl_parser_extras.cpp |  6 +++++
>  src/glsl/glsl_parser_extras.h   |  7 +++++
>  5 files changed, 89 insertions(+)
> 
> diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp
> index 03efb6d..d704b84 100644
> --- a/src/glsl/builtin_functions.cpp
> +++ b/src/glsl/builtin_functions.cpp
> @@ -300,6 +300,13 @@ tex3d_lod(const _mesa_glsl_parse_state *state)
>  {
>     return tex3d(state) && lod_exists_in_stage(state);
>  }
> +
> +static bool
> +shader_atomic_counters(const _mesa_glsl_parse_state *state)
> +{
> +   return state->ARB_shader_atomic_counters_enable;
> +}
> +
>  /** @} */
>  
>  /******************************************************************************/
> @@ -515,6 +522,11 @@ private:
>     B1(fma)
>     B2(ldexp)
>     B2(frexp)
> +
> +   ir_function_signature *_atomic_intrinsic(builtin_available_predicate avail);
> +   ir_function_signature *_atomic_op(const char *intrinsic,
> +                                     builtin_available_predicate avail);
> +
>  #undef B0
>  #undef B1
>  #undef B2
> @@ -621,6 +633,15 @@ builtin_builder::create_shader()
>  void
>  builtin_builder::create_intrinsics()
>  {
> +   add_function("__intrinsic_atomic_read",
> +                _atomic_intrinsic(shader_atomic_counters),
> +                NULL);
> +   add_function("__intrinsic_atomic_increment",
> +                _atomic_intrinsic(shader_atomic_counters),
> +                NULL);
> +   add_function("__intrinsic_atomic_predecrement",
> +                _atomic_intrinsic(shader_atomic_counters),
> +                NULL);
>  }
>  
>  /**
> @@ -1856,6 +1877,20 @@ builtin_builder::create_builtins()
>                  _frexp(glsl_type::vec3_type,  glsl_type::ivec3_type),
>                  _frexp(glsl_type::vec4_type,  glsl_type::ivec4_type),
>                  NULL);
> +
> +   add_function("atomicCounter",
> +                _atomic_op("__intrinsic_atomic_read",
> +                           shader_atomic_counters),
> +                NULL);
> +   add_function("atomicCounterIncrement",
> +                _atomic_op("__intrinsic_atomic_increment",
> +                           shader_atomic_counters),
> +                NULL);
> +   add_function("atomicCounterDecrement",
> +                _atomic_op("__intrinsic_atomic_predecrement",
> +                           shader_atomic_counters),
> +                NULL);
> +
>  #undef F
>  #undef FI
>  #undef FIU
> @@ -3606,6 +3641,29 @@ builtin_builder::_frexp(const glsl_type *x_type, const glsl_type *exp_type)
>  
>     return sig;
>  }
> +
> +ir_function_signature *
> +builtin_builder::_atomic_intrinsic(builtin_available_predicate avail)
> +{
> +   ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter");
> +   MAKE_INTRINSIC(glsl_type::uint_type, avail, 1, counter);
> +   return sig;
> +}
> +
> +ir_function_signature *
> +builtin_builder::_atomic_op(const char *intrinsic,
> +                            builtin_available_predicate avail)
> +{
> +   ir_variable *counter = in_var(glsl_type::atomic_uint_type, "atomic_counter");
> +   MAKE_SIG(glsl_type::uint_type, avail, 1, counter);
> +
> +   ir_variable *retval = body.make_temp(glsl_type::uint_type, "atomic_retval");
> +   body.emit(call(shader->symbols->get_function(intrinsic), retval, 1,
> +                  operand(counter)));
> +   body.emit(ret(retval));
> +   return sig;
> +}
> +
>  /** @} */
>  
>  /******************************************************************************/
> diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp
> index 6a808c0..49f0f42 100644
> --- a/src/glsl/builtin_variables.cpp
> +++ b/src/glsl/builtin_variables.cpp
> @@ -555,6 +555,21 @@ builtin_variable_generator::generate_constants()
>         */
>        add_const("gl_MaxTextureCoords", state->Const.MaxTextureCoords);
>     }
> +
> +   if (state->ARB_shader_atomic_counters_enable) {
> +      add_const("gl_MaxVertexAtomicCounters",
> +                state->Const.MaxVertexAtomicCounters);
> +      add_const("gl_MaxGeometryAtomicCounters",
> +                state->Const.MaxGeometryAtomicCounters);
> +      add_const("gl_MaxFragmentAtomicCounters",
> +                state->Const.MaxFragmentAtomicCounters);
> +      add_const("gl_MaxCombinedAtomicCounters",
> +                state->Const.MaxCombinedAtomicCounters);
> +      add_const("gl_MaxAtomicCounterBindings",
> +                state->Const.MaxAtomicBufferBindings);
> +      add_const("gl_MaxTessControlAtomicCounters", 0);
> +      add_const("gl_MaxTessEvaluationAtomicCounters", 0);
> +   }
>  }
>  
>  
> diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
> index 6eaa5f9..2b4e988 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_shader_atomic_counters)
> +	         add_builtin_define(parser, "GL_ARB_shader_atomic_counters", 1);
>  	   }
>  	}
>  
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index 6ebffc3..d0271bc 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -109,6 +109,12 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
>  
>     this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
>  
> +   this->Const.MaxVertexAtomicCounters = ctx->Const.VertexProgram.MaxAtomicCounters;
> +   this->Const.MaxGeometryAtomicCounters = ctx->Const.GeometryProgram.MaxAtomicCounters;
> +   this->Const.MaxFragmentAtomicCounters = ctx->Const.FragmentProgram.MaxAtomicCounters;
> +   this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters;
> +   this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings;
> +
>     this->current_function = NULL;
>     this->toplevel_ir = NULL;
>     this->found_return = false;
> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
> index d3e1a78..155071e 100644
> --- a/src/glsl/glsl_parser_extras.h
> +++ b/src/glsl/glsl_parser_extras.h
> @@ -221,6 +221,13 @@ struct _mesa_glsl_parse_state {
>        /* 3.00 ES */
>        int MinProgramTexelOffset;
>        int MaxProgramTexelOffset;
> +
> +      /* ARB_shader_atomic_counters */
> +      unsigned MaxVertexAtomicCounters;
> +      unsigned MaxGeometryAtomicCounters;
> +      unsigned MaxFragmentAtomicCounters;
> +      unsigned MaxCombinedAtomicCounters;
> +      unsigned MaxAtomicBufferBindings;
>     } Const;
>  
>     /**
> 



More information about the mesa-dev mailing list