From: Ian Romanick <ian.d.roman...@intel.com> Currently this is done at each call to glLinkProgram. This seems like as good a place as any. This is the main place where memory usage will change, and it enables tracking as applications progress (e.g., load new levels).
Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/mesa/main/shaderapi.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 28739da..8e8170e 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -58,6 +58,7 @@ #include "../glsl/ir.h" #include "../glsl/ir_uniform.h" #include "../glsl/program.h" +#include "../glsl/ir_memory_usage.h" /** Define this to enable shader substitution (see below) */ #define SHADER_SUBST 0 @@ -887,6 +888,56 @@ compile_shader(struct gl_context *ctx, GLuint shaderObj) } +#ifdef DEBUG +static void +memory_stats_cb(GLuint key, void *data, void *userData) +{ + struct ir_memory_statistics *total = + (struct ir_memory_statistics *) userData; + struct ir_memory_statistics stats; + struct gl_shader_program *shProg = (struct gl_shader_program *) data; + + (void) key; + + if (shProg->Type == GL_SHADER_PROGRAM_MESA) { + unsigned i; + + for (i = 0; i < MESA_SHADER_STAGES; i++) { + struct gl_shader *sh = shProg->_LinkedShaders[i]; + + if (shProg->_LinkedShaders[i] != NULL) { + calculate_ir_tree_memory_usage(sh->ir, &stats); + + total->variable_usage += stats.variable_usage; + total->variable_name_usage += stats.variable_name_usage; + total->dereference_variable_usage += + stats.dereference_variable_usage; + total->dereference_array_usage += stats.dereference_array_usage; + total->dereference_record_usage += stats.dereference_record_usage; + total->dereference_record_field_usage += + stats.dereference_record_field_usage; + } + } + } else { + struct gl_shader *sh = (struct gl_shader *) data; + + assert(sh->Type == GL_FRAGMENT_SHADER + || sh->Type == GL_VERTEX_SHADER + || sh->Type == GL_GEOMETRY_SHADER_ARB); + + calculate_ir_tree_memory_usage(sh->ir, &stats); + + total->variable_usage += stats.variable_usage; + total->variable_name_usage += stats.variable_name_usage; + total->dereference_variable_usage += stats.dereference_variable_usage; + total->dereference_array_usage += stats.dereference_array_usage; + total->dereference_record_usage += stats.dereference_record_usage; + total->dereference_record_field_usage += + stats.dereference_record_field_usage; + } +} +#endif /* DEBUG */ + /** * Link a program's shaders. */ @@ -920,6 +971,34 @@ link_program(struct gl_context *ctx, GLuint program) shProg->Name, shProg->InfoLog); } + /* On the first draw call, dump the memory usage statistics for *ALL* + * known shaders. + */ +#ifdef DEBUG + if (ctx->_Shader->Flags & GLSL_LOG) { + struct ir_memory_statistics stats; + + memset(&stats, 0, sizeof(stats)); + _mesa_HashWalk(ctx->Shared->ShaderObjects, + memory_stats_cb, + &stats); + + printf("IR MEM: variable usage / name / total: %u %u %u\n", + stats.variable_usage, + stats.variable_name_usage, + stats.variable_usage + stats.variable_name_usage); + printf("IR MEM: dereference variable usage: %u\n", + stats.dereference_variable_usage); + printf("IR MEM: dereference array usage: %u\n", + stats.dereference_array_usage); + printf("IR MEM: dereference record usage / field / total: %u %u %u\n", + stats.dereference_record_usage, + stats.dereference_record_field_usage, + stats.dereference_record_usage + + stats.dereference_record_field_usage); + } +#endif /* DEBUG */ + /* debug code */ if (0) { GLuint i; -- 1.8.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev