glsl: Do not add extra padding to structures
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 19 Jul 2014 21:14:29 +0000 (14:14 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 4 Aug 2014 21:40:07 +0000 (14:40 -0700)
This code was attemping to align the base of the structure to the required
alignment of the structure.  However, it had two problems:

1. It was aligning the target structure member, not the base of the
structure.

2. It was calculating the alignment based on the members previous to the
target member instead of all the members of the structure.

Fixes gles3conform failures in:

ES3-CTS.shaders.uniform_block.random.nested_structs.6
ES3-CTS.shaders.uniform_block.random.nested_structs_arrays_instance_arrays.2
ES3-CTS.shaders.uniform_block.random.nested_structs_arrays_instance_arrays.6
ES3-CTS.shaders.uniform_block.random.all_per_block_buffers.5
ES3-CTS.shaders.uniform_block.random.all_per_block_buffers.19
ES3-CTS.shaders.uniform_block.random.all_shared_buffer.0
ES3-CTS.shaders.uniform_block.random.all_shared_buffer.2
ES3-CTS.shaders.uniform_block.random.all_shared_buffer.6
ES3-CTS.shaders.uniform_block.random.all_shared_buffer.12

v2: Fix rebase failure noticed by Matt.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/lower_ubo_reference.cpp

index 48675da2f2b89634200a3b54a47eaa7cc6675896..3cdfc04ac5cc70b638e99bf45367dc7bad250f42 100644 (file)
@@ -327,7 +327,6 @@ lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue)
         const glsl_type *struct_type = deref_record->record->type;
         unsigned intra_struct_offset = 0;
 
-        unsigned max_field_align = 16;
         for (unsigned int i = 0; i < struct_type->length; i++) {
            const glsl_type *type = struct_type->fields.structure[i].type;
 
@@ -341,7 +340,6 @@ lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue)
 
             unsigned field_align = type->std140_base_alignment(field_row_major);
 
-           max_field_align = MAX2(field_align, max_field_align);
            intra_struct_offset = glsl_align(intra_struct_offset, field_align);
 
            if (strcmp(struct_type->fields.structure[i].name,
@@ -350,7 +348,6 @@ lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue)
             intra_struct_offset += type->std140_size(field_row_major);
         }
 
-        const_offset = glsl_align(const_offset, max_field_align);
         const_offset += intra_struct_offset;
 
         deref = deref_record->record->as_dereference();