[Mesa-dev] [PATCH v2 01/14] glsl: Add new atomic_uint built-in GLSL type.
Ian Romanick
idr at freedesktop.org
Tue Oct 22 14:41:50 PDT 2013
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
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;
> + else if (is_array())
> + return length * element_type()->atomic_size();
> + else
> + return 0;
> + }
> +
> + /**
> + * Return whether a type contains any atomic counters.
> + */
> + bool contains_atomic() const
> + {
> + return atomic_size();
> + }
> +
> + /**
> * Query the full type of a matrix row
> *
> * \return
> diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
> index b0f92cb..d65d8dc 100644
> --- a/src/glsl/ir.cpp
> +++ b/src/glsl/ir.cpp
> @@ -1579,7 +1579,7 @@ ir_swizzle::variable_referenced() const
> ir_variable::ir_variable(const struct glsl_type *type, const char *name,
> ir_variable_mode mode)
> : max_array_access(0), read_only(false), centroid(false), invariant(false),
> - mode(mode), interpolation(INTERP_QUALIFIER_NONE)
> + mode(mode), interpolation(INTERP_QUALIFIER_NONE), atomic()
> {
> this->ir_type = ir_type_variable;
> this->type = type;
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index 6c5630b..fd12ae6 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -547,6 +547,14 @@ public:
> int binding;
>
> /**
> + * Location an atomic counter is stored at.
> + */
> + struct {
> + unsigned buffer_index;
> + unsigned offset;
> + } atomic;
> +
> + /**
> * Built-in state that backs this uniform
> *
> * Once set at variable creation, \c state_slots must remain invariant.
> diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
> index fb303b0..6e6588a 100644
> --- a/src/glsl/ir_clone.cpp
> +++ b/src/glsl/ir_clone.cpp
> @@ -51,6 +51,8 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const
> var->location = this->location;
> var->index = this->index;
> var->binding = this->binding;
> + var->atomic.buffer_index = this->atomic.buffer_index;
> + var->atomic.offset = this->atomic.offset;
> var->warn_extension = this->warn_extension;
> var->origin_upper_left = this->origin_upper_left;
> var->pixel_center_integer = this->pixel_center_integer;
> @@ -385,6 +387,7 @@ ir_constant::clone(void *mem_ctx, struct hash_table *ht) const
> }
>
> case GLSL_TYPE_SAMPLER:
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_VOID:
> case GLSL_TYPE_ERROR:
> case GLSL_TYPE_INTERFACE:
> diff --git a/src/glsl/link_uniform_initializers.cpp b/src/glsl/link_uniform_initializers.cpp
> index 3f66710..786aaf0 100644
> --- a/src/glsl/link_uniform_initializers.cpp
> +++ b/src/glsl/link_uniform_initializers.cpp
> @@ -69,6 +69,7 @@ copy_constant_to_storage(union gl_constant_value *storage,
> break;
> case GLSL_TYPE_ARRAY:
> case GLSL_TYPE_STRUCT:
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_INTERFACE:
> case GLSL_TYPE_VOID:
> case GLSL_TYPE_ERROR:
> diff --git a/src/glsl/tests/uniform_initializer_utils.cpp b/src/glsl/tests/uniform_initializer_utils.cpp
> index a04f5dd..5e86c24 100644
> --- a/src/glsl/tests/uniform_initializer_utils.cpp
> +++ b/src/glsl/tests/uniform_initializer_utils.cpp
> @@ -92,6 +92,7 @@ generate_data_element(void *mem_ctx, const glsl_type *type,
> case GLSL_TYPE_BOOL:
> data.b[i] = bool(values[idx]);
> break;
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_STRUCT:
> case GLSL_TYPE_ARRAY:
> case GLSL_TYPE_VOID:
> @@ -119,6 +120,7 @@ generate_data_element(void *mem_ctx, const glsl_type *type,
> case GLSL_TYPE_BOOL:
> ASSERT_EQ(data.b[i], val->value.b[i]);
> break;
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_STRUCT:
> case GLSL_TYPE_ARRAY:
> case GLSL_TYPE_VOID:
> @@ -217,6 +219,7 @@ verify_data(gl_constant_value *storage, unsigned storage_array_size,
> case GLSL_TYPE_BOOL:
> EXPECT_EQ(int(val->value.b[i]), storage[i].i);
> break;
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_STRUCT:
> case GLSL_TYPE_ARRAY:
> case GLSL_TYPE_VOID:
> diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
> index b08107b..c1ea26c 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -622,6 +622,7 @@ type_size(const struct glsl_type *type)
> * at link time.
> */
> return 1;
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_VOID:
> case GLSL_TYPE_ERROR:
> case GLSL_TYPE_INTERFACE:
> @@ -2592,6 +2593,7 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
> format = uniform_native;
> columns = 1;
> break;
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_ARRAY:
> case GLSL_TYPE_VOID:
> case GLSL_TYPE_STRUCT:
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index a5d0b84..9196371 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -969,6 +969,7 @@ type_size(const struct glsl_type *type)
> * at link time.
> */
> return 1;
> + case GLSL_TYPE_ATOMIC_UINT:
> case GLSL_TYPE_INTERFACE:
> case GLSL_TYPE_VOID:
> case GLSL_TYPE_ERROR:
>
More information about the mesa-dev
mailing list