Reviewed-by: Anuj Phogat <anuj.pho...@gmail.com> Reviewed-by: Edward O'Callaghan <eocallag...@alterapraxis.com> --- src/compiler/glsl/ir_optimization.h | 3 ++- src/compiler/glsl/link_varyings.cpp | 5 +++-- src/compiler/glsl/lower_packed_varyings.cpp | 27 ++++++++++++++++++--------- 3 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index f9599a3..a2f6350 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -125,7 +125,8 @@ 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, - bool disable_varying_packing, bool xfb_enabled); + bool disable_varying_packing, bool xfb_enabled, + bool has_enhanced_layouts); bool lower_vector_insert(exec_list *instructions, bool lower_nonconstant_index); bool lower_vector_derefs(gl_shader *shader); void lower_named_interface_blocks(void *mem_ctx, gl_shader *shader); diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 2be3fb0..998adec 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -2194,13 +2194,14 @@ assign_varying_locations(struct gl_context *ctx, if (producer) { lower_packed_varyings(mem_ctx, slots_used, ir_var_shader_out, 0, producer, disable_varying_packing, - xfb_enabled); + xfb_enabled, ctx->API == API_OPENGL_CORE); } if (consumer) { lower_packed_varyings(mem_ctx, slots_used, ir_var_shader_in, consumer_vertices, consumer, - disable_varying_packing, xfb_enabled); + disable_varying_packing, xfb_enabled, + ctx->API == API_OPENGL_CORE); } return true; diff --git a/src/compiler/glsl/lower_packed_varyings.cpp b/src/compiler/glsl/lower_packed_varyings.cpp index 29ca779..2ab2822 100644 --- a/src/compiler/glsl/lower_packed_varyings.cpp +++ b/src/compiler/glsl/lower_packed_varyings.cpp @@ -170,7 +170,8 @@ public: exec_list *out_instructions, exec_list *out_variables, bool disable_varying_packing, - bool xfb_enabled); + bool xfb_enabled, + bool has_enhanced_layouts); void run(struct gl_shader *shader); @@ -237,6 +238,7 @@ private: exec_list *out_variables; bool disable_varying_packing; + bool has_enhanced_layouts; bool xfb_enabled; }; @@ -246,7 +248,7 @@ 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 xfb_enabled, bool has_enhanced_layouts) : mem_ctx(mem_ctx), locations_used(locations_used), packed_varyings((ir_variable **) @@ -257,7 +259,8 @@ lower_packed_varyings_visitor::lower_packed_varyings_visitor( out_instructions(out_instructions), out_variables(out_variables), disable_varying_packing(disable_varying_packing), - xfb_enabled(xfb_enabled) + xfb_enabled(xfb_enabled), + has_enhanced_layouts(has_enhanced_layouts) { } @@ -677,11 +680,14 @@ lower_packed_varyings_visitor::get_packed_varying_deref( bool lower_packed_varyings_visitor::needs_lowering(ir_variable *var) { - /* Things composed of vec4's and varyings with explicitly assigned - * locations don't need lowering. Everything else does. + /* Don't lower varying with explicit location unless ARB_enhanced_layouts + * is enabled, also don't try to pack structs with explicit location as + * they don't support the component layout qualifier anyway. */ - if (var->data.explicit_location) + if (var->data.explicit_location && (!has_enhanced_layouts || + var->type->without_array()->is_record())) { return false; + } /* Override disable_varying_packing if the var is only used by transform * feedback. Also override it if transform feedback is enabled and the @@ -690,11 +696,13 @@ lower_packed_varyings_visitor::needs_lowering(ir_variable *var) */ const glsl_type *type = var->type; if (disable_varying_packing && !var->data.is_xfb_only && + !var->data.explicit_location && !((type->is_array() || type->is_record() || type->is_matrix()) && xfb_enabled)) return false; - type = type->without_array(); + /* Things composed of vec4's don't need lowering everything else does. */ + type = var->type->without_array(); if (type->vector_elements == 4 && !type->is_double()) return false; return true; @@ -748,7 +756,7 @@ 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 xfb_enabled, bool has_enhanced_layouts) { ir_function *main_func = shader->symbols->get_function("main"); exec_list void_parameters; @@ -766,7 +774,8 @@ lower_packed_varyings(void *mem_ctx, unsigned locations_used, &new_instructions, &new_variables, disable_varying_packing, - xfb_enabled); + xfb_enabled, + has_enhanced_layouts); visitor.run(shader); if (mode == ir_var_shader_out) { if (shader->Stage == MESA_SHADER_GEOMETRY) { -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev