Improve the quality of the disassembly output for fragment programs.
This commit is contained in:
+125
-129
@@ -43,142 +43,138 @@ void
|
||||
_mesa_debug_fp_inst(GLint num, struct fp_instruction *fp)
|
||||
{
|
||||
GLint a;
|
||||
|
||||
/* fprintf(stderr, "PROGRAM_OUTPUT: 0x%x\n", PROGRAM_OUTPUT); */
|
||||
/* fprintf(stderr, "PROGRAM_INPUT: 0x%x\n", PROGRAM_INPUT); */
|
||||
/* fprintf(stderr, "PROGRAM_TEMPORARY: 0x%x\n", PROGRAM_TEMPORARY); */
|
||||
|
||||
static const char *opcode_string[] = {
|
||||
"ABS", /* ARB_f_p only */
|
||||
"ADD",
|
||||
"CMP", /* ARB_f_p only */
|
||||
"COS",
|
||||
"DDX", /* NV_f_p only */
|
||||
"DDY", /* NV_f_p only */
|
||||
"DP3",
|
||||
"DP4",
|
||||
"DPH", /* ARB_f_p only */
|
||||
"DST",
|
||||
"END", /* private opcode */
|
||||
"EX2",
|
||||
"FLR",
|
||||
"FRC",
|
||||
"KIL", /* ARB_f_p only */
|
||||
"KIL_NV", /* NV_f_p only */
|
||||
"LG2",
|
||||
"LIT",
|
||||
"LRP",
|
||||
"MAD",
|
||||
"MAX",
|
||||
"MIN",
|
||||
"MOV",
|
||||
"MUL",
|
||||
"PK2H", /* NV_f_p only */
|
||||
"PK2US", /* NV_f_p only */
|
||||
"PK4B", /* NV_f_p only */
|
||||
"PK4UB", /* NV_f_p only */
|
||||
"POW",
|
||||
"PRINT", /* Mesa only */
|
||||
"RCP",
|
||||
"RFL", /* NV_f_p only */
|
||||
"RSQ",
|
||||
"SCS", /* ARB_f_p only */
|
||||
"SEQ", /* NV_f_p only */
|
||||
"SFL", /* NV_f_p only */
|
||||
"SGE", /* NV_f_p only */
|
||||
"SGT", /* NV_f_p only */
|
||||
"SIN",
|
||||
"SLE", /* NV_f_p only */
|
||||
"SLT",
|
||||
"SNE", /* NV_f_p only */
|
||||
"STR", /* NV_f_p only */
|
||||
"SUB",
|
||||
"SWZ", /* ARB_f_p only */
|
||||
"TEX",
|
||||
"TXB", /* ARB_f_p only */
|
||||
"TXD", /* NV_f_p only */
|
||||
"TXP", /* ARB_f_p only */
|
||||
"TXP_NV", /* NV_f_p only */
|
||||
"UP2H", /* NV_f_p only */
|
||||
"UP2US", /* NV_f_p only */
|
||||
"UP4B", /* NV_f_p only */
|
||||
"UP4UB", /* NV_f_p only */
|
||||
"X2D", /* NV_f_p only - 2d mat mul */
|
||||
"XPD", /* ARB_f_p only - cross product */
|
||||
};
|
||||
|
||||
static const char *file_string[] = {
|
||||
"TEMP",
|
||||
"INPUT",
|
||||
"OUTPUT",
|
||||
"LOCAL",
|
||||
"ENV",
|
||||
"NAMED",
|
||||
"STATE",
|
||||
"WRITE_ONLY",
|
||||
"ADDR"
|
||||
};
|
||||
|
||||
static const char swz[] = "xyzw01??";
|
||||
|
||||
for (a=0; a<num; a++) {
|
||||
switch (fp[a].Opcode) {
|
||||
case FP_OPCODE_END:
|
||||
fprintf(stderr, "FP_OPCODE_END"); break;
|
||||
_mesa_printf("%s", opcode_string[fp[a].Opcode]);
|
||||
|
||||
case FP_OPCODE_ABS:
|
||||
fprintf(stderr, "FP_OPCODE_ABS"); break;
|
||||
if (fp[a].Saturate)
|
||||
_mesa_printf("_SAT");
|
||||
|
||||
case FP_OPCODE_ADD:
|
||||
fprintf(stderr, "FP_OPCODE_ADD"); break;
|
||||
|
||||
case FP_OPCODE_CMP:
|
||||
fprintf(stderr, "FP_OPCODE_CMP"); break;
|
||||
|
||||
case FP_OPCODE_COS:
|
||||
fprintf(stderr, "FP_OPCODE_COS"); break;
|
||||
|
||||
case FP_OPCODE_DP3:
|
||||
fprintf(stderr, "FP_OPCODE_DP3"); break;
|
||||
|
||||
case FP_OPCODE_DP4:
|
||||
fprintf(stderr, "FP_OPCODE_DP4"); break;
|
||||
|
||||
case FP_OPCODE_DPH:
|
||||
fprintf(stderr, "FP_OPCODE_DPH"); break;
|
||||
|
||||
case FP_OPCODE_DST:
|
||||
fprintf(stderr, "FP_OPCODE_DST"); break;
|
||||
|
||||
case FP_OPCODE_EX2:
|
||||
fprintf(stderr, "FP_OPCODE_EX2"); break;
|
||||
|
||||
case FP_OPCODE_FLR:
|
||||
fprintf(stderr, "FP_OPCODE_FLR"); break;
|
||||
|
||||
case FP_OPCODE_FRC:
|
||||
fprintf(stderr, "FP_OPCODE_FRC"); break;
|
||||
|
||||
case FP_OPCODE_KIL:
|
||||
fprintf(stderr, "FP_OPCODE_KIL"); break;
|
||||
|
||||
case FP_OPCODE_LG2:
|
||||
fprintf(stderr, "FP_OPCODE_LG2"); break;
|
||||
|
||||
case FP_OPCODE_LIT:
|
||||
fprintf(stderr, "FP_OPCODE_LIT"); break;
|
||||
|
||||
case FP_OPCODE_LRP:
|
||||
fprintf(stderr, "FP_OPCODE_LRP"); break;
|
||||
|
||||
case FP_OPCODE_MAD:
|
||||
fprintf(stderr, "FP_OPCODE_MAD"); break;
|
||||
|
||||
case FP_OPCODE_MAX:
|
||||
fprintf(stderr, "FP_OPCODE_MAX"); break;
|
||||
|
||||
case FP_OPCODE_MIN:
|
||||
fprintf(stderr, "FP_OPCODE_MIN"); break;
|
||||
|
||||
case FP_OPCODE_MOV:
|
||||
fprintf(stderr, "FP_OPCODE_MOV"); break;
|
||||
|
||||
case FP_OPCODE_MUL:
|
||||
fprintf(stderr, "FP_OPCODE_MUL"); break;
|
||||
|
||||
case FP_OPCODE_POW:
|
||||
fprintf(stderr, "FP_OPCODE_POW"); break;
|
||||
|
||||
case FP_OPCODE_RCP:
|
||||
fprintf(stderr, "FP_OPCODE_RCP"); break;
|
||||
|
||||
case FP_OPCODE_RSQ:
|
||||
fprintf(stderr, "FP_OPCODE_RSQ"); break;
|
||||
|
||||
case FP_OPCODE_SCS:
|
||||
fprintf(stderr, "FP_OPCODE_SCS"); break;
|
||||
|
||||
case FP_OPCODE_SIN:
|
||||
fprintf(stderr, "FP_OPCODE_SIN"); break;
|
||||
|
||||
case FP_OPCODE_SLT:
|
||||
fprintf(stderr, "FP_OPCODE_SLT"); break;
|
||||
|
||||
case FP_OPCODE_SUB:
|
||||
fprintf(stderr, "FP_OPCODE_SUB"); break;
|
||||
|
||||
case FP_OPCODE_SWZ:
|
||||
fprintf(stderr, "FP_OPCODE_SWZ"); break;
|
||||
|
||||
case FP_OPCODE_TEX:
|
||||
fprintf(stderr, "FP_OPCODE_TEX"); break;
|
||||
|
||||
case FP_OPCODE_TXB:
|
||||
fprintf(stderr, "FP_OPCODE_TXB"); break;
|
||||
|
||||
case FP_OPCODE_TXP:
|
||||
fprintf(stderr, "FP_OPCODE_TXP"); break;
|
||||
|
||||
case FP_OPCODE_XPD:
|
||||
fprintf(stderr, "FP_OPCODE_XPD"); break;
|
||||
|
||||
default:
|
||||
_mesa_warning(NULL, "Bad opcode in debug_fg_inst()");
|
||||
if (fp[a].DstReg.File != 0xf) {
|
||||
if (fp[a].DstReg.WriteMask != 0xf ||
|
||||
fp[a].SrcReg[0].NegateBase)
|
||||
_mesa_printf(" %s[%d].%s%s%s%s ", file_string[fp[a].DstReg.File], fp[a].DstReg.Index,
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 0) ? "x" : "",
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 1) ? "y" : "",
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 2) ? "z" : "",
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 3) ? "w" : "");
|
||||
else
|
||||
_mesa_printf(" %s[%d] ", file_string[fp[a].DstReg.File], fp[a].DstReg.Index);
|
||||
}
|
||||
|
||||
fprintf(stderr, " D(0x%x:%d:%d%d%d%d) ",
|
||||
fp[a].DstReg.File, fp[a].DstReg.Index,
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 0),
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 1),
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 2),
|
||||
GET_BIT(fp[a].DstReg.WriteMask, 3));
|
||||
|
||||
fprintf(stderr, "S1(0x%x:%d:%d%d%d%d) ", fp[a].SrcReg[0].File, fp[a].SrcReg[0].Index,
|
||||
GET_SWZ(fp[a].SrcReg[0].Swizzle, 0),
|
||||
GET_SWZ(fp[a].SrcReg[0].Swizzle, 1),
|
||||
GET_SWZ(fp[a].SrcReg[0].Swizzle, 2),
|
||||
GET_SWZ(fp[a].SrcReg[0].Swizzle, 3));
|
||||
if (fp[a].SrcReg[0].File != 0xf) {
|
||||
if (fp[a].SrcReg[0].Swizzle != SWIZZLE_NOOP ||
|
||||
fp[a].SrcReg[0].NegateBase)
|
||||
_mesa_printf("%s[%d].%s%c%c%c%c ", file_string[fp[a].SrcReg[0].File], fp[a].SrcReg[0].Index,
|
||||
fp[a].SrcReg[0].NegateBase ? "-" : "",
|
||||
swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 0)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 1)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 2)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 3)]);
|
||||
else
|
||||
_mesa_printf("%s[%d] ", file_string[fp[a].SrcReg[0].File], fp[a].SrcReg[0].Index);
|
||||
}
|
||||
|
||||
fprintf(stderr, "S2(0x%x:%d:%d%d%d%d) ", fp[a].SrcReg[1].File, fp[a].SrcReg[1].Index,
|
||||
GET_SWZ(fp[a].SrcReg[1].Swizzle, 0),
|
||||
GET_SWZ(fp[a].SrcReg[1].Swizzle, 1),
|
||||
GET_SWZ(fp[a].SrcReg[1].Swizzle, 2),
|
||||
GET_SWZ(fp[a].SrcReg[1].Swizzle, 3));
|
||||
|
||||
fprintf(stderr, "S3(0x%x:%d:%d%d%d%d)", fp[a].SrcReg[2].File, fp[a].SrcReg[2].Index,
|
||||
GET_SWZ(fp[a].SrcReg[2].Swizzle, 0),
|
||||
GET_SWZ(fp[a].SrcReg[2].Swizzle, 1),
|
||||
GET_SWZ(fp[a].SrcReg[2].Swizzle, 2),
|
||||
GET_SWZ(fp[a].SrcReg[2].Swizzle, 3));
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
if (fp[a].SrcReg[1].File != 0xf) {
|
||||
if (fp[a].SrcReg[1].Swizzle != SWIZZLE_NOOP ||
|
||||
fp[a].SrcReg[1].NegateBase)
|
||||
_mesa_printf("%s[%d].%s%c%c%c%c ", file_string[fp[a].SrcReg[1].File], fp[a].SrcReg[1].Index,
|
||||
fp[a].SrcReg[1].NegateBase ? "-" : "",
|
||||
swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 0)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 1)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 2)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 3)]);
|
||||
else
|
||||
_mesa_printf("%s[%d] ", file_string[fp[a].SrcReg[1].File], fp[a].SrcReg[1].Index);
|
||||
}
|
||||
|
||||
if (fp[a].SrcReg[2].File != 0xf) {
|
||||
if (fp[a].SrcReg[2].Swizzle != SWIZZLE_NOOP ||
|
||||
fp[a].SrcReg[2].NegateBase)
|
||||
_mesa_printf("%s[%d].%s%c%c%c%c ", file_string[fp[a].SrcReg[2].File], fp[a].SrcReg[2].Index,
|
||||
fp[a].SrcReg[1].NegateBase ? "-" : "",
|
||||
swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 0)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 1)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 2)],
|
||||
swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 3)]);
|
||||
else
|
||||
_mesa_printf("%s[%d] ", file_string[fp[a].SrcReg[2].File], fp[a].SrcReg[2].Index);
|
||||
}
|
||||
|
||||
_mesa_printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user