* \param negateBase 4-bit negation vector
* \param extended if true, also allow 0, 1 values
*/
-static const char *
-swizzle_string(GLuint swizzle, GLuint negateBase, GLboolean extended)
+const char *
+_mesa_swizzle_string(GLuint swizzle, GLuint negateBase, GLboolean extended)
{
static const char swz[] = "xyzw01?!";
static char s[20];
}
-static const char *
-condcode_string(GLuint condcode)
+const char *
+_mesa_condcode_string(GLuint condcode)
{
switch (condcode) {
case COND_GT: return "GT";
dstReg->Index, mode, prog),
writemask_string(dstReg->WriteMask));
+ if (dstReg->CondMask != COND_TR) {
+ _mesa_printf(" (%s.%s)",
+ _mesa_condcode_string(dstReg->CondMask),
+ _mesa_swizzle_string(dstReg->CondSwizzle, GL_FALSE, GL_FALSE));
+ }
+
#if 0
_mesa_printf("%s[%d]%s",
file_string((enum register_file) dstReg->File, mode),
_mesa_printf("%s%s",
reg_string((enum register_file) srcReg->File,
srcReg->Index, mode, prog),
- swizzle_string(srcReg->Swizzle,
+ _mesa_swizzle_string(srcReg->Swizzle,
srcReg->NegateBase, GL_FALSE));
#if 0
_mesa_printf("%s[%d]%s",
file_string((enum register_file) srcReg->File, mode),
srcReg->Index,
- swizzle_string(srcReg->Swizzle,
+ _mesa_swizzle_string(srcReg->Swizzle,
srcReg->NegateBase, GL_FALSE));
#endif
}
static void
print_alu_instruction(const struct prog_instruction *inst,
- const char *opcode_string, GLuint numRegs,
+ const char *opcode_string, GLuint numRegs,
gl_prog_print_mode mode,
const struct gl_program *prog)
{
}
+void
+_mesa_print_alu_instruction(const struct prog_instruction *inst,
+ const char *opcode_string, GLuint numRegs)
+{
+ print_alu_instruction(inst, opcode_string, numRegs, PROG_PRINT_DEBUG, NULL);
+}
+
+
void
_mesa_print_instruction(const struct prog_instruction *inst)
{
gl_prog_print_mode mode,
const struct gl_program *prog)
{
- GLuint i;
+ GLint i;
if (inst->Opcode == OPCODE_ELSE ||
inst->Opcode == OPCODE_ENDIF ||
inst->Opcode == OPCODE_ENDSUB) {
indent -= 3;
}
- assert(indent >= 0);
for (i = 0; i < indent; i++) {
_mesa_printf(" ");
}
file_string((enum register_file) inst->SrcReg[0].File,
mode),
inst->SrcReg[0].Index,
- swizzle_string(inst->SrcReg[0].Swizzle,
- inst->SrcReg[0].NegateBase, GL_FALSE));
+ _mesa_swizzle_string(inst->SrcReg[0].Swizzle,
+ inst->SrcReg[0].NegateBase, GL_FALSE));
}
if (inst->Comment)
_mesa_printf(" # %s", inst->Comment);
file_string((enum register_file) inst->SrcReg[0].File,
mode),
inst->SrcReg[0].Index,
- swizzle_string(inst->SrcReg[0].Swizzle,
- inst->SrcReg[0].NegateBase, GL_TRUE));
+ _mesa_swizzle_string(inst->SrcReg[0].Swizzle,
+ inst->SrcReg[0].NegateBase, GL_TRUE));
print_comment(inst);
break;
case OPCODE_TEX:
print_comment(inst);
break;
case OPCODE_BRA:
- _mesa_printf("BRA %u (%s%s)",
+ _mesa_printf("BRA %d (%s%s)",
inst->BranchTarget,
- condcode_string(inst->DstReg.CondMask),
- swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
- print_comment(inst);
- break;
- case OPCODE_CAL:
- _mesa_printf("CAL %u", inst->BranchTarget);
+ _mesa_condcode_string(inst->DstReg.CondMask),
+ _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
print_comment(inst);
break;
case OPCODE_IF:
- _mesa_printf("IF (%s%s); # (if false, goto %d)",
- condcode_string(inst->DstReg.CondMask),
- swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE),
- inst->BranchTarget);
+ if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
+ /* Use ordinary register */
+ _mesa_printf("IF ");
+ print_src_reg(&inst->SrcReg[0], mode, prog);
+ _mesa_printf("; ");
+ }
+ else {
+ /* Use cond codes */
+ _mesa_printf("IF (%s%s);",
+ _mesa_condcode_string(inst->DstReg.CondMask),
+ _mesa_swizzle_string(inst->DstReg.CondSwizzle,
+ 0, GL_FALSE));
+ }
+ _mesa_printf(" # (if false, goto %d)", inst->BranchTarget);
print_comment(inst);
return indent + 3;
case OPCODE_ELSE:
_mesa_printf("ENDLOOP; # (goto %d)\n", inst->BranchTarget);
break;
case OPCODE_BRK:
- _mesa_printf("BRK (%s%s); #(goto %d)",
- condcode_string(inst->DstReg.CondMask),
- swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE),
- inst->BranchTarget);
- print_comment(inst);
- break;
case OPCODE_CONT:
- _mesa_printf("CONT (%s%s); #(goto %d)",
- condcode_string(inst->DstReg.CondMask),
- swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE),
+ _mesa_printf("%s (%s%s); # (goto %d)",
+ _mesa_opcode_string(inst->Opcode),
+ _mesa_condcode_string(inst->DstReg.CondMask),
+ _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE),
inst->BranchTarget);
print_comment(inst);
break;
+
case OPCODE_BGNSUB:
- _mesa_printf("SUB");
- print_comment(inst);
- return indent + 3;
+ if (mode == PROG_PRINT_NV) {
+ _mesa_printf("%s:\n", inst->Comment); /* comment is label */
+ return indent;
+ }
+ else {
+ _mesa_printf("BGNSUB");
+ print_comment(inst);
+ return indent + 3;
+ }
case OPCODE_ENDSUB:
- _mesa_printf("ENDSUB");
+ if (mode == PROG_PRINT_DEBUG) {
+ _mesa_printf("ENDSUB");
+ print_comment(inst);
+ }
+ break;
+ case OPCODE_CAL:
+ if (mode == PROG_PRINT_NV) {
+ _mesa_printf("CAL %s; # (goto %d)\n", inst->Comment, inst->BranchTarget);
+ }
+ else {
+ _mesa_printf("CAL %u", inst->BranchTarget);
+ print_comment(inst);
+ }
+ break;
+ case OPCODE_RET:
+ _mesa_printf("RET (%s%s)",
+ _mesa_condcode_string(inst->DstReg.CondMask),
+ _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
print_comment(inst);
break;
+
case OPCODE_END:
_mesa_printf("END\n");
break;
case OPCODE_NOP:
- _mesa_printf("NOP");
- print_comment(inst);
+ if (mode == PROG_PRINT_DEBUG) {
+ _mesa_printf("NOP");
+ print_comment(inst);
+ }
+ else if (inst->Comment) {
+ /* ARB/NV extensions don't have NOP instruction */
+ _mesa_printf("# %s\n", inst->Comment);
+ }
break;
/* XXX may need other special-case instructions */
default:
void
_mesa_print_program(const struct gl_program *prog)
{
- _mesa_print_program_opt(prog, PROG_PRINT_ARB, GL_TRUE);
+ _mesa_print_program_opt(prog, PROG_PRINT_DEBUG, GL_TRUE);
}