[Mesa-dev] [PATCH 1/3] i965/fs: Add some minimal backend-IR dumping.

Kenneth Graunke kenneth at whitecape.org
Tue Nov 27 19:02:37 PST 2012


On 11/27/2012 12:12 AM, Eric Anholt wrote:
> ---
>   src/mesa/drivers/dri/i965/brw_fs.cpp |   89 ++++++++++++++++++++++++++++++++++
>   src/mesa/drivers/dri/i965/brw_fs.h   |    3 ++
>   2 files changed, 92 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 2f88d92..5fd0e7b 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -1935,6 +1935,95 @@ fs_visitor::remove_duplicate_mrf_writes()
>      return progress;
>   }
>
> +void
> +fs_visitor::dump_instruction(fs_inst *inst)
> +{
> +   if (inst->opcode < ARRAY_SIZE(opcode_descs) &&
> +       opcode_descs[inst->opcode].name) {
> +      printf("%s", opcode_descs[inst->opcode].name);
> +   } else {
> +      printf("op%d", inst->opcode);
> +   }
> +   if (inst->saturate)
> +      printf(".sat");
> +   printf(" ");
> +
> +   switch (inst->dst.file) {
> +   case GRF:
> +      printf("vgrf%d", inst->dst.reg);
> +      if (inst->dst.reg_offset)
> +         printf("+%d", inst->dst.reg_offset);
> +      break;
> +   case MRF:
> +      printf("m%d", inst->dst.reg);
> +      break;
> +   case BAD_FILE:
> +      printf("(null)");
> +      break;
> +   case UNIFORM:
> +      printf("***u%d***", inst->dst.reg);
> +      break;
> +   default:
> +      printf("???");
> +      break;
> +   }
> +   printf(", ");
> +
> +   for (int i = 0; i < 3; i++) {
> +      if (inst->src[i].negate)
> +         printf("-");
> +      if (inst->src[i].abs)
> +         printf("|");
> +      switch (inst->src[i].file) {
> +      case GRF:
> +         printf("vgrf%d", inst->src[i].reg);
> +         if (inst->src[i].reg_offset)
> +            printf("+%d", inst->src[i].reg_offset);
> +         break;
> +      case MRF:
> +         printf("***m%d***", inst->src[i].reg);
> +         break;

Ah, I see...***___*** means that it's invalid.  Nice touch.

> +      case UNIFORM:
> +         printf("u%d", inst->src[i].reg);
> +         if (inst->src[i].reg_offset)
> +            printf(".%d", inst->src[i].reg_offset);
> +         break;
> +      case BAD_FILE:
> +         printf("(null)");
> +         break;
> +      default:
> +         printf("???");
> +         break;
> +      }
> +      if (inst->src[i].abs)
> +         printf("|");
> +
> +      if (i < 3)
> +         printf(", ");
> +   }
> +
> +   printf(" ");
> +
> +   if (inst->force_uncompressed)
> +      printf("1sthalf ");
> +
> +   if (inst->force_sechalf)
> +      printf("2ndhalf ");
> +
> +   printf("\n");
> +}
> +
> +void
> +fs_visitor::dump_instructions()
> +{
> +   int ip = 0;
> +   foreach_list_safe(node, &this->instructions) {

I would just use foreach_list here, since dumping instructions doesn't 
modify the list.

Otherwise it looks fine.
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

> +      fs_inst *inst = (fs_inst *)node;
> +      printf("%d: ", ip++);
> +      dump_instruction(inst);
> +   }
> +}
> +
>   /**
>    * Possibly returns an instruction that set up @param reg.
>    *
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index 389643e..538de73 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -389,6 +389,9 @@ public:
>      void setup_builtin_uniform_values(ir_variable *ir);
>      int implied_mrf_writes(fs_inst *inst);
>
> +   void dump_instructions();
> +   void dump_instruction(fs_inst *inst);
> +
>      const struct gl_fragment_program *fp;
>      struct brw_wm_compile *c;
>
>



More information about the mesa-dev mailing list