[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