diff options
author | Brian <[email protected]> | 2007-02-26 13:11:20 -0700 |
---|---|---|
committer | Brian <[email protected]> | 2007-02-26 13:11:20 -0700 |
commit | 25ea5ea27e7fa4bd7151723d7549a0c33ac1ceda (patch) | |
tree | 845f42be66305613b31728728109939c7b51bba7 /src/mesa/shader | |
parent | 32fbbf38b4358acd46569fd3c2b21fbc21e417a8 (diff) | |
parent | 3c1c999226859216b8af35c4806413b4488f21b4 (diff) |
Merge branch 'glsl-compiler-1' of git+ssh://[email protected]/git/mesa/mesa into glsl-compiler-1
Diffstat (limited to 'src/mesa/shader')
-rw-r--r-- | src/mesa/shader/prog_debug.c | 26 | ||||
-rw-r--r-- | src/mesa/shader/prog_execute.c | 311 | ||||
-rw-r--r-- | src/mesa/shader/prog_execute.h | 8 |
3 files changed, 164 insertions, 181 deletions
diff --git a/src/mesa/shader/prog_debug.c b/src/mesa/shader/prog_debug.c index e3e5396bb17..57929fcbcae 100644 --- a/src/mesa/shader/prog_debug.c +++ b/src/mesa/shader/prog_debug.c @@ -141,9 +141,7 @@ _mesa_GetProgramRegisterfvMESA(GLenum target, "glGetProgramRegisterfvMESA(registerName)"); return; } -#if 0 /* FIX ME */ - ctx->Driver.GetVertexProgramRegister(ctx, PROGRAM_TEMPORARY, i, v); -#endif + ctx->Driver.GetProgramRegister(ctx, PROGRAM_TEMPORARY, i, v); } else if (reg[0] == 'v' && reg[1] == '[') { /* Vertex Input attribute */ @@ -154,10 +152,7 @@ _mesa_GetProgramRegisterfvMESA(GLenum target, _mesa_sprintf(number, "%d", i); if (_mesa_strncmp(reg + 2, name, 4) == 0 || _mesa_strncmp(reg + 2, number, _mesa_strlen(number)) == 0) { -#if 0 /* FIX ME */ - ctx->Driver.GetVertexProgramRegister(ctx, PROGRAM_INPUT, - i, v); -#endif + ctx->Driver.GetProgramRegister(ctx, PROGRAM_INPUT, i, v); return; } } @@ -210,7 +205,7 @@ _mesa_GetProgramRegisterfvMESA(GLenum target, "glGetProgramRegisterfvMESA(registerName)"); return; } - ctx->Driver.GetFragmentProgramRegister(ctx, PROGRAM_TEMPORARY, + ctx->Driver.GetProgramRegister(ctx, PROGRAM_TEMPORARY, i, v); } else if (reg[0] == 'f' && reg[1] == '[') { @@ -219,8 +214,7 @@ _mesa_GetProgramRegisterfvMESA(GLenum target, for (i = 0; i < ctx->Const.FragmentProgram.MaxAttribs; i++) { const char *name = _mesa_nv_fragment_input_register_name(i); if (_mesa_strncmp(reg + 2, name, 4) == 0) { - ctx->Driver.GetFragmentProgramRegister(ctx, - PROGRAM_INPUT, i, v); + ctx->Driver.GetProgramRegister(ctx, PROGRAM_INPUT, i, v); return; } } @@ -230,18 +224,18 @@ _mesa_GetProgramRegisterfvMESA(GLenum target, } else if (_mesa_strcmp(reg, "o[COLR]") == 0) { /* Fragment output color */ - ctx->Driver.GetFragmentProgramRegister(ctx, PROGRAM_OUTPUT, - FRAG_RESULT_COLR, v); + ctx->Driver.GetProgramRegister(ctx, PROGRAM_OUTPUT, + FRAG_RESULT_COLR, v); } else if (_mesa_strcmp(reg, "o[COLH]") == 0) { /* Fragment output color */ - ctx->Driver.GetFragmentProgramRegister(ctx, PROGRAM_OUTPUT, - FRAG_RESULT_COLH, v); + ctx->Driver.GetProgramRegister(ctx, PROGRAM_OUTPUT, + FRAG_RESULT_COLH, v); } else if (_mesa_strcmp(reg, "o[DEPR]") == 0) { /* Fragment output depth */ - ctx->Driver.GetFragmentProgramRegister(ctx, PROGRAM_OUTPUT, - FRAG_RESULT_DEPR, v); + ctx->Driver.GetProgramRegister(ctx, PROGRAM_OUTPUT, + FRAG_RESULT_DEPR, v); } else { /* try user-defined identifiers */ diff --git a/src/mesa/shader/prog_execute.c b/src/mesa/shader/prog_execute.c index 063d572428b..a63298ba7d6 100644 --- a/src/mesa/shader/prog_execute.c +++ b/src/mesa/shader/prog_execute.c @@ -74,66 +74,30 @@ static const GLfloat ZeroVec[4] = { 0.0F, 0.0F, 0.0F, 0.0F }; -#if FEATURE_MESA_program_debug -static struct gl_program_machine *CurrentMachine = NULL; - -/** - * For GL_MESA_program_debug. - * Return current value (4*GLfloat) of a program register. - * Called via ctx->Driver.GetFragmentProgramRegister(). - */ -void -_mesa_get_program_register(GLcontext *ctx, enum register_file file, - GLuint index, GLfloat val[4]) -{ - if (CurrentMachine) { - switch (file) { - case PROGRAM_INPUT: - if (CurrentMachine->CurProgram->Target == GL_VERTEX_PROGRAM_ARB) { - COPY_4V(val, CurrentMachine->VertAttribs[index]); - } - else { - COPY_4V(val, - CurrentMachine->Attribs[index][CurrentMachine->CurElement]); - } - break; - case PROGRAM_OUTPUT: - COPY_4V(val, CurrentMachine->Outputs[index]); - break; - case PROGRAM_TEMPORARY: - COPY_4V(val, CurrentMachine->Temporaries[index]); - break; - default: - _mesa_problem(NULL, - "bad register file in _swrast_get_program_register"); - } - } -} -#endif /* FEATURE_MESA_program_debug */ - - - /** * Return a pointer to the 4-element float vector specified by the given * source register. */ static INLINE const GLfloat * -get_register_pointer(GLcontext * ctx, - const struct prog_src_register *source, +get_register_pointer(const struct prog_src_register *source, const struct gl_program_machine *machine) { if (source->RelAddr) { const GLint reg = source->Index + machine->AddressReg[0][0]; - ASSERT( (source->File == PROGRAM_ENV_PARAM) || - (source->File == PROGRAM_STATE_VAR) ); - if (reg < 0 || reg > MAX_NV_VERTEX_PROGRAM_PARAMS) - return ZeroVec; - else if (source->File == PROGRAM_ENV_PARAM) - return ctx->VertexProgram.Parameters[reg]; + if (source->File == PROGRAM_ENV_PARAM) + if (reg < 0 || reg >= MAX_PROGRAM_ENV_PARAMS) + return ZeroVec; + else + return machine->EnvParams[reg]; else { + const struct gl_program_parameter_list *params; ASSERT(source->File == PROGRAM_LOCAL_PARAM || source->File == PROGRAM_STATE_VAR); - return machine->CurProgram->Parameters->ParameterValues[reg]; + params = machine->CurProgram->Parameters; + if (reg < 0 || reg >= params->NumParameters) + return ZeroVec; + else + return params->ParameterValues[reg]; } } @@ -162,10 +126,7 @@ get_register_pointer(GLcontext * ctx, case PROGRAM_ENV_PARAM: ASSERT(source->Index < MAX_PROGRAM_ENV_PARAMS); - if (machine->CurProgram->Target == GL_VERTEX_PROGRAM_ARB) - return ctx->VertexProgram.Parameters[source->Index]; - else - return ctx->FragmentProgram.Parameters[source->Index]; + return machine->EnvParams[source->Index]; case PROGRAM_STATE_VAR: /* Fallthrough */ @@ -179,7 +140,7 @@ get_register_pointer(GLcontext * ctx, return machine->CurProgram->Parameters->ParameterValues[source->Index]; default: - _mesa_problem(ctx, + _mesa_problem(NULL, "Invalid input register file %d in get_register_pointer()", source->File); return NULL; @@ -187,16 +148,39 @@ get_register_pointer(GLcontext * ctx, } +#if FEATURE_MESA_program_debug +static struct gl_program_machine *CurrentMachine = NULL; + +/** + * For GL_MESA_program_debug. + * Return current value (4*GLfloat) of a program register. + * Called via ctx->Driver.GetProgramRegister(). + */ +void +_mesa_get_program_register(GLcontext *ctx, enum register_file file, + GLuint index, GLfloat val[4]) +{ + if (CurrentMachine) { + struct prog_src_register src; + const GLfloat *reg; + src.File = file; + src.Index = index; + reg = get_register_pointer(&src, CurrentMachine); + COPY_4V(val, reg); + } +} +#endif /* FEATURE_MESA_program_debug */ + + /** * Fetch a 4-element float vector from the given source register. * Apply swizzling and negating as needed. */ static void -fetch_vector4(GLcontext * ctx, - const struct prog_src_register *source, +fetch_vector4(const struct prog_src_register *source, const struct gl_program_machine *machine, GLfloat result[4]) { - const GLfloat *src = get_register_pointer(ctx, source, machine); + const GLfloat *src = get_register_pointer(source, machine); ASSERT(src); if (source->Swizzle == SWIZZLE_NOOP) { @@ -354,11 +338,10 @@ fetch_vector4_deriv(GLcontext * ctx, * As above, but only return result[0] element. */ static void -fetch_vector1(GLcontext * ctx, - const struct prog_src_register *source, +fetch_vector1(const struct prog_src_register *source, const struct gl_program_machine *machine, GLfloat result[4]) { - const GLfloat *src = get_register_pointer(ctx, source, machine); + const GLfloat *src = get_register_pointer(source, machine); ASSERT(src); result[0] = src[GET_SWZ(source->Swizzle, 0)]; @@ -632,19 +615,19 @@ init_machine_deriv(GLcontext * ctx, /** * Execute the given vertex/fragment program. * - * \param ctx - rendering context - * \param program - the fragment program to execute - * \param machine - machine state (register file) - * \param maxInst - max number of instructions to execute + * \param ctx rendering context + * \param program the program to execute + * \param machine machine state (must be initialized) * \return GL_TRUE if program completed or GL_FALSE if program executed KIL. */ GLboolean _mesa_execute_program(GLcontext * ctx, - const struct gl_program *program, GLuint maxInst, - struct gl_program_machine *machine, GLuint element) + const struct gl_program *program, + struct gl_program_machine *machine) { - const GLuint MAX_EXEC = 10000; - GLint pc, total = 0; + const GLuint numInst = program->NumInstructions; + const GLuint maxExec = 10000; + GLint pc, numExec = 0; machine->CurProgram = program; @@ -656,7 +639,14 @@ _mesa_execute_program(GLcontext * ctx, CurrentMachine = machine; #endif - for (pc = 0; pc < maxInst; pc++) { + if (program->Target == GL_VERTEX_PROGRAM_ARB) { + machine->EnvParams = ctx->VertexProgram.Parameters; + } + else { + machine->EnvParams = ctx->FragmentProgram.Parameters; + } + + for (pc = 0; pc < numInst; pc++) { const struct prog_instruction *inst = program->Instructions + pc; #if FEATURE_MESA_program_debug @@ -676,7 +666,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_ABS: { GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); result[0] = FABSF(a[0]); result[1] = FABSF(a[1]); result[2] = FABSF(a[2]); @@ -687,8 +677,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_ADD: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = a[0] + b[0]; result[1] = a[1] + b[1]; result[2] = a[2] + b[2]; @@ -704,7 +694,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_ARL: { GLfloat t[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, t); + fetch_vector4(&inst->SrcReg[0], machine, t); machine->AddressReg[0][0] = (GLint) FLOORF(t[0]); } break; @@ -743,9 +733,9 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_CMP: { GLfloat a[4], b[4], c[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); - fetch_vector4(ctx, &inst->SrcReg[2], machine, c); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[2], machine, c); result[0] = a[0] < 0.0F ? b[0] : c[0]; result[1] = a[1] < 0.0F ? b[1] : c[1]; result[2] = a[2] < 0.0F ? b[2] : c[2]; @@ -756,7 +746,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_COS: { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = result[3] = (GLfloat) _mesa_cos(a[0]); store_vector4(inst, machine, result); @@ -776,11 +766,11 @@ _mesa_execute_program(GLcontext * ctx, * Finally, find the difference in the register values for * the original and derivative runs. */ - fetch_vector4(ctx, &inst->SrcReg[0], machine, program, a); + fetch_vector4(&inst->SrcReg[0], machine, program, a); init_machine_deriv(ctx, machine, program, span, 'X', &dMachine); execute_program(ctx, program, pc, &dMachine, span, column); - fetch_vector4(ctx, &inst->SrcReg[0], &dMachine, program, + fetch_vector4(&inst->SrcReg[0], &dMachine, program, aNext); result[0] = aNext[0] - a[0]; result[1] = aNext[1] - a[1]; @@ -802,9 +792,9 @@ _mesa_execute_program(GLcontext * ctx, column, result)) { init_machine_deriv(ctx, machine, program, span, 'Y', &dMachine); - fetch_vector4(ctx, &inst->SrcReg[0], machine, program, a); + fetch_vector4(&inst->SrcReg[0], machine, program, a); execute_program(ctx, program, pc, &dMachine, span, column); - fetch_vector4(ctx, &inst->SrcReg[0], &dMachine, program, + fetch_vector4(&inst->SrcReg[0], &dMachine, program, aNext); result[0] = aNext[0] - a[0]; result[1] = aNext[1] - a[1]; @@ -820,8 +810,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_DP3: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = result[1] = result[2] = result[3] = DOT3(a, b); store_vector4(inst, machine, result); if (DEBUG_PROG) { @@ -833,8 +823,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_DP4: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = result[1] = result[2] = result[3] = DOT4(a, b); store_vector4(inst, machine, result); if (DEBUG_PROG) { @@ -847,8 +837,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_DPH: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = result[1] = result[2] = result[3] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + b[3]; store_vector4(inst, machine, result); @@ -857,8 +847,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_DST: /* Distance vector */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = 1.0F; result[1] = a[1] * b[1]; result[2] = a[2]; @@ -869,7 +859,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_EXP: { GLfloat t[4], q[4], floor_t0; - fetch_vector1(ctx, &inst->SrcReg[0], machine, t); + fetch_vector1(&inst->SrcReg[0], machine, t); floor_t0 = FLOORF(t[0]); if (floor_t0 > FLT_MAX_EXP) { SET_POS_INFINITY(q[0]); @@ -895,7 +885,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_EX2: /* Exponential base 2 */ { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = result[3] = (GLfloat) _mesa_pow(2.0, a[0]); store_vector4(inst, machine, result); @@ -904,7 +894,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_FLR: { GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); result[0] = FLOORF(a[0]); result[1] = FLOORF(a[1]); result[2] = FLOORF(a[2]); @@ -915,7 +905,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_FRC: { GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); result[0] = a[0] - FLOORF(a[0]); result[1] = a[1] - FLOORF(a[1]); result[2] = a[2] - FLOORF(a[2]); @@ -944,7 +934,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_INT: /* float to int */ { GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); result[0] = (GLfloat) (GLint) a[0]; result[1] = (GLfloat) (GLint) a[1]; result[2] = (GLfloat) (GLint) a[2]; @@ -960,7 +950,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_KIL: /* ARB_f_p only */ { GLfloat a[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); if (a[0] < 0.0F || a[1] < 0.0F || a[2] < 0.0F || a[3] < 0.0F) { return GL_FALSE; } @@ -969,7 +959,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_LG2: /* log base 2 */ { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = result[3] = LOG2(a[0]); store_vector4(inst, machine, result); } @@ -978,7 +968,7 @@ _mesa_execute_program(GLcontext * ctx, { const GLfloat epsilon = 1.0F / 256.0F; /* from NV VP spec */ GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); a[0] = MAX2(a[0], 0.0F); a[1] = MAX2(a[1], 0.0F); /* XXX ARB version clamps a[3], NV version doesn't */ @@ -1007,7 +997,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_LOG: { GLfloat t[4], q[4], abs_t0; - fetch_vector1(ctx, &inst->SrcReg[0], machine, t); + fetch_vector1(&inst->SrcReg[0], machine, t); abs_t0 = FABSF(t[0]); if (abs_t0 != 0.0F) { /* Since we really can't handle infinite values on VMS @@ -1044,9 +1034,9 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_LRP: { GLfloat a[4], b[4], c[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); - fetch_vector4(ctx, &inst->SrcReg[2], machine, c); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[2], machine, c); result[0] = a[0] * b[0] + (1.0F - a[0]) * c[0]; result[1] = a[1] * b[1] + (1.0F - a[1]) * c[1]; result[2] = a[2] * b[2] + (1.0F - a[2]) * c[2]; @@ -1064,9 +1054,9 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_MAD: { GLfloat a[4], b[4], c[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); - fetch_vector4(ctx, &inst->SrcReg[2], machine, c); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[2], machine, c); result[0] = a[0] * b[0] + c[0]; result[1] = a[1] * b[1] + c[1]; result[2] = a[2] * b[2] + c[2]; @@ -1084,8 +1074,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_MAX: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = MAX2(a[0], b[0]); result[1] = MAX2(a[1], b[1]); result[2] = MAX2(a[2], b[2]); @@ -1101,8 +1091,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_MIN: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = MIN2(a[0], b[0]); result[1] = MIN2(a[1], b[1]); result[2] = MIN2(a[2], b[2]); @@ -1113,7 +1103,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_MOV: { GLfloat result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, result); + fetch_vector4(&inst->SrcReg[0], machine, result); store_vector4(inst, machine, result); if (DEBUG_PROG) { printf("MOV (%g %g %g %g)\n", @@ -1124,8 +1114,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_MUL: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = a[0] * b[0]; result[1] = a[1] * b[1]; result[2] = a[2] * b[2]; @@ -1141,7 +1131,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_NOISE1: { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = result[3] = _slang_library_noise1(a[0]); @@ -1151,7 +1141,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_NOISE2: { GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = result[3] = _slang_library_noise2(a[0], a[1]); @@ -1161,7 +1151,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_NOISE3: { GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = @@ -1172,7 +1162,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_NOISE4: { GLfloat a[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = @@ -1188,7 +1178,7 @@ _mesa_execute_program(GLcontext * ctx, GLhalfNV hx, hy; GLuint *rawResult = (GLuint *) result; GLuint twoHalves; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); hx = _mesa_float_to_half(a[0]); hy = _mesa_float_to_half(a[1]); twoHalves = hx | (hy << 16); @@ -1201,7 +1191,7 @@ _mesa_execute_program(GLcontext * ctx, { GLfloat a[4], result[4]; GLuint usx, usy, *rawResult = (GLuint *) result; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); a[0] = CLAMP(a[0], 0.0F, 1.0F); a[1] = CLAMP(a[1], 0.0F, 1.0F); usx = IROUND(a[0] * 65535.0F); @@ -1215,7 +1205,7 @@ _mesa_execute_program(GLcontext * ctx, { GLfloat a[4], result[4]; GLuint ubx, uby, ubz, ubw, *rawResult = (GLuint *) result; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); a[0] = CLAMP(a[0], -128.0F / 127.0F, 1.0F); a[1] = CLAMP(a[1], -128.0F / 127.0F, 1.0F); a[2] = CLAMP(a[2], -128.0F / 127.0F, 1.0F); @@ -1233,7 +1223,7 @@ _mesa_execute_program(GLcontext * ctx, { GLfloat a[4], result[4]; GLuint ubx, uby, ubz, ubw, *rawResult = (GLuint *) result; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); a[0] = CLAMP(a[0], 0.0F, 1.0F); a[1] = CLAMP(a[1], 0.0F, 1.0F); a[2] = CLAMP(a[2], 0.0F, 1.0F); @@ -1250,8 +1240,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_POW: { GLfloat a[4], b[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); - fetch_vector1(ctx, &inst->SrcReg[1], machine, b); + fetch_vector1(&inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[1], machine, b); result[0] = result[1] = result[2] = result[3] = (GLfloat) _mesa_pow(a[0], b[0]); store_vector4(inst, machine, result); @@ -1260,7 +1250,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_RCP: { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); if (DEBUG_PROG) { if (a[0] == 0) printf("RCP(0)\n"); @@ -1282,8 +1272,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_RFL: /* reflection vector */ { GLfloat axis[4], dir[4], result[4], tmpX, tmpW; - fetch_vector4(ctx, &inst->SrcReg[0], machine, axis); - fetch_vector4(ctx, &inst->SrcReg[1], machine, dir); + fetch_vector4(&inst->SrcReg[0], machine, axis); + fetch_vector4(&inst->SrcReg[1], machine, dir); tmpW = DOT3(axis, axis); tmpX = (2.0F * DOT3(axis, dir)) / tmpW; result[0] = tmpX * axis[0] - dir[0]; @@ -1296,7 +1286,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_RSQ: /* 1 / sqrt() */ { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); a[0] = FABSF(a[0]); result[0] = result[1] = result[2] = result[3] = INV_SQRTF(a[0]); store_vector4(inst, machine, result); @@ -1308,7 +1298,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SCS: /* sine and cos */ { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = (GLfloat) _mesa_cos(a[0]); result[1] = (GLfloat) _mesa_sin(a[0]); result[2] = 0.0; /* undefined! */ @@ -1319,8 +1309,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SEQ: /* set on equal */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = (a[0] == b[0]) ? 1.0F : 0.0F; result[1] = (a[1] == b[1]) ? 1.0F : 0.0F; result[2] = (a[2] == b[2]) ? 1.0F : 0.0F; @@ -1337,8 +1327,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SGE: /* set on greater or equal */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = (a[0] >= b[0]) ? 1.0F : 0.0F; result[1] = (a[1] >= b[1]) ? 1.0F : 0.0F; result[2] = (a[2] >= b[2]) ? 1.0F : 0.0F; @@ -1349,8 +1339,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SGT: /* set on greater */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = (a[0] > b[0]) ? 1.0F : 0.0F; result[1] = (a[1] > b[1]) ? 1.0F : 0.0F; result[2] = (a[2] > b[2]) ? 1.0F : 0.0F; @@ -1365,7 +1355,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SIN: { GLfloat a[4], result[4]; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = result[1] = result[2] = result[3] = (GLfloat) _mesa_sin(a[0]); store_vector4(inst, machine, result); @@ -1374,8 +1364,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SLE: /* set on less or equal */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = (a[0] <= b[0]) ? 1.0F : 0.0F; result[1] = (a[1] <= b[1]) ? 1.0F : 0.0F; result[2] = (a[2] <= b[2]) ? 1.0F : 0.0F; @@ -1386,8 +1376,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SLT: /* set on less */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = (a[0] < b[0]) ? 1.0F : 0.0F; result[1] = (a[1] < b[1]) ? 1.0F : 0.0F; result[2] = (a[2] < b[2]) ? 1.0F : 0.0F; @@ -1398,8 +1388,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SNE: /* set on not equal */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = (a[0] != b[0]) ? 1.0F : 0.0F; result[1] = (a[1] != b[1]) ? 1.0F : 0.0F; result[2] = (a[2] != b[2]) ? 1.0F : 0.0F; @@ -1416,8 +1406,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SUB: { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = a[0] - b[0]; result[1] = a[1] - b[1]; result[2] = a[2] - b[2]; @@ -1433,7 +1423,7 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_SWZ: /* extended swizzle */ { const struct prog_src_register *source = &inst->SrcReg[0]; - const GLfloat *src = get_register_pointer(ctx, source, machine); + const GLfloat *src = get_register_pointer(source, machine); GLfloat result[4]; GLuint i; for (i = 0; i < 4; i++) { @@ -1472,7 +1462,7 @@ _mesa_execute_program(GLcontext * ctx, else #endif lambda = 0.0; - fetch_vector4(ctx, &inst->SrcReg[0], machine, coord); + fetch_vector4(&inst->SrcReg[0], machine, coord); machine->FetchTexelLod(ctx, coord, lambda, inst->TexSrcUnit, color); if (DEBUG_PROG) { @@ -1498,7 +1488,7 @@ _mesa_execute_program(GLcontext * ctx, else #endif lambda = 0.0; - fetch_vector4(ctx, &inst->SrcReg[0], machine, coord); + fetch_vector4(&inst->SrcReg[0], machine, coord); /* coord[3] is the bias to add to lambda */ bias = texUnit->LodBias + coord[3]; if (texUnit->_Current) @@ -1512,9 +1502,9 @@ _mesa_execute_program(GLcontext * ctx, /* Texture lookup w/ partial derivatives for LOD */ { GLfloat texcoord[4], dtdx[4], dtdy[4], color[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, texcoord); - fetch_vector4(ctx, &inst->SrcReg[1], machine, dtdx); - fetch_vector4(ctx, &inst->SrcReg[2], machine, dtdy); + fetch_vector4(&inst->SrcReg[0], machine, texcoord); + fetch_vector4(&inst->SrcReg[1], machine, dtdx); + fetch_vector4(&inst->SrcReg[2], machine, dtdy); machine->FetchTexelDeriv(ctx, texcoord, dtdx, dtdy, inst->TexSrcUnit, color); store_vector4(inst, machine, color); @@ -1531,7 +1521,7 @@ _mesa_execute_program(GLcontext * ctx, else #endif lambda = 0.0; - fetch_vector4(ctx, &inst->SrcReg[0], machine, texcoord); + fetch_vector4(&inst->SrcReg[0], machine, texcoord); /* Not so sure about this test - if texcoord[3] is * zero, we'd probably be fine except for an ASSERT in * IROUND_POS() which gets triggered by the inf values created. @@ -1557,7 +1547,7 @@ _mesa_execute_program(GLcontext * ctx, else #endif lambda = 0.0; - fetch_vector4(ctx, &inst->SrcReg[0], machine, texcoord); + fetch_vector4(&inst->SrcReg[0], machine, texcoord); if (inst->TexSrcTarget != TEXTURE_CUBE_INDEX && texcoord[3] != 0.0) { texcoord[0] /= texcoord[3]; @@ -1574,7 +1564,7 @@ _mesa_execute_program(GLcontext * ctx, GLfloat a[4], result[4]; const GLuint *rawBits = (const GLuint *) a; GLhalfNV hx, hy; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); hx = rawBits[0] & 0xffff; hy = rawBits[0] >> 16; result[0] = result[2] = _mesa_half_to_float(hx); @@ -1587,7 +1577,7 @@ _mesa_execute_program(GLcontext * ctx, GLfloat a[4], result[4]; const GLuint *rawBits = (const GLuint *) a; GLushort usx, usy; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); usx = rawBits[0] & 0xffff; usy = rawBits[0] >> 16; result[0] = result[2] = usx * (1.0f / 65535.0f); @@ -1599,7 +1589,7 @@ _mesa_execute_program(GLcontext * ctx, { GLfloat a[4], result[4]; const GLuint *rawBits = (const GLuint *) a; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = (((rawBits[0] >> 0) & 0xff) - 128) / 127.0F; result[1] = (((rawBits[0] >> 8) & 0xff) - 128) / 127.0F; result[2] = (((rawBits[0] >> 16) & 0xff) - 128) / 127.0F; @@ -1611,7 +1601,7 @@ _mesa_execute_program(GLcontext * ctx, { GLfloat a[4], result[4]; const GLuint *rawBits = (const GLuint *) a; - fetch_vector1(ctx, &inst->SrcReg[0], machine, a); + fetch_vector1(&inst->SrcReg[0], machine, a); result[0] = ((rawBits[0] >> 0) & 0xff) / 255.0F; result[1] = ((rawBits[0] >> 8) & 0xff) / 255.0F; result[2] = ((rawBits[0] >> 16) & 0xff) / 255.0F; @@ -1622,8 +1612,8 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_XPD: /* cross product */ { GLfloat a[4], b[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); result[0] = a[1] * b[2] - a[2] * b[1]; result[1] = a[2] * b[0] - a[0] * b[2]; result[2] = a[0] * b[1] - a[1] * b[0]; @@ -1634,9 +1624,9 @@ _mesa_execute_program(GLcontext * ctx, case OPCODE_X2D: /* 2-D matrix transform */ { GLfloat a[4], b[4], c[4], result[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); - fetch_vector4(ctx, &inst->SrcReg[1], machine, b); - fetch_vector4(ctx, &inst->SrcReg[2], machine, c); + fetch_vector4(&inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[1], machine, b); + fetch_vector4(&inst->SrcReg[2], machine, c); result[0] = a[0] + b[0] * c[0] + b[1] * c[1]; result[1] = a[1] + b[0] * c[2] + b[1] * c[3]; result[2] = a[2] + b[0] * c[0] + b[1] * c[1]; @@ -1648,7 +1638,7 @@ _mesa_execute_program(GLcontext * ctx, { if (inst->SrcReg[0].File != -1) { GLfloat a[4]; - fetch_vector4(ctx, &inst->SrcReg[0], machine, a); + fetch_vector4(&inst->SrcReg[0], machine, a); _mesa_printf("%s%g, %g, %g, %g\n", (const char *) inst->Data, a[0], a[1], a[2], a[3]); } @@ -1666,11 +1656,10 @@ _mesa_execute_program(GLcontext * ctx, } - total++; - if (total > MAX_EXEC) { + numExec++; + if (numExec > maxExec) { _mesa_problem(ctx, "Infinite loop detected in fragment program"); return GL_TRUE; - abort(); } } /* for pc */ diff --git a/src/mesa/shader/prog_execute.h b/src/mesa/shader/prog_execute.h index 1eb9e73d01a..47845e9111f 100644 --- a/src/mesa/shader/prog_execute.h +++ b/src/mesa/shader/prog_execute.h @@ -55,9 +55,9 @@ struct gl_program_machine GLfloat Temporaries[MAX_PROGRAM_TEMPS][4]; GLfloat Outputs[MAX_PROGRAM_OUTPUTS][4]; + GLfloat (*EnvParams)[4]; /**< Vertex or Fragment env parameters */ GLuint CondCodes[4]; /**< COND_* value for x/y/z/w */ - - GLint AddressReg[MAX_VERTEX_PROGRAM_ADDRESS_REGS][4]; + GLint AddressReg[MAX_PROGRAM_ADDRESS_REGS][4]; GLuint CallStack[MAX_PROGRAM_CALL_DEPTH]; /**< For CAL/RET instructions */ GLuint StackDepth; /**< Index/ptr to top of CallStack[] */ @@ -74,8 +74,8 @@ _mesa_get_program_register(GLcontext *ctx, enum register_file file, extern GLboolean _mesa_execute_program(GLcontext *ctx, - const struct gl_program *program, GLuint maxInst, - struct gl_program_machine *machine, GLuint element); + const struct gl_program *program, + struct gl_program_machine *machine); #endif /* PROG_EXECUTE_H */ |