Kevin Day wrote:
> 
> > >
> > > To follow up, this still happens in 3.2 beta 1. What can I do to help track
> > > this down further?
> >
> >
> > To disable that one function and use the default C implementation instead,
> > I think this would work:
> >
> > Modify Mesa/src/X86/x86.c in the gl_init_x86_asm_transforms() function:
> >
> >
> > void gl_init_x86_asm_transforms( void )
> > {
> > #ifdef USE_X86_ASM
> >    void *save = gl_transform_tab[0][3][MATRIX_3D_NO_ROT];  /* save C function */
> <snip>
> >
> >    gl_transform_tab[0][3][MATRIX_3D_NO_ROT] = save;  /* restore C function */
> > ...
> > ...
> >
> > It'll generate a warning, but it should work.
> 
> Did that, here's what I get now:
> 
> Starting program: /tmp/mesa/junk
> 
> Program received signal SIGFPE, Arithmetic exception.
> transform_points3_3d_no_rot_raw (to_vec=0x80b4000, mat=0x80b5000, from_vec=0x80b500c,
>     mask=0x18 <Error reading address 0x18: Bad address>, flag=4) at xform_tmp.h:680
> 680              to[i][0] = m0 * ox                      + m12       ;
> (gdb) bt
> #0  transform_points3_3d_no_rot_raw (to_vec=0x80b4000, mat=0x80b5000, 
>from_vec=0x80b500c,
>     mask=0x18 <Error reading address 0x18: Bad address>, flag=4) at xform_tmp.h:680
> #1  0x2 in ?? ()
> #2  0x80b2030 in ?? ()
> (gdb) info float
> u: status 0x90a8: exceptions: OVERF LOS; flags: 0000; top 2
> e: status 0x1000: flags: 0000; top 2
> control 0x1260: compute to 53 bits; round NEAREST; mask: LOS;
> last instruction: opcode 0x158; pc 0x1f:0x2814e16e; operand 0x2f:0x80b2068
>  regno     tag  msb              lsb  value
> %st(5)    valid 4005f000000000000000  120
> %st(4)    valid 400dffff000000000000  32767.5
> %st(3)    valid 4006a000000000000000  160
> %st(2)    valid 4005f000000000000000  120
> %st(1)    valid 400dffff000000000000  32767.5
> %st(0) => valid 4085b074bb8a94000000  3.00224e+40
> %st(7)    empty 400dffff000000000000  32767.5
> %st(6)    empty 4005f000000000000000  120
> (gdb) list
> 675        (void) flag;
> 676        ASSERT(mat->type == MATRIX_3D_NO_ROT);
> 677        STRIDE_LOOP {
> 678           CLIP_CHECK {
> 679              const GLfloat ox = from[0], oy = from[1], oz = from[2];
> 680              to[i][0] = m0 * ox                      + m12       ;
> 681              to[i][1] =           m5 * oy            + m13       ;
> 682              to[i][2] =                     m10 * oz + m14       ;
> 683           }
> 684        }
> (gdb) print to[i][0]
> $1 = -0.199290305
> (gdb) print m0
> $2 = 4.18664068e-34
> (gdb) print ox
> No symbol "ox" in current context.
> (gdb) print m12
> $3 = -1.49981213
> 
> Is 'ox' a macro, or did it get optimized out?

Probably the later.  Try recompiling with -g.

The fact that you get the same error both with the C code and the ASM
code hints that the real problem is elsewhere/earlier.


> Attached is a program that will compile cleanly without any of our junk. It
> renders to a dummy osmesa buffer that doesn't get used. :) I'm playing on my
> home machine which is on FreeBSD 4.0, which has all the FP exceptions
> (except for division-by-zero) masked off by default, so I added the
> fpsetmask line to make sure they're on. Our development target is on 3.2,
> which has them all on.


I'll try to look at your code later.  I'm super busy with other things now.
If anyone else can investigate, that would be great.

-Brian


_______________________________________________
Mesa-bug maillist  -  [EMAIL PROTECTED]
http://lists.mesa3d.org/mailman/listinfo/mesa-bug


_______________________________________________
Mesa-dev maillist  -  [EMAIL PROTECTED]
http://lists.mesa3d.org/mailman/listinfo/mesa-dev

Reply via email to