Fixes piglit vs-*-main-return. --- src/glsl/lower_packed_varyings.cpp | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/src/glsl/lower_packed_varyings.cpp b/src/glsl/lower_packed_varyings.cpp index 5e844c7..b8c3228 100644 --- a/src/glsl/lower_packed_varyings.cpp +++ b/src/glsl/lower_packed_varyings.cpp @@ -646,6 +646,33 @@ lower_packed_varyings_gs_splicer::visit_leave(ir_emit_vertex *ev) return visit_continue; } +namespace { + +class ir_insert_before_return_visitor : public ir_hierarchical_visitor +{ +public: + ir_insert_before_return_visitor(void *mem_ctx, exec_list *instructions) + : mem_ctx(mem_ctx), instructions(instructions) + { + } + + ir_visitor_status visit_enter(ir_return *ir) { + exec_list cloned; + clone_ir_list(mem_ctx, &cloned, instructions); + ir->insert_before(&cloned); + return visit_continue_with_parent; + } + + ir_visitor_status visit_enter(ir_assignment *ir) { + /* No need to descend expression trees. */ + return visit_continue_with_parent; + } + + void *mem_ctx; + exec_list *instructions; +}; + +} /* anonymous namespace */ void lower_packed_varyings(void *mem_ctx, unsigned locations_used, @@ -670,8 +697,11 @@ lower_packed_varyings(void *mem_ctx, unsigned locations_used, splicer.run(instructions); } else { /* For other shader types, outputs need to be lowered at the end of - * main() + * main(), and at each early return from main. */ + ir_insert_before_return_visitor v(mem_ctx, &new_instructions); + v.run(&main_func_sig->body); + main_func_sig->body.append_list(&new_instructions); } } else { -- 2.1.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev