-/* $XFree86$ */ /* -*- mode: c; c-basic-offset: 3 -*- */
+/* -*- mode: c; c-basic-offset: 3 -*- */
/*
* Mesa 3-D graphics library
* Version: 3.5
#endif
#endif
#if DO_SPEC
- GLubyte (*spec)[4];
+ GLfloat (*spec)[4];
GLuint spec_stride;
#endif
#if DO_FOG
GLuint fog_stride;
#endif
#if DO_RGBA
- GLubyte (*col)[4];
+ GLfloat (*col)[4];
GLuint col_stride;
#endif
GLfloat (*coord)[4];
#endif
#if DO_SPEC
- spec = (GLubyte (*)[4])VB->SecondaryColorPtr[0]->data;
- spec_stride = VB->SecondaryColorPtr[0]->stride;
+ if (VB->SecondaryColorPtr[0]) {
+ spec = VB->SecondaryColorPtr[0]->data;
+ spec_stride = VB->SecondaryColorPtr[0]->stride;
+ } else {
+ spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
+ spec_stride = 0;
+ }
#endif
#if DO_FOG
if (start) {
#if DO_TEX1
- tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + start * tc1_stride);
+ STRIDE_4F(tc1, start * tc1_stride);
#endif
#if DO_TEX0
- tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride);
+ STRIDE_4F(tc0, start * tc0_stride);
#endif
#if DO_SPEC
- STRIDE_4UB(spec, start * spec_stride);
+ STRIDE_4F(spec, start * spec_stride);
#endif
#if DO_FOG
- /* STRIDE_F(fog, start * fog_stride); */
- fog = (GLfloat (*)[4])((GLubyte *)fog + start * fog_stride);
+ STRIDE_4F(fog, start * fog_stride);
#endif
#if DO_RGBA
- STRIDE_4UB(col, start * col_stride);
+ STRIDE_4F(col, start * col_stride);
#endif
- coord = (GLfloat (*)[4])((GLubyte *)coord + start * coord_stride);
+ STRIDE_4F(coord, start * coord_stride);
}
for (i=start; i < end; i++, v = (VERTEX *)((GLubyte *)v + stride)) {
#if DO_PTEX
if (tc1_size == 4) {
#ifdef MACH64_PREMULT_TEXCOORDS
- LE32_OUT_FLOAT( p++, w*tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
- LE32_OUT_FLOAT( p++, w*tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
- LE32_OUT_FLOAT( p++, w*tc1[0][3] ); /* VERTEX_?_SECONDARY_W */
+ LE32_OUT_FLOAT( p++, w*tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
+ LE32_OUT_FLOAT( p++, w*tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
+ LE32_OUT_FLOAT( p++, w*tc1[0][3] ); /* VERTEX_?_SECONDARY_W */
#else /* !MACH64_PREMULT_TEXCOORDS */
float rhw = 1.0 / tc1[0][3];
- LE32_OUT_FLOAT( p++, rhw*tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
- LE32_OUT_FLOAT( p++, rhw*tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
- LE32_OUT_FLOAT( p++, w*tc1[0][3] ); /* VERTEX_?_SECONDARY_W */
+ LE32_OUT_FLOAT( p++, rhw*tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
+ LE32_OUT_FLOAT( p++, rhw*tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
+ LE32_OUT_FLOAT( p++, w*tc1[0][3] ); /* VERTEX_?_SECONDARY_W */
#endif /* !MACH64_PREMULT_TEXCOORDS */
} else {
#endif /* DO_PTEX */
#ifdef MACH64_PREMULT_TEXCOORDS
- LE32_OUT_FLOAT( p++, w*tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
- LE32_OUT_FLOAT( p++, w*tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
- LE32_OUT_FLOAT( p++, w ); /* VERTEX_?_SECONDARY_W */
+ LE32_OUT_FLOAT( p++, w*tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
+ LE32_OUT_FLOAT( p++, w*tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
+ LE32_OUT_FLOAT( p++, w ); /* VERTEX_?_SECONDARY_W */
#else /* !MACH64_PREMULT_TEXCOORDS */
- LE32_OUT_FLOAT( p++, tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
- LE32_OUT_FLOAT( p++, tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
- LE32_OUT_FLOAT( p++, w ); /* VERTEX_?_SECONDARY_W */
+ LE32_OUT_FLOAT( p++, tc1[0][0] ); /* VERTEX_?_SECONDARY_S */
+ LE32_OUT_FLOAT( p++, tc1[0][1] ); /* VERTEX_?_SECONDARY_T */
+ LE32_OUT_FLOAT( p++, w ); /* VERTEX_?_SECONDARY_W */
#endif /* !MACH64_PREMULT_TEXCOORDS */
#if DO_PTEX
}
#endif /* DO_PTEX */
- tc1 = (GLfloat (*)[4])((GLubyte *)tc1 + tc1_stride);
+ STRIDE_4F(tc1, tc1_stride);
#else /* !DO_TEX1 */
p += 3;
#endif /* !DO_TEX1 */
#if DO_PTEX
}
#endif /* DO_PTEX */
- tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride);
+ STRIDE_4F(tc0, tc0_stride);
#else /* !DO_TEX0 */
p += 3;
#endif /* !DO_TEX0 */
#if DO_SPEC
- ((GLubyte *)p)[0] = spec[0][2]; /* VERTEX_?_SPEC_B */
- ((GLubyte *)p)[1] = spec[0][1]; /* VERTEX_?_SPEC_G */
- ((GLubyte *)p)[2] = spec[0][0]; /* VERTEX_?_SPEC_R */
- STRIDE_4UB(spec, spec_stride);
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[0], spec[0][2]); /* VERTEX_?_SPEC_B */
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[1], spec[0][1]); /* VERTEX_?_SPEC_G */
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[2], spec[0][0]); /* VERTEX_?_SPEC_R */
+
+ STRIDE_4F(spec, spec_stride);
#endif
#if DO_FOG
- ((GLubyte *)p)[3] = fog[0][0] * 255.0; /* VERTEX_?_SPEC_A */
- fog = (GLfloat (*)[4])((GLubyte *)fog + fog_stride);
- /* STRIDE_F(fog, fog_stride); */
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[3], fog[0][0]); /* VERTEX_?_SPEC_A */
+ /* ((GLubyte *)p)[3] = fog[0][0] * 255.0; */
+ STRIDE_4F(fog, fog_stride);
#endif
p++;
#if DO_XYZW
if (mask[i] == 0) {
/* unclipped */
- LE32_OUT( p++, VIEWPORT_Z( coord[0][2] ) ); /* VERTEX_?_Z */
+ LE32_OUT( p++, VIEWPORT_Z( coord[0][2] ) ); /* VERTEX_?_Z */
} else {
#endif
p++;
#endif
#if DO_RGBA
- *((GLubyte *)p)++ = col[0][2]; /* VERTEX_?_B */
- *((GLubyte *)p)++ = col[0][1]; /* VERTEX_?_G */
- *((GLubyte *)p)++ = col[0][0]; /* VERTEX_?_R */
- *((GLubyte *)p)++ = col[0][3]; /* VERTEX_?_A */
- STRIDE_4UB(col, col_stride);
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[0], col[0][2]);
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[1], col[0][1]);
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[2], col[0][0]);
+ UNCLAMPED_FLOAT_TO_UBYTE(((GLubyte *)p)[3], col[0][3]);
+ p++;
+ STRIDE_4F(col, col_stride);
#else
p++;
#endif
(VIEWPORT_Y( coord[0][1] ) & 0xffff) ); /* VERTEX_?_Y */
if (MACH64_DEBUG & DEBUG_VERBOSE_PRIMS) {
- fprintf( stderr, "%s: vert (importable) %d: %.2f %.2f %.2f %x\n",
+ fprintf( stderr, "%s: vert %d: %.2f %.2f %.2f %x\n",
__FUNCTION__,
i,
(LE32_IN( p ) >> 16)/4.0,
}
#endif
#if DO_TEX1 || DO_TEX0 || DO_XYZW
- coord = (GLfloat (*)[4])((GLubyte *)coord + coord_stride);
+ STRIDE_4F(coord, coord_stride);
#endif
assert( p + 1 - (CARD32 *)v == 10 );
LOCALVARS
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
GLubyte *ddverts = GET_VERTEX_STORE();
- GLuint shift = GET_VERTEX_STRIDE_SHIFT();
+ GLuint size = GET_VERTEX_SIZE();
const GLfloat *dstclip = VB->ClipPtr->data[edst];
GLfloat w;
const GLfloat *s = GET_VIEWPORT_MAT();
- CARD32 *dst = (CARD32 *)(ddverts + (edst << shift));
- CARD32 *in = (CARD32 *)(ddverts + (ein << shift));
- CARD32 *out = (CARD32 *)(ddverts + (eout << shift));
+ CARD32 *dst = (CARD32 *)(ddverts + (edst * size));
+ CARD32 *in = (CARD32 *)(ddverts + (ein * size));
+ CARD32 *out = (CARD32 *)(ddverts + (eout * size));
(void)s;
#endif /* !DO_TEX0 */
#if DO_SPEC
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_SPEC_B */
- ((GLubyte *)dst)++; ((GLubyte *)out)++; ((GLubyte *)in)++;
-
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_SPEC_G */
- ((GLubyte *)dst)++; ((GLubyte *)out)++; ((GLubyte *)in)++;
-
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_SPEC_R */
-#if DO_FOG
- ((GLubyte *)dst)++; ((GLubyte *)out)++; ((GLubyte *)in)++;
-#else /* !DO_FOG */
- ((GLubyte *)dst) += 2; ((GLubyte *)out) += 2; ((GLubyte *)in) += 2;
-#endif /* !DO_FOG */
-#elif DO_FOG
- ((GLubyte *)dst) += 3; ((GLubyte *)out) += 3; ((GLubyte *)in) += 3;
+ INTERP_UB( t, ((GLubyte *)dst)[0], ((GLubyte *)out)[0], ((GLubyte *)in)[0] ); /* VERTEX_?_SPEC_B */
+ INTERP_UB( t, ((GLubyte *)dst)[1], ((GLubyte *)out)[1], ((GLubyte *)in)[1] ); /* VERTEX_?_SPEC_G */
+ INTERP_UB( t, ((GLubyte *)dst)[2], ((GLubyte *)out)[2], ((GLubyte *)in)[2] ); /* VERTEX_?_SPEC_R */
#endif
#if DO_FOG
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_SPEC_A */
- ((GLubyte *)dst)++; ((GLubyte *)out)++; ((GLubyte *)in)++;
+ INTERP_UB( t, ((GLubyte *)dst)[3], ((GLubyte *)out)[3], ((GLubyte *)in)[3] ); /* VERTEX_?_SPEC_A */
#endif /* DO_FOG */
-#if !DO_SPEC && !DO_FOG
dst++; out++; in++;
-#endif
LE32_OUT( dst, VIEWPORT_Z( dstclip[2] * w ) ); /* VERTEX_?_Z */
dst++; out++; in++;
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_B */
- ((GLubyte *)dst)++; ((GLubyte *)out)++; ((GLubyte *)in)++;
-
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_G */
- ((GLubyte *)dst)++; ((GLubyte *)out)++; ((GLubyte *)in)++;
-
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_R */
- ((GLubyte *)dst)++; ((GLubyte *)out)++; ((GLubyte *)in)++;
-
- INTERP_UB( t, *(GLubyte *)dst, *(GLubyte *)out, *(GLubyte *)in ); /* VERTEX_?_A */
- ((GLubyte *)dst)++; /* ((GLubyte *)out)++; ((GLubyte *)in)++; */
+ INTERP_UB( t, ((GLubyte *)dst)[0], ((GLubyte *)out)[0], ((GLubyte *)in)[0] ); /* VERTEX_?_B */
+ INTERP_UB( t, ((GLubyte *)dst)[1], ((GLubyte *)out)[1], ((GLubyte *)in)[1] ); /* VERTEX_?_G */
+ INTERP_UB( t, ((GLubyte *)dst)[2], ((GLubyte *)out)[2], ((GLubyte *)in)[2] ); /* VERTEX_?_R */
+ INTERP_UB( t, ((GLubyte *)dst)[3], ((GLubyte *)out)[3], ((GLubyte *)in)[3] ); /* VERTEX_?_A */
+ dst++; /*out++; in++;*/
LE32_OUT( dst,
(VIEWPORT_X( dstclip[0] * w ) << 16) | /* VERTEX_?_X */
(VIEWPORT_Y( dstclip[1] * w ) & 0xffff) ); /* VERTEX_?_Y */
- assert( dst + 1 - (CARD32 *)(ddverts + (edst << shift)) == 10 );
- assert( in + 2 - (CARD32 *)(ddverts + (ein << shift)) == 10 );
- assert( out + 2 - (CARD32 *)(ddverts + (eout << shift)) == 10 );
+ assert( dst + 1 - (CARD32 *)(ddverts + (edst * size)) == 10 );
+ assert( in + 2 - (CARD32 *)(ddverts + (ein * size)) == 10 );
+ assert( out + 2 - (CARD32 *)(ddverts + (eout * size)) == 10 );
if (MACH64_DEBUG & DEBUG_VERBOSE_PRIMS) {
fprintf( stderr, "%s: dst vert: %.2f %.2f %.2f %x\n",
#if DO_SPEC || DO_FOG || DO_RGBA
LOCALVARS
GLubyte *verts = GET_VERTEX_STORE();
- GLuint shift = GET_VERTEX_STRIDE_SHIFT();
- GLuint *dst = (GLuint *)(verts + (edst << shift));
- GLuint *src = (GLuint *)(verts + (esrc << shift));
+ GLuint size = GET_VERTEX_SIZE();
+ GLuint *dst = (GLuint *)(verts + (edst * size));
+ GLuint *src = (GLuint *)(verts + (esrc * size));
#endif
#if DO_SPEC || DO_FOG
setup_tab[IND].copy_pv = TAG(copy_pv);
- /* vertex_stride_shift must be the same because each
- * vertex is aligned with the end of the structure and
- * not the beginning
- */
#if DO_TEX1
setup_tab[IND].vertex_format = TEX1_VERTEX_FORMAT;
setup_tab[IND].vertex_size = 10;
- setup_tab[IND].vertex_stride_shift = 6;
#elif DO_TEX0
setup_tab[IND].vertex_format = TEX0_VERTEX_FORMAT;
setup_tab[IND].vertex_size = 7;
- setup_tab[IND].vertex_stride_shift = 6;
#elif DO_SPEC || DO_FOG
setup_tab[IND].vertex_format = NOTEX_VERTEX_FORMAT;
setup_tab[IND].vertex_size = 4;
- setup_tab[IND].vertex_stride_shift = 6;
#else
setup_tab[IND].vertex_format = TINY_VERTEX_FORMAT;
setup_tab[IND].vertex_size = 3;
- setup_tab[IND].vertex_stride_shift = 6;
#endif
- assert(setup_tab[IND].vertex_size * 4 <=
- 1 << setup_tab[IND].vertex_stride_shift);
}