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