While I was debugging a new vertex buffer template for Mach64 I've
discovered that this piece of code doesn't work:

  INTERP_F( t, (*dst++).f, (*out++).f * qout, (*in++).f * qin );
  INTERP_F( t, (*dst++).f, (*out++).f * qout, (*in++).f * qin );

The problem is that INTERP_F is defined in src/mmath.h as:

  #define INTERP_F( t, dstf, outf, inf ) \
    dstf = LINTERP( t, outf, inf )

while in turn LINTERP is defined as 

  #define LINTERP(T, OUT, IN) \
    ((OUT) + (T) * ((IN) - (OUT)))

so the OUT argument is being used twice and the pointer incremented
twice as well.

I think this is a bug in Mesa. First because a macro should generally behave as an
ordinary function, unless there is a very special reason not to do so.
Second because this relies on compiler optimization to remove the
redundancy of calculating OUT twice. Although I haven't check what is
the exact assembler output of gcc, the call of INTERP_F with calculations in
its arguments is used on the default vertex template, hence used across
all drivers. See src/tnl_dd/t_dd_vbtmp.h:669:

  INTERP_F( t, dst->v.u0, out->v.u0 * qout, in->v.u0 * qin );
  INTERP_F( t, dst->v.v0, out->v.v0 * qout, in->v.v0 * qin );


Since it isn't pratical to change LINTERP, INTERP_F should be
redefined to

  #define INTERP_F( t, dstf, outf, inf ) \
  do { \
    GLfloat temp = outf; \
    dstf = LINTERP( t, temp, inf ); \
  } while (0)

and LINTERP shouldn't be used outside mmath.h. Other macros which call
LINTERP should be checked too.

Jos� Fonseca


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Dri-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to