227
228
* source register.
229
230
static INLINE const GLfloat *
230
get_register_pointer( const struct prog_src_register *source,
231
const struct gl_vertex_program_state *state )
231
get_register_pointer( GLcontext *ctx,
232
const struct prog_src_register *source,
233
struct vp_machine *machine,
234
const struct gl_vertex_program *program )
233
236
if (source->RelAddr) {
234
const GLint reg = source->Index + state->AddressReg[0];
237
const GLint reg = source->Index + machine->AddressReg[0];
235
238
ASSERT( (source->File == PROGRAM_ENV_PARAM) ||
236
239
(source->File == PROGRAM_STATE_VAR) );
237
240
if (reg < 0 || reg > MAX_NV_VERTEX_PROGRAM_PARAMS)
239
242
else if (source->File == PROGRAM_ENV_PARAM)
240
return state->Parameters[reg];
242
return state->Current->Base.Parameters->ParameterValues[reg];
243
return ctx->VertexProgram.Parameters[reg];
245
ASSERT(source->File == PROGRAM_LOCAL_PARAM);
246
return program->Base.Parameters->ParameterValues[reg];
245
250
switch (source->File) {
246
251
case PROGRAM_TEMPORARY:
247
252
ASSERT(source->Index < MAX_NV_VERTEX_PROGRAM_TEMPS);
248
return state->Temporaries[source->Index];
253
return machine->Temporaries[source->Index];
249
254
case PROGRAM_INPUT:
250
255
ASSERT(source->Index < MAX_NV_VERTEX_PROGRAM_INPUTS);
251
return state->Inputs[source->Index];
256
return machine->Inputs[source->Index];
252
257
case PROGRAM_OUTPUT:
253
258
/* This is only needed for the PRINT instruction */
254
259
ASSERT(source->Index < MAX_NV_VERTEX_PROGRAM_OUTPUTS);
255
return state->Outputs[source->Index];
260
return machine->Outputs[source->Index];
256
261
case PROGRAM_LOCAL_PARAM:
257
262
ASSERT(source->Index < MAX_PROGRAM_LOCAL_PARAMS);
258
return state->Current->Base.LocalParams[source->Index];
263
return program->Base.LocalParams[source->Index];
259
264
case PROGRAM_ENV_PARAM:
260
265
ASSERT(source->Index < MAX_NV_VERTEX_PROGRAM_PARAMS);
261
return state->Parameters[source->Index];
266
return ctx->VertexProgram.Parameters[source->Index];
262
267
case PROGRAM_STATE_VAR:
263
ASSERT(source->Index < state->Current->Base.Parameters->NumParameters);
264
return state->Current->Base.Parameters->ParameterValues[source->Index];
268
ASSERT(source->Index < program->Base.Parameters->NumParameters);
269
return program->Base.Parameters->ParameterValues[source->Index];
266
271
_mesa_problem(NULL,
267
272
"Bad source register file in get_register_pointer");
512
520
SET_NEG_INFINITY(q[2]);
515
store_vector4( &inst->DstReg, state, q );
523
store_vector4( inst, machine, q );
520
528
GLfloat t[4], u[4], prod[4];
521
fetch_vector4( &inst->SrcReg[0], state, t );
522
fetch_vector4( &inst->SrcReg[1], state, u );
529
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
530
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
523
531
prod[0] = t[0] * u[0];
524
532
prod[1] = t[1] * u[1];
525
533
prod[2] = t[2] * u[2];
526
534
prod[3] = t[3] * u[3];
527
store_vector4( &inst->DstReg, state, prod );
535
store_vector4( inst, machine, prod );
532
540
GLfloat t[4], u[4], sum[4];
533
fetch_vector4( &inst->SrcReg[0], state, t );
534
fetch_vector4( &inst->SrcReg[1], state, u );
541
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
542
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
535
543
sum[0] = t[0] + u[0];
536
544
sum[1] = t[1] + u[1];
537
545
sum[2] = t[2] + u[2];
538
546
sum[3] = t[3] + u[3];
539
store_vector4( &inst->DstReg, state, sum );
547
store_vector4( inst, machine, sum );
544
552
GLfloat t[4], u[4], dot[4];
545
fetch_vector4( &inst->SrcReg[0], state, t );
546
fetch_vector4( &inst->SrcReg[1], state, u );
553
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
554
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
547
555
dot[0] = t[0] * u[0] + t[1] * u[1] + t[2] * u[2];
548
556
dot[1] = dot[2] = dot[3] = dot[0];
549
store_vector4( &inst->DstReg, state, dot );
557
store_vector4( inst, machine, dot );
554
562
GLfloat t[4], u[4], dot[4];
555
fetch_vector4( &inst->SrcReg[0], state, t );
556
fetch_vector4( &inst->SrcReg[1], state, u );
563
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
564
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
557
565
dot[0] = t[0] * u[0] + t[1] * u[1] + t[2] * u[2] + t[3] * u[3];
558
566
dot[1] = dot[2] = dot[3] = dot[0];
559
store_vector4( &inst->DstReg, state, dot );
567
store_vector4( inst, machine, dot );
564
572
GLfloat t[4], u[4], dst[4];
565
fetch_vector4( &inst->SrcReg[0], state, t );
566
fetch_vector4( &inst->SrcReg[1], state, u );
573
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
574
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
568
576
dst[1] = t[1] * u[1];
571
store_vector4( &inst->DstReg, state, dst );
579
store_vector4( inst, machine, dst );
576
584
GLfloat t[4], u[4], min[4];
577
fetch_vector4( &inst->SrcReg[0], state, t );
578
fetch_vector4( &inst->SrcReg[1], state, u );
585
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
586
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
579
587
min[0] = (t[0] < u[0]) ? t[0] : u[0];
580
588
min[1] = (t[1] < u[1]) ? t[1] : u[1];
581
589
min[2] = (t[2] < u[2]) ? t[2] : u[2];
582
590
min[3] = (t[3] < u[3]) ? t[3] : u[3];
583
store_vector4( &inst->DstReg, state, min );
591
store_vector4( inst, machine, min );
588
596
GLfloat t[4], u[4], max[4];
589
fetch_vector4( &inst->SrcReg[0], state, t );
590
fetch_vector4( &inst->SrcReg[1], state, u );
597
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
598
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
591
599
max[0] = (t[0] > u[0]) ? t[0] : u[0];
592
600
max[1] = (t[1] > u[1]) ? t[1] : u[1];
593
601
max[2] = (t[2] > u[2]) ? t[2] : u[2];
594
602
max[3] = (t[3] > u[3]) ? t[3] : u[3];
595
store_vector4( &inst->DstReg, state, max );
603
store_vector4( inst, machine, max );
600
608
GLfloat t[4], u[4], slt[4];
601
fetch_vector4( &inst->SrcReg[0], state, t );
602
fetch_vector4( &inst->SrcReg[1], state, u );
609
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
610
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
603
611
slt[0] = (t[0] < u[0]) ? 1.0F : 0.0F;
604
612
slt[1] = (t[1] < u[1]) ? 1.0F : 0.0F;
605
613
slt[2] = (t[2] < u[2]) ? 1.0F : 0.0F;
606
614
slt[3] = (t[3] < u[3]) ? 1.0F : 0.0F;
607
store_vector4( &inst->DstReg, state, slt );
615
store_vector4( inst, machine, slt );
612
620
GLfloat t[4], u[4], sge[4];
613
fetch_vector4( &inst->SrcReg[0], state, t );
614
fetch_vector4( &inst->SrcReg[1], state, u );
621
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
622
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
615
623
sge[0] = (t[0] >= u[0]) ? 1.0F : 0.0F;
616
624
sge[1] = (t[1] >= u[1]) ? 1.0F : 0.0F;
617
625
sge[2] = (t[2] >= u[2]) ? 1.0F : 0.0F;
618
626
sge[3] = (t[3] >= u[3]) ? 1.0F : 0.0F;
619
store_vector4( &inst->DstReg, state, sge );
627
store_vector4( inst, machine, sge );
624
632
GLfloat t[4], u[4], v[4], sum[4];
625
fetch_vector4( &inst->SrcReg[0], state, t );
626
fetch_vector4( &inst->SrcReg[1], state, u );
627
fetch_vector4( &inst->SrcReg[2], state, v );
633
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
634
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
635
fetch_vector4( ctx, &inst->SrcReg[2], machine, program, v );
628
636
sum[0] = t[0] * u[0] + v[0];
629
637
sum[1] = t[1] * u[1] + v[1];
630
638
sum[2] = t[2] * u[2] + v[2];
631
639
sum[3] = t[3] * u[3] + v[3];
632
store_vector4( &inst->DstReg, state, sum );
640
store_vector4( inst, machine, sum );
638
fetch_vector4( &inst->SrcReg[0], state, t );
639
state->AddressReg[0] = (GLint) FLOORF(t[0]);
646
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
647
machine->AddressReg[0] = (GLint) FLOORF(t[0]);
644
652
GLfloat t[4], u[4], dot[4];
645
fetch_vector4( &inst->SrcReg[0], state, t );
646
fetch_vector4( &inst->SrcReg[1], state, u );
653
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
654
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
647
655
dot[0] = t[0] * u[0] + t[1] * u[1] + t[2] * u[2] + u[3];
648
656
dot[1] = dot[2] = dot[3] = dot[0];
649
store_vector4( &inst->DstReg, state, dot );
657
store_vector4( inst, machine, dot );
655
fetch_vector1( &inst->SrcReg[0], state, t );
663
fetch_vector1( ctx, &inst->SrcReg[0], machine, program, t );
656
664
if (t[0] == 1.0F)
676
684
t[0] = t[1] = t[2] = t[3] = u;
677
store_vector4( &inst->DstReg, state, t );
685
store_vector4( inst, machine, t );
680
688
case OPCODE_SUB: /* GL_NV_vertex_program1_1 */
682
690
GLfloat t[4], u[4], sum[4];
683
fetch_vector4( &inst->SrcReg[0], state, t );
684
fetch_vector4( &inst->SrcReg[1], state, u );
691
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
692
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
685
693
sum[0] = t[0] - u[0];
686
694
sum[1] = t[1] - u[1];
687
695
sum[2] = t[2] - u[2];
688
696
sum[3] = t[3] - u[3];
689
store_vector4( &inst->DstReg, state, sum );
697
store_vector4( inst, machine, sum );
692
700
case OPCODE_ABS: /* GL_NV_vertex_program1_1 */
695
fetch_vector4( &inst->SrcReg[0], state, t );
703
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
696
704
if (t[0] < 0.0) t[0] = -t[0];
697
705
if (t[1] < 0.0) t[1] = -t[1];
698
706
if (t[2] < 0.0) t[2] = -t[2];
699
707
if (t[3] < 0.0) t[3] = -t[3];
700
store_vector4( &inst->DstReg, state, t );
708
store_vector4( inst, machine, t );
703
711
case OPCODE_FLR: /* GL_ARB_vertex_program */
706
fetch_vector4( &inst->SrcReg[0], state, t );
714
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
707
715
t[0] = FLOORF(t[0]);
708
716
t[1] = FLOORF(t[1]);
709
717
t[2] = FLOORF(t[2]);
710
718
t[3] = FLOORF(t[3]);
711
store_vector4( &inst->DstReg, state, t );
719
store_vector4( inst, machine, t );
714
722
case OPCODE_FRC: /* GL_ARB_vertex_program */
717
fetch_vector4( &inst->SrcReg[0], state, t );
725
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
718
726
t[0] = t[0] - FLOORF(t[0]);
719
727
t[1] = t[1] - FLOORF(t[1]);
720
728
t[2] = t[2] - FLOORF(t[2]);
721
729
t[3] = t[3] - FLOORF(t[3]);
722
store_vector4( &inst->DstReg, state, t );
730
store_vector4( inst, machine, t );
725
733
case OPCODE_EX2: /* GL_ARB_vertex_program */
728
fetch_vector1( &inst->SrcReg[0], state, t );
736
fetch_vector1( ctx, &inst->SrcReg[0], machine, program, t );
729
737
t[0] = t[1] = t[2] = t[3] = (GLfloat)_mesa_pow(2.0, t[0]);
730
store_vector4( &inst->DstReg, state, t );
738
store_vector4( inst, machine, t );
733
741
case OPCODE_LG2: /* GL_ARB_vertex_program */
736
fetch_vector1( &inst->SrcReg[0], state, t );
744
fetch_vector1( ctx, &inst->SrcReg[0], machine, program, t );
737
745
t[0] = t[1] = t[2] = t[3] = LOG2(t[0]);
738
store_vector4( &inst->DstReg, state, t );
746
store_vector4( inst, machine, t );
741
749
case OPCODE_POW: /* GL_ARB_vertex_program */
743
751
GLfloat t[4], u[4];
744
fetch_vector1( &inst->SrcReg[0], state, t );
745
fetch_vector1( &inst->SrcReg[1], state, u );
752
fetch_vector1( ctx, &inst->SrcReg[0], machine, program, t );
753
fetch_vector1( ctx, &inst->SrcReg[1], machine, program, u );
746
754
t[0] = t[1] = t[2] = t[3] = (GLfloat)_mesa_pow(t[0], u[0]);
747
store_vector4( &inst->DstReg, state, t );
755
store_vector4( inst, machine, t );
750
758
case OPCODE_XPD: /* GL_ARB_vertex_program */
752
760
GLfloat t[4], u[4], cross[4];
753
fetch_vector4( &inst->SrcReg[0], state, t );
754
fetch_vector4( &inst->SrcReg[1], state, u );
761
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
762
fetch_vector4( ctx, &inst->SrcReg[1], machine, program, u );
755
763
cross[0] = t[1] * u[2] - t[2] * u[1];
756
764
cross[1] = t[2] * u[0] - t[0] * u[2];
757
765
cross[2] = t[0] * u[1] - t[1] * u[0];
758
store_vector4( &inst->DstReg, state, cross );
766
store_vector4( inst, machine, cross );
761
769
case OPCODE_SWZ: /* GL_ARB_vertex_program */
763
771
const struct prog_src_register *source = &inst->SrcReg[0];
764
const GLfloat *src = get_register_pointer(source, state);
772
const GLfloat *src = get_register_pointer(ctx, source,
765
774
GLfloat result[4];
768
777
/* do extended swizzling here */
769
778
for (i = 0; i < 4; i++) {
770
if (GET_SWZ(source->Swizzle, i) == SWIZZLE_ZERO)
779
const GLuint swz = GET_SWZ(source->Swizzle, i);
780
if (swz == SWIZZLE_ZERO)
772
else if (GET_SWZ(source->Swizzle, i) == SWIZZLE_ONE)
782
else if (swz == SWIZZLE_ONE)
775
result[i] = src[GET_SWZ(source->Swizzle, i)];
787
result[i] = src[swz];
776
789
if (source->NegateBase & (1 << i))
777
790
result[i] = -result[i];
779
store_vector4( &inst->DstReg, state, result );
792
store_vector4( inst, machine, result );
782
795
case OPCODE_PRINT:
783
796
if (inst->SrcReg[0].File) {
785
fetch_vector4( &inst->SrcReg[0], state, t );
798
fetch_vector4( ctx, &inst->SrcReg[0], machine, program, t );
786
799
_mesa_printf("%s%g, %g, %g, %g\n",
787
800
(char *) inst->Data, t[0], t[1], t[2], t[3]);