glsl: Fix gl_shader_stage enum unsigned comparison
[mesa.git] / src / mesa / program / prog_print.c
index e4faa63c06f995dd58d158619a660f2e9ca882e4..4f85d14c41d8376425b286d737161e8cc51bc81d 100644 (file)
@@ -147,6 +147,13 @@ arb_input_attrib_string(GLuint index, GLenum progType)
       "fragment.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
       "fragment.(twenty-two)", /* VARYING_SLOT_FACE */
       "fragment.(twenty-three)", /* VARYING_SLOT_PNTC */
+      "fragment.(twenty-four)", /* VARYING_SLOT_TESS_LEVEL_OUTER */
+      "fragment.(twenty-five)", /* VARYING_SLOT_TESS_LEVEL_INNER */
+      "fragment.(twenty-six)", /* VARYING_SLOT_CULL_DIST0 */
+      "fragment.(twenty-seven)", /* VARYING_SLOT_CULL_DIST1 */
+      "fragment.(twenty-eight)", /* VARYING_SLOT_BOUNDING_BOX0 */
+      "fragment.(twenty-nine)", /* VARYING_SLOT_BOUNDING_BOX1 */
+      "fragment.(thirty)", /* VARYING_SLOT_VIEW_INDEX */
       "fragment.varying[0]",
       "fragment.varying[1]",
       "fragment.varying[2]",
@@ -202,7 +209,7 @@ arb_input_attrib_string(GLuint index, GLenum progType)
 
 
 /**
- * Print a vertex program's InputsRead field in human-readable format.
+ * Print a vertex program's inputs_read field in human-readable format.
  * For debugging.
  */
 void
@@ -220,7 +227,7 @@ _mesa_print_vp_inputs(GLbitfield inputs)
 
 
 /**
- * Print a fragment program's InputsRead field in human-readable format.
+ * Print a fragment program's inputs_read field in human-readable format.
  * For debugging.
  */
 void
@@ -272,6 +279,13 @@ arb_output_attrib_string(GLuint index, GLenum progType)
       "result.(twenty-one)", /* VARYING_SLOT_VIEWPORT */
       "result.(twenty-two)", /* VARYING_SLOT_FACE */
       "result.(twenty-three)", /* VARYING_SLOT_PNTC */
+      "result.(twenty-four)", /* VARYING_SLOT_TESS_LEVEL_OUTER */
+      "result.(twenty-five)", /* VARYING_SLOT_TESS_LEVEL_INNER */
+      "result.(twenty-six)", /* VARYING_SLOT_CULL_DIST0 */
+      "result.(twenty-seven)", /* VARYING_SLOT_CULL_DIST1 */
+      "result.(twenty-eight)", /* VARYING_SLOT_BOUNDING_BOX0 */
+      "result.(twenty-nine)", /* VARYING_SLOT_BOUNDING_BOX1 */
+      "result.(thirty)", /* VARYING_SLOT_VIEW_INDEX */
       "result.varying[0]",
       "result.varying[1]",
       "result.varying[2]",
@@ -350,8 +364,7 @@ arb_output_attrib_string(GLuint index, GLenum progType)
  */
 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)
+           GLboolean relAddr, const struct gl_program *prog)
 {
    static char str[100];
    const char *addr = relAddr ? "ADDR+" : "";
@@ -362,11 +375,6 @@ reg_string(gl_register_file f, GLint index, gl_prog_print_mode 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:
@@ -504,24 +512,6 @@ _mesa_writemask_string(GLuint writeMask)
 }
 
 
-const char *
-_mesa_condcode_string(GLuint condcode)
-{
-   switch (condcode) {
-   case COND_GT:  return "GT";
-   case COND_EQ:  return "EQ";
-   case COND_LT:  return "LT";
-   case COND_UN:  return "UN";
-   case COND_GE:  return "GE";
-   case COND_LE:  return "LE";
-   case COND_NE:  return "NE";
-   case COND_TR:  return "TR";
-   case COND_FL:  return "FL";
-   default: return "cond???";
-   }
-}
-
-
 static void
 fprint_dst_reg(FILE * f,
                const struct prog_dst_register *dstReg,
@@ -530,17 +520,9 @@ fprint_dst_reg(FILE * f,
 {
    fprintf(f, "%s%s",
           reg_string((gl_register_file) dstReg->File,
-                     dstReg->Index, mode, dstReg->RelAddr, prog,
-                      GL_FALSE, GL_FALSE, 0),
+                     dstReg->Index, mode, dstReg->RelAddr, prog),
           _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),
@@ -556,16 +538,11 @@ fprint_src_reg(FILE *f,
                gl_prog_print_mode mode,
                const struct gl_program *prog)
 {
-   const char *abs = srcReg->Abs ? "|" : "";
-
-   fprintf(f, "%s%s%s%s",
-          abs,
+   fprintf(f, "%s%s",
           reg_string((gl_register_file) srcReg->File,
-                     srcReg->Index, mode, srcReg->RelAddr, prog,
-                      srcReg->HasIndex2, srcReg->RelAddr2, srcReg->Index2),
+                     srcReg->Index, mode, srcReg->RelAddr, prog),
           _mesa_swizzle_string(srcReg->Swizzle,
-                               srcReg->Negate, GL_FALSE),
-          abs);
+                               srcReg->Negate, GL_FALSE));
 #if 0
    fprintf(f, "%s[%d]%s",
           _mesa_register_file_name((gl_register_file) srcReg->File),
@@ -576,16 +553,6 @@ fprint_src_reg(FILE *f,
 }
 
 
-static void
-fprint_comment(FILE *f, const struct prog_instruction *inst)
-{
-   if (inst->Comment)
-      fprintf(f, ";  # %s\n", inst->Comment);
-   else
-      fprintf(f, ";\n");
-}
-
-
 void
 _mesa_fprint_alu_instruction(FILE *f,
                             const struct prog_instruction *inst,
@@ -596,8 +563,6 @@ _mesa_fprint_alu_instruction(FILE *f,
    GLuint j;
 
    fprintf(f, "%s", opcode_string);
-   if (inst->CondUpdate)
-      fprintf(f, ".C");
 
    /* frag prog only */
    if (inst->Saturate)
@@ -620,7 +585,7 @@ _mesa_fprint_alu_instruction(FILE *f,
         fprintf(f, ", ");
    }
 
-   fprint_comment(f, inst);
+   fprintf(f, ";\n");
 }
 
 
@@ -667,7 +632,7 @@ _mesa_fprint_instruction_opt(FILE *f,
              inst->SrcReg[0].Index,
              _mesa_swizzle_string(inst->SrcReg[0].Swizzle,
                                   inst->SrcReg[0].Negate, GL_TRUE));
-      fprint_comment(f, inst);
+      fprintf(f, ";\n");
       break;
    case OPCODE_TEX:
    case OPCODE_TXP:
@@ -701,48 +666,28 @@ _mesa_fprint_instruction_opt(FILE *f,
       }
       if (inst->TexShadow)
          fprintf(f, " SHADOW");
-      fprint_comment(f, inst);
+      fprintf(f, ";\n");
       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_KIL_NV:
-      fprintf(f, "%s", _mesa_opcode_string(inst->Opcode));
-      fprintf(f, " ");
-      fprintf(f, "%s.%s",
-             _mesa_condcode_string(inst->DstReg.CondMask),
-             _mesa_swizzle_string(inst->DstReg.CondSwizzle,
-                                  GL_FALSE, GL_FALSE));
-      fprint_comment(f, inst);
+      fprintf(f, ";\n");
       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);
+      fprintf(f, ";\n");
       break;
    case OPCODE_IF:
-      if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) {
-         /* Use ordinary register */
-         fprintf(f, "IF ");
-         fprint_src_reg(f, &inst->SrcReg[0], mode, prog);
-         fprintf(f, "; ");
-      }
-      else {
-         /* Use cond codes */
-         fprintf(f, "IF (%s%s);",
-                _mesa_condcode_string(inst->DstReg.CondMask),
-                _mesa_swizzle_string(inst->DstReg.CondSwizzle,
-                                     0, GL_FALSE));
-      }
+      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);
+      fprintf(f, ";\n");
       return indent + 3;
    case OPCODE_ELSE:
       fprintf(f, "ELSE; # (goto %d)\n", inst->BranchTarget);
@@ -758,33 +703,29 @@ _mesa_fprint_instruction_opt(FILE *f,
       break;
    case OPCODE_BRK:
    case OPCODE_CONT:
-      fprintf(f, "%s (%s%s); # (goto %d)",
+      fprintf(f, "%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);
-      fprint_comment(f, inst);
+      fprintf(f, ";\n");
       break;
 
    case OPCODE_BGNSUB:
       fprintf(f, "BGNSUB");
-      fprint_comment(f, inst);
+      fprintf(f, ";\n");
       return indent + 3;
    case OPCODE_ENDSUB:
       if (mode == PROG_PRINT_DEBUG) {
          fprintf(f, "ENDSUB");
-         fprint_comment(f, inst);
+         fprintf(f, ";\n");
       }
       break;
    case OPCODE_CAL:
       fprintf(f, "CAL %u", inst->BranchTarget);
-      fprint_comment(f, inst);
+      fprintf(f, ";\n");
       break;
    case OPCODE_RET:
-      fprintf(f, "RET (%s%s)",
-             _mesa_condcode_string(inst->DstReg.CondMask),
-             _mesa_swizzle_string(inst->DstReg.CondSwizzle, 0, GL_FALSE));
-      fprint_comment(f, inst);
+      fprintf(f, "RET");
+      fprintf(f, ";\n");
       break;
 
    case OPCODE_END:
@@ -793,11 +734,7 @@ _mesa_fprint_instruction_opt(FILE *f,
    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);
+         fprintf(f, ";\n");
       }
       break;
    /* XXX may need other special-case instructions */
@@ -868,10 +805,10 @@ _mesa_fprint_program_opt(FILE *f,
       fprintf(f, "# Geometry Shader\n");
    }
 
-   for (i = 0; i < prog->NumInstructions; i++) {
+   for (i = 0; i < prog->arb.NumInstructions; i++) {
       if (lineNumbers)
          fprintf(f, "%3d: ", i);
-      indent = _mesa_fprint_instruction_opt(f, prog->Instructions + i,
+      indent = _mesa_fprint_instruction_opt(f, prog->arb.Instructions + i,
                                            indent, mode, prog);
    }
 }
@@ -923,16 +860,18 @@ _mesa_fprint_program_parameters(FILE *f,
    GLuint i;
 
    fprintf(f, "InputsRead: %" PRIx64 " (0b%s)\n",
-           (uint64_t) prog->InputsRead, binary(prog->InputsRead));
+           (uint64_t) prog->info.inputs_read, binary(prog->info.inputs_read));
    fprintf(f, "OutputsWritten: %" PRIx64 " (0b%s)\n",
-           (uint64_t) prog->OutputsWritten, binary(prog->OutputsWritten));
-   fprintf(f, "NumInstructions=%d\n", prog->NumInstructions);
-   fprintf(f, "NumTemporaries=%d\n", prog->NumTemporaries);
-   fprintf(f, "NumParameters=%d\n", prog->NumParameters);
-   fprintf(f, "NumAttributes=%d\n", prog->NumAttributes);
-   fprintf(f, "NumAddressRegs=%d\n", prog->NumAddressRegs);
+           (uint64_t) prog->info.outputs_written,
+           binary(prog->info.outputs_written));
+   fprintf(f, "NumInstructions=%d\n", prog->arb.NumInstructions);
+   fprintf(f, "NumTemporaries=%d\n", prog->arb.NumTemporaries);
+   fprintf(f, "NumParameters=%d\n", prog->arb.NumParameters);
+   fprintf(f, "NumAttributes=%d\n", prog->arb.NumAttributes);
+   fprintf(f, "NumAddressRegs=%d\n", prog->arb.NumAddressRegs);
    fprintf(f, "IndirectRegisterFiles: 0x%x (0b%s)\n",
-           prog->IndirectRegisterFiles, binary(prog->IndirectRegisterFiles));
+           prog->arb.IndirectRegisterFiles,
+           binary(prog->arb.IndirectRegisterFiles));
    fprintf(f, "SamplersUsed: 0x%x (0b%s)\n",
                  prog->SamplersUsed, binary(prog->SamplersUsed));
    fprintf(f, "Samplers=[ ");
@@ -1015,6 +954,12 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
    case MESA_SHADER_FRAGMENT:
       type = "frag";
       break;
+   case MESA_SHADER_TESS_CTRL:
+      type = "tesc";
+      break;
+   case MESA_SHADER_TESS_EVAL:
+      type = "tese";
+      break;
    case MESA_SHADER_VERTEX:
       type = "vert";
       break;
@@ -1024,6 +969,8 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
    case MESA_SHADER_COMPUTE:
       type = "comp";
       break;
+   default:
+      break;
    }
 
    _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type);
@@ -1033,7 +980,11 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
       return;
    }
 
+#ifdef DEBUG
    fprintf(f, "/* Shader %u source, checksum %u */\n", shader->Name, shader->SourceChecksum);
+#else
+   fprintf(f, "/* Shader %u source */\n", shader->Name);
+#endif
    fputs(shader->Source, f);
    fprintf(f, "\n");
 
@@ -1043,16 +994,6 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
    if (shader->InfoLog) {
       fputs(shader->InfoLog, f);
    }
-   if (shader->CompileStatus && shader->Program) {
-      fprintf(f, "/* GPU code */\n");
-      fprintf(f, "/*\n");
-      _mesa_fprint_program_opt(f, shader->Program, PROG_PRINT_DEBUG, GL_TRUE);
-      fprintf(f, "*/\n");
-      fprintf(f, "/* Parameters / constants */\n");
-      fprintf(f, "/*\n");
-      _mesa_fprint_parameter_list(f, shader->Program->Parameters);
-      fprintf(f, "*/\n");
-   }
 
    fclose(f);
 }
@@ -1064,19 +1005,18 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
  * _mesa_write_shader_to_file function.
  */
 void
-_mesa_append_uniforms_to_file(const struct gl_shader *shader)
+_mesa_append_uniforms_to_file(const struct gl_program *prog)
 {
-   const struct gl_program *const prog = shader->Program;
    const char *type;
    char filename[100];
    FILE *f;
 
-   if (shader->Stage == MESA_SHADER_FRAGMENT)
+   if (prog->info.stage == MESA_SHADER_FRAGMENT)
       type = "frag";
    else
       type = "vert";
 
-   _mesa_snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type);
+   _mesa_snprintf(filename, sizeof(filename), "shader.%s", type);
    f = fopen(filename, "a"); /* append */
    if (!f) {
       fprintf(stderr, "Unable to open %s for appending\n", filename);