diff options
author | Gert Wollny <[email protected]> | 2018-06-05 22:26:35 +0200 |
---|---|---|
committer | Gert Wollny <[email protected]> | 2018-08-11 12:32:42 +0200 |
commit | b1cead3add3eb47be2505430051c51f5a7a803b8 (patch) | |
tree | 44dd54d1b776e91bcc30d48d4a953bd897f400e1 /src/mesa/state_tracker | |
parent | be95ca9be7b2a067b900979f7c01c1f2355509f5 (diff) |
mesa/st/glsl_to_tgsi: Add method to collect some TGSI statistics
When mesa is compiled in debug mode then this adds the possibility
to print out some statistics about the translated and optimized TGSI
shaders to a file.
The functionality is enabled by setting the environment variable
GLSL_TO_TGSI_PRINT_STATS
to the file name where the statistics should be collected. The file is
opened in append mode so that statistics from various runs will be
accumulated.
v4: Make accress to log file thread save (thanks for pointing this out Nicolai
Hähnle)
Signed-off-by: Gert Wollny <[email protected]>
Acked-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 55984ff0c78..a865379d703 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -66,6 +66,49 @@ #define MAX_GLSL_TEXTURE_OFFSET 4 +#ifndef NDEBUG +#include "util/u_atomic.h" +#include "util/simple_mtx.h" +#include <fstream> +#include <ios> + +/* Prepare to make it possible to specify log file */ +static std::ofstream stats_log; + +/* Helper function to check whether we want to write some statistics + * of the shader conversion. + */ + +static simple_mtx_t print_stats_mutex = _SIMPLE_MTX_INITIALIZER_NP; + +static inline bool print_stats_enabled () +{ + static int stats_enabled = 0; + + if (!stats_enabled) { + simple_mtx_lock(&print_stats_mutex); + if (!stats_enabled) { + const char *stats_filename = getenv("GLSL_TO_TGSI_PRINT_STATS"); + if (stats_filename) { + bool write_header = std::ifstream(stats_filename).fail(); + stats_log.open(stats_filename, std::ios_base::out | std::ios_base::app); + stats_enabled = stats_log.good() ? 1 : -1; + if (write_header) + stats_log << "arrays,temps,temps in arrays,total,instructions\n"; + } else { + stats_enabled = -1; + } + } + simple_mtx_unlock(&print_stats_mutex); + } + return stats_enabled > 0; +} +#define PRINT_STATS(X) if (print_stats_enabled()) do { X; } while (false); +#else +#define PRINT_STATS(X) +#endif + + static unsigned is_precise(const ir_variable *ir) { if (!ir) @@ -348,6 +391,8 @@ public: st_dst_reg *l, st_src_reg *r, st_src_reg *cond, bool cond_swap); + void print_stats(); + void *mem_ctx; }; @@ -5491,6 +5536,27 @@ glsl_to_tgsi_visitor::renumber_registers(void) ralloc_free(first_writes); } +#ifndef NDEBUG +void glsl_to_tgsi_visitor::print_stats() +{ + int narray_registers = 0; + for (unsigned i = 0; i < this->next_array; ++i) + narray_registers += this->array_sizes[i]; + + int ninstructions = 0; + foreach_in_list(glsl_to_tgsi_instruction, inst, &instructions) { + ++ninstructions; + } + + simple_mtx_lock(&print_stats_mutex); + stats_log << next_array << ", " + << next_temp << ", " + << narray_registers << ", " + << next_temp + narray_registers << ", " + << ninstructions << "\n"; + simple_mtx_unlock(&print_stats_mutex); +} +#endif /* ------------------------- TGSI conversion stuff -------------------------- */ /** @@ -7004,6 +7070,8 @@ get_mesa_program_tgsi(struct gl_context *ctx, return NULL; } + PRINT_STATS(v->print_stats()); + return prog; } |