This patch ties in the new temporary register lifetime estiamtion and rename mapping evaluation. In order to enable it, the evironment variable MESA_GLSL_TO_TGSI_NEW_MERGE must be set.
Performance to compare between the current and the new implementation were measured by running the shader-db in one thread; Numbers are in % of total run. ----------------------------------------------------------- old new(qsort) new(std::sort) ------------------------ valgrind ------------------------- merge 0.21 0.20 0.13 estimate lifetime 0.03 0.05 0.05 evaluate mapping (incl=0.16) 0.12 0.06 apply mapping 0.02 0.02 0.02 --- perf (approximate because of statistic sampling) ------- merge 0.24 0.20 0.14 estimate lifetime 0.03 0.05 0.05 evaluate mapping (incl=0.16) 0.10 0.04 apply mapping 0.05 0.05 0.05 --- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 33 ++++++++++++++++------ .../tests/test_glsl_to_tgsi_lifetime.cpp | 12 ++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index ebe87a7821..f475b448c9 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -55,7 +55,7 @@ #include "st_glsl_types.h" #include "st_nir.h" #include "st_shader_cache.h" -#include "st_glsl_to_tgsi_private.h" +#include "st_glsl_to_tgsi_temprename.h" #include "util/hash_table.h" #include <algorithm> @@ -322,6 +322,7 @@ public: void merge_two_dsts(void); void merge_registers(void); + void merge_registers_alternative(void); void renumber_registers(void); void emit_block_mov(ir_assignment *ir, const struct glsl_type *type, @@ -567,7 +568,7 @@ glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op, if (swz > 1) { dinst->src[j].double_reg2 = true; dinst->src[j].index++; - } + } if (swz & 1) dinst->src[j].swizzle = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_W, SWIZZLE_Z, SWIZZLE_W); @@ -2093,7 +2094,7 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op) st_src_reg temp = get_temp(glsl_type::uvec4_type); st_dst_reg temp_dst = st_dst_reg(temp); unsigned orig_swz = op[0].swizzle; - /* + /* * To convert unsigned to 64-bit: * zero Y channel, copy X channel. */ @@ -2571,8 +2572,8 @@ glsl_to_tgsi_visitor::visit(ir_dereference_array *ir) if (index) { if (this->prog->Target == GL_VERTEX_PROGRAM_ARB && - src.file == PROGRAM_INPUT) - element_size = attrib_type_size(ir->type, true); + src.file == PROGRAM_INPUT) + element_size = attrib_type_size(ir->type, true); if (is_2D) { src.index2D = index->value.i[0]; src.has_index2 = true; @@ -2854,7 +2855,7 @@ glsl_to_tgsi_visitor::emit_block_mov(ir_assignment *ir, const struct glsl_type * if (type->is_dual_slot()) { l->index++; if (r->is_double_vertex_input == false) - r->index++; + r->index++; } } @@ -5137,6 +5138,18 @@ glsl_to_tgsi_visitor::merge_two_dsts(void) } } +void +glsl_to_tgsi_visitor::merge_registers_alternative(void) +{ + struct rename_reg_pair *renames = rzalloc_array(mem_ctx, struct rename_reg_pair, this->next_temp); + struct lifetime *lt = ralloc_array(mem_ctx, struct lifetime, this->next_temp); + estimate_temporary_lifetimes(mem_ctx, &this->instructions, this->next_temp, lt); + evaluate_remapping(mem_ctx, this->next_temp, lt, renames); + rename_temp_registers(&renames[0]); + ralloc_free(lt); + ralloc_free(renames); +} + /* Merges temporary registers together where possible to reduce the number of * registers needed to run a program. * @@ -6601,8 +6614,12 @@ get_mesa_program_tgsi(struct gl_context *ctx, while (v->eliminate_dead_code()); v->merge_two_dsts(); - if (!skip_merge_registers) - v->merge_registers(); + if (!skip_merge_registers) { + if (getenv("MESA_GLSL_TO_TGSI_NEW_MERGE") != NULL) + v->merge_registers_alternative(); + else + v->merge_registers(); + } v->renumber_registers(); /* Write the END instruction. */ diff --git a/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp b/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp index 8fd62d1db3..d63daea80e 100644 --- a/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp +++ b/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp @@ -1027,4 +1027,16 @@ TEST_F(RegisterRemapping, RegisterRemapping2) run(lt, expect); } +TEST_F(RegisterRemapping, RegisterRemappingMergeAll) +{ + vector<lifetime> lt({{-1,-1}, + {0, 1}, + {1, 2}, + {2, 3}, + {3, 4}, + }); + vector<int> expect({0, 1, 1, 1, 1}); + run(lt, expect); +} + -- 2.13.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev