[Mesa-dev] [PATCH 2/2] i965: Add INTEL_DEBUG=perf information for GS recompiles.

Pohjolainen, Topi topi.pohjolainen at intel.com
Wed Dec 2 06:38:32 PST 2015


On Tue, Dec 01, 2015 at 11:38:06PM -0800, Kenneth Graunke wrote:
> Surprisingly, this didn't exist at all.

I compared this to the equivalent in brw_wm.c. Both patches:

Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>

> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_gs.c | 58 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 58 insertions(+)
> 
> We could almost certainly clean this up, and I'm not opposed to that, I just
> wanted to fill the feature gap in the simplest way.
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
> index 02e6a8f..edb52ac 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs.c
> @@ -37,6 +37,44 @@
>  #include "glsl/ir_uniform.h"
>  
>  static void
> +brw_gs_debug_recompile(struct brw_context *brw,
> +                       struct gl_shader_program *shader_prog,
> +                       const struct brw_gs_prog_key *key)
> +{
> +   struct brw_cache_item *c = NULL;
> +   const struct brw_gs_prog_key *old_key = NULL;
> +   bool found = false;
> +
> +   perf_debug("Recompiling geometry shader for program %d\n",
> +              shader_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_CACHE_GS_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 |= brw_debug_recompile_sampler_key(brw, &old_key->tex, &key->tex);
> +
> +   if (!found) {
> +      perf_debug("  Something else\n");
> +   }
> +}
> +
> +static void
>  assign_gs_binding_table_offsets(const struct brw_device_info *devinfo,
>                                  const struct gl_shader_program *shader_prog,
>                                  const struct gl_program *prog,
> @@ -63,6 +101,9 @@ brw_codegen_gs_prog(struct brw_context *brw,
>     struct gl_shader *shader = prog->_LinkedShaders[MESA_SHADER_GEOMETRY];
>     struct brw_stage_state *stage_state = &brw->gs.base;
>     struct brw_gs_prog_data prog_data;
> +   bool start_busy = false;
> +   double start_time = 0;
> +
>     memset(&prog_data, 0, sizeof(prog_data));
>  
>     assign_gs_binding_table_offsets(brw->intelScreen->devinfo, prog,
> @@ -77,6 +118,7 @@ brw_codegen_gs_prog(struct brw_context *brw,
>      * every uniform is a float which gets padded to the size of a vec4.
>      */
>     struct gl_shader *gs = prog->_LinkedShaders[MESA_SHADER_GEOMETRY];
> +   struct brw_shader *bgs = (struct brw_shader *) gs;
>     int param_count = gp->program.Base.nir->num_uniforms;
>     if (!compiler->scalar_stage[MESA_SHADER_GEOMETRY])
>        param_count *= 4;
> @@ -107,6 +149,11 @@ brw_codegen_gs_prog(struct brw_context *brw,
>     if (INTEL_DEBUG & DEBUG_SHADER_TIME)
>        st_index = brw_get_shader_time_index(brw, prog, NULL, ST_GS);
>  
> +   if (unlikely(brw->perf_debug)) {
> +      start_busy = brw->batch.last_bo && drm_intel_bo_busy(brw->batch.last_bo);
> +      start_time = get_time();
> +   }
> +
>     void *mem_ctx = ralloc_context(NULL);
>     unsigned program_size;
>     char *error_str;
> @@ -119,6 +166,17 @@ brw_codegen_gs_prog(struct brw_context *brw,
>        return false;
>     }
>  
> +   if (unlikely(brw->perf_debug)) {
> +      if (bgs->compiled_once) {
> +         brw_gs_debug_recompile(brw, prog, key);
> +      }
> +      if (start_busy && !drm_intel_bo_busy(brw->batch.last_bo)) {
> +         perf_debug("GS compile took %.03f ms and stalled the GPU\n",
> +                    (get_time() - start_time) * 1000);
> +      }
> +      bgs->compiled_once = true;
> +   }
> +
>     /* Scratch space is used for register spilling */
>     if (prog_data.base.base.total_scratch) {
>        brw_get_scratch_bo(brw, &stage_state->scratch_bo,
> -- 
> 2.6.2
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list