X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fprogram%2Fprog_print.c;h=7e043302da219074e682e1ffb8723a7255659380;hb=HEAD;hp=e4faa63c06f995dd58d158619a660f2e9ca882e4;hpb=a62edcce4eb4c800d972817a20ee874bf2a2c3ef;p=mesa.git diff --git a/src/mesa/program/prog_print.c b/src/mesa/program/prog_print.c index e4faa63c06f..7e043302da2 100644 --- a/src/mesa/program/prog_print.c +++ b/src/mesa/program/prog_print.c @@ -33,11 +33,12 @@ #include "main/glheader.h" #include "main/context.h" -#include "main/imports.h" + #include "prog_instruction.h" #include "prog_parameter.h" #include "prog_print.h" #include "prog_statevars.h" +#include "util/bitscan.h" @@ -50,12 +51,14 @@ _mesa_register_file_name(gl_register_file f) switch (f) { case PROGRAM_TEMPORARY: return "TEMP"; - case PROGRAM_STATE_VAR: - return "STATE"; + case PROGRAM_ARRAY: + return "ARRAY"; case PROGRAM_INPUT: return "INPUT"; case PROGRAM_OUTPUT: return "OUTPUT"; + case PROGRAM_STATE_VAR: + return "STATE"; case PROGRAM_CONSTANT: return "CONST"; case PROGRAM_UNIFORM: @@ -68,10 +71,20 @@ _mesa_register_file_name(gl_register_file f) return "SYSVAL"; case PROGRAM_UNDEFINED: return "UNDEFINED"; + case PROGRAM_IMMEDIATE: + return "IMM"; + case PROGRAM_BUFFER: + return "BUFFER"; + case PROGRAM_MEMORY: + return "MEMORY"; + case PROGRAM_IMAGE: + return "IMAGE"; + case PROGRAM_HW_ATOMIC: + return "HWATOMIC"; default: { static char s[20]; - _mesa_snprintf(s, sizeof(s), "FILE%u", f); + snprintf(s, sizeof(s), "FILE%u", f); return s; } } @@ -89,7 +102,6 @@ arb_input_attrib_string(GLuint index, GLenum progType) */ static const char *const vertAttribs[] = { "vertex.position", - "vertex.weight", "vertex.normal", "vertex.color.primary", "vertex.color.secondary", @@ -147,6 +159,14 @@ 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.(thirty-one)", /* VARYING_SLOT_VIEWPORT_MASK */ "fragment.varying[0]", "fragment.varying[1]", "fragment.varying[2]", @@ -202,7 +222,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 +240,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 +292,14 @@ 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.(thirty-one)", /* VARYING_SLOT_VIEWPORT_MASK */ "result.varying[0]", "result.varying[1]", "result.varying[2]", @@ -350,8 +378,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 +389,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 +526,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,16 +534,8 @@ 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", @@ -552,20 +548,15 @@ fprint_dst_reg(FILE * f, static void fprint_src_reg(FILE *f, - const struct prog_src_register *srcReg, + 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, + 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 +567,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 +577,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 +599,7 @@ _mesa_fprint_alu_instruction(FILE *f, fprintf(f, ", "); } - fprint_comment(f, inst); + fprintf(f, ";\n"); } @@ -667,7 +646,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 +680,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 +717,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 +748,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 +819,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 +874,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=[ "); @@ -949,7 +902,7 @@ _mesa_fprint_program_parameters(FILE *f, const GLfloat *p = prog->LocalParams[i]; fprintf(f, "%2d: %f, %f, %f, %f\n", i, p[0], p[1], p[2], p[3]); } -#endif +#endif _mesa_print_parameter_list(prog->Parameters); } @@ -981,7 +934,9 @@ _mesa_fprint_parameter_list(FILE *f, 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]; + unsigned pvo = list->ParameterValueOffset[i]; + const GLfloat *v = (GLfloat *) list->ParameterValues + pvo; + fprintf(f, "param[%d] sz=%d %s %s = {%.3g, %.3g, %.3g, %.3g}", i, param->Size, _mesa_register_file_name(list->Parameters[i].Type), @@ -1015,6 +970,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,16 +985,22 @@ _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); + snprintf(filename, sizeof(filename), "shader_%u.%s", shader->Name, type); f = fopen(filename, "w"); if (!f) { fprintf(stderr, "Unable to open %s for writing\n", filename); 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 +1010,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 +1021,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); + snprintf(filename, sizeof(filename), "shader.%s", type); f = fopen(filename, "a"); /* append */ if (!f) { fprintf(stderr, "Unable to open %s for appending\n", filename);