X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fprogram%2Fprog_execute.c;h=c50465dfc4989510feda669cf1877609d40ce4fe;hb=08c1444c9582f8654f9c688b79230ba2acbc2027;hp=aadf82116e59dc006d2bf1c0b1677bcc7ba6259e;hpb=0d047d10f196b72be938d004f2e0fc7e5c253702;p=mesa.git diff --git a/src/mesa/program/prog_execute.c b/src/mesa/program/prog_execute.c index aadf82116e5..c50465dfc49 100644 --- a/src/mesa/program/prog_execute.c +++ b/src/mesa/program/prog_execute.c @@ -36,8 +36,10 @@ #include "c99_math.h" +#include "main/errors.h" #include "main/glheader.h" #include "main/macros.h" +#include "main/mtypes.h" #include "prog_execute.h" #include "prog_instruction.h" #include "prog_parameter.h" @@ -117,11 +119,13 @@ get_src_register_pointer(const struct prog_src_register *source, /* Fallthrough */ case PROGRAM_CONSTANT: /* Fallthrough */ - case PROGRAM_UNIFORM: + case PROGRAM_UNIFORM: { if (reg >= (GLint) prog->Parameters->NumParameters) return ZeroVec; - return (GLfloat *) prog->Parameters->ParameterValues[reg]; + unsigned pvo = prog->Parameters->ParameterValueOffset[reg]; + return (GLfloat *) prog->Parameters->ParameterValues + pvo; + } case PROGRAM_SYSTEM_VALUE: assert(reg < (GLint) ARRAY_SIZE(machine->SystemValues)); return machine->SystemValues[reg]; @@ -222,8 +226,7 @@ fetch_vector4(const struct prog_src_register *source, * XXX this currently only works for fragment program input attribs. */ static void -fetch_vector4_deriv(struct gl_context * ctx, - const struct prog_src_register *source, +fetch_vector4_deriv(const struct prog_src_register *source, const struct gl_program_machine *machine, char xOrY, GLfloat result[4]) { @@ -374,7 +377,7 @@ _mesa_execute_program(struct gl_context * ctx, const struct gl_program *program, struct gl_program_machine *machine) { - const GLuint numInst = program->NumInstructions; + const GLuint numInst = program->arb.NumInstructions; const GLuint maxExec = 65536; GLuint pc, numExec = 0; @@ -392,7 +395,7 @@ _mesa_execute_program(struct gl_context * ctx, } for (pc = 0; pc < numInst; pc++) { - const struct prog_instruction *inst = program->Instructions + pc; + const struct prog_instruction *inst = program->arb.Instructions + pc; if (DEBUG_PROG) { _mesa_print_instruction(inst); @@ -439,12 +442,12 @@ _mesa_execute_program(struct gl_context * ctx, break; case OPCODE_BGNLOOP: /* no-op */ - assert(program->Instructions[inst->BranchTarget].Opcode + assert(program->arb.Instructions[inst->BranchTarget].Opcode == OPCODE_ENDLOOP); break; case OPCODE_ENDLOOP: /* subtract 1 here since pc is incremented by for(pc) loop */ - assert(program->Instructions[inst->BranchTarget].Opcode + assert(program->arb.Instructions[inst->BranchTarget].Opcode == OPCODE_BGNLOOP); pc = inst->BranchTarget - 1; /* go to matching BNGLOOP */ break; @@ -453,14 +456,14 @@ _mesa_execute_program(struct gl_context * ctx, case OPCODE_ENDSUB: /* end subroutine */ break; case OPCODE_BRK: /* break out of loop (conditional) */ - assert(program->Instructions[inst->BranchTarget].Opcode + assert(program->arb.Instructions[inst->BranchTarget].Opcode == OPCODE_ENDLOOP); /* break out of loop */ /* pc++ at end of for-loop will put us after the ENDLOOP inst */ pc = inst->BranchTarget; break; case OPCODE_CONT: /* continue loop (conditional) */ - assert(program->Instructions[inst->BranchTarget].Opcode + assert(program->arb.Instructions[inst->BranchTarget].Opcode == OPCODE_ENDLOOP); /* continue at ENDLOOP */ /* Subtract 1 here since we'll do pc++ at end of for-loop */ @@ -507,16 +510,14 @@ _mesa_execute_program(struct gl_context * ctx, case OPCODE_DDX: /* Partial derivative with respect to X */ { GLfloat result[4]; - fetch_vector4_deriv(ctx, &inst->SrcReg[0], machine, - 'X', result); + fetch_vector4_deriv(&inst->SrcReg[0], machine, 'X', result); store_vector4(inst, machine, result); } break; case OPCODE_DDY: /* Partial derivative with respect to Y */ { GLfloat result[4]; - fetch_vector4_deriv(ctx, &inst->SrcReg[0], machine, - 'Y', result); + fetch_vector4_deriv(&inst->SrcReg[0], machine, 'Y', result); store_vector4(inst, machine, result); } break; @@ -645,9 +646,9 @@ _mesa_execute_program(struct gl_context * ctx, case OPCODE_IF: { GLboolean cond; - assert(program->Instructions[inst->BranchTarget].Opcode + assert(program->arb.Instructions[inst->BranchTarget].Opcode == OPCODE_ELSE || - program->Instructions[inst->BranchTarget].Opcode + program->arb.Instructions[inst->BranchTarget].Opcode == OPCODE_ENDIF); /* eval condition */ GLfloat a[4]; @@ -669,7 +670,7 @@ _mesa_execute_program(struct gl_context * ctx, break; case OPCODE_ELSE: /* goto ENDIF */ - assert(program->Instructions[inst->BranchTarget].Opcode + assert(program->arb.Instructions[inst->BranchTarget].Opcode == OPCODE_ENDIF); assert(inst->BranchTarget >= 0); pc = inst->BranchTarget; @@ -967,24 +968,6 @@ _mesa_execute_program(struct gl_context * ctx, store_vector4(inst, machine, result); } break; - case OPCODE_SEQ: /* set on equal */ - { - GLfloat a[4], b[4], result[4]; - 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; - result[3] = (a[3] == b[3]) ? 1.0F : 0.0F; - store_vector4(inst, machine, result); - if (DEBUG_PROG) { - printf("SEQ (%g %g %g %g) = (%g %g %g %g) == (%g %g %g %g)\n", - result[0], result[1], result[2], result[3], - a[0], a[1], a[2], a[3], - b[0], b[1], b[2], b[3]); - } - } - break; case OPCODE_SGE: /* set on greater or equal */ { GLfloat a[4], b[4], result[4]; @@ -1003,24 +986,6 @@ _mesa_execute_program(struct gl_context * ctx, } } break; - case OPCODE_SGT: /* set on greater */ - { - GLfloat a[4], b[4], result[4]; - 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; - result[3] = (a[3] > b[3]) ? 1.0F : 0.0F; - store_vector4(inst, machine, result); - if (DEBUG_PROG) { - printf("SGT (%g %g %g %g) = (%g %g %g %g) > (%g %g %g %g)\n", - result[0], result[1], result[2], result[3], - a[0], a[1], a[2], a[3], - b[0], b[1], b[2], b[3]); - } - } - break; case OPCODE_SIN: { GLfloat a[4], result[4]; @@ -1030,24 +995,6 @@ _mesa_execute_program(struct gl_context * ctx, store_vector4(inst, machine, result); } break; - case OPCODE_SLE: /* set on less or equal */ - { - GLfloat a[4], b[4], result[4]; - 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; - result[3] = (a[3] <= b[3]) ? 1.0F : 0.0F; - store_vector4(inst, machine, result); - if (DEBUG_PROG) { - printf("SLE (%g %g %g %g) = (%g %g %g %g) <= (%g %g %g %g)\n", - result[0], result[1], result[2], result[3], - a[0], a[1], a[2], a[3], - b[0], b[1], b[2], b[3]); - } - } - break; case OPCODE_SLT: /* set on less */ { GLfloat a[4], b[4], result[4]; @@ -1066,24 +1013,6 @@ _mesa_execute_program(struct gl_context * ctx, } } break; - case OPCODE_SNE: /* set on not equal */ - { - GLfloat a[4], b[4], result[4]; - 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; - result[3] = (a[3] != b[3]) ? 1.0F : 0.0F; - store_vector4(inst, machine, result); - if (DEBUG_PROG) { - printf("SNE (%g %g %g %g) = (%g %g %g %g) != (%g %g %g %g)\n", - result[0], result[1], result[2], result[3], - a[0], a[1], a[2], a[3], - b[0], b[1], b[2], b[3]); - } - } - break; case OPCODE_SSG: /* set sign (-1, 0 or +1) */ { GLfloat a[4], result[4];