[Mesa-dev] [PATCH v2 01/14] glsl: Add new atomic_uint built-in GLSL type.

Kenneth Graunke kenneth at whitecape.org
Wed Oct 2 02:25:00 PDT 2013


On 10/01/2013 07:15 PM, Francisco Jerez wrote:
> v2: Fix GLSL version in which the type became available.  Add
>     contains_atomic() convenience method.  Split off atomic counter
>     comparison error checking to a separate patch that will handle all
>     opaque types.  Include new ir_variable fields for atomic types.
> ---
>  src/glsl/ast_to_hir.cpp                      |  1 +
>  src/glsl/builtin_type_macros.h               |  2 ++
>  src/glsl/builtin_types.cpp                   |  6 ++++++
>  src/glsl/glsl_types.cpp                      |  2 ++
>  src/glsl/glsl_types.h                        | 22 ++++++++++++++++++++++
>  src/glsl/ir.cpp                              |  2 +-
>  src/glsl/ir.h                                |  8 ++++++++
>  src/glsl/ir_clone.cpp                        |  3 +++
>  src/glsl/link_uniform_initializers.cpp       |  1 +
>  src/glsl/tests/uniform_initializer_utils.cpp |  3 +++
>  src/mesa/program/ir_to_mesa.cpp              |  2 ++
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp   |  1 +
>  12 files changed, 52 insertions(+), 1 deletion(-)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 0859d9e..99159dc 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -902,6 +902,7 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1)
>     case GLSL_TYPE_VOID:
>     case GLSL_TYPE_SAMPLER:
>     case GLSL_TYPE_INTERFACE:
> +   case GLSL_TYPE_ATOMIC_UINT:
>        /* I assume a comparison of a struct containing a sampler just
>         * ignores the sampler present in the type.
>         */
> diff --git a/src/glsl/builtin_type_macros.h b/src/glsl/builtin_type_macros.h
> index fec38da..263fd83 100644
> --- a/src/glsl/builtin_type_macros.h
> +++ b/src/glsl/builtin_type_macros.h
> @@ -110,6 +110,8 @@ DECL_TYPE(sampler2DRectShadow,    GL_SAMPLER_2D_RECT_SHADOW,        GLSL_SAMPLER
>  
>  DECL_TYPE(samplerExternalOES,     GL_SAMPLER_EXTERNAL_OES,          GLSL_SAMPLER_DIM_EXTERNAL, 0, 0, GLSL_TYPE_FLOAT)
>  
> +DECL_TYPE(atomic_uint, GL_UNSIGNED_INT_ATOMIC_COUNTER, GLSL_TYPE_ATOMIC_UINT, 1, 1)
> +
>  STRUCT_TYPE(gl_DepthRangeParameters)
>  STRUCT_TYPE(gl_PointParameters)
>  STRUCT_TYPE(gl_MaterialParameters)
> diff --git a/src/glsl/builtin_types.cpp b/src/glsl/builtin_types.cpp
> index 722eda2..98f608b 100644
> --- a/src/glsl/builtin_types.cpp
> +++ b/src/glsl/builtin_types.cpp
> @@ -203,6 +203,8 @@ const static struct builtin_type_versions {
>     T(sampler2DRectShadow,             140, 999)
>  
>     T(struct_gl_DepthRangeParameters,  110, 100)
> +
> +   T(atomic_uint,                     420, 999)
>  };
>  
>  const glsl_type *const deprecated_types[] = {
> @@ -284,5 +286,9 @@ _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
>     if (state->OES_texture_3D_enable) {
>        add_type(symbols, glsl_type::sampler3D_type);
>     }
> +
> +   if (state->ARB_shader_atomic_counters_enable) {
> +      add_type(symbols, glsl_type::atomic_uint_type);
> +   }
>  }
>  /** @} */
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index 3c396dd..e1fe153 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -586,6 +586,7 @@ glsl_type::component_slots() const
>        return this->length * this->fields.array->component_slots();
>  
>     case GLSL_TYPE_SAMPLER:
> +   case GLSL_TYPE_ATOMIC_UINT:
>     case GLSL_TYPE_VOID:
>     case GLSL_TYPE_ERROR:
>        break;
> @@ -874,6 +875,7 @@ glsl_type::count_attribute_slots() const
>        return this->length * this->fields.array->count_attribute_slots();
>  
>     case GLSL_TYPE_SAMPLER:
> +   case GLSL_TYPE_ATOMIC_UINT:
>     case GLSL_TYPE_VOID:
>     case GLSL_TYPE_ERROR:
>        break;
> diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
> index 9f61eee..d00b9e7 100644
> --- a/src/glsl/glsl_types.h
> +++ b/src/glsl/glsl_types.h
> @@ -53,6 +53,7 @@ enum glsl_base_type {
>     GLSL_TYPE_FLOAT,
>     GLSL_TYPE_BOOL,
>     GLSL_TYPE_SAMPLER,
> +   GLSL_TYPE_ATOMIC_UINT,
>     GLSL_TYPE_STRUCT,
>     GLSL_TYPE_INTERFACE,
>     GLSL_TYPE_ARRAY,
> @@ -441,6 +442,27 @@ struct glsl_type {
>     }
>  
>     /**
> +    * Return the amount of atomic counter storage required for a type.
> +    */
> +   unsigned atomic_size() const
> +   {
> +      if (base_type == GLSL_TYPE_ATOMIC_UINT)
> +         return ATOMIC_COUNTER_SIZE;

This doesn't compile, since ATOMIC_COUNTER_SIZE is not defined.

> +      else if (is_array())
> +         return length * element_type()->atomic_size();
> +      else
> +         return 0;
> +   }



More information about the mesa-dev mailing list