Patches 7, 8, 10-13 & 15-17 are simple enough, Reviewed-by: Edward O'Callaghan <funfunc...@folklore1984.net>
I would perhaps suggest squashing 16+17 together, up to you. Kind Regards, Edward. On 07/08/2016 10:38 AM, Timothy Arceri wrote: > On Thu, 2016-07-07 at 17:50 +1000, Edward O'Callaghan wrote: >> Hi, >> >> There is a typing issue in this patch in that, you are converting >> ‘gl_linked_shader*’ to ‘gl_shader*’ for the first argument to >> function >> ‘void set_num_packed_components(gl_shader*, ir_variable_mode, >> unsigned >> int)’ at the various call sites. > > Whoops, not sure how I missed that when rebasing. Fix pushed to the > branch in my repo. Thanks. > >> >> Cheers, >> Edward. >> >> >> On 07/07/2016 11:58 AM, Timothy Arceri wrote: >>> This will be used to store the total number of components used at >>> this location >>> when packing via ARB_enhanced_layouts. >>> --- >>> src/compiler/glsl/glsl_to_nir.cpp | 1 + >>> src/compiler/glsl/ir.h | 5 +++ >>> src/compiler/glsl/link_varyings.cpp | 74 >>> ++++++++++++++++++++++++++++++++++++- >>> src/compiler/glsl/linker.cpp | 2 + >>> src/compiler/glsl/linker.h | 4 ++ >>> src/compiler/nir/nir.h | 5 +++ >>> 6 files changed, 89 insertions(+), 2 deletions(-) >>> >>> diff --git a/src/compiler/glsl/glsl_to_nir.cpp >>> b/src/compiler/glsl/glsl_to_nir.cpp >>> index 20302e3..baba624 100644 >>> --- a/src/compiler/glsl/glsl_to_nir.cpp >>> +++ b/src/compiler/glsl/glsl_to_nir.cpp >>> @@ -375,6 +375,7 @@ nir_visitor::visit(ir_variable *ir) >>> var->data.explicit_binding = ir->data.explicit_binding; >>> var->data.has_initializer = ir->data.has_initializer; >>> var->data.location_frac = ir->data.location_frac; >>> + var->data.num_packed_components = ir- >>>> data.num_packed_components; >>> >>> switch (ir->data.depth_layout) { >>> case ir_depth_layout_none: >>> diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h >>> index 1325e35..637b53c 100644 >>> --- a/src/compiler/glsl/ir.h >>> +++ b/src/compiler/glsl/ir.h >>> @@ -770,6 +770,11 @@ public: >>> unsigned location_frac:2; >>> >>> /** >>> + * The total number of components packed into this location. >>> + */ >>> + unsigned num_packed_components:4; >>> + >>> + /** >>> * Layout of the matrix. Uses glsl_matrix_layout values. >>> */ >>> unsigned matrix_layout:2; >>> diff --git a/src/compiler/glsl/link_varyings.cpp >>> b/src/compiler/glsl/link_varyings.cpp >>> index 76d0be1..35f97a9 100644 >>> --- a/src/compiler/glsl/link_varyings.cpp >>> +++ b/src/compiler/glsl/link_varyings.cpp >>> @@ -1975,6 +1975,70 @@ reserved_varying_slot(struct >>> gl_linked_shader *stage, >>> return slots; >>> } >>> >>> +void >>> +set_num_packed_components(struct gl_shader *shader, >>> ir_variable_mode io_mode, >>> + unsigned base_offset) >>> +{ >>> + /* Find the max number of components used at this location */ >>> + unsigned num_components[MAX_VARYINGS_INCL_PATCH] = { 0 }; >>> + >>> + foreach_in_list(ir_instruction, node, shader->ir) { >>> + ir_variable *const var = node->as_variable(); >>> + >>> + if (var == NULL || var->data.mode != io_mode || >>> + !var->data.explicit_location) >>> + continue; >>> + >>> + int idx = var->data.location - base_offset; >>> + if (idx < 0 || idx >= MAX_VARYINGS_INCL_PATCH || >>> + var->type->without_array()->is_record() || >>> + var->type->without_array()->is_matrix()) >>> + continue; >>> + >>> + if (var->type->is_array()) { >>> + const glsl_type *type = get_varying_type(var, shader- >>>> Stage); >>> + unsigned array_components = type->without_array()- >>>> vector_elements + >>> + var->data.location_frac; >>> + assert(type->arrays_of_arrays_size() + idx <= >>> + ARRAY_SIZE(num_components)); >>> + for (unsigned i = idx; i < type->arrays_of_arrays_size(); >>> i++) { >>> + num_components[i] = MAX2(array_components, >>> num_components[i]); >>> + } >>> + } else { >>> + unsigned comps = var->type->vector_elements + >>> + var->data.location_frac; >>> + num_components[idx] = MAX2(comps, num_components[idx]); >>> + } >>> + } >>> + >>> + foreach_in_list(ir_instruction, node, shader->ir) { >>> + ir_variable *const var = node->as_variable(); >>> + >>> + if (var == NULL || var->data.mode != io_mode || >>> + !var->data.explicit_location) >>> + continue; >>> + >>> + int idx = var->data.location - base_offset; >>> + if (idx < 0 || idx >= MAX_VARYINGS_INCL_PATCH || >>> + var->type->without_array()->is_record() || >>> + var->type->without_array()->is_matrix()) >>> + continue; >>> + >>> + /* For arrays we need to check all elements in order to find >>> the max >>> + * number of components used. >>> + */ >>> + unsigned c = 0; >>> + if (var->type->is_array()) { >>> + const glsl_type *type = get_varying_type(var, shader- >>>> Stage); >>> + for (unsigned i = idx; i < type->arrays_of_arrays_size(); >>> i++) { >>> + c = MAX2(c, num_components[i]); >>> + } >>> + } else { >>> + c = num_components[idx]; >>> + } >>> + var->data.num_packed_components = c; >>> + } >>> +} >>> >>> /** >>> * Assign locations for all variables that are produced in one >>> pipeline stage >>> @@ -2091,11 +2155,17 @@ assign_varying_locations(struct gl_context >>> *ctx, >>> * 4. Mark input variables in the consumer that do not have >>> locations as >>> * not being inputs. This lets the optimizer eliminate >>> them. >>> */ >>> - if (consumer) >>> + if (consumer) { >>> canonicalize_shader_io(consumer->ir, ir_var_shader_in); >>> + set_num_packed_components(consumer, ir_var_shader_in, >>> + VARYING_SLOT_VAR0); >>> + } >>> >>> - if (producer) >>> + if (producer) { >>> canonicalize_shader_io(producer->ir, ir_var_shader_out); >>> + set_num_packed_components(producer, ir_var_shader_out, >>> + VARYING_SLOT_VAR0); >>> + } >>> >>> if (consumer) >>> linker::populate_consumer_input_sets(mem_ctx, consumer->ir, >>> diff --git a/src/compiler/glsl/linker.cpp >>> b/src/compiler/glsl/linker.cpp >>> index d963f54..d8bb58b 100644 >>> --- a/src/compiler/glsl/linker.cpp >>> +++ b/src/compiler/glsl/linker.cpp >>> @@ -2625,6 +2625,8 @@ >>> assign_attribute_or_color_locations(gl_shader_program *prog, >>> (target_index == MESA_SHADER_VERTEX) >>> ? ir_var_shader_in : ir_var_shader_out; >>> >>> + set_num_packed_components(sh, direction, generic_base); >>> + >>> >>> /* Temporary storage for the set of attributes that need >>> locations assigned. >>> */ >>> diff --git a/src/compiler/glsl/linker.h >>> b/src/compiler/glsl/linker.h >>> index e1a53d2..056ce97 100644 >>> --- a/src/compiler/glsl/linker.h >>> +++ b/src/compiler/glsl/linker.h >>> @@ -86,6 +86,10 @@ extern void >>> link_check_atomic_counter_resources(struct gl_context *ctx, >>> struct gl_shader_program >>> *prog); >>> >>> +void >>> +set_num_packed_components(struct gl_shader *shader, >>> ir_variable_mode io_mode, >>> + unsigned base_offset); >>> + >>> /** >>> * Class for processing all of the leaf fields of a variable that >>> corresponds >>> * to a program resource. >>> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h >>> index a7921ee..2bfedb2 100644 >>> --- a/src/compiler/nir/nir.h >>> +++ b/src/compiler/nir/nir.h >>> @@ -227,6 +227,11 @@ typedef struct nir_variable { >>> unsigned location_frac:2; >>> >>> /** >>> + * The total number of components packed into this location. >>> + */ >>> + unsigned num_packed_components:4; >>> + >>> + /** >>> * \brief Layout qualifier for gl_FragDepth. >>> * >>> * This is not equal to \c ir_depth_layout_none if and only >>> if this >>> >>
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev