This actually tries to pack any input with an explicit location we just let the optimisiation passes clean up the extra assignments if there was no actual packing done.
V2: drop unncessary formatting changes (Anuj) Reviewed-by: Anuj Phogat <anuj.pho...@gmail.com> Reviewed-by: Edward O'Callaghan <eocallag...@alterapraxis.com> --- src/compiler/glsl/ir_optimization.h | 1 + src/compiler/glsl/link_varyings.cpp | 35 ++++++++++++++++++++++------- src/compiler/glsl/lower_packed_varyings.cpp | 25 ++++++++++++--------- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index a2f6350..7751c15 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -125,6 +125,7 @@ void lower_ubo_reference(struct gl_shader *shader); void lower_packed_varyings(void *mem_ctx, unsigned locations_used, ir_variable_mode mode, unsigned gs_input_vertices, gl_shader *shader, + unsigned base_location, bool disable_varying_packing, bool xfb_enabled, bool has_enhanced_layouts); bool lower_vector_insert(exec_list *instructions, bool lower_nonconstant_index); diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 998adec..ac99e9a 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -1877,7 +1877,8 @@ canonicalize_shader_io(exec_list *ir, enum ir_variable_mode io_mode) * In theory a 32 bits value will be enough but a 64 bits value is future proof. */ uint64_t -reserved_varying_slot(struct gl_shader *stage, ir_variable_mode io_mode) +reserved_varying_slot(struct gl_shader *stage, ir_variable_mode io_mode, + int base_location) { assert(io_mode == ir_var_shader_in || io_mode == ir_var_shader_out); assert(MAX_VARYING <= 64); /* avoid an overflow of the returned value */ @@ -1893,10 +1894,10 @@ reserved_varying_slot(struct gl_shader *stage, ir_variable_mode io_mode) if (var == NULL || var->data.mode != io_mode || !var->data.explicit_location || - var->data.location < VARYING_SLOT_VAR0) + var->data.location < base_location) continue; - var_slot = var->data.location - VARYING_SLOT_VAR0; + var_slot = var->data.location - base_location; unsigned num_elements = get_varying_type(var, stage->Stage) ->count_attribute_slots(stage->Stage == MESA_SHADER_VERTEX); @@ -2118,8 +2119,8 @@ assign_varying_locations(struct gl_context *ctx, } const uint64_t reserved_slots = - reserved_varying_slot(producer, ir_var_shader_out) | - reserved_varying_slot(consumer, ir_var_shader_in); + reserved_varying_slot(producer, ir_var_shader_out, VARYING_SLOT_VAR0) | + reserved_varying_slot(consumer, ir_var_shader_in, VARYING_SLOT_VAR0); /* Add varyings with explicit locations to varyings with implicit locations * to get the total number of slots used. @@ -2192,14 +2193,32 @@ assign_varying_locations(struct gl_context *ctx, } if (producer) { + if (producer->Stage == MESA_SHADER_VERTEX) { + /* Since we only pack vertex inputs with an explicit location we only + * need to count those inputs. + */ + const uint64_t reserved_slots = + reserved_varying_slot(producer, ir_var_shader_in, + VERT_ATTRIB_GENERIC0); + + /* Pack vertex inputs with the component layout qualifier */ + unsigned vertex_attributes = _mesa_bitcount_64(reserved_slots); + if (vertex_attributes > 0) + lower_packed_varyings(mem_ctx, vertex_attributes, + ir_var_shader_in, 0, producer, + VERT_ATTRIB_GENERIC0, true, xfb_enabled, + ctx->API == API_OPENGL_CORE); + } + lower_packed_varyings(mem_ctx, slots_used, ir_var_shader_out, - 0, producer, disable_varying_packing, - xfb_enabled, ctx->API == API_OPENGL_CORE); + 0, producer, VARYING_SLOT_VAR0, + disable_varying_packing, xfb_enabled, + ctx->API == API_OPENGL_CORE); } if (consumer) { lower_packed_varyings(mem_ctx, slots_used, ir_var_shader_in, - consumer_vertices, consumer, + consumer_vertices, consumer, VARYING_SLOT_VAR0, disable_varying_packing, xfb_enabled, ctx->API == API_OPENGL_CORE); } diff --git a/src/compiler/glsl/lower_packed_varyings.cpp b/src/compiler/glsl/lower_packed_varyings.cpp index 2ab2822..caa760e 100644 --- a/src/compiler/glsl/lower_packed_varyings.cpp +++ b/src/compiler/glsl/lower_packed_varyings.cpp @@ -169,6 +169,7 @@ public: unsigned gs_input_vertices, exec_list *out_instructions, exec_list *out_variables, + unsigned base_location, bool disable_varying_packing, bool xfb_enabled, bool has_enhanced_layouts); @@ -198,11 +199,13 @@ private: */ void * const mem_ctx; + const unsigned base_location; + /** * Number of generic varying slots which are used by this shader. This is * used to allocate temporary intermediate data structures. If any varying * used by this shader has a location greater than or equal to - * VARYING_SLOT_VAR0 + locations_used, an assertion will fire. + * base_location + locations_used, an assertion will fire. */ const unsigned locations_used; @@ -238,8 +241,8 @@ private: exec_list *out_variables; bool disable_varying_packing; - bool has_enhanced_layouts; bool xfb_enabled; + bool has_enhanced_layouts; }; } /* anonymous namespace */ @@ -247,9 +250,11 @@ private: lower_packed_varyings_visitor::lower_packed_varyings_visitor( void *mem_ctx, unsigned locations_used, ir_variable_mode mode, unsigned gs_input_vertices, exec_list *out_instructions, - exec_list *out_variables, bool disable_varying_packing, - bool xfb_enabled, bool has_enhanced_layouts) + exec_list *out_variables, unsigned base_location, + bool disable_varying_packing, bool xfb_enabled, + bool has_enhanced_layouts) : mem_ctx(mem_ctx), + base_location(base_location), locations_used(locations_used), packed_varyings((ir_variable **) rzalloc_array_size(mem_ctx, sizeof(*packed_varyings), @@ -273,7 +278,7 @@ lower_packed_varyings_visitor::run(struct gl_shader *shader) continue; if (var->data.mode != this->mode || - var->data.location < VARYING_SLOT_VAR0 || + var->data.location < (int) this->base_location || !this->needs_lowering(var)) continue; @@ -597,7 +602,6 @@ lower_packed_varyings_visitor::lower_arraylike(ir_rvalue *rvalue, } else { char *subscripted_name = ralloc_asprintf(this->mem_ctx, "%s[%d]", name, i); - fine_location = this->lower_rvalue(dereference_array, fine_location, unpacked_var, subscripted_name, @@ -624,7 +628,7 @@ lower_packed_varyings_visitor::get_packed_varying_deref( unsigned location, ir_variable *unpacked_var, const char *name, unsigned vertex_index) { - unsigned slot = location - VARYING_SLOT_VAR0; + unsigned slot = location - this->base_location; assert(slot < locations_used); if (this->packed_varyings[slot] == NULL) { char *packed_name = ralloc_asprintf(this->mem_ctx, "packed:%s", name); @@ -755,8 +759,9 @@ lower_packed_varyings_gs_splicer::visit_leave(ir_emit_vertex *ev) void lower_packed_varyings(void *mem_ctx, unsigned locations_used, ir_variable_mode mode, unsigned gs_input_vertices, - gl_shader *shader, bool disable_varying_packing, - bool xfb_enabled, bool has_enhanced_layouts) + gl_shader *shader, unsigned base_location, + bool disable_varying_packing, bool xfb_enabled, + bool has_enhanced_layouts) { ir_function *main_func = shader->symbols->get_function("main"); exec_list void_parameters; @@ -768,11 +773,11 @@ lower_packed_varyings(void *mem_ctx, unsigned locations_used, mode == ir_var_shader_in))) { exec_list *instructions = shader->ir; exec_list new_instructions, new_variables; - lower_packed_varyings_visitor visitor(mem_ctx, locations_used, mode, gs_input_vertices, &new_instructions, &new_variables, + base_location, disable_varying_packing, xfb_enabled, has_enhanced_layouts); -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev