From de99760bf3511d05185799c4fb4347f9e5f420f4 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sat, 12 Nov 2005 17:53:14 +0000 Subject: Move stuff common to vertex/fragment_program into the base class, including: Instructions, InputsRead, OutputsWritten, and Parameters. Also, added debug functions: _mesa_print_instruction(), _mesa_print_program_parameters() and revamp _mesa_print_program(). --- src/mesa/shader/arbfragparse.c | 24 ++--- src/mesa/shader/arbprogparse.c | 32 ++++--- src/mesa/shader/arbprogparse.h | 2 + src/mesa/shader/arbvertparse.c | 18 ++-- src/mesa/shader/nvfragparse.c | 27 +++--- src/mesa/shader/nvprogram.c | 6 +- src/mesa/shader/nvvertexec.c | 13 +-- src/mesa/shader/nvvertparse.c | 24 ++--- src/mesa/shader/program.c | 194 +++++++++++++++++++++++++---------------- src/mesa/shader/program.h | 8 +- 10 files changed, 198 insertions(+), 150 deletions(-) (limited to 'src/mesa/shader') diff --git a/src/mesa/shader/arbfragparse.c b/src/mesa/shader/arbfragparse.c index 31223cc473..e6470be9fe 100644 --- a/src/mesa/shader/arbfragparse.c +++ b/src/mesa/shader/arbfragparse.c @@ -67,31 +67,31 @@ _mesa_parse_arb_fragment_program(GLcontext * ctx, GLenum target, } _mesa_memcpy(newInstructions, ap.FPInstructions, ap.Base.NumInstructions * sizeof(struct prog_instruction)); - if (program->Instructions) - _mesa_free(program->Instructions); - program->Instructions = newInstructions; + if (program->Base.Instructions) + _mesa_free(program->Base.Instructions); + program->Base.Instructions = newInstructions; program->Base.String = ap.Base.String; program->Base.NumInstructions = ap.Base.NumInstructions; program->Base.NumTemporaries = ap.Base.NumTemporaries; program->Base.NumParameters = ap.Base.NumParameters; program->Base.NumAttributes = ap.Base.NumAttributes; program->Base.NumAddressRegs = ap.Base.NumAddressRegs; - program->NumAluInstructions = ap.NumAluInstructions; - program->NumTexInstructions = ap.NumTexInstructions; - program->NumTexIndirections = ap.NumTexIndirections; - program->InputsRead = ap.InputsRead; - program->OutputsWritten = ap.OutputsWritten; + program->NumAluInstructions = ap.NumAluInstructions; + program->NumTexInstructions = ap.NumTexInstructions; + program->NumTexIndirections = ap.NumTexIndirections; + program->Base.InputsRead = ap.Base.InputsRead; + program->Base.OutputsWritten = ap.Base.OutputsWritten; for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) program->TexturesUsed[i] = ap.TexturesUsed[i]; - if (program->Parameters) { + if (program->Base.Parameters) { /* free previous program's parameters */ - _mesa_free_parameter_list(program->Parameters); + _mesa_free_parameter_list(program->Base.Parameters); } - program->Parameters = ap.Parameters; + program->Base.Parameters = ap.Base.Parameters; program->FogOption = ap.FogOption; #if DEBUG_FP - _mesa_print_program(ap.Base.NumInstructions, ap.FPInstructions); + _mesa_print_program(&program.Base); #endif } diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c index 5f039170c3..e1a42e2dd9 100644 --- a/src/mesa/shader/arbprogparse.c +++ b/src/mesa/shader/arbprogparse.c @@ -1518,7 +1518,7 @@ parse_attrib_binding(GLcontext * ctx, GLubyte ** inst, _mesa_error(ctx, GL_INVALID_OPERATION, msg); } - Program->InputsRead |= (1 << *inputReg); + Program->Base.InputsRead |= (1 << *inputReg); return err; } @@ -1609,7 +1609,7 @@ parse_result_binding(GLcontext *ctx, GLubyte **inst, break; } - Program->OutputsWritten |= (1 << *outputReg); + Program->Base.OutputsWritten |= (1 << *outputReg); return 0; } @@ -1698,9 +1698,8 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, for (row = first_row; row <= last_row; row++) { state_tokens[3] = state_tokens[4] = row; - idx = - _mesa_add_state_reference (Program->Parameters, - state_tokens); + idx = _mesa_add_state_reference(Program->Base.Parameters, + state_tokens); if (param_var->param_binding_begin == ~0U) param_var->param_binding_begin = idx; param_var->param_binding_length++; @@ -1708,8 +1707,8 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, } } else { - idx = - _mesa_add_state_reference (Program->Parameters, state_tokens); + idx = _mesa_add_state_reference(Program->Base.Parameters, + state_tokens); if (param_var->param_binding_begin == ~0U) param_var->param_binding_begin = idx; param_var->param_binding_length++; @@ -1720,7 +1719,7 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, case PARAM_PROGRAM_ELEMENT: if (parse_program_single_item (ctx, inst, Program, state_tokens)) return 1; - idx = _mesa_add_state_reference (Program->Parameters, state_tokens); + idx = _mesa_add_state_reference (Program->Base.Parameters, state_tokens); if (param_var->param_binding_begin == ~0U) param_var->param_binding_begin = idx; param_var->param_binding_length++; @@ -1759,9 +1758,8 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, for (new_idx = start_idx; new_idx <= end_idx; new_idx++) { state_tokens[2] = new_idx; - idx = - _mesa_add_state_reference (Program->Parameters, - state_tokens); + idx = _mesa_add_state_reference(Program->Base.Parameters, + state_tokens); param_var->param_binding_length++; Program->Base.NumParameters++; } @@ -1773,9 +1771,9 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, case PARAM_CONSTANT: parse_constant (inst, const_values, Program, use); - idx = - _mesa_add_named_constant (Program->Parameters, - (char *) param_var->name, const_values); + idx = _mesa_add_named_constant(Program->Base.Parameters, + (char *) param_var->name, + const_values); if (param_var->param_binding_begin == ~0U) param_var->param_binding_begin = idx; param_var->param_binding_length++; @@ -3949,9 +3947,9 @@ _mesa_parse_arb_program (GLcontext * ctx, const GLubyte * str, GLsizei len, program->Base.NumTemporaries = program->Base.NumParameters = program->Base.NumAttributes = program->Base.NumAddressRegs = 0; - program->Parameters = _mesa_new_parameter_list (); - program->InputsRead = 0x0; - program->OutputsWritten = 0x0; + program->Base.Parameters = _mesa_new_parameter_list (); + program->Base.InputsRead = 0x0; + program->Base.OutputsWritten = 0x0; program->Position = 0; program->MajorVersion = program->MinorVersion = 0; program->PrecisionOption = GL_DONT_CARE; diff --git a/src/mesa/shader/arbprogparse.h b/src/mesa/shader/arbprogparse.h index 5dbf31a2b1..b8498ff281 100644 --- a/src/mesa/shader/arbprogparse.h +++ b/src/mesa/shader/arbprogparse.h @@ -43,9 +43,11 @@ struct arb_program { struct program Base; +#if 0 struct program_parameter_list *Parameters; GLbitfield InputsRead; GLbitfield OutputsWritten; +#endif GLuint Position; /* Just used for error reporting while parsing */ GLuint MajorVersion; diff --git a/src/mesa/shader/arbvertparse.c b/src/mesa/shader/arbvertparse.c index bb18a2ea47..253f2937ed 100644 --- a/src/mesa/shader/arbvertparse.c +++ b/src/mesa/shader/arbvertparse.c @@ -71,9 +71,9 @@ _mesa_parse_arb_vertex_program(GLcontext * ctx, GLenum target, } _mesa_memcpy(newInstructions, ap.VPInstructions, ap.Base.NumInstructions * sizeof(struct prog_instruction)); - if (program->Instructions) - _mesa_free(program->Instructions); - program->Instructions = newInstructions; + if (program->Base.Instructions) + _mesa_free(program->Base.Instructions); + program->Base.Instructions = newInstructions; program->Base.String = ap.Base.String; program->Base.NumInstructions = ap.Base.NumInstructions; program->Base.NumTemporaries = ap.Base.NumTemporaries; @@ -81,16 +81,16 @@ _mesa_parse_arb_vertex_program(GLcontext * ctx, GLenum target, program->Base.NumAttributes = ap.Base.NumAttributes; program->Base.NumAddressRegs = ap.Base.NumAddressRegs; program->IsPositionInvariant = ap.HintPositionInvariant; - program->InputsRead = ap.InputsRead; - program->OutputsWritten = ap.OutputsWritten; + program->Base.InputsRead = ap.Base.InputsRead; + program->Base.OutputsWritten = ap.Base.OutputsWritten; - if (program->Parameters) { + if (program->Base.Parameters) { /* free previous program's parameters */ - _mesa_free_parameter_list(program->Parameters); + _mesa_free_parameter_list(program->Base.Parameters); } - program->Parameters = ap.Parameters; + program->Base.Parameters = ap.Base.Parameters; #if DEBUG_VP - _mesa_print_program(ap.Base.NumInstructions, ap.VPInstructions); + _mesa_print_program(&program->Base); #endif } diff --git a/src/mesa/shader/nvfragparse.c b/src/mesa/shader/nvfragparse.c index 3a48005844..6a8d250d7e 100644 --- a/src/mesa/shader/nvfragparse.c +++ b/src/mesa/shader/nvfragparse.c @@ -1535,17 +1535,17 @@ _mesa_parse_nv_fragment_program(GLcontext *ctx, GLenum dstTarget, } program->Base.String = programString; program->Base.Format = GL_PROGRAM_FORMAT_ASCII_ARB; - if (program->Instructions) { - FREE(program->Instructions); + if (program->Base.Instructions) { + _mesa_free(program->Base.Instructions); } - program->Instructions = newInst; - program->InputsRead = parseState.inputsRead; - program->OutputsWritten = parseState.outputsWritten; + program->Base.Instructions = newInst; + program->Base.InputsRead = parseState.inputsRead; + program->Base.OutputsWritten = parseState.outputsWritten; for (u = 0; u < ctx->Const.MaxTextureImageUnits; u++) program->TexturesUsed[u] = parseState.texturesUsed[u]; /* save program parameters */ - program->Parameters = parseState.parameters; + program->Base.Parameters = parseState.parameters; /* allocate registers for declared program parameters */ #if 00 @@ -1582,17 +1582,16 @@ PrintSrcReg(const struct fragment_program *program, _mesa_printf("-"); } if (src->File == PROGRAM_NAMED_PARAM) { - if (program->Parameters->Parameters[src->Index].Type == PROGRAM_CONSTANT) { - _mesa_printf("{%g, %g, %g, %g}", - program->Parameters->ParameterValues[src->Index][0], - program->Parameters->ParameterValues[src->Index][1], - program->Parameters->ParameterValues[src->Index][2], - program->Parameters->ParameterValues[src->Index][3]); + if (program->Base.Parameters->Parameters[src->Index].Type + == PROGRAM_CONSTANT) { + const GLfloat *v; + v = program->Base.Parameters->ParameterValues[src->Index]; + _mesa_printf("{%g, %g, %g, %g}", v[0], v[1], v[2], v[3]); } else { ASSERT(program->Parameters->Parameters[src->Index].Type == PROGRAM_NAMED_PARAM); - _mesa_printf("%s", program->Parameters->Parameters[src->Index].Name); + _mesa_printf("%s", program->Base.Parameters->Parameters[src->Index].Name); } } else if (src->File == PROGRAM_OUTPUT) { @@ -1734,7 +1733,7 @@ _mesa_print_nv_fragment_program(const struct fragment_program *program) { const struct prog_instruction *inst; - for (inst = program->Instructions; inst->Opcode != OPCODE_END; inst++) { + for (inst = program->Base.Instructions; inst->Opcode != OPCODE_END; inst++) { int i; for (i = 0; Instructions[i].name; i++) { if (inst->Opcode == Instructions[i].opcode) { diff --git a/src/mesa/shader/nvprogram.c b/src/mesa/shader/nvprogram.c index c85e7c00bd..fadb5be2ad 100644 --- a/src/mesa/shader/nvprogram.c +++ b/src/mesa/shader/nvprogram.c @@ -780,7 +780,8 @@ _mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, } fragProg = (struct fragment_program *) prog; - v = _mesa_lookup_parameter_value(fragProg->Parameters, len, (char *) name); + v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, len, + (char *) name); if (v) { v[0] = x; v[1] = y; @@ -845,7 +846,8 @@ _mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name, } fragProg = (struct fragment_program *) prog; - v = _mesa_lookup_parameter_value(fragProg->Parameters, len, (char *) name); + v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, + len, (char *) name); if (v) { params[0] = v[0]; params[1] = v[1]; diff --git a/src/mesa/shader/nvvertexec.c b/src/mesa/shader/nvvertexec.c index 5bb40d881e..a413dcbc29 100644 --- a/src/mesa/shader/nvvertexec.c +++ b/src/mesa/shader/nvvertexec.c @@ -162,10 +162,10 @@ _mesa_init_vp_per_primitive_registers(GLcontext *ctx) } else { /* Using and ARB vertex program */ - if (ctx->VertexProgram.Current->Parameters) { + if (ctx->VertexProgram.Current->Base.Parameters) { /* Grab the state GL state and put into registers */ _mesa_load_state_parameters(ctx, - ctx->VertexProgram.Current->Parameters); + ctx->VertexProgram.Current->Base.Parameters); } } } @@ -239,7 +239,7 @@ get_register_pointer( const struct prog_src_register *source, else if (source->File == PROGRAM_ENV_PARAM) return state->Parameters[reg]; else - return state->Current->Parameters->ParameterValues[reg]; + return state->Current->Base.Parameters->ParameterValues[reg]; } else { switch (source->File) { @@ -261,7 +261,7 @@ get_register_pointer( const struct prog_src_register *source, return state->Parameters[source->Index]; case PROGRAM_STATE_VAR: ASSERT(source->Index < state->Current->Parameters->NumParameters); - return state->Current->Parameters->ParameterValues[source->Index]; + return state->Current->Base.Parameters->ParameterValues[source->Index]; default: _mesa_problem(NULL, "Bad source register file in get_register_pointer"); @@ -395,9 +395,10 @@ _mesa_exec_vertex_program(GLcontext *ctx, const struct vertex_program *program) ctx->VertexProgram.Inputs[VERT_ATTRIB_POS]); /* XXX: This could go elsewhere */ - ctx->VertexProgram.Current->OutputsWritten |= VERT_BIT_POS; + ctx->VertexProgram.Current->Base.OutputsWritten |= VERT_BIT_POS; } - for (inst = program->Instructions; ; inst++) { + + for (inst = program->Base.Instructions; ; inst++) { if (ctx->VertexProgram.CallbackEnabled && ctx->VertexProgram.Callback) { diff --git a/src/mesa/shader/nvvertparse.c b/src/mesa/shader/nvvertparse.c index fd880dc007..e2c14b9918 100644 --- a/src/mesa/shader/nvvertparse.c +++ b/src/mesa/shader/nvvertparse.c @@ -1367,28 +1367,28 @@ _mesa_parse_nv_vertex_program(GLcontext *ctx, GLenum dstTarget, /* copy the compiled instructions */ assert(parseState.numInst <= MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS); newInst = (struct prog_instruction *) - MALLOC(parseState.numInst * sizeof(struct prog_instruction)); + _mesa_malloc(parseState.numInst * sizeof(struct prog_instruction)); if (!newInst) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV"); - FREE(programString); + _mesa_free(programString); return; /* out of memory */ } - MEMCPY(newInst, instBuffer, - parseState.numInst * sizeof(struct prog_instruction)); + _mesa_memcpy(newInst, instBuffer, + parseState.numInst * sizeof(struct prog_instruction)); /* install the program */ program->Base.Target = target; if (program->Base.String) { - FREE(program->Base.String); + _mesa_free(program->Base.String); } program->Base.String = programString; program->Base.Format = GL_PROGRAM_FORMAT_ASCII_ARB; - if (program->Instructions) { - FREE(program->Instructions); + if (program->Base.Instructions) { + _mesa_free(program->Base.Instructions); } - program->Instructions = newInst; - program->InputsRead = parseState.inputsRead; - program->OutputsWritten = parseState.outputsWritten; + program->Base.Instructions = newInst; + program->Base.InputsRead = parseState.inputsRead; + program->Base.OutputsWritten = parseState.outputsWritten; program->IsPositionInvariant = parseState.isPositionInvariant; program->IsNVProgram = GL_TRUE; @@ -1531,7 +1531,7 @@ _mesa_print_nv_vertex_instruction(const struct prog_instruction *inst) break; case OPCODE_PRINT: _mesa_printf("PRINT '%s'", inst->Data); - if (inst->SrcReg[0].File) { + if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { _mesa_printf(", "); PrintSrcReg(&inst->SrcReg[0]); _mesa_printf(";\n"); @@ -1557,7 +1557,7 @@ _mesa_print_nv_vertex_program(const struct vertex_program *program) { const struct prog_instruction *inst; - for (inst = program->Instructions; ; inst++) { + for (inst = program->Base.Instructions; ; inst++) { _mesa_print_nv_vertex_instruction(inst); if (inst->Opcode == OPCODE_END) return; diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index d46fadefca..a9b84fc754 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -294,35 +294,20 @@ _mesa_delete_program(GLcontext *ctx, struct program *prog) if (prog->String) _mesa_free(prog->String); - if (prog->Target == GL_VERTEX_PROGRAM_NV || - prog->Target == GL_VERTEX_STATE_PROGRAM_NV) { - struct vertex_program *vprog = (struct vertex_program *) prog; - if (vprog->Instructions) { - GLuint i; - for (i = 0; i < vprog->Base.NumInstructions; i++) { - if (vprog->Instructions[i].Data) - _mesa_free(vprog->Instructions[i].Data); - } - _mesa_free(vprog->Instructions); - } - if (vprog->Parameters) - _mesa_free_parameter_list(vprog->Parameters); - } - else if (prog->Target == GL_FRAGMENT_PROGRAM_NV || - prog->Target == GL_FRAGMENT_PROGRAM_ARB) { - struct fragment_program *fprog = (struct fragment_program *) prog; - if (fprog->Instructions) { - GLuint i; - for (i = 0; i < fprog->Base.NumInstructions; i++) { - if (fprog->Instructions[i].Data) - _mesa_free(fprog->Instructions[i].Data); - } - _mesa_free(fprog->Instructions); + + if (prog->Instructions) { + GLuint i; + for (i = 0; i < prog->NumInstructions; i++) { + if (prog->Instructions[i].Data) + _mesa_free(prog->Instructions[i].Data); } - if (fprog->Parameters) - _mesa_free_parameter_list(fprog->Parameters); + _mesa_free(prog->Instructions); } - else if (prog->Target == GL_FRAGMENT_SHADER_ATI) { + + if (prog->Parameters) + _mesa_free_parameter_list(prog->Parameters); + + if (prog->Target == GL_FRAGMENT_SHADER_ATI) { struct ati_fragment_shader *atifs = (struct ati_fragment_shader *)prog; GLuint i; for (i = 0; i < MAX_NUM_PASSES_ATI; i++) { @@ -1175,73 +1160,128 @@ writemask_string(GLuint writeMask) /** - * Print a vertx/fragment program to stdout. - * XXX this function could be greatly improved. + * Print a single vertex/fragment program instruction. */ void -_mesa_print_program(GLuint count, const struct prog_instruction *inst) +_mesa_print_instruction(const struct prog_instruction *inst) { - GLuint i; + switch (inst->Opcode) { + case OPCODE_PRINT: + _mesa_printf("PRINT '%s'", inst->Data); + if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { + _mesa_printf(", "); + _mesa_printf("%s[%d]%s", + program_file_string(inst->SrcReg[0].File), + inst->SrcReg[0].Index, + swizzle_string(inst->SrcReg[0].Swizzle, + inst->SrcReg[0].NegateBase)); + } + _mesa_printf(";\n"); + break; + /* XXX check for a bunch of other special-case instructions */ + default: + /* typical alu instruction */ + { + const GLuint numRegs = _mesa_num_inst_src_regs(inst->Opcode); + GLuint j; - for (i = 0; i < count; i++) { - /* inst number */ - _mesa_printf("%3d: ", i); + _mesa_printf("%s", _mesa_opcode_string(inst->Opcode)); + + /* frag prog only */ + if (inst->Saturate) + _mesa_printf("_SAT"); + + if (inst->DstReg.File != PROGRAM_UNDEFINED) { + _mesa_printf(" %s[%d]%s", + program_file_string(inst->DstReg.File), + inst->DstReg.Index, + writemask_string(inst->DstReg.WriteMask)); + } - switch (inst[i].Opcode) { - case OPCODE_PRINT: - _mesa_printf("PRINT '%s'", inst[i].Data); - if (inst->SrcReg[0].File != PROGRAM_UNDEFINED) { + if (numRegs > 0) _mesa_printf(", "); + + for (j = 0; j < numRegs; j++) { _mesa_printf("%s[%d]%s", - program_file_string(inst[i].SrcReg[0].File), - inst[i].SrcReg[0].Index, - swizzle_string(inst[i].SrcReg[0].Swizzle, - inst[i].SrcReg[0].NegateBase)); + program_file_string(inst->SrcReg[j].File), + inst->SrcReg[j].Index, + swizzle_string(inst->SrcReg[j].Swizzle, + inst->SrcReg[j].NegateBase)); + if (j + 1 < numRegs) + _mesa_printf(", "); } + _mesa_printf(";\n"); - break; - /* XXX check for a bunch of other special-case instructions */ - default: - /* typical alu instruction */ - { - const GLuint numRegs = _mesa_num_inst_src_regs(inst[i].Opcode); - GLuint j; - - _mesa_printf("%s", _mesa_opcode_string(inst[i].Opcode)); - - /* frag prog only */ - if (inst[i].Saturate) - _mesa_printf("_SAT"); - - if (inst[i].DstReg.File != PROGRAM_UNDEFINED) { - _mesa_printf(" %s[%d]%s", - program_file_string(inst[i].DstReg.File), - inst[i].DstReg.Index, - writemask_string(inst[i].DstReg.WriteMask)); - } + } + } +} - if (numRegs > 0) - _mesa_printf(", "); - for (j = 0; j < numRegs; j++) { - _mesa_printf("%s[%d]%s", - program_file_string(inst[i].SrcReg[j].File), - inst[i].SrcReg[j].Index, - swizzle_string(inst[i].SrcReg[j].Swizzle, - inst[i].SrcReg[j].NegateBase)); - if (j + 1 < numRegs) - _mesa_printf(", "); - } +/** + * Print a vertx/fragment program to stdout. + * XXX this function could be greatly improved. + */ +void +_mesa_print_program(const struct program *prog) +{ + GLuint i; + for (i = 0; i < prog->NumInstructions; i++) { + _mesa_printf("%3d: ", i); + _mesa_print_instruction(prog->Instructions + i); + } +} - _mesa_printf(";\n"); - } + +/** + * Print all of a program's parameters. + */ +void +_mesa_print_program_parameters(GLcontext *ctx, const struct program *prog) +{ + GLint i; + + _mesa_printf("NumInstructions=%d\n", prog->NumInstructions); + _mesa_printf("NumTemporaries=%d\n", prog->NumTemporaries); + _mesa_printf("NumParameters=%d\n", prog->NumParameters); + _mesa_printf("NumAttributes=%d\n", prog->NumAttributes); + _mesa_printf("NumAddressRegs=%d\n", prog->NumAddressRegs); + + _mesa_load_state_parameters(ctx, prog->Parameters); + +#if 0 + _mesa_printf("Local Params:\n"); + for (i = 0; i < MAX_PROGRAM_LOCAL_PARAMS; i++){ + const GLfloat *p = prog->LocalParams[i]; + _mesa_printf("%2d: %f, %f, %f, %f\n", i, p[0], p[1], p[2], p[3]); + } +#endif + + for (i = 0; i < prog->Parameters->NumParameters; i++){ + const GLfloat *p = prog->Parameters->ParameterValues[i]; + _mesa_printf("param %02d:", i); + + switch (prog->Parameters->Parameters[i].Type) { + case PROGRAM_NAMED_PARAM: + _mesa_printf("%s", prog->Parameters->Parameters[i].Name); + _mesa_printf("(NAMED_PARAMETER)"); + break; + case PROGRAM_CONSTANT: + _mesa_printf("(CONSTANT)"); + break; + case PROGRAM_STATE_VAR: + _mesa_printf("(STATE)\n"); + break; + default: + _mesa_printf("(UNK)\n"); + break; } + + _mesa_printf("{ %f, %f, %f, %f }\n", p[0], p[1], p[2], p[3]); } } - /**********************************************************************/ /* API functions */ /**********************************************************************/ @@ -1674,7 +1714,7 @@ _mesa_GetProgramRegisterfvMESA(GLenum target, else { /* try user-defined identifiers */ const GLfloat *value = _mesa_lookup_parameter_value( - ctx->FragmentProgram.Current->Parameters, -1, reg); + ctx->FragmentProgram.Current->Base.Parameters, -1, reg); if (value) { COPY_4V(v, value); } diff --git a/src/mesa/shader/program.h b/src/mesa/shader/program.h index 373a046da7..ab72f457ee 100644 --- a/src/mesa/shader/program.h +++ b/src/mesa/shader/program.h @@ -256,7 +256,13 @@ _mesa_load_state_parameters(GLcontext *ctx, extern void -_mesa_print_program(GLuint count, const struct prog_instruction *inst); +_mesa_print_instruction(const struct prog_instruction *inst); + +extern void +_mesa_print_program(const struct program *prog); + +extern void +_mesa_print_program_parameters(GLcontext *ctx, const struct program *prog); /* -- cgit v1.2.3