Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
/**
 * 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");
   }
}
Exemplo n.º 3
0
/**
 * 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;
}
Exemplo n.º 4
0
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
}
Exemplo n.º 5
0
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
}
Exemplo n.º 6
0
/**
 * 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");
    }
}
Exemplo n.º 7
0
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
}
Exemplo n.º 8
0
/**
 * 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;
}
Exemplo n.º 9
0
/**
 * 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;
}