glsl: Make sure shader source isn't NULL.
[mesa.git] / src / mesa / program / prog_print.c
index 00810bd10b37959cd3681fa4dc43d22679b87f92..00aa6de963b6a8fc9b57169f10863faeef520772 100644 (file)
@@ -265,7 +265,8 @@ arb_output_attrib_string(GLint 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 relAddr, const struct gl_program *prog,
+           GLboolean hasIndex2, GLboolean relAddr2, GLint index2)
 {
    static char str[100];
    const char *addr = relAddr ? "ADDR+" : "";
@@ -275,6 +276,11 @@ reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode,
    switch (mode) {
    case PROG_PRINT_DEBUG:
       sprintf(str, "%s[%s%d]", file_string(f, mode), 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:
@@ -478,7 +484,8 @@ fprint_dst_reg(FILE * f,
 {
    fprintf(f, "%s%s",
           reg_string((gl_register_file) dstReg->File,
-                     dstReg->Index, mode, dstReg->RelAddr, prog),
+                     dstReg->Index, mode, dstReg->RelAddr, prog,
+                      GL_FALSE, GL_FALSE, 0),
           _mesa_writemask_string(dstReg->WriteMask));
    
    if (dstReg->CondMask != COND_TR) {
@@ -508,7 +515,8 @@ fprint_src_reg(FILE *f,
    fprintf(f, "%s%s%s%s",
           abs,
           reg_string((gl_register_file) srcReg->File,
-                     srcReg->Index, mode, srcReg->RelAddr, prog),
+                     srcReg->Index, mode, srcReg->RelAddr, prog,
+                      srcReg->HasIndex2, srcReg->RelAddr2, srcReg->Index2),
           _mesa_swizzle_string(srcReg->Swizzle,
                                srcReg->Negate, GL_FALSE),
           abs);
@@ -532,12 +540,12 @@ fprint_comment(FILE *f, const struct prog_instruction *inst)
 }
 
 
-static void
-fprint_alu_instruction(FILE *f,
-                       const struct prog_instruction *inst,
-                       const char *opcode_string, GLuint numRegs,
-                       gl_prog_print_mode mode,
-                       const struct gl_program *prog)
+void
+_mesa_fprint_alu_instruction(FILE *f,
+                            const struct prog_instruction *inst,
+                            const char *opcode_string, GLuint numRegs,
+                            gl_prog_print_mode mode,
+                            const struct gl_program *prog)
 {
    GLuint j;
 
@@ -574,8 +582,8 @@ void
 _mesa_print_alu_instruction(const struct prog_instruction *inst,
                             const char *opcode_string, GLuint numRegs)
 {
-   fprint_alu_instruction(stderr, inst, opcode_string,
-                          numRegs, PROG_PRINT_DEBUG, NULL);
+   _mesa_fprint_alu_instruction(stderr, inst, opcode_string,
+                               numRegs, PROG_PRINT_DEBUG, NULL);
 }
 
 
@@ -783,16 +791,16 @@ _mesa_fprint_instruction_opt(FILE *f,
    default:
       if (inst->Opcode < MAX_OPCODE) {
          /* typical alu instruction */
-         fprint_alu_instruction(f, inst,
-                                _mesa_opcode_string(inst->Opcode),
-                                _mesa_num_inst_src_regs(inst->Opcode),
-                                mode, prog);
+         _mesa_fprint_alu_instruction(f, inst,
+                                     _mesa_opcode_string(inst->Opcode),
+                                     _mesa_num_inst_src_regs(inst->Opcode),
+                                     mode, prog);
       }
       else {
-         fprint_alu_instruction(f, inst,
-                                _mesa_opcode_string(inst->Opcode),
-                                3/*_mesa_num_inst_src_regs(inst->Opcode)*/,
-                                mode, prog);
+         _mesa_fprint_alu_instruction(f, inst,
+                                     _mesa_opcode_string(inst->Opcode),
+                                     3/*_mesa_num_inst_src_regs(inst->Opcode)*/,
+                                     mode, prog);
       }
       break;
    }
@@ -909,12 +917,15 @@ _mesa_fprint_program_parameters(FILE *f,
    fprintf(f, "InputsRead: 0x%x (0b%s)\n",
                  prog->InputsRead, binary(prog->InputsRead));
    fprintf(f, "OutputsWritten: 0x%llx (0b%s)\n",
-                 prog->OutputsWritten, binary(prog->OutputsWritten));
+                 (unsigned long long)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);
+   fprintf(f, "IndirectRegisterFiles: 0x%x (0b%s)\n",
+           prog->IndirectRegisterFiles, binary(prog->IndirectRegisterFiles));
    fprintf(f, "SamplersUsed: 0x%x (0b%s)\n",
                  prog->SamplersUsed, binary(prog->SamplersUsed));
    fprintf(f, "Samplers=[ ");
@@ -1022,11 +1033,11 @@ _mesa_write_shader_to_file(const struct gl_shader *shader)
 
    fprintf(f, "/* Compile status: %s */\n",
            shader->CompileStatus ? "ok" : "fail");
-   if (!shader->CompileStatus) {
-      fprintf(f, "/* Log Info: */\n");
+   fprintf(f, "/* Log Info: */\n");
+   if (shader->InfoLog) {
       fputs(shader->InfoLog, f);
    }
-   else {
+   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);