static void fprint_dst_reg(FILE * f, const struct prog_dst_register *dstReg, gl_prog_print_mode mode, const struct gl_program *prog) { fprintf(f, "%s%s", reg_string((gl_register_file) dstReg->File, dstReg->Index, mode, dstReg->RelAddr, prog, GL_FALSE, GL_FALSE, 0), _mesa_writemask_string(dstReg->WriteMask)); if (dstReg->CondMask != COND_TR) { fprintf(f, " (%s.%s)", _mesa_condcode_string(dstReg->CondMask), _mesa_swizzle_string(dstReg->CondSwizzle, GL_FALSE, GL_FALSE)); } #if 0 fprintf(f, "%s[%d]%s", _mesa_register_file_name((gl_register_file) dstReg->File), dstReg->Index, _mesa_writemask_string(dstReg->WriteMask)); #endif }
/** * Print a program parameter list to given file. */ static void _mesa_fprint_parameter_list(FILE *f, const struct gl_program_parameter_list *list) { GLuint i; if (!list) return; if (0) fprintf(f, "param list %p\n", (void *) list); fprintf(f, "dirty state flags: 0x%x\n", list->StateFlags); for (i = 0; i < list->NumParameters; i++){ struct gl_program_parameter *param = list->Parameters + i; const GLfloat *v = (GLfloat *) list->ParameterValues[i]; fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}", i, param->Size, _mesa_register_file_name(list->Parameters[i].Type), param->Name, v[0], v[1], v[2], v[3]); if (param->Flags & PROG_PARAM_BIT_CENTROID) fprintf(f, " Centroid"); if (param->Flags & PROG_PARAM_BIT_INVARIANT) fprintf(f, " Invariant"); if (param->Flags & PROG_PARAM_BIT_FLAT) fprintf(f, " Flat"); if (param->Flags & PROG_PARAM_BIT_LINEAR) fprintf(f, " Linear"); fprintf(f, "\n"); } }
/** * Return string representation of the given register. * Note that some types of registers (like PROGRAM_UNIFORM) aren't defined * by the ARB/NV program languages so we've taken some liberties here. * \param f the register file (PROGRAM_INPUT, PROGRAM_TEMPORARY, etc) * \param index number of the register in the register file * \param mode the output format/mode/style * \param prog pointer to containing program */ static const char * reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, GLboolean relAddr, const struct gl_program *prog) { static char str[100]; const char *addr = relAddr ? "ADDR+" : ""; str[0] = 0; switch (mode) { case PROG_PRINT_DEBUG: sprintf(str, "%s[%s%d]", _mesa_register_file_name(f), addr, index); break; case PROG_PRINT_ARB: switch (f) { case PROGRAM_INPUT: sprintf(str, "%s", arb_input_attrib_string(index, prog->Target)); break; case PROGRAM_OUTPUT: sprintf(str, "%s", arb_output_attrib_string(index, prog->Target)); break; case PROGRAM_TEMPORARY: sprintf(str, "temp%d", index); break; case PROGRAM_CONSTANT: /* extension */ sprintf(str, "constant[%s%d]", addr, index); break; case PROGRAM_UNIFORM: /* extension */ sprintf(str, "uniform[%s%d]", addr, index); break; case PROGRAM_SYSTEM_VALUE: sprintf(str, "sysvalue[%s%d]", addr, index); break; case PROGRAM_STATE_VAR: { struct gl_program_parameter *param = prog->Parameters->Parameters + index; char *state = _mesa_program_state_string(param->StateIndexes); sprintf(str, "%s", state); free(state); } break; case PROGRAM_ADDRESS: sprintf(str, "A%d", index); break; default: _mesa_problem(NULL, "bad file in reg_string()"); } break; default: _mesa_problem(NULL, "bad mode in reg_string()"); } return str; }
static void fprint_dst_reg(FILE * f, const struct prog_dst_register *dstReg, gl_prog_print_mode mode, const struct gl_program *prog) { fprintf(f, "%s%s", reg_string((gl_register_file) dstReg->File, dstReg->Index, mode, dstReg->RelAddr, prog), _mesa_writemask_string(dstReg->WriteMask)); #if 0 fprintf(f, "%s[%d]%s", _mesa_register_file_name((gl_register_file) dstReg->File), dstReg->Index, _mesa_writemask_string(dstReg->WriteMask)); #endif }
static void fprint_src_reg(FILE *f, const struct prog_src_register *srcReg, gl_prog_print_mode mode, const struct gl_program *prog) { fprintf(f, "%s%s", reg_string((gl_register_file) srcReg->File, srcReg->Index, mode, srcReg->RelAddr, prog), _mesa_swizzle_string(srcReg->Swizzle, srcReg->Negate, GL_FALSE)); #if 0 fprintf(f, "%s[%d]%s", _mesa_register_file_name((gl_register_file) srcReg->File), srcReg->Index, _mesa_swizzle_string(srcReg->Swizzle, srcReg->Negate, GL_FALSE)); #endif }
/** * Print a program parameter list to given file. */ static void _mesa_fprint_parameter_list(FILE *f, const struct gl_program_parameter_list *list) { GLuint i; if (!list) return; if (0) fprintf(f, "param list %p\n", (void *) list); fprintf(f, "dirty state flags: 0x%x\n", list->StateFlags); for (i = 0; i < list->NumParameters; i++) { struct gl_program_parameter *param = list->Parameters + i; const GLfloat *v = (GLfloat *) list->ParameterValues[i]; fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}", i, param->Size, _mesa_register_file_name(list->Parameters[i].Type), param->Name, v[0], v[1], v[2], v[3]); fprintf(f, "\n"); } }
static void fprint_src_reg(FILE *f, const struct prog_src_register *srcReg, gl_prog_print_mode mode, const struct gl_program *prog) { const char *abs = srcReg->Abs ? "|" : ""; fprintf(f, "%s%s%s%s", abs, reg_string((gl_register_file) srcReg->File, srcReg->Index, mode, srcReg->RelAddr, prog, srcReg->HasIndex2, srcReg->RelAddr2, srcReg->Index2), _mesa_swizzle_string(srcReg->Swizzle, srcReg->Negate, GL_FALSE), abs); #if 0 fprintf(f, "%s[%d]%s", _mesa_register_file_name((gl_register_file) srcReg->File), srcReg->Index, _mesa_swizzle_string(srcReg->Swizzle, srcReg->Negate, GL_FALSE)); #endif }
/** * Print a single vertex/fragment program instruction. */ GLint _mesa_fprint_instruction_opt(FILE *f, const struct prog_instruction *inst, GLint indent, gl_prog_print_mode mode, const struct gl_program *prog) { GLint i; if (inst->Opcode == OPCODE_ELSE || inst->Opcode == OPCODE_ENDIF || inst->Opcode == OPCODE_ENDLOOP || inst->Opcode == OPCODE_ENDSUB) { indent -= 3; } for (i = 0; i < indent; i++) { fprintf(f, " "); } switch (inst->Opcode) { case OPCODE_SWZ: fprintf(f, "SWZ"); if (inst->Saturate) fprintf(f, "_SAT"); fprintf(f, " "); fprint_dst_reg(f, &inst->DstReg, mode, prog); fprintf(f, ", %s[%d], %s", _mesa_register_file_name((gl_register_file) inst->SrcReg[0].File), inst->SrcReg[0].Index, _mesa_swizzle_string(inst->SrcReg[0].Swizzle, inst->SrcReg[0].Negate, GL_TRUE)); fprint_comment(f, inst); break; case OPCODE_TEX: case OPCODE_TXP: case OPCODE_TXL: case OPCODE_TXB: case OPCODE_TXD: fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); if (inst->Saturate) fprintf(f, "_SAT"); fprintf(f, " "); fprint_dst_reg(f, &inst->DstReg, mode, prog); fprintf(f, ", "); fprint_src_reg(f, &inst->SrcReg[0], mode, prog); if (inst->Opcode == OPCODE_TXD) { fprintf(f, ", "); fprint_src_reg(f, &inst->SrcReg[1], mode, prog); fprintf(f, ", "); fprint_src_reg(f, &inst->SrcReg[2], mode, prog); } fprintf(f, ", texture[%d], ", inst->TexSrcUnit); switch (inst->TexSrcTarget) { case TEXTURE_1D_INDEX: fprintf(f, "1D"); break; case TEXTURE_2D_INDEX: fprintf(f, "2D"); break; case TEXTURE_3D_INDEX: fprintf(f, "3D"); break; case TEXTURE_CUBE_INDEX: fprintf(f, "CUBE"); break; case TEXTURE_RECT_INDEX: fprintf(f, "RECT"); break; case TEXTURE_1D_ARRAY_INDEX: fprintf(f, "1D_ARRAY"); break; case TEXTURE_2D_ARRAY_INDEX: fprintf(f, "2D_ARRAY"); break; default: ; } if (inst->TexShadow) fprintf(f, " SHADOW"); fprint_comment(f, inst); break; case OPCODE_KIL: fprintf(f, "%s", _mesa_opcode_string(inst->Opcode)); fprintf(f, " "); fprint_src_reg(f, &inst->SrcReg[0], mode, prog); fprint_comment(f, inst); break; case OPCODE_ARL: fprintf(f, "ARL "); fprint_dst_reg(f, &inst->DstReg, mode, prog); fprintf(f, ", "); fprint_src_reg(f, &inst->SrcReg[0], mode, prog); fprint_comment(f, inst); break; case OPCODE_IF: fprintf(f, "IF "); fprint_src_reg(f, &inst->SrcReg[0], mode, prog); fprintf(f, "; "); fprintf(f, " # (if false, goto %d)", inst->BranchTarget); fprint_comment(f, inst); return indent + 3; case OPCODE_ELSE: fprintf(f, "ELSE; # (goto %d)\n", inst->BranchTarget); return indent + 3; case OPCODE_ENDIF: fprintf(f, "ENDIF;\n"); break; case OPCODE_BGNLOOP: fprintf(f, "BGNLOOP; # (end at %d)\n", inst->BranchTarget); return indent + 3; case OPCODE_ENDLOOP: fprintf(f, "ENDLOOP; # (goto %d)\n", inst->BranchTarget); break; case OPCODE_BRK: case OPCODE_CONT: fprintf(f, "%s; # (goto %d)", _mesa_opcode_string(inst->Opcode), inst->BranchTarget); fprint_comment(f, inst); break; case OPCODE_BGNSUB: fprintf(f, "BGNSUB"); fprint_comment(f, inst); return indent + 3; case OPCODE_ENDSUB: if (mode == PROG_PRINT_DEBUG) { fprintf(f, "ENDSUB"); fprint_comment(f, inst); } break; case OPCODE_CAL: fprintf(f, "CAL %u", inst->BranchTarget); fprint_comment(f, inst); break; case OPCODE_RET: fprintf(f, "RET"); fprint_comment(f, inst); break; case OPCODE_END: fprintf(f, "END\n"); break; case OPCODE_NOP: if (mode == PROG_PRINT_DEBUG) { fprintf(f, "NOP"); fprint_comment(f, inst); } else if (inst->Comment) { /* ARB/NV extensions don't have NOP instruction */ fprintf(f, "# %s\n", inst->Comment); } break; /* XXX may need other special-case instructions */ default: if (inst->Opcode < MAX_OPCODE) { /* typical alu instruction */ _mesa_fprint_alu_instruction(f, inst, _mesa_opcode_string(inst->Opcode), _mesa_num_inst_src_regs(inst->Opcode), mode, prog); } else { _mesa_fprint_alu_instruction(f, inst, _mesa_opcode_string(inst->Opcode), 3/*_mesa_num_inst_src_regs(inst->Opcode)*/, mode, prog); } break; } return indent; }
/** * Return string representation of the given register. * Note that some types of registers (like PROGRAM_UNIFORM) aren't defined * by the ARB/NV program languages so we've taken some liberties here. * \param f the register file (PROGRAM_INPUT, PROGRAM_TEMPORARY, etc) * \param index number of the register in the register file * \param mode the output format/mode/style * \param prog pointer to containing program */ static const char * reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode, GLboolean relAddr, const struct gl_program *prog, GLboolean hasIndex2, GLboolean relAddr2, GLint index2) { static char str[100]; const char *addr = relAddr ? "ADDR+" : ""; str[0] = 0; switch (mode) { case PROG_PRINT_DEBUG: sprintf(str, "%s[%s%d]", _mesa_register_file_name(f), addr, index); if (hasIndex2) { int offset = strlen(str); const char *addr2 = relAddr2 ? "ADDR+" : ""; sprintf(str+offset, "[%s%d]", addr2, index2); } break; case PROG_PRINT_ARB: switch (f) { case PROGRAM_INPUT: sprintf(str, "%s", arb_input_attrib_string(index, prog->Target)); break; case PROGRAM_OUTPUT: sprintf(str, "%s", arb_output_attrib_string(index, prog->Target)); break; case PROGRAM_TEMPORARY: sprintf(str, "temp%d", index); break; case PROGRAM_ENV_PARAM: sprintf(str, "program.env[%s%d]", addr, index); break; case PROGRAM_LOCAL_PARAM: sprintf(str, "program.local[%s%d]", addr, index); break; case PROGRAM_VARYING: /* extension */ sprintf(str, "varying[%s%d]", addr, index); break; case PROGRAM_CONSTANT: /* extension */ sprintf(str, "constant[%s%d]", addr, index); break; case PROGRAM_UNIFORM: /* extension */ sprintf(str, "uniform[%s%d]", addr, index); break; case PROGRAM_SYSTEM_VALUE: sprintf(str, "sysvalue[%s%d]", addr, index); break; case PROGRAM_STATE_VAR: { struct gl_program_parameter *param = prog->Parameters->Parameters + index; char *state = _mesa_program_state_string(param->StateIndexes); sprintf(str, "%s", state); free(state); } break; case PROGRAM_ADDRESS: sprintf(str, "A%d", index); break; default: _mesa_problem(NULL, "bad file in reg_string()"); } break; case PROG_PRINT_NV: switch (f) { case PROGRAM_INPUT: if (prog->Target == GL_VERTEX_PROGRAM_ARB) sprintf(str, "v[%d]", index); else sprintf(str, "f[%d]", index); break; case PROGRAM_OUTPUT: sprintf(str, "o[%d]", index); break; case PROGRAM_TEMPORARY: sprintf(str, "R%d", index); break; case PROGRAM_ENV_PARAM: sprintf(str, "c[%d]", index); break; case PROGRAM_VARYING: /* extension */ sprintf(str, "varying[%s%d]", addr, index); break; case PROGRAM_UNIFORM: /* extension */ sprintf(str, "uniform[%s%d]", addr, index); break; case PROGRAM_CONSTANT: /* extension */ sprintf(str, "constant[%s%d]", addr, index); break; case PROGRAM_STATE_VAR: /* extension */ sprintf(str, "state[%s%d]", addr, index); break; default: _mesa_problem(NULL, "bad file in reg_string()"); } break; default: _mesa_problem(NULL, "bad mode in reg_string()"); } return str; }