diff options
-rw-r--r-- | src/mesa/drivers/common/t_dd_dmatmp.h | 258 | ||||
-rw-r--r-- | src/mesa/drivers/common/t_dd_tritmp.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/common/t_dd_vb.c | 222 | ||||
-rw-r--r-- | src/mesa/drivers/common/t_dd_vbtmp.h | 323 | ||||
-rw-r--r-- | src/mesa/drivers/common/t_dd_vertex.h | 70 |
5 files changed, 593 insertions, 282 deletions
diff --git a/src/mesa/drivers/common/t_dd_dmatmp.h b/src/mesa/drivers/common/t_dd_dmatmp.h index 38406e408d7..15568ee659d 100644 --- a/src/mesa/drivers/common/t_dd_dmatmp.h +++ b/src/mesa/drivers/common/t_dd_dmatmp.h @@ -39,14 +39,21 @@ * render the primitive natively. */ -#if !defined(HAVE_TRI_STRIPS) || !defined(HAVE_TRIANGLES) -#error "must have at least tristrips and triangles to use render template" +#if !defined(HAVE_TRIANGLES) +#error "must have at least triangles to use render template" #endif #if !HAVE_ELTS #define ALLOC_ELTS( nr ) #define EMIT_ELT( offset, elt ) #define INCR_ELTS( nr ) +#define ELT_INIT(prim) +#define GET_CURRENT_VB_MAX_ELTS() 0 +#define GET_SUBSEQUENT_VB_MAX_ELTS() 0 +#define ALLOC_ELTS_NEW_PRIMITIVE(nr) +#define RELEASE_ELT_VERTS() +#define EMIT_INDEXED_VERTS( ctx, start, count ) + #endif #ifndef EMIT_TWO_ELTS @@ -67,9 +74,12 @@ static GLboolean TAG(emit_elt_verts)( GLcontext *ctx, GLuint start, GLuint count ) { if (HAVE_ELTS) { + LOCAL_VARS; GLuint nr = count - start; - if ( nr >= GET_SUBSEQUENT_VB_MAX_VERTS() ) + if ( nr >= GET_SUBSEQUENT_VB_MAX_VERTS() ) /* assumes same packing for + * indexed and regualar verts + */ return GL_FALSE; NEW_PRIMITIVE(); /* finish last prim */ @@ -80,10 +90,11 @@ static GLboolean TAG(emit_elt_verts)( GLcontext *ctx, } } +#if (HAVE_ELTS) static void TAG(emit_elts)( GLcontext *ctx, GLuint *elts, GLuint nr ) { - GLushort *dest; GLint i; + LOCAL_VARS; ELTS_VARS; ALLOC_ELTS( nr ); @@ -93,6 +104,7 @@ static void TAG(emit_elts)( GLcontext *ctx, GLuint *elts, GLuint nr ) INCR_ELTS( 2 ); } } +#endif /*********************************************************************** @@ -107,6 +119,7 @@ static void TAG(render_points_verts)( GLcontext *ctx, GLuint flags ) { if (HAVE_POINTS) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); int currentsz = GET_CURRENT_VB_MAX_VERTS(); GLuint j, nr; @@ -122,7 +135,7 @@ static void TAG(render_points_verts)( GLcontext *ctx, currentsz = dmasz; } } else { - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -132,6 +145,7 @@ static void TAG(render_lines_verts)( GLcontext *ctx, GLuint flags ) { if (HAVE_LINES) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); int currentsz = GET_CURRENT_VB_MAX_VERTS(); GLuint j, nr; @@ -153,7 +167,7 @@ static void TAG(render_lines_verts)( GLcontext *ctx, currentsz = dmasz; } } else { - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -164,6 +178,7 @@ static void TAG(render_line_strip_verts)( GLcontext *ctx, GLuint flags ) { if (HAVE_LINE_STRIPS) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); int currentsz = GET_CURRENT_VB_MAX_VERTS(); GLuint j, nr; @@ -180,7 +195,7 @@ static void TAG(render_line_strip_verts)( GLcontext *ctx, currentsz = dmasz; } } else { - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -191,6 +206,7 @@ static void TAG(render_line_loop_verts)( GLcontext *ctx, GLuint flags ) { if (HAVE_LINE_STRIPS) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); int currentsz = GET_CURRENT_VB_MAX_VERTS(); GLuint j, nr; @@ -221,7 +237,7 @@ static void TAG(render_line_loop_verts)( GLcontext *ctx, EMIT_VERTS( ctx, start, 1 ); } else { - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -231,6 +247,7 @@ static void TAG(render_triangles_verts)( GLcontext *ctx, GLuint count, GLuint flags ) { + LOCAL_VARS; int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/3) * 3; int currentsz = (GET_CURRENT_VB_MAX_VERTS()/3) * 3; GLuint j, nr; @@ -259,37 +276,42 @@ static void TAG(render_tri_strip_verts)( GLcontext *ctx, GLuint count, GLuint flags ) { - GLuint j, nr; - int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); - int currentsz; - - INIT(GL_TRIANGLE_STRIP); - NEW_PRIMITIVE(); - - currentsz = GET_CURRENT_VB_MAX_VERTS(); + if (HAVE_TRI_STRIPS) { + LOCAL_VARS; + GLuint j, nr; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz; + + INIT(GL_TRIANGLE_STRIP); + NEW_PRIMITIVE(); + + currentsz = GET_CURRENT_VB_MAX_VERTS(); - if (currentsz < 8) { - FIRE_VERTICES( ctx ); - currentsz = dmasz; - } - - if (flags & PRIM_PARITY) { - if (HAVE_TRI_STRIP_1 && 0) { - } else { - EMIT_VERTS( ctx, start, 1 ); - currentsz--; + if (currentsz < 8) { + FIRE_VERTICES(); + currentsz = dmasz; } - } - /* From here on emit even numbers of tris when wrapping over buffers: - */ - dmasz -= (dmasz & 1); - currentsz -= (currentsz & 1); + if (flags & PRIM_PARITY) { + if (HAVE_TRI_STRIP_1 && 0) { + } else { + EMIT_VERTS( ctx, start, 1 ); + currentsz--; + } + } - for (j = start ; j < count - 2; j += nr - 2 ) { - nr = MIN2( currentsz, count - j ); - EMIT_VERTS( ctx, j, nr ); - currentsz = dmasz; + /* From here on emit even numbers of tris when wrapping over buffers: + */ + dmasz -= (dmasz & 1); + currentsz -= (currentsz & 1); + + for (j = start ; j < count - 2; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + EMIT_VERTS( ctx, j, nr ); + currentsz = dmasz; + } + } else { + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -298,7 +320,8 @@ static void TAG(render_tri_fan_verts)( GLcontext *ctx, GLuint count, GLuint flags ) { - if (HAVE_TRI_FAN) { + if (HAVE_TRI_FANS) { + LOCAL_VARS; GLuint j, nr; int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); int currentsz = GET_CURRENT_VB_MAX_VERTS(); @@ -307,7 +330,7 @@ static void TAG(render_tri_fan_verts)( GLcontext *ctx, INIT(GL_TRIANGLE_FAN); if (currentsz < 8) { - FIRE_VERTICES( ctx ); + FIRE_VERTICES(); currentsz = dmasz; } @@ -322,7 +345,7 @@ static void TAG(render_tri_fan_verts)( GLcontext *ctx, /* Could write code to emit these as indexed vertices (for the * g400, for instance). */ - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -332,7 +355,8 @@ static void TAG(render_poly_verts)( GLcontext *ctx, GLuint count, GLuint flags ) { - if (HAVE_POLYGON) { + if (HAVE_POLYGONS) { + LOCAL_VARS; GLuint j, nr; int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); int currentsz = GET_CURRENT_VB_MAX_VERTS(); @@ -341,7 +365,7 @@ static void TAG(render_poly_verts)( GLcontext *ctx, INIT(GL_POLYGON); if (currentsz < 8) { - FIRE_VERTICES( ctx ); + FIRE_VERTICES(); currentsz = dmasz; } @@ -352,10 +376,10 @@ static void TAG(render_poly_verts)( GLcontext *ctx, currentsz = dmasz; } } - else if (HAVE_TRIFAN && !(ctx->TriangleCaps & DD_FLATSHADE)) { + else if (HAVE_TRI_FANS && !(ctx->_TriangleCaps & DD_FLATSHADE)) { TAG(render_tri_fan_verts)( ctx, start, count, flags ); } else { - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -370,8 +394,9 @@ static void TAG(render_quad_strip_verts)( GLcontext *ctx, /* TODO. */ } else if (ctx->_TriangleCaps & DD_FLATSHADE) { - if (emit_elt_verts( ctx, start, count )) { - int dmasz = SUBSEQUENT_VB_ELT_NR(); + if (TAG(emit_elt_verts)( ctx, start, count )) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint j, nr; @@ -380,7 +405,7 @@ static void TAG(render_quad_strip_verts)( GLcontext *ctx, NEW_PRIMITIVE(); ELT_INIT( GL_TRIANGLES ); - currentsz = CURRENT_VB_ELT_NR_NEW_PRIMITIVE(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); /* Emit whole number of quads in total, and in each buffer. */ @@ -420,14 +445,15 @@ static void TAG(render_quad_strip_verts)( GLcontext *ctx, } else { /* Vertices won't fit in a single buffer or elts not available, - * fallback. + * VERT_FALLBACK. */ - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } - else { - int dmasz = GET_SUBSEQUENT_VB_SIZE(); - int currentsz = GET_CURRENT_VB_SIZE(); + else if (HAVE_TRI_STRIPS) { + LOCAL_VARS; + int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS(); + int currentsz = GET_CURRENT_VB_MAX_VERTS(); /* Emit smooth-shaded quadstrips as tristrips: */ @@ -441,7 +467,7 @@ static void TAG(render_quad_strip_verts)( GLcontext *ctx, count -= (count-start) & 1; if (currentsz < 8) { - FIRE_VERTICES( ctx ); + FIRE_VERTICES(); currentsz = dmasz; } @@ -450,6 +476,8 @@ static void TAG(render_quad_strip_verts)( GLcontext *ctx, EMIT_VERTS( ctx, j, nr ); currentsz = dmasz; } + } else { + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -460,18 +488,19 @@ static void TAG(render_quads_verts)( GLcontext *ctx, GLuint flags ) { if (HAVE_QUADS && 0) { - } else if (emit_elt_verts( ctx, start, count )) { + } else if (TAG(emit_elt_verts)( ctx, start, count )) { /* Hardware doesn't have a quad primitive type -- try to * simulate it using indexed vertices and the triangle * primitive: */ + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint j, nr; NEW_PRIMITIVE(); ELT_INIT( GL_TRIANGLES ); - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); /* Emit whole number of quads in total, and in each buffer. */ @@ -514,7 +543,7 @@ static void TAG(render_quads_verts)( GLcontext *ctx, else { /* Vertices won't fit in a single buffer, fallback. */ - FALLBACK( ctx, start, count, flags ); + VERT_FALLBACK( ctx, start, count, flags ); } } @@ -528,8 +557,7 @@ static void TAG(render_noop)( GLcontext *ctx, -static void (*TAG(render_tab_verts))( GLcontext *, GLuint, - GLuint, GLuint)[GL_POLYGON+2] = +static render_func TAG(render_tab_verts)[GL_POLYGON+2] = { TAG(render_points_verts), TAG(render_lines_verts), @@ -556,6 +584,7 @@ static void TAG(render_points_elts)( GLcontext *ctx, GLuint flags ) { if (HAVE_POINTS) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; @@ -569,7 +598,7 @@ static void TAG(render_points_elts)( GLcontext *ctx, for (j = start; j < count; j += nr ) { nr = MIN2( currentsz, count - j ); - emit_elts( ctx, elts+j, nr ); + TAG(emit_elts)( ctx, elts+j, nr ); NEW_PRIMITIVE(); currentsz = dmasz; } @@ -586,6 +615,7 @@ static void TAG(render_lines_elts)( GLcontext *ctx, GLuint flags ) { if (HAVE_LINES) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; @@ -605,7 +635,7 @@ static void TAG(render_lines_elts)( GLcontext *ctx, for (j = start; j < count; j += nr ) { nr = MIN2( currentsz, count - j ); - emit_elts( ctx, elts+j, nr ); + TAG(emit_elts)( ctx, elts+j, nr ); NEW_PRIMITIVE(); currentsz = dmasz; } @@ -621,6 +651,7 @@ static void TAG(render_line_strip_elts)( GLcontext *ctx, GLuint flags ) { if (HAVE_LINE_STRIPS) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; @@ -629,13 +660,13 @@ static void TAG(render_line_strip_elts)( GLcontext *ctx, NEW_PRIMITIVE(); /* always a new primitive */ ELT_INIT( GL_LINE_STRIP ); - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); if (currentsz < 8) currentsz = dmasz; for (j = start; j < count - 1; j += nr - 1 ) { nr = MIN2( currentsz, count - j ); - emit_elts( ctx, elts+j, nr ); + TAG(emit_elts)( ctx, elts+j, nr ); NEW_PRIMITIVE(); currentsz = dmasz; } @@ -653,6 +684,7 @@ static void TAG(render_line_loop_elts)( GLcontext *ctx, GLuint flags ) { if (HAVE_LINE_STRIPS) { + LOCAL_VARS; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; @@ -666,9 +698,9 @@ static void TAG(render_line_loop_elts)( GLcontext *ctx, else j = start + 1; - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); if (currentsz < 8) { - FIRE_VERTICES( ctx ); + FIRE_VERTICES(); currentsz = dmasz; } @@ -680,12 +712,12 @@ static void TAG(render_line_loop_elts)( GLcontext *ctx, for ( ; j < count - 1; j += nr - 1 ) { nr = MIN2( currentsz, count - j ); /* NEW_PRIMITIVE(); */ - emit_elts( ctx, elts+j, nr ); + TAG(emit_elts)( ctx, elts+j, nr ); currentsz = dmasz; } if (flags & PRIM_END) - emit_elts( ctx, elts+start, 1 ); + TAG(emit_elts)( ctx, elts+start, 1 ); NEW_PRIMITIVE(); } else { @@ -704,6 +736,7 @@ static void TAG(render_triangles_elts)( GLcontext *ctx, GLuint count, GLuint flags ) { + LOCAL_VARS; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/3*3; int currentsz; @@ -712,7 +745,7 @@ static void TAG(render_triangles_elts)( GLcontext *ctx, NEW_PRIMITIVE(); ELT_INIT( GL_TRIANGLES ); - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); /* Emit whole number of tris in total. dmasz is already a multiple * of 3. @@ -724,7 +757,7 @@ static void TAG(render_triangles_elts)( GLcontext *ctx, for (j = start; j < count; j += nr) { nr = MIN2( currentsz, count - j ); - emit_elts( ctx, elts+j, nr ); + TAG(emit_elts)( ctx, elts+j, nr ); NEW_PRIMITIVE(); currentsz = dmasz; } @@ -737,34 +770,40 @@ static void TAG(render_tri_strip_elts)( GLcontext *ctx, GLuint count, GLuint flags ) { - GLuint j, nr; - GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; - int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); - int currentsz; - - NEW_PRIMITIVE(); - ELT_INIT( GL_TRIANGLE_STRIP ); - - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); - if (currentsz < 8) { - FIRE_VERTICES( ctx ); - currentsz = dmasz; - } - - if (flags & PRIM_PARITY) { - emit_elts( ctx, elts+start, 1 ); - } - - /* Keep the same winding over multiple buffers: - */ - dmasz -= (dmasz & 1); - currentsz -= (currentsz & 1); + if (HAVE_TRI_STRIPS) { + LOCAL_VARS; + GLuint j, nr; + GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; + int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); + int currentsz; - for (j = start ; j < count - 2; j += nr - 2 ) { - nr = MIN2( currentsz, count - j ); - emit_elts( ctx, elts+j, nr ); NEW_PRIMITIVE(); - currentsz = dmasz; + ELT_INIT( GL_TRIANGLE_STRIP ); + + currentsz = GET_CURRENT_VB_MAX_ELTS(); + if (currentsz < 8) { + FIRE_VERTICES(); + currentsz = dmasz; + } + + if (flags & PRIM_PARITY) { + TAG(emit_elts)( ctx, elts+start, 1 ); + } + + /* Keep the same winding over multiple buffers: + */ + dmasz -= (dmasz & 1); + currentsz -= (currentsz & 1); + + for (j = start ; j < count - 2; j += nr - 2 ) { + nr = MIN2( currentsz, count - j ); + TAG(emit_elts)( ctx, elts+j, nr ); + NEW_PRIMITIVE(); + currentsz = dmasz; + } + } else { + /* TODO: try to emit as indexed triangles */ + ELT_FALLBACK( ctx, start, count, flags ); } } @@ -773,7 +812,8 @@ static void TAG(render_tri_fan_elts)( GLcontext *ctx, GLuint count, GLuint flags ) { - if (HAVE_TRI_FAN) { + if (HAVE_TRI_FANS) { + LOCAL_VARS; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; GLuint j, nr; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); @@ -782,16 +822,16 @@ static void TAG(render_tri_fan_elts)( GLcontext *ctx, NEW_PRIMITIVE(); ELT_INIT( GL_TRIANGLE_FAN ); - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); if (currentsz < 8) { - FIRE_VERTICES( ctx ); + FIRE_VERTICES(); currentsz = dmasz; } for (j = start + 1 ; j < count - 1; j += nr - 1 ) { nr = MIN2( currentsz, count - j + 1 ); - emit_elts( ctx, elts+start, 1 ); - emit_elts( ctx, elts+j, nr - 1 ); + TAG(emit_elts)( ctx, elts+start, 1 ); + TAG(emit_elts)( ctx, elts+j, nr - 1 ); NEW_PRIMITIVE(); currentsz = dmasz; } @@ -807,8 +847,9 @@ static void TAG(render_poly_elts)( GLcontext *ctx, GLuint count, GLuint flags ) { - if (HAVE_POLYGON && 0) { - } else if (HAVE_TRI_FAN && !(ctx->_TriangleCaps & DD_FLATSHADE)) { + if (HAVE_POLYGONS && 0) { + } else if (HAVE_TRI_FANS && !(ctx->_TriangleCaps & DD_FLATSHADE)) { + LOCAL_VARS; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; GLuint j, nr; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); @@ -817,16 +858,16 @@ static void TAG(render_poly_elts)( GLcontext *ctx, NEW_PRIMITIVE(); ELT_INIT( GL_TRIANGLE_FAN ); - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); if (currentsz < 8) { - FIRE_VERTICES( ctx ); + FIRE_VERTICES(); currentsz = dmasz; } for (j = start + 1 ; j < count - 1 ; j += nr - 1 ) { nr = MIN2( currentsz, count - j + 1 ); - emit_elts( ctx, elts+start, 1 ); - emit_elts( ctx, elts+j, nr - 1 ); + TAG(emit_elts)( ctx, elts+start, 1 ); + TAG(emit_elts)( ctx, elts+j, nr - 1 ); NEW_PRIMITIVE(); currentsz = dmasz; } @@ -842,13 +883,14 @@ static void TAG(render_quad_strip_elts)( GLcontext *ctx, { if (HAVE_QUAD_STRIPS && 0) { } else { + LOCAL_VARS; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint j, nr; NEW_PRIMITIVE(); - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); /* Emit whole number of quads in total, and in each buffer. */ @@ -896,7 +938,7 @@ static void TAG(render_quad_strip_elts)( GLcontext *ctx, for (j = start; j < count - 3; j += nr - 2 ) { nr = MIN2( currentsz, count - j ); - emit_elts( ctx, elts+j, nr ); + TAG(emit_elts)( ctx, elts+j, nr ); NEW_PRIMITIVE(); currentsz = dmasz; } @@ -912,13 +954,14 @@ static void TAG(render_quads_elts)( GLcontext *ctx, { if (HAVE_QUADS && 0) { } else { + LOCAL_VARS; GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts; int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); int currentsz; GLuint j, nr; ELT_INIT( GL_TRIANGLES ); - currentsz = GET_CURRENT_VB_MAX_ELTS_NEW_PRIM(); + currentsz = GET_CURRENT_VB_MAX_ELTS(); /* Emit whole number of quads in total, and in each buffer. */ @@ -961,8 +1004,7 @@ static void TAG(render_quads_elts)( GLcontext *ctx, -static void (*TAG(render_tab_verts))( GLcontext *, GLuint, - GLuint, GLuint)[GL_POLYGON+2] = +static render_func TAG(render_tab_elts)[GL_POLYGON+2] = { TAG(render_points_elts), TAG(render_lines_elts), diff --git a/src/mesa/drivers/common/t_dd_tritmp.h b/src/mesa/drivers/common/t_dd_tritmp.h index 7cd7c756f9e..7f573a5abc8 100644 --- a/src/mesa/drivers/common/t_dd_tritmp.h +++ b/src/mesa/drivers/common/t_dd_tritmp.h @@ -88,6 +88,8 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) GLuint facing; LOCAL_VARS(3); +/* fprintf(stderr, "%s\n", __FUNCTION__); */ + v[0] = (VERTEX *)GET_VERTEX(e0); v[1] = (VERTEX *)GET_VERTEX(e1); v[2] = (VERTEX *)GET_VERTEX(e2); diff --git a/src/mesa/drivers/common/t_dd_vb.c b/src/mesa/drivers/common/t_dd_vb.c index 18413469851..7b6f3bd25f4 100644 --- a/src/mesa/drivers/common/t_dd_vb.c +++ b/src/mesa/drivers/common/t_dd_vb.c @@ -1,4 +1,224 @@ - /* + * Mesa 3-D graphics library + * Version: 3.5 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Author: + * Keith Whitwell <[email protected]> + */ + +#if (HAVE_HW_VIEWPORT) +#define UNVIEWPORT_VARS +#define UNVIEWPORT_X(x) x +#define UNVIEWPORT_Y(x) x +#define UNVIEWPORT_Z(x) x +#endif + +/* These don't need to be duplicated, but there's currently nowhere + * really convenient to put them. Need to build some actual .o files in + * this directory? */ +static void copy_pv_rgba4_spec5( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + GLubyte *verts = GET_VERTEX_STORE(); + GLuint shift = GET_VERTEX_STRIDE_SHIFT(); + GLuint *dst = (GLuint *)(verts + (edst << shift)); + GLuint *src = (GLuint *)(verts + (esrc << shift)); + dst[4] = src[4]; + dst[5] = src[5]; +} + +static void copy_pv_rgba4( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + GLubyte *verts = GET_VERTEX_STORE(); + GLuint shift = GET_VERTEX_STRIDE_SHIFT(); + GLuint *dst = (GLuint *)(verts + (edst << shift)); + GLuint *src = (GLuint *)(verts + (esrc << shift)); + dst[4] = src[4]; +} + +static void copy_pv_rgba3( GLcontext *ctx, GLuint edst, GLuint esrc ) +{ + GLubyte *verts = GET_VERTEX_STORE(); + GLuint shift = GET_VERTEX_STRIDE_SHIFT(); + GLuint *dst = (GLuint *)(verts + (edst << shift)); + GLuint *src = (GLuint *)(verts + (esrc << shift)); + dst[3] = src[3]; +} + + +void TAG(translate_vertex)(GLcontext *ctx, + const VERTEX *src, + SWvertex *dst) +{ + GLuint format = GET_VERTEX_FORMAT(); + GLfloat *s = ctx->Viewport._WindowMap.m; + UNVIEWPORT_VARS; + + if (format == TINY_VERTEX_FORMAT) { + dst->win[0] = s[0] * src->v.x + s[12]; + dst->win[1] = s[5] * src->v.y + s[13]; + dst->win[2] = s[10] * src->v.z + s[14]; + dst->win[3] = 1.0; + + dst->color[0] = src->tv.color.red; + dst->color[1] = src->tv.color.green; + dst->color[2] = src->tv.color.blue; + dst->color[3] = src->tv.color.alpha; + } + else { + GLfloat oow = (HAVE_HW_DIVIDE) ? 1.0 / src->v.w : src->v.w; + + if (HAVE_HW_VIEWPORT) { + dst->win[0] = s[0] * src->v.x * oow + s[12]; + dst->win[1] = s[5] * src->v.y * oow + s[13]; + dst->win[2] = s[10] * src->v.z * oow + s[14]; + dst->win[3] = oow; + } else { + dst->win[0] = UNVIEWPORT_X( src->v.x ); + dst->win[1] = UNVIEWPORT_Y( src->v.y ); + dst->win[2] = UNVIEWPORT_Z( src->v.z ); + dst->win[3] = oow; + } + + dst->color[0] = src->v.color.red; + dst->color[1] = src->v.color.green; + dst->color[2] = src->v.color.blue; + dst->color[3] = src->v.color.alpha; + + dst->specular[0] = src->v.specular.red; + dst->specular[1] = src->v.specular.green; + dst->specular[2] = src->v.specular.blue; + + dst->fog = src->v.color.alpha/255.0; + + if (HAVE_PTEX_VERTICES && + ((HAVE_TEX2_VERTICES && format == PROJ_TEX3_VERTEX_FORMAT) || + (format == PROJ_TEX1_VERTEX_FORMAT))) { + + dst->texcoord[0][0] = src->pv.u0; + dst->texcoord[0][1] = src->pv.v0; + dst->texcoord[0][3] = src->pv.q0; + + dst->texcoord[1][0] = src->pv.u1; + dst->texcoord[1][1] = src->pv.v1; + dst->texcoord[1][3] = src->pv.q1; + + if (HAVE_TEX2_VERTICES) { + dst->texcoord[2][0] = src->pv.u2; + dst->texcoord[2][1] = src->pv.v2; + dst->texcoord[2][3] = src->pv.q2; + } + + if (HAVE_TEX3_VERTICES) { + dst->texcoord[3][0] = src->pv.u3; + dst->texcoord[3][1] = src->pv.v3; + dst->texcoord[3][3] = src->pv.q3; + } + } + else { + dst->texcoord[0][0] = src->v.u0; + dst->texcoord[0][1] = src->v.v0; + dst->texcoord[0][3] = 1.0; + + dst->texcoord[1][0] = src->v.u1; + dst->texcoord[1][1] = src->v.v1; + dst->texcoord[1][3] = 1.0; + + if (HAVE_TEX2_VERTICES) { + dst->texcoord[2][0] = src->v.u2; + dst->texcoord[2][1] = src->v.v2; + dst->texcoord[2][3] = 1.0; + } + + if (HAVE_TEX3_VERTICES) { + dst->texcoord[3][0] = src->v.u3; + dst->texcoord[3][1] = src->v.v3; + dst->texcoord[3][3] = 1.0; + } + } + } + + dst->pointSize = ctx->Point._Size; +} + +#if 0 +static void +mga_translate_vertex( GLcontext *ctx, const mgaVertex *src, SWvertex *dst) +{ + mgaContextPtr mmesa = MGA_CONTEXT(ctx); + + dst->win[0] = src->v.x - mmesa->drawX - SUBPIXEL_X; + dst->win[1] = - src->v.y + mmesa->driDrawable->h + mmesa->drawY + SUBPIXEL_Y; + dst->win[2] = src->v.z / mmesa->depth_scale; + dst->win[3] = src->v.oow; + + dst->color[0] = src->v.color.red; + dst->color[1] = src->v.color.green; + dst->color[2] = src->v.color.blue; + dst->color[3] = src->v.color.alpha; + + if (mmesa->tmu_source[0] == 0) { + dst->texcoord[0][0] = src->v.tu0; + dst->texcoord[0][1] = src->v.tv0; + dst->texcoord[0][3] = 1.0; + } else { + dst->texcoord[1][0] = src->v.tu0; + dst->texcoord[1][1] = src->v.tv0; + dst->texcoord[1][3] = 1.0; + } + + dst->texcoord[1][0] = src->v.tu1; + dst->texcoord[1][1] = src->v.tv1; + dst->texcoord[1][3] = 1.0; + + dst->pointSize = ctx->Point._Size; +} +#endif + + +void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v ) +{ + GLuint format = GET_VERTEX_FORMAT(); + + if (format == TINY_VERTEX_FORMAT) { + fprintf(stderr, "x %f y %f z %f\n", v->v.x, v->v.y, v->v.z); + fprintf(stderr, "r %d g %d b %d a %d\n", + v->tv.color.red, + v->tv.color.green, + v->tv.color.blue, + v->tv.color.alpha); + } + else { + fprintf(stderr, "x %f y %f z %f oow %f\n", + v->v.x, v->v.y, v->v.z, v->v.w); + fprintf(stderr, "r %d g %d b %d a %d\n", + v->v.color.red, + v->v.color.green, + v->v.color.blue, + v->v.color.alpha); + } + + fprintf(stderr, "\n"); +} + +#undef TAG diff --git a/src/mesa/drivers/common/t_dd_vbtmp.h b/src/mesa/drivers/common/t_dd_vbtmp.h index 4490f099b7f..4e769c48ac1 100644 --- a/src/mesa/drivers/common/t_dd_vbtmp.h +++ b/src/mesa/drivers/common/t_dd_vbtmp.h @@ -70,8 +70,7 @@ * DO_TEX3: Emit tex3 u,v coordinates. * DO_PTEX: Emit tex0,1,2,3 q coordinates where possible. * - * HAVE_RGBA_COLOR: Hardware takes color in rgba order. - * HAVE_BGRA_COLOR: Hardware takes color in bgra order. + * HAVE_RGBA_COLOR: Hardware takes color in rgba order (else bgra). * * HAVE_HW_VIEWPORT: Hardware performs viewport transform. * HAVE_HW_DIVIDE: Hardware performs perspective divide. @@ -91,16 +90,20 @@ */ #if (HAVE_HW_VIEWPORT) -#define VIEWPORT_X(x) x -#define VIEWPORT_Y(x) x -#define VIEWPORT_Z(x) x +#define VIEWPORT_X(dst,x) dst = x +#define VIEWPORT_Y(dst,y) dst = y +#define VIEWPORT_Z(dst,z) dst = z #else -#define VIEWPORT_X(x) (s[0] * x + s[12]) -#define VIEWPORT_Y(y) (s[5] * y + s[13]) -#define VIEWPORT_Z(z) (s[10] * z + s[14]) +#define VIEWPORT_X(dst,x) dst = s[0] * x + s[12] +#define VIEWPORT_Y(dst,y) dst = s[5] * y + s[13] +#define VIEWPORT_Z(dst,z) dst = s[10] * z + s[14] #endif -#if (HAVE_HW_DIVIDE || DO_RGBA || DO_XYZW || !HAVE_TINY_VERTICES) +#if (HAVE_HW_DIVIDE && !HAVE_PTEX_VERTICES) +#error "can't cope with this combination" +#endif + +#if (HAVE_HW_DIVIDE || DO_SPEC || DO_TEX0 || DO_FOG || !HAVE_TINY_VERTICES) static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, @@ -109,15 +112,21 @@ static void TAG(emit)( GLcontext *ctx, { struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; GLfloat (*tc0)[4], (*tc1)[4], *fog; + GLfloat (*tc2)[4], (*tc3)[4]; GLubyte (*col)[4], (*spec)[4]; GLuint tc0_stride, tc1_stride, col_stride, spec_stride, fog_stride; + GLuint tc2_stride, tc3_stride; GLuint tc0_size, tc1_size; + GLuint tc2_size, tc3_size; GLfloat (*coord)[4]; GLuint coord_stride; VERTEX *v = (VERTEX *)dest; const GLfloat *s = GET_VIEWPORT_MAT(); + const GLubyte *mask = VB->ClipMask; int i; +/* fprintf(stderr, "%s\n", __FUNCTION__); */ + if (HAVE_HW_VIEWPORT && HAVE_HW_DIVIDE) { (void) s; coord = VB->ClipPtr->data; @@ -128,52 +137,58 @@ static void TAG(emit)( GLcontext *ctx, coord_stride = VB->ProjectedClipPtr->stride; } - if (DO_TEX0) { - tc0_stride = VB->TexCoordPtr[0]->stride; - tc0 = VB->TexCoordPtr[0]->data; - if (DO_PTEX) - tc0_size = VB->TexCoordPtr[0]->size; - } + if (DO_TEX3) { + const GLuint t3 = GET_TEXSOURCE(3); - if (DO_TEX1) { - if (VB->TexCoordPtr[0] == 0) - VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; - - tc1 = VB->TexCoordPtr[1]->data; - tc1_stride = VB->TexCoordPtr[1]->stride; + if (VB->TexCoordPtr[2] == 0) { + if (VB->TexCoordPtr[1] == 0) { + if (VB->TexCoordPtr[0] == 0) + VB->TexCoordPtr[0] = VB->TexCoordPtr[t3]; + VB->TexCoordPtr[1] = VB->TexCoordPtr[t3]; + } + VB->TexCoordPtr[2] = VB->TexCoordPtr[t3]; + } + + tc3 = VB->TexCoordPtr[t3]->data; + tc3_stride = VB->TexCoordPtr[t3]->stride; if (DO_PTEX) - tc1_size = VB->TexCoordPtr[1]->size; + tc3_size = VB->TexCoordPtr[t3]->size; } if (DO_TEX2) { + const GLuint t2 = GET_TEXSOURCE(2); + if (VB->TexCoordPtr[1] == 0) { if (VB->TexCoordPtr[0] == 0) - VB->TexCoordPtr[0] = VB->TexCoordPtr[2]; - VB->TexCoordPtr[1] = VB->TexCoordPtr[2]; + VB->TexCoordPtr[0] = VB->TexCoordPtr[t2]; + VB->TexCoordPtr[1] = VB->TexCoordPtr[t2]; } - tc2 = VB->TexCoordPtr[2]->data; - tc2_stride = VB->TexCoordPtr[2]->stride; + tc2 = VB->TexCoordPtr[t2]->data; + tc2_stride = VB->TexCoordPtr[t2]->stride; if (DO_PTEX) - tc2_size = VB->TexCoordPtr[2]->size; + tc2_size = VB->TexCoordPtr[t2]->size; } - if (DO_TEX3) { - if (VB->TexCoordPtr[2] == 0) { - if (VB->TexCoordPtr[1] == 0) { - if (VB->TexCoordPtr[0] == 0) - VB->TexCoordPtr[0] = VB->TexCoordPtr[3]; - VB->TexCoordPtr[1] = VB->TexCoordPtr[3]; - } - VB->TexCoordPtr[2] = VB->TexCoordPtr[3]; - } - tc3 = VB->TexCoordPtr[3]->data; - tc3_stride = VB->TexCoordPtr[3]->stride; + if (DO_TEX1) { + const GLuint t1 = GET_TEXSOURCE(1); + if (VB->TexCoordPtr[0] == 0) + VB->TexCoordPtr[0] = VB->TexCoordPtr[t1]; + tc1 = VB->TexCoordPtr[1]->data; + tc1_stride = VB->TexCoordPtr[1]->stride; if (DO_PTEX) - tc3_size = VB->TexCoordPtr[3]->size; + tc1_size = VB->TexCoordPtr[1]->size; } - + + if (DO_TEX0) { + const GLuint t0 = GET_TEXSOURCE(0); + tc0_stride = VB->TexCoordPtr[t0]->stride; + tc0 = VB->TexCoordPtr[t0]->data; + if (DO_PTEX) + tc0_size = VB->TexCoordPtr[t0]->size; + } + if (DO_RGBA) { col = VB->ColorPtr[0]->data; col_stride = VB->ColorPtr[0]->stride; @@ -210,17 +225,16 @@ static void TAG(emit)( GLcontext *ctx, STRIDE_F(fog, start * fog_stride); } - for (i=start; i < end; i++, v = (ddVertex *)((GLubyte *)v + stride)) { + for (i=start; i < end; i++, v = (VERTEX *)((GLubyte *)v + stride)) { if (DO_XYZW) { if (HAVE_HW_VIEWPORT || mask[i] == 0) { VIEWPORT_X(v->v.x, coord[0][0]); VIEWPORT_Y(v->v.y, coord[0][1]); VIEWPORT_Z(v->v.z, coord[0][2]); - VIEWPORT_W(v->v.w, coord[0][3]); + v->v.w = coord[0][3]; } coord = (GLfloat (*)[4])((GLubyte *)coord + coord_stride); } - NOTE_W; if (DO_RGBA) { if (HAVE_RGBA_COLOR) { *(GLuint *)&v->v.color = *(GLuint *)&col[0]; @@ -244,20 +258,20 @@ static void TAG(emit)( GLcontext *ctx, STRIDE_F(fog, fog_stride); } if (DO_TEX0) { - v->v.tu0 = tc0[0][0]; - v->v.tv0 = tc0[0][1]; + v->v.u0 = tc0[0][0]; + v->v.v0 = tc0[0][1]; if (DO_PTEX) { if (HAVE_PTEX_VERTICES) { if (tc0_size == 4) - v->pv.tq0 = tc0[0][3]; + v->pv.q0 = tc0[0][3]; else - v->pv.tq0 = 1.0; + v->pv.q0 = 1.0; } else if (tc0_size == 4) { float rhw = 1.0 / tc0[0][3]; v->v.w *= tc0[0][3]; - v->v.u0 *= w; - v->v.v0 *= w; + v->v.u0 *= rhw; + v->v.v0 *= rhw; } } tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride); @@ -313,16 +327,15 @@ static void TAG(emit)( GLcontext *ctx, } } else { - for (i=start; i < end; i++, v = (ddVertex *)((GLubyte *)v + stride)) { + for (i=start; i < end; i++, v = (VERTEX *)((GLubyte *)v + stride)) { if (DO_XYZW) { if (HAVE_HW_VIEWPORT || mask[i] == 0) { VIEWPORT_X(v->v.x, coord[i][0]); VIEWPORT_Y(v->v.y, coord[i][1]); VIEWPORT_Z(v->v.z, coord[i][2]); - VIEWPORT_W(v->v.w, coord[i][3]); + v->v.w = coord[i][3]; } } - NOTE_W; if (DO_RGBA) { if (HAVE_RGBA_COLOR) { *(GLuint *)&v->v.color = *(GLuint *)&col[i]; @@ -348,9 +361,9 @@ static void TAG(emit)( GLcontext *ctx, v->pv.v0 = tc0[i][1]; if (HAVE_PTEX_VERTICES) { if (tc0_size == 4) - v->pv.tq0 = tc0[i][3]; + v->pv.q0 = tc0[i][3]; else - v->pv.tq0 = 1.0; + v->pv.q0 = 1.0; v->pv.q1 = 0; /* radeon */ } @@ -388,6 +401,12 @@ static void TAG(emit)( GLcontext *ctx, } } #else +#if DO_XYZW + +#if HAVE_HW_DIVIDE +#error "cannot use tiny vertices with hw perspective divide" +#endif + static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest, GLuint stride ) { @@ -397,8 +416,14 @@ static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, GLfloat (*coord)[4] = VB->ProjectedClipPtr->data; GLuint coord_stride = VB->ProjectedClipPtr->stride; GLfloat *v = (GLfloat *)dest; + const GLubyte *mask = VB->ClipMask; + const GLfloat *s = GET_VIEWPORT_MAT(); int i; + (void) s; + +/* fprintf(stderr, "%s (template 2)\n", __FUNCTION__); */ + ASSERT(stride == 4); /* Pack what's left into a 4-dword vertex. Color is in a different @@ -412,9 +437,9 @@ static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, for (i=start; i < end; i++, v+=4) { if (HAVE_HW_VIEWPORT || mask[i] == 0) { - v[0] = VIEWPORT_X(coord[0][0]); - v[1] = VIEWPORT_Y(coord[0][1]); - v[2] = VIEWPORT_Z(coord[0][2]); + VIEWPORT_X(v[0], coord[0][0]); + VIEWPORT_Y(v[1], coord[0][1]); + VIEWPORT_Z(v[2], coord[0][2]); } coord = (GLfloat (*)[4])((GLubyte *)coord + coord_stride); if (DO_RGBA) { @@ -435,9 +460,9 @@ static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, else { for (i=start; i < end; i++, v+=4) { if (HAVE_HW_VIEWPORT || mask[i] == 0) { - v[0] = VIEWPORT_X(coord[i][0]); - v[1] = VIEWPORT_Y(coord[i][1]); - v[2] = VIEWPORT_Z(coord[i][2]); + VIEWPORT_X(v[0], coord[i][0]); + VIEWPORT_Y(v[1], coord[i][1]); + VIEWPORT_Z(v[2], coord[i][2]); } if (DO_RGBA) { if (HAVE_RGBA_COLOR) { @@ -454,7 +479,42 @@ static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, } } } -#endif +#else +static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, + void *dest, GLuint stride ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLubyte (*col)[4] = VB->ColorPtr[0]->data; + GLuint col_stride = VB->ColorPtr[0]->stride; + GLfloat *v = (GLfloat *)dest; + int i; + + if (start) + STRIDE_4UB(col, col_stride * start); + + /* Need to figure out where color is: + */ + if (GET_VERTEX_FORMAT() == TINY_VERTEX_FORMAT) + v += 3; + else + v += 4; + + for (i=start; i < end; i++, STRIDE_F(v, stride)) { + if (HAVE_RGBA_COLOR) { + *(GLuint *)v = *(GLuint *)col[0]; + } + else { + GLubyte *b = (GLubyte *)v; + b[0] = col[0][2]; + b[1] = col[0][1]; + b[2] = col[0][0]; + b[3] = col[0][3]; + } + STRIDE_4UB( col, col_stride ); + } +} +#endif /* emit */ +#endif /* emit */ #if (DO_XYZW) && (DO_RGBA) @@ -501,10 +561,9 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) return GL_TRUE; } -#endif +#endif /* ptex */ -#if (!DO_PTEX || HAVE_PTEX_VERTICES) static void TAG(interp)( GLcontext *ctx, GLfloat t, GLuint edst, GLuint eout, GLuint ein, @@ -517,14 +576,11 @@ static void TAG(interp)( GLcontext *ctx, GLfloat w; const GLfloat *s = GET_VIEWPORT_MAT(); - (void)s; - VERTEX *dst = (VERTEX *)(ddverts + (edst << shift)); VERTEX *in = (VERTEX *)(ddverts + (eout << shift)); VERTEX *out = (VERTEX *)(ddverts + (ein << shift)); - PREPARE_PROJIN; - PREPARE_PROJOUT; + (void)s; /* fprintf(stderr, "%s\n", __FUNCTION__); */ @@ -561,10 +617,29 @@ static void TAG(interp)( GLcontext *ctx, INTERP_UB( t, dst->ub4[5][3], out->ub4[5][3], in->ub4[5][3] ); } if (DO_TEX0) { - if (DO_PTEX && HAVE_PTEX_VERTICES) { - INTERP_F( t, dst->pv.u0, out->pv.u0, in->pv.u0 ); - INTERP_F( t, dst->pv.v0, out->pv.v0, in->pv.v0 ); - INTERP_F( t, dst->pv.q0, out->pv.q0, in->pv.q0 ); + if (DO_PTEX) { + if (HAVE_PTEX_VERTICES) { + INTERP_F( t, dst->pv.u0, out->pv.u0, in->pv.u0 ); + INTERP_F( t, dst->pv.v0, out->pv.v0, in->pv.v0 ); + INTERP_F( t, dst->pv.q0, out->pv.q0, in->pv.q0 ); + } else { + GLfloat wout = VB->ProjectedClipPtr->data[eout][3]; + GLfloat win = VB->ProjectedClipPtr->data[ein][3]; + GLfloat qout = out->pv.w / wout; + GLfloat qin = in->pv.w / win; + GLfloat qdst, rqdst; + + ASSERT( !HAVE_HW_DIVIDE ); + + 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 ); + INTERP_F( t, qdst, qout, qin ); + + rqdst = 1.0 / qdst; + dst->v.u0 *= rqdst; + dst->v.v0 *= rqdst; + dst->v.w *= rqdst; + } } else { INTERP_F( t, dst->v.u0, out->v.u0, in->v.u0 ); @@ -613,105 +688,8 @@ static void TAG(interp)( GLcontext *ctx, INTERP_UB( t, dst->ub4[3][3], out->ub4[3][3], in->ub4[3][3] ); } } -#endif -/* Build an SWvertex from a hardware vertex. - * - * This code is hit only when a mix of accelerated and unaccelerated - * primitives are being drawn, and only for the unaccelerated - * primitives. - */ -static void -TAG(translate_vertex)( GLcontext *ctx, const radeonVertex *src, SWvertex *dst) -{ - HW_CONTEXT; - GLfloat *s = ctx->Viewport._WindowMap.m; - - if (USE_TINY_VERT) { - if (HAVE_HW_VIEWPORT) { - dst->win[0] = s[0] * src->v.x + s[12]; - dst->win[1] = s[5] * src->v.y + s[13]; - dst->win[2] = s[10] * src->v.z + s[14]; - dst->win[3] = 1.0; - } else { - dst->win[0] = ADJ_X(src->v.x); - dst->win[1] = ADJ_Y(src->v.y); - dst->win[2] = ADJ_Z(src->v.z); - dst->win[3] = 1.0; - } - - dst->color[0] = src->tv.color.red; - dst->color[1] = src->tv.color.green; - dst->color[2] = src->tv.color.blue; - dst->color[3] = src->tv.color.alpha; - } - else { - if (HAVE_HW_VIEWPORT) { - if (HAVE_HW_DIVIDE) { - GLfloat oow = 1.0 / src->v.rhw; - dst->win[0] = s[0] * src->v.x * oow + s[12]; - dst->win[1] = s[5] * src->v.y * oow + s[13]; - dst->win[2] = s[10] * src->v.z * oow + s[14]; - dst->win[3] = oow; - } - else { - dst->win[0] = s[0] * src->v.x + s[12]; - dst->win[1] = s[5] * src->v.y + s[13]; - dst->win[2] = s[10] * src->v.z + s[14]; - dst->win[3] = src->v.rhw; - } - } else { - dst->win[0] = ADJ_X(src->v.x); - dst->win[1] = ADJ_Y(src->v.y); - dst->win[2] = ADJ_Z(src->v.z); - dst->win[3] = src->v.rhw; - } - - dst->color[0] = src->v.color.red; - dst->color[1] = src->v.color.green; - dst->color[2] = src->v.color.blue; - dst->color[3] = src->v.color.alpha; - - if (DO_SPEC) { - dst->specular[0] = src->v.specular.red; - dst->specular[1] = src->v.specular.green; - dst->specular[2] = src->v.specular.blue; - } - - if (DO_FOG) { - dst->fog = src->v.color.alpha/255.0; - } - - if (DO_PTEX) { - if (DO_TEX0) { - dst->texcoord[0][0] = src->pv.u0; - dst->texcoord[0][1] = src->pv.v0; - dst->texcoord[0][3] = src->pv.q0; - } - if (DO_TEX1) { - dst->texcoord[1][0] = src->pv.u1; - dst->texcoord[1][1] = src->pv.v1; - dst->texcoord[1][3] = src->pv.q1; - } - } else { - if (DO_TEX0) { - dst->texcoord[0][0] = src->v.u0; - dst->texcoord[0][1] = src->v.v0; - dst->texcoord[0][3] = 1.0; - } - if (DO_TEX1) { - dst->texcoord[1][0] = src->v.u1; - dst->texcoord[1][1] = src->v.v1; - dst->texcoord[1][3] = 1.0; - } - } - } - - dst->pointSize = ctx->Point._Size; -} - -#endif -#endif +#endif /* rgba && xyzw */ static void TAG(init)( void ) @@ -724,12 +702,12 @@ static void TAG(init)( void ) #endif if (DO_SPEC) - setup_tab[IND].copy_pv = _tnl_dd_copy_pv_rgba4_spec5; + setup_tab[IND].copy_pv = copy_pv_rgba4_spec5; else if (HAVE_HW_DIVIDE || DO_SPEC || DO_FOG || DO_TEX0 || DO_TEX1 || DO_TEX2 || DO_TEX3) - setup_tab[IND].copy_pv = _tnl_dd_copy_pv_rgba4; + setup_tab[IND].copy_pv = copy_pv_rgba4; else - setup_tab[IND].copy_pv = _tnl_dd_copy_pv_rgba3; + setup_tab[IND].copy_pv = copy_pv_rgba3; if (DO_TEX3) { if (DO_PTEX) { @@ -747,7 +725,6 @@ static void TAG(init)( void ) else if (DO_TEX2) { if (DO_PTEX) { ASSERT(HAVE_PTEX_VERTICES); - ASSERT(0); /* issue to resolve: odd vertex size */ setup_tab[IND].vertex_format = PROJ_TEX3_VERTEX_FORMAT; setup_tab[IND].vertex_size = 18; setup_tab[IND].vertex_stride_shift = 7; diff --git a/src/mesa/drivers/common/t_dd_vertex.h b/src/mesa/drivers/common/t_dd_vertex.h new file mode 100644 index 00000000000..fcb734072bf --- /dev/null +++ b/src/mesa/drivers/common/t_dd_vertex.h @@ -0,0 +1,70 @@ +/* + * Mesa 3-D graphics library + * Version: 3.5 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Author: + * Keith Whitwell <[email protected]> + */ + +#if (COLOR_IS_RBGA) +typedef struct { + GLubyte red; + GLubyte green; + GLubyte blue; + GLubyte alpha; +} TAG(_color); +#else +typedef struct { + GLubyte blue; + GLubyte green; + GLubyte red; + GLubyte alpha; +} TAG(_color); +#endif + +typedef union { + struct { + float x, y, z, w; + TAG(_color) color; + TAG(_color) specular; + float u0, v0; + float u1, v1; + float u2, v2; + float u3, v3; + } v; + struct { + float x, y, z, w; + TAG(_color) color; + TAG(_color) specular; + float u0, v0, q0; + float u1, v1, q1; + float u2, v2, q2; + float u3, v3, q3; + } pv; + struct { + float x, y, z; + TAG(_color) color; + } tv; + float f[16]; + unsigned int ui[16]; + unsigned char ub4[4][16]; +} TAG(Vertex), *TAG(VertexPtr); |