From fc3b7c9b56701f23b002543de33a8d8c43f9bdc2 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 12 Jul 2012 13:19:53 -0700 Subject: [PATCH] i965: Add performance debug for shader recompiles. Reviewed-by: Jordan Justen Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_context.h | 2 + src/mesa/drivers/dri/i965/brw_fs.cpp | 6 +++ src/mesa/drivers/dri/i965/brw_program.h | 2 + src/mesa/drivers/dri/i965/brw_vec4_emit.cpp | 6 +++ src/mesa/drivers/dri/i965/brw_wm.c | 84 +++++++++++++++++++++++++++++ src/mesa/drivers/dri/i965/brw_wm.h | 3 ++ 6 files changed, 103 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 1548f81..51dfcca 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -275,6 +275,8 @@ struct brw_fragment_program { struct brw_shader { struct gl_shader base; + bool compiled_once; + /** Shader IR transformed for native compile, at link time. */ struct exec_list *ir; }; diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 334a14c..642d95a 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -2104,6 +2104,12 @@ brw_wm_fs_emit(struct brw_context *brw, struct brw_wm_compile *c, c->prog_data.dispatch_width = 8; + if (unlikely(INTEL_DEBUG & DEBUG_PERF)) { + if (shader->compiled_once) + brw_wm_debug_recompile(brw, prog, &c->key); + shader->compiled_once = true; + } + return true; } diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h index 874238f..9fbc201 100644 --- a/src/mesa/drivers/dri/i965/brw_program.h +++ b/src/mesa/drivers/dri/i965/brw_program.h @@ -45,5 +45,7 @@ struct brw_sampler_prog_key_data { void brw_populate_sampler_prog_key_data(struct gl_context *ctx, const struct gl_program *prog, struct brw_sampler_prog_key_data *key); +bool brw_debug_recompile_sampler_key(const struct brw_sampler_prog_key_data *old_key, + const struct brw_sampler_prog_key_data *key); #endif diff --git a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp index e63e08d..aea7d01 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp @@ -1037,6 +1037,10 @@ brw_vs_emit(struct gl_shader_program *prog, struct brw_vs_compile *c) printf("\n\n"); } + if (shader->compiled_once) { + perf_debug("Recompiling vertex shader for program %d\n", prog->Name); + } + vec4_visitor v(c, prog, shader); if (!v.run()) { prog->LinkStatus = false; @@ -1044,6 +1048,8 @@ brw_vs_emit(struct gl_shader_program *prog, struct brw_vs_compile *c) return false; } + shader->compiled_once = true; + return true; } diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c index 3abc696..323eabd 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.c +++ b/src/mesa/drivers/dri/i965/brw_wm.c @@ -347,6 +347,90 @@ bool do_wm_prog(struct brw_context *brw, return true; } +static bool +key_debug(const char *name, int a, int b) +{ + if (a != b) { + perf_debug(" %s %d->%d\n", name, a, b); + return true; + } else { + return false; + } +} + +bool +brw_debug_recompile_sampler_key(const struct brw_sampler_prog_key_data *old_key, + const struct brw_sampler_prog_key_data *key) +{ + bool found = false; + + for (unsigned int i = 0; i < BRW_MAX_TEX_UNIT; i++) { + found |= key_debug("EXT_texture_swizzle or DEPTH_TEXTURE_MODE", + key->swizzles[i], old_key->swizzles[i]); + } + found |= key_debug("GL_CLAMP enabled on any texture unit's 1st coordinate", + key->gl_clamp_mask[0], old_key->gl_clamp_mask[0]); + found |= key_debug("GL_CLAMP enabled on any texture unit's 2nd coordinate", + key->gl_clamp_mask[1], old_key->gl_clamp_mask[1]); + found |= key_debug("GL_CLAMP enabled on any texture unit's 3rd coordinate", + key->gl_clamp_mask[2], old_key->gl_clamp_mask[2]); + found |= key_debug("GL_MESA_ycbcr texturing\n", + key->yuvtex_mask, old_key->yuvtex_mask); + found |= key_debug("GL_MESA_ycbcr UV swapping\n", + key->yuvtex_swap_mask, old_key->yuvtex_swap_mask); + + return found; +} + +void +brw_wm_debug_recompile(struct brw_context *brw, + struct gl_shader_program *prog, + const struct brw_wm_prog_key *key) +{ + struct brw_cache_item *c = NULL; + const struct brw_wm_prog_key *old_key = NULL; + bool found = false; + + perf_debug("Recompiling fragment shader for program %d\n", prog->Name); + + for (unsigned int i = 0; i < brw->cache.size; i++) { + for (c = brw->cache.items[i]; c; c = c->next) { + if (c->cache_id == BRW_WM_PROG) { + old_key = c->key; + + if (old_key->program_string_id == key->program_string_id) + break; + } + } + if (c) + break; + } + + if (!c) { + perf_debug(" Didn't find previous compile in the shader cache for " + "debug\n"); + return; + } + + found |= key_debug("alphatest, computed depth, depth test, or depth write", + key->iz_lookup, old_key->iz_lookup); + found |= key_debug("depth statistics", key->stats_wm, old_key->stats_wm); + found |= key_debug("flat shading", key->flat_shade, old_key->flat_shade); + found |= key_debug("number of color buffers", key->nr_color_regions, old_key->nr_color_regions); + found |= key_debug("rendering to FBO", key->render_to_fbo, old_key->render_to_fbo); + found |= key_debug("fragment color clamping", key->clamp_fragment_color, old_key->clamp_fragment_color); + found |= key_debug("line smoothing", key->line_aa, old_key->line_aa); + found |= key_debug("proj_attrib_mask", key->proj_attrib_mask, old_key->proj_attrib_mask); + found |= key_debug("renderbuffer height", key->drawable_height, old_key->drawable_height); + found |= key_debug("vertex shader outputs", key->vp_outputs_written, old_key->vp_outputs_written); + + found |= brw_debug_recompile_sampler_key(&key->tex, &old_key->tex); + + if (!found) { + perf_debug(" Something else\n"); + } +} + void brw_populate_sampler_prog_key_data(struct gl_context *ctx, const struct gl_program *prog, diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h index b976a60..53b644f 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.h +++ b/src/mesa/drivers/dri/i965/brw_wm.h @@ -480,5 +480,8 @@ bool do_wm_prog(struct brw_context *brw, struct gl_shader_program *prog, struct brw_fragment_program *fp, struct brw_wm_prog_key *key); +void brw_wm_debug_recompile(struct brw_context *brw, + struct gl_shader_program *prog, + const struct brw_wm_prog_key *key); #endif -- 2.7.4