[Mesa-dev] [PATCH v5 6/6] mesa/st: glsl_to_tgsi: tie in new temporary register merge approach
Gert Wollny
gw.fossdev at gmail.com
Sun Jun 25 07:22:15 UTC 2017
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 | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 528fc4cc64..d4abee9d02 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,
@@ -5139,6 +5140,23 @@ 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 *lifetimes =
+ rzalloc_array(mem_ctx, struct lifetime, this->next_temp);
+
+ get_temp_registers_required_lifetimes(mem_ctx, &this->instructions,
+ this->next_temp, lifetimes);
+ get_temp_registers_remapping(mem_ctx, this->next_temp, lifetimes, renames);
+ rename_temp_registers(renames);
+
+ ralloc_free(lifetimes);
+ ralloc_free(renames);
+}
+
/* Merges temporary registers together where possible to reduce the number of
* registers needed to run a program.
*
@@ -6603,8 +6621,13 @@ 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. */
--
2.13.0
More information about the mesa-dev
mailing list