Reviewed-by: Ian Romanick <ian.d.roman...@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: >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev