const GLboolean clamp = inst->Saturate;
const GLboolean updateCC = inst->UpdateCondRegister;
GLfloat *dstReg;
+ GLfloat dummyReg[4];
GLfloat clampedValue[4];
const GLboolean *writeMask = dest->WriteMask;
GLboolean condWriteMask[4];
case PROGRAM_TEMPORARY:
dstReg = machine->Temporaries[dest->Index];
break;
+ case PROGRAM_WRITE_ONLY:
+ dstReg = dummyReg;
+ return;
default:
_mesa_problem(NULL, "bad register file in store_vector4(fp)");
return;
/* copy existing machine */
_mesa_memcpy(dMachine, machine, sizeof(struct fp_machine));
- /* Clear temporary registers */
- _mesa_bzero( (void*) machine->Temporaries,
- MAX_NV_FRAGMENT_PROGRAM_TEMPS * 4 * sizeof(GLfloat));
+ if (program->Base.Target == GL_FRAGMENT_PROGRAM_NV) {
+ /* Clear temporary registers (undefined for ARB_f_p) */
+ _mesa_bzero( (void*) machine->Temporaries,
+ MAX_NV_FRAGMENT_PROGRAM_TEMPS * 4 * sizeof(GLfloat));
+ }
/* Add derivatives */
if (program->InputsRead & (1 << FRAG_ATTRIB_WPOS)) {
result[0] = result[1] = result[2] = result[3] =
a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
store_vector4( inst, machine, result );
+#if DEBUG_FRAG
+ printf("DP4 %g = (%g, %g %g %g) . (%g, %g %g %g)\n",
+ result[0], a[0], a[1], a[2], a[3], b[0], b[1], b[2], b[3]);
+#endif
}
break;
case FP_OPCODE_DPH:
result[2] = MAX2(a[2], b[2]);
result[3] = MAX2(a[3], b[3]);
store_vector4( inst, machine, result );
+#if DEBUG_FRAG
+ printf("MAX (%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]);
+#endif
}
break;
case FP_OPCODE_MIN:
GLfloat result[4];
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, result );
store_vector4( inst, machine, result );
+#if DEBUG_FRAG
+ printf("MOV (%g %g %g %g)\n",
+ result[0], result[1], result[2], result[3]);
+#endif
}
break;
case FP_OPCODE_MUL:
if (ctx->FragmentProgram.CallbackEnabled)
inputsRead = ~0;
- /* Clear temporary registers */
- _mesa_bzero(machine->Temporaries,
- MAX_NV_FRAGMENT_PROGRAM_TEMPS * 4 * sizeof(GLfloat));
+ if (program->Base.Target == GL_FRAGMENT_PROGRAM_NV) {
+ /* Clear temporary registers (undefined for ARB_f_p) */
+ _mesa_bzero(machine->Temporaries,
+ MAX_NV_FRAGMENT_PROGRAM_TEMPS * 4 * sizeof(GLfloat));
+ }
/* Load input registers */
if (inputsRead & (1 << FRAG_ATTRIB_WPOS)) {