summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/common/t_dd_dmatmp.h6
-rw-r--r--src/mesa/drivers/common/t_dd_tritmp.h240
2 files changed, 178 insertions, 68 deletions
diff --git a/src/mesa/drivers/common/t_dd_dmatmp.h b/src/mesa/drivers/common/t_dd_dmatmp.h
index 1b4e89bdb15..f2a08c02842 100644
--- a/src/mesa/drivers/common/t_dd_dmatmp.h
+++ b/src/mesa/drivers/common/t_dd_dmatmp.h
@@ -44,6 +44,7 @@
#endif
#if !HAVE_ELTS
+#define ELTS_VARS
#define ALLOC_ELTS( nr )
#define EMIT_ELT( offset, elt )
#define INCR_ELTS( nr )
@@ -392,7 +393,7 @@ static void TAG(render_quad_strip_verts)( GLcontext *ctx,
if (HAVE_QUAD_STRIPS && 0) {
/* TODO.
*/
- } else if (ctx->_TriangleCaps & DD_FLATSHADE) {
+ } else if (HAVE_TRI_STRIPS && ctx->_TriangleCaps & DD_FLATSHADE) {
if (TAG(emit_elt_verts)( ctx, start, count )) {
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
@@ -881,7 +882,8 @@ static void TAG(render_quad_strip_elts)( GLcontext *ctx,
GLuint flags )
{
if (HAVE_QUAD_STRIPS && 0) {
- } else {
+ }
+ else if (HAVE_TRI_STRIPS) {
LOCAL_VARS;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
diff --git a/src/mesa/drivers/common/t_dd_tritmp.h b/src/mesa/drivers/common/t_dd_tritmp.h
index 7f573a5abc8..0608fd96951 100644
--- a/src/mesa/drivers/common/t_dd_tritmp.h
+++ b/src/mesa/drivers/common/t_dd_tritmp.h
@@ -69,6 +69,17 @@
#define VERT_COPY_IND( v0, v1 )
#define VERT_SAVE_IND( idx )
#define VERT_RESTORE_IND( idx )
+#if HAVE_BACK_COLORS
+#define VERT_SET_RGBA( v, c )
+#endif
+#else
+#define VERT_SET_RGBA( v, c ) (void) c
+#define VERT_COPY_RGBA( v0, v1 )
+#define VERT_SAVE_RGBA( idx )
+#define VERT_RESTORE_RGBA( idx )
+#if HAVE_BACK_COLORS
+#define VERT_SET_IND( v, c )
+#endif
#endif
#if !HAVE_SPEC
@@ -76,8 +87,27 @@
#define VERT_COPY_SPEC( v0, v1 )
#define VERT_SAVE_SPEC( idx )
#define VERT_RESTORE_SPEC( idx )
+#if HAVE_BACK_COLORS
+#define VERT_COPY_SPEC1( v )
+#endif
+#else
+#if HAVE_BACK_COLORS
+#define VERT_SET_SPEC( v, c )
+#endif
#endif
+#if !HAVE_BACK_COLORS
+#define VERT_COPY_SPEC1( v )
+#define VERT_COPY_IND1( v )
+#define VERT_COPY_RGBA1( v )
+#endif
+
+#ifndef INSANE_VERTICES
+#define VERT_SET_Z(v,val) VERT_Z(v) = val
+#define VERT_Z_ADD(v,val) VERT_Z(v) += val
+#endif
+
+#if DO_TRI
static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
{
struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb;
@@ -125,26 +155,48 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
if (DO_TWOSIDE && facing == 1)
{
if (HAVE_RGBA) {
- GLchan (*vbcolor)[4] = VB->ColorPtr[1]->data;
- ASSERT(VB->ColorPtr[1]->stride == 4*sizeof(GLchan));
-
- if (!DO_FLAT) {
- VERT_SET_RGBA( v[0], vbcolor[e0] );
- VERT_SET_RGBA( v[1], vbcolor[e1] );
- }
- VERT_SET_RGBA( v[2], vbcolor[e2] );
+ if (HAVE_BACK_COLORS) {
+ if (!DO_FLAT) {
+ VERT_SAVE_RGBA( 0 );
+ VERT_SAVE_RGBA( 1 );
+ VERT_COPY_RGBA1( v[0] );
+ VERT_COPY_RGBA1( v[1] );
+ }
+ VERT_SAVE_RGBA( 2 );
+ VERT_COPY_RGBA1( v[2] );
+ if (HAVE_SPEC) {
+ if (!DO_FLAT) {
+ VERT_SAVE_SPEC( 0 );
+ VERT_SAVE_SPEC( 1 );
+ VERT_COPY_SPEC1( v[0] );
+ VERT_COPY_SPEC1( v[1] );
+ }
+ VERT_SAVE_SPEC( 2 );
+ VERT_COPY_SPEC1( v[2] );
+ }
+ }
+ else {
+ GLchan (*vbcolor)[4] = VB->ColorPtr[1]->data;
+ ASSERT(VB->ColorPtr[1]->stride == 4*sizeof(GLchan));
+ (void) vbcolor;
- if (HAVE_SPEC && VB->SecondaryColorPtr[1]) {
- GLchan (*vbspec)[4] = VB->SecondaryColorPtr[1]->data;
- ASSERT(VB->SecondaryColorPtr[1]->stride == 4*sizeof(GLchan));
-
if (!DO_FLAT) {
- VERT_SET_SPEC( v[0], vbspec[e0] );
- VERT_SET_SPEC( v[1], vbspec[e1] );
+ VERT_SET_RGBA( v[0], vbcolor[e0] );
+ VERT_SET_RGBA( v[1], vbcolor[e1] );
}
- VERT_SET_SPEC( v[2], vbspec[e2] );
- }
- }
+ VERT_SET_RGBA( v[2], vbcolor[e2] );
+
+ if (HAVE_SPEC && VB->SecondaryColorPtr[1]) {
+ GLchan (*vbspec)[4] = VB->SecondaryColorPtr[1]->data;
+
+ if (!DO_FLAT) {
+ VERT_SET_SPEC( v[0], vbspec[e0] );
+ VERT_SET_SPEC( v[1], vbspec[e1] );
+ }
+ VERT_SET_SPEC( v[2], vbspec[e2] );
+ }
+ }
+ }
else {
GLuint *vbindex = VB->IndexPtr[1]->data;
if (!DO_FLAT) {
@@ -202,23 +254,23 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
if (mode == GL_POINT) {
if (DO_OFFSET && ctx->Polygon.OffsetPoint) {
- VERT_Z(v[0]) += offset;
- VERT_Z(v[1]) += offset;
- VERT_Z(v[2]) += offset;
+ VERT_Z_ADD(v[0], offset);
+ VERT_Z_ADD(v[1], offset);
+ VERT_Z_ADD(v[2], offset);
}
UNFILLED_TRI( ctx, GL_POINT, e0, e1, e2 );
} else if (mode == GL_LINE) {
if (DO_OFFSET && ctx->Polygon.OffsetLine) {
- VERT_Z(v[0]) += offset;
- VERT_Z(v[1]) += offset;
- VERT_Z(v[2]) += offset;
+ VERT_Z_ADD(v[0], offset);
+ VERT_Z_ADD(v[1], offset);
+ VERT_Z_ADD(v[2], offset);
}
UNFILLED_TRI( ctx, GL_LINE, e0, e1, e2 );
} else {
if (DO_OFFSET && ctx->Polygon.OffsetFill) {
- VERT_Z(v[0]) += offset;
- VERT_Z(v[1]) += offset;
- VERT_Z(v[2]) += offset;
+ VERT_Z_ADD(v[0], offset);
+ VERT_Z_ADD(v[1], offset);
+ VERT_Z_ADD(v[2], offset);
}
if (DO_UNFILLED)
RASTERIZE( GL_TRIANGLES );
@@ -227,32 +279,45 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
if (DO_OFFSET)
{
- VERT_Z(v[0]) = z[0];
- VERT_Z(v[1]) = z[1];
- VERT_Z(v[2]) = z[2];
+ VERT_SET_Z(v[0], z[0]);
+ VERT_SET_Z(v[1], z[1]);
+ VERT_SET_Z(v[2], z[2]);
}
if (DO_TWOSIDE && facing == 1)
{
if (HAVE_RGBA) {
- GLchan (*vbcolor)[4] = VB->ColorPtr[0]->data;
- ASSERT(VB->ColorPtr[0]->stride == 4*sizeof(GLchan));
-
- if (!DO_FLAT) {
- VERT_SET_RGBA( v[0], vbcolor[e0] );
- VERT_SET_RGBA( v[1], vbcolor[e1] );
- }
- VERT_SET_RGBA( v[2], vbcolor[e2] );
-
- if (HAVE_SPEC && VB->SecondaryColorPtr[0]) {
- GLchan (*vbspec)[4] = VB->SecondaryColorPtr[0]->data;
- ASSERT(VB->SecondaryColorPtr[0]->stride == 4*sizeof(GLchan));
-
+ if (HAVE_BACK_COLORS) {
+ VERT_RESTORE_RGBA( 0 );
+ VERT_RESTORE_RGBA( 1 );
+ VERT_RESTORE_RGBA( 2 );
+ if (HAVE_SPEC) {
+ VERT_RESTORE_SPEC( 0 );
+ VERT_RESTORE_SPEC( 1 );
+ VERT_RESTORE_SPEC( 2 );
+ }
+ }
+ else {
+ GLchan (*vbcolor)[4] = VB->ColorPtr[0]->data;
+ ASSERT(VB->ColorPtr[0]->stride == 4*sizeof(GLchan));
+ (void) vbcolor;
+
if (!DO_FLAT) {
- VERT_SET_SPEC( v[0], vbspec[e0] );
- VERT_SET_SPEC( v[1], vbspec[e1] );
+ VERT_SET_RGBA( v[0], vbcolor[e0] );
+ VERT_SET_RGBA( v[1], vbcolor[e1] );
+ }
+ VERT_SET_RGBA( v[2], vbcolor[e2] );
+
+ if (HAVE_SPEC && VB->SecondaryColorPtr[0]) {
+ GLchan (*vbspec)[4] = VB->SecondaryColorPtr[0]->data;
+ ASSERT(VB->SecondaryColorPtr[0]->stride == 4*sizeof(GLchan));
+
+ if (!DO_FLAT) {
+ VERT_SET_SPEC( v[0], vbspec[e0] );
+ VERT_SET_SPEC( v[1], vbspec[e1] );
+ }
+ VERT_SET_SPEC( v[2], vbspec[e2] );
}
- VERT_SET_SPEC( v[2], vbspec[e2] );
}
}
else {
@@ -280,11 +345,11 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
VERT_RESTORE_IND( 1 );
}
}
-
-
}
+#endif
-#if (DO_FULL_QUAD)
+#if DO_QUAD
+#if DO_FULL_QUAD
static void TAG(quad)( GLcontext *ctx,
GLuint e0, GLuint e1, GLuint e2, GLuint e3 )
{
@@ -333,6 +398,7 @@ static void TAG(quad)( GLcontext *ctx,
{
if (HAVE_RGBA) {
GLchan (*vbcolor)[4] = VB->ColorPtr[1]->data;
+ (void)vbcolor;
if (!DO_FLAT) {
VERT_SET_RGBA( v[0], vbcolor[e0] );
@@ -418,26 +484,26 @@ static void TAG(quad)( GLcontext *ctx,
if (mode == GL_POINT) {
if (( DO_OFFSET) && ctx->Polygon.OffsetPoint) {
- VERT_Z(v[0]) += offset;
- VERT_Z(v[1]) += offset;
- VERT_Z(v[2]) += offset;
- VERT_Z(v[3]) += offset;
+ VERT_Z_ADD(v[0], offset);
+ VERT_Z_ADD(v[1], offset);
+ VERT_Z_ADD(v[2], offset);
+ VERT_Z_ADD(v[3], offset);
}
UNFILLED_QUAD( ctx, GL_POINT, e0, e1, e2, e3 );
} else if (mode == GL_LINE) {
if (DO_OFFSET && ctx->Polygon.OffsetLine) {
- VERT_Z(v[0]) += offset;
- VERT_Z(v[1]) += offset;
- VERT_Z(v[2]) += offset;
- VERT_Z(v[3]) += offset;
+ VERT_Z_ADD(v[0], offset);
+ VERT_Z_ADD(v[1], offset);
+ VERT_Z_ADD(v[2], offset);
+ VERT_Z_ADD(v[3], offset);
}
UNFILLED_QUAD( ctx, GL_LINE, e0, e1, e2, e3 );
} else {
if (DO_OFFSET && ctx->Polygon.OffsetFill) {
- VERT_Z(v[0]) += offset;
- VERT_Z(v[1]) += offset;
- VERT_Z(v[2]) += offset;
- VERT_Z(v[3]) += offset;
+ VERT_Z_ADD(v[0], offset);
+ VERT_Z_ADD(v[1], offset);
+ VERT_Z_ADD(v[2], offset);
+ VERT_Z_ADD(v[3], offset);
}
RASTERIZE( GL_TRIANGLES );
QUAD( (v[0]), (v[1]), (v[2]), (v[3]) );
@@ -445,10 +511,10 @@ static void TAG(quad)( GLcontext *ctx,
if (DO_OFFSET)
{
- VERT_Z(v[0]) = z[0];
- VERT_Z(v[1]) = z[1];
- VERT_Z(v[2]) = z[2];
- VERT_Z(v[3]) = z[3];
+ VERT_SET_Z(v[0], z[0]);
+ VERT_SET_Z(v[1], z[1]);
+ VERT_SET_Z(v[2], z[2]);
+ VERT_SET_Z(v[3], z[3]);
}
if (DO_TWOSIDE && facing == 1)
@@ -456,6 +522,7 @@ static void TAG(quad)( GLcontext *ctx,
if (HAVE_RGBA) {
GLchan (*vbcolor)[4] = VB->ColorPtr[0]->data;
ASSERT(VB->ColorPtr[0]->stride == 4*sizeof(GLchan));
+ (void) vbcolor;
if (!DO_FLAT) {
VERT_SET_RGBA( v[0], vbcolor[e0] );
@@ -526,8 +593,9 @@ static void TAG(quad)( GLcontext *ctx, GLuint e0,
}
}
#endif
+#endif
-
+#if DO_LINE
static void TAG(line)( GLcontext *ctx, GLuint e0, GLuint e1 )
{
TNLvertexbuffer *VB = &TNL_CONTEXT(ctx)->vb;
@@ -567,8 +635,9 @@ static void TAG(line)( GLcontext *ctx, GLuint e0, GLuint e1 )
}
}
}
+#endif
-
+#if DO_POINT
static void TAG(points)( GLcontext *ctx, GLuint first, GLuint last )
{
struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb;
@@ -592,13 +661,22 @@ static void TAG(points)( GLcontext *ctx, GLuint first, GLuint last )
}
}
}
+#endif
static void TAG(init)( void )
{
+#if DO_QUAD
TAB[IND].quad = TAG(quad);
+#endif
+#if DO_TRI
TAB[IND].triangle = TAG(triangle);
+#endif
+#if DO_LINE
TAB[IND].line = TAG(line);
+#endif
+#if DO_POINT
TAB[IND].points = TAG(points);
+#endif
}
#undef IND
@@ -609,6 +687,17 @@ static void TAG(init)( void )
#undef VERT_COPY_IND
#undef VERT_SAVE_IND
#undef VERT_RESTORE_IND
+#if HAVE_BACK_COLORS
+#undef VERT_SET_RGBA
+#endif
+#else
+#undef VERT_SET_RGBA
+#undef VERT_COPY_RGBA
+#undef VERT_SAVE_RGBA
+#undef VERT_RESTORE_RGBA
+#if HAVE_BACK_COLORS
+#undef VERT_SET_IND
+#endif
#endif
#if !HAVE_SPEC
@@ -616,4 +705,23 @@ static void TAG(init)( void )
#undef VERT_COPY_SPEC
#undef VERT_SAVE_SPEC
#undef VERT_RESTORE_SPEC
+#if HAVE_BACK_COLORS
+#undef VERT_COPY_SPEC1
#endif
+#else
+#if HAVE_BACK_COLORS
+#undef VERT_SET_SPEC
+#endif
+#endif
+
+#if !HAVE_BACK_COLORS
+#undef VERT_COPY_SPEC1
+#undef VERT_COPY_IND1
+#undef VERT_COPY_RGBA1
+#endif
+
+#ifndef INSANE_VERTICES
+#undef VERT_SET_Z
+#undef VERT_Z_ADD
+#endif
+