[Mesa-dev] [PATCH v4 (part2) 21/59] glsl: propagate interface packing information to arrays of scalars, vectors.
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Sun Aug 30 23:39:04 PDT 2015
On 29/08/15 09:22, Jordan Justen wrote:
> On 2015-08-05 01:30:18, Iago Toral Quiroga wrote:
>> From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>>
>> Now std140 is not the only interface packing qualifier that can be used.
>>
>> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>> ---
>> src/glsl/ast.h | 10 +++++++++
>> src/glsl/ast_to_hir.cpp | 54 +++++++++++++++++++++++++++++++++++++------------
>> src/glsl/glsl_types.cpp | 14 ++++++++++---
>> src/glsl/glsl_types.h | 8 ++++++--
>> 4 files changed, 68 insertions(+), 18 deletions(-)
>>
>> diff --git a/src/glsl/ast.h b/src/glsl/ast.h
>> index ac3f80f..ad6e300 100644
>> --- a/src/glsl/ast.h
>> +++ b/src/glsl/ast.h
>> @@ -730,6 +730,11 @@ public:
>> struct _mesa_glsl_parse_state *state)
>> const;
>>
>> + const struct glsl_type *glsl_type(const char **name,
>> + struct _mesa_glsl_parse_state *state,
>> + enum glsl_interface_packing packing)
>> + const;
>> +
>> virtual void print(void) const;
>>
>> ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
>> @@ -757,6 +762,11 @@ public:
>> struct _mesa_glsl_parse_state *state)
>> const;
>>
>> + const struct glsl_type *glsl_type(const char **name,
>> + struct _mesa_glsl_parse_state *state,
>> + enum glsl_interface_packing packing)
>> + const;
>> +
>> ast_type_qualifier qualifier;
>> ast_type_specifier *specifier;
>> };
>> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
>> index 2dadb03..193098a 100644
>> --- a/src/glsl/ast_to_hir.cpp
>> +++ b/src/glsl/ast_to_hir.cpp
>> @@ -1951,10 +1951,15 @@ process_array_size(exec_node *node,
>> static const glsl_type *
>> process_array_type(YYLTYPE *loc, const glsl_type *base,
>> ast_array_specifier *array_specifier,
>> - struct _mesa_glsl_parse_state *state)
>> + struct _mesa_glsl_parse_state *state,
>> + enum glsl_interface_packing packing)
>> {
>> const glsl_type *array_type = base;
>>
>> + /* Mesa uses std140 interface packing by default. */
>> + if (packing != GLSL_INTERFACE_PACKING_STD430)
>> + packing = GLSL_INTERFACE_PACKING_STD140;
>
> I wonder if we should let drivers decide if they want to use std430
> packing for 'shared' and 'packed'?
>
If we want it, this could be done in a separate patch in the future.
> Maybe the comment should mention packed/shared?
>
OK, I will add it.
>> +
>> if (array_specifier != NULL) {
>> if (base->is_array()) {
>>
>> @@ -1983,11 +1988,12 @@ process_array_type(YYLTYPE *loc, const glsl_type *base,
>> for (exec_node *node = array_specifier->array_dimensions.tail_pred;
>> !node->is_head_sentinel(); node = node->prev) {
>> unsigned array_size = process_array_size(node, state);
>> - array_type = glsl_type::get_array_instance(array_type, array_size);
>> + array_type = glsl_type::get_array_instance(array_type, array_size,
>> + packing);
>> }
>>
>> if (array_specifier->is_unsized_array)
>> - array_type = glsl_type::get_array_instance(array_type, 0);
>> + array_type = glsl_type::get_array_instance(array_type, 0, packing);
>> }
>>
>> return array_type;
>> @@ -1998,13 +2004,22 @@ const glsl_type *
>> ast_type_specifier::glsl_type(const char **name,
>> struct _mesa_glsl_parse_state *state) const
>> {
>> + return glsl_type(name, state, GLSL_INTERFACE_PACKING_STD140);
>> +}
>> +
>> +const glsl_type *
>> +ast_type_specifier::glsl_type(const char **name,
>> + struct _mesa_glsl_parse_state *state,
>> + enum glsl_interface_packing packing) const
>> +{
>> const struct glsl_type *type;
>>
>> type = state->symbols->get_type(this->type_name);
>> *name = this->type_name;
>>
>> YYLTYPE loc = this->get_location();
>> - type = process_array_type(&loc, type, this->array_specifier, state);
>> + type = process_array_type(&loc, type, this->array_specifier, state,
>> + packing);
>>
>> return type;
>> }
>> @@ -2013,7 +2028,14 @@ const glsl_type *
>> ast_fully_specified_type::glsl_type(const char **name,
>> struct _mesa_glsl_parse_state *state) const
>> {
>> - const struct glsl_type *type = this->specifier->glsl_type(name, state);
>> + return glsl_type(name, state, GLSL_INTERFACE_PACKING_STD140);
>> +}
>> +const glsl_type *
>> +ast_fully_specified_type::glsl_type(const char **name,
>> + struct _mesa_glsl_parse_state *state,
>> + enum glsl_interface_packing packing) const
>> +{
>> + const struct glsl_type *type = this->specifier->glsl_type(name, state, packing);
>>
>> if (type == NULL)
>> return NULL;
>> @@ -3638,7 +3660,7 @@ ast_declarator_list::hir(exec_list *instructions,
>>
>> }
>> var_type = process_array_type(&loc, decl_type, decl->array_specifier,
>> - state);
>> + state, GLSL_INTERFACE_PACKING_STD140);
>>
>> var = new(ctx) ir_variable(var_type, identifier, ir_var_auto);
>>
>> @@ -4311,7 +4333,8 @@ ast_parameter_declarator::hir(exec_list *instructions,
>> /* This only handles "vec4 foo[..]". The earlier specifier->glsl_type(...)
>> * call already handled the "vec4[..] foo" case.
>> */
>> - type = process_array_type(&loc, type, this->array_specifier, state);
>> + type = process_array_type(&loc, type, this->array_specifier, state,
>> + GLSL_INTERFACE_PACKING_STD140);
>>
>> if (!type->is_error() && type->is_unsized_array()) {
>> _mesa_glsl_error(&loc, state, "arrays passed as parameters must have "
>> @@ -5569,7 +5592,8 @@ ast_process_structure_or_interface_block(exec_list *instructions,
>> bool is_interface,
>> enum glsl_matrix_layout matrix_layout,
>> bool allow_reserved_names,
>> - ir_variable_mode var_mode)
>> + ir_variable_mode var_mode,
>> + enum glsl_interface_packing packing)
>> {
>> unsigned decl_count = 0;
>>
>> @@ -5605,7 +5629,7 @@ ast_process_structure_or_interface_block(exec_list *instructions,
>> }
>>
>> const glsl_type *decl_type =
>> - decl_list->type->glsl_type(& type_name, state);
>> + decl_list->type->glsl_type(& type_name, state, packing);
>>
>> foreach_list_typed (ast_declaration, decl, link,
>> &decl_list->declarations) {
>> @@ -5674,7 +5698,8 @@ ast_process_structure_or_interface_block(exec_list *instructions,
>> }
>>
>> field_type = process_array_type(&loc, decl_type,
>> - decl->array_specifier, state);
>> + decl->array_specifier, state,
>> + packing);
>> fields[i].type = field_type;
>> fields[i].name = decl->identifier;
>> fields[i].location = -1;
>> @@ -5788,7 +5813,8 @@ ast_struct_specifier::hir(exec_list *instructions,
>> false,
>> GLSL_MATRIX_LAYOUT_INHERITED,
>> false /* allow_reserved_names */,
>> - ir_var_auto);
>> + ir_var_auto,
>> + GLSL_INTERFACE_PACKING_STD140);
>>
>> validate_identifier(this->name, loc, state);
>>
>> @@ -5943,7 +5969,8 @@ ast_interface_block::hir(exec_list *instructions,
>> true,
>> matrix_layout,
>> redeclaring_per_vertex,
>> - var_mode);
>> + var_mode,
>> + packing);
>>
>> state->struct_specifier_depth--;
>>
>> @@ -6199,7 +6226,8 @@ ast_interface_block::hir(exec_list *instructions,
>> }
>>
>> const glsl_type *block_array_type =
>> - process_array_type(&loc, block_type, this->array_specifier, state);
>> + process_array_type(&loc, block_type, this->array_specifier, state,
>> + GLSL_INTERFACE_PACKING_STD140);
>>
>> /* From section 4.3.9 (Interface Blocks) of the GLSL ES 3.10 spec:
>> *
>> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
>> index d29769a..75f2f31 100644
>> --- a/src/glsl/glsl_types.cpp
>> +++ b/src/glsl/glsl_types.cpp
>> @@ -380,10 +380,11 @@ _mesa_glsl_release_types(void)
>> }
>>
>>
>> -glsl_type::glsl_type(const glsl_type *array, unsigned length) :
>> +glsl_type::glsl_type(const glsl_type *array, unsigned length,
>> + enum glsl_interface_packing packing) :
>> base_type(GLSL_TYPE_ARRAY),
>> sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
>> - sampler_type(0), interface_packing(0),
>> + sampler_type(0), interface_packing(packing),
>> vector_elements(0), matrix_columns(0),
>> length(length), name(NULL)
>> {
>> @@ -677,6 +678,13 @@ glsl_type::get_sampler_instance(enum glsl_sampler_dim dim,
>> const glsl_type *
>> glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
>> {
>> + return get_array_instance(base, array_size, GLSL_INTERFACE_PACKING_STD140);
>> +}
>> +
>> +const glsl_type *
>> +glsl_type::get_array_instance(const glsl_type *base, unsigned array_size,
>> + enum glsl_interface_packing packing)
>> +{
>> /* Generate a name using the base type pointer in the key. This is
>> * done because the name of the base type may not be unique across
>> * shaders. For example, two shaders may have different record types
>> @@ -695,7 +703,7 @@ glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
>> const struct hash_entry *entry = _mesa_hash_table_search(array_types, key);
>> if (entry == NULL) {
>> mtx_unlock(&glsl_type::mutex);
>> - const glsl_type *t = new glsl_type(base, array_size);
>> + const glsl_type *t = new glsl_type(base, array_size, packing);
>> mtx_lock(&glsl_type::mutex);
>>
>> entry = _mesa_hash_table_insert(array_types,
>> diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
>> index d994eb5..0b0e31d 100644
>> --- a/src/glsl/glsl_types.h
>> +++ b/src/glsl/glsl_types.h
>> @@ -248,7 +248,10 @@ struct glsl_type {
>> * Get the instance of an array type
>> */
>> static const glsl_type *get_array_instance(const glsl_type *base,
>> - unsigned elements);
>> + unsigned elements);
>> + static const glsl_type *get_array_instance(const glsl_type *base,
>> + unsigned elements,
>
> Indent issue.
>
> Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
>
OK, thanks.
Sam
>> + enum glsl_interface_packing packing);
>>
>> /**
>> * Get the instance of a record type
>> @@ -703,7 +706,8 @@ private:
>> enum glsl_interface_packing packing, const char *name);
>>
>> /** Constructor for array types */
>> - glsl_type(const glsl_type *array, unsigned length);
>> + glsl_type(const glsl_type *array, unsigned length,
>> + enum glsl_interface_packing packing);
>>
>> /** Constructor for subroutine types */
>> glsl_type(const char *name);
>> --
>> 1.9.1
>>
>
More information about the mesa-dev
mailing list