diff options
33 files changed, 779 insertions, 1100 deletions
diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c index 306e0be3b96..b36cbee47c6 100644 --- a/src/mesa/drivers/glide/fxdd.c +++ b/src/mesa/drivers/glide/fxdd.c @@ -651,8 +651,7 @@ static const GLubyte *fxDDGetString(GLcontext *ctx, GLenum name) } static const struct gl_pipeline_stage *fx_pipeline[] = { - &_tnl_update_material_stage, - /* TODO: Add the fastpath here */ + &_tnl_update_material_stage, /* TODO: Add the fastpath here */ &_tnl_vertex_transform_stage, &_tnl_normal_transform_stage, &_tnl_lighting_stage, @@ -660,8 +659,7 @@ static const struct gl_pipeline_stage *fx_pipeline[] = { &_tnl_texgen_stage, &_tnl_texture_transform_stage, &_tnl_point_attenuation_stage, - &fx_render_stage, /* ADD: render simple unclipped vb's */ - &_tnl_render_stage, /* KEEP: the old render stage for fallbacks */ + &_tnl_render_stage, 0, }; @@ -680,7 +678,6 @@ int fxDDInitFxMesaContext( fxMesaContext fxMesa ) if (firsttime) { fxDDSetupInit(); fxDDTrifuncInit(); -/* fxDDFastPathInit(); */ firsttime = 0; } diff --git a/src/mesa/drivers/glide/fxdrv.h b/src/mesa/drivers/glide/fxdrv.h index 38ce0ce2dab..cefd6d0e1a9 100644 --- a/src/mesa/drivers/glide/fxdrv.h +++ b/src/mesa/drivers/glide/fxdrv.h @@ -509,7 +509,7 @@ struct tfxMesaContext { GLuint size; }; -typedef void (*tfxSetupFunc)(GLcontext *ctx, GLuint, GLuint, GLuint); +typedef void (*tfxSetupFunc)(GLcontext *ctx, GLuint, GLuint ); extern GrHwConfiguration glbHWConfig; extern int glbCurrentBoard; diff --git a/src/mesa/drivers/glide/fxtris.c b/src/mesa/drivers/glide/fxtris.c index 7d887133b61..11072a26012 100644 --- a/src/mesa/drivers/glide/fxtris.c +++ b/src/mesa/drivers/glide/fxtris.c @@ -11,6 +11,7 @@ #include "swrast_setup/swrast_setup.h" #include "tnl/t_context.h" +#include "tnl/t_pipeline.h" #include "fxdrv.h" #include "fxglidew.h" @@ -469,6 +470,56 @@ fx_null_tri( GLcontext *ctx, + +/**********************************************************************/ +/* Render whole begin/end objects */ +/**********************************************************************/ + + +/* Vertices, no clipping. + */ +#define RENDER_POINTS( start, count ) \ + for ( ; start < count ; start++) \ + grDrawPoint( &v[ELT(start)].v ); + +#define RENDER_LINE( i1, i ) \ + grDrawLine( &v[i1].v, &v[i].v ) + +#define RENDER_TRI( i2, i1, i ) \ + grDrawTriangle( &v[i2].v, &v[i1].v, &v[i].v ) + +#define RENDER_QUAD( i3, i2, i1, i ) \ + grDrawTriangle( &v[i3].v, &v[i2].v, &v[i].v ); \ + grDrawTriangle( &v[i2].v, &v[i1].v, &v[i].v ) + +#define TAG(x) fx_##x##_verts +#define LOCAL_VARS \ + fxVertex *v = FX_CONTEXT(ctx)->verts; + +/* Verts, no clipping. + */ +#define ELT(x) x +#define RESET_STIPPLE +#define RESET_OCCLUSION +#define PRESERVE_VB_DEFS +#include "tnl/t_vb_rendertmp.h" + + +/* Elts, no clipping. + */ +#undef ELT +#undef TAG +#undef LOCAL_VARS +#define TAG(x) fx_##x##_elts +#define ELT(x) elt[x] +#define LOCAL_VARS \ + fxVertex *v = FX_CONTEXT(ctx)->verts; \ + const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; +#include "tnl/t_vb_rendertmp.h" + + + + /* Setup the Point, Line, Triangle and Quad functions based on the * current rendering state. Wherever possible, use the hardware to * render the primitive. Otherwise, fallback to software rendering. @@ -487,6 +538,8 @@ void fxDDChooseRenderState( GLcontext *ctx ) ctx->Driver.LineFunc = _swsetup_Line; ctx->Driver.TriangleFunc = _swsetup_Triangle; ctx->Driver.QuadFunc = _swsetup_Quad; + ctx->Driver.RenderTabVerts = _tnl_render_tab_verts; + ctx->Driver.RenderTabElts = _tnl_render_tab_elts; fxMesa->render_index = FX_FALLBACK_BIT; return; @@ -549,9 +602,19 @@ void fxDDChooseRenderState( GLcontext *ctx ) ctx->Driver.TriangleFunc = rast_tab[index].triangle; ctx->Driver.QuadFunc = rast_tab[index].quad; fxMesa->render_index = index; + + if (fxMesa->render_index == 0) { + ctx->Driver.RenderTabVerts = fx_render_tab_verts; + ctx->Driver.RenderTabElts = fx_render_tab_elts; + } else { + ctx->Driver.RenderTabVerts = _tnl_render_tab_verts; + ctx->Driver.RenderTabElts = _tnl_render_tab_elts; + } } + + #else diff --git a/src/mesa/drivers/glide/fxvb.c b/src/mesa/drivers/glide/fxvb.c index 22128e61f6b..3138d59649d 100644 --- a/src/mesa/drivers/glide/fxvb.c +++ b/src/mesa/drivers/glide/fxvb.c @@ -238,10 +238,10 @@ static tfxSetupFunc setupfuncs[MAX_SETUP]; static void -fxsetup_invalid( GLcontext *ctx, GLuint start, GLuint end, GLuint newinputs ) +fxsetup_invalid( GLcontext *ctx, GLuint start, GLuint end ) { fprintf(stderr, "fxMesa: invalid setup function\n"); - (void) (ctx && start && end && newinputs); + (void) (ctx && start && end); } @@ -334,43 +334,49 @@ void fx_BuildProjVerts( GLcontext *ctx, GLuint start, GLuint count, { fxMesaContext fxMesa = FX_CONTEXT(ctx); struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLuint ind = fxMesa->setup_gone; - fxMesa->setup_gone = 0; + if (newinputs == ~0) { + /* build interpolated vertices */ + setupfuncs[fxMesa->setupindex]( ctx, start, count ); + } else { + GLuint ind = fxMesa->setup_gone; + fxMesa->setup_gone = 0; - if (newinputs & VERT_CLIP) - ind = fxMesa->setupindex; /* clipmask has changed - invalidated all */ - else { - if (newinputs & VERT_TEX0) - ind |= fxMesa->tex_dest[0]; + if (newinputs & VERT_CLIP) + ind = fxMesa->setupindex; /* clipmask has potentially changed */ + else { + if (newinputs & VERT_TEX0) + ind |= fxMesa->tex_dest[0]; - if (newinputs & VERT_TEX1) - ind |= fxMesa->tex_dest[1]; - - if (newinputs & VERT_RGBA) - ind |= SETUP_RGBA; - - ind &= fxMesa->setupindex; - } + if (newinputs & VERT_TEX1) + ind |= fxMesa->tex_dest[1]; - if (0) { - _tnl_print_vert_flags("newinputs", newinputs); - fxPrintSetupFlags("setup function", ind); - } + if (newinputs & VERT_RGBA) + ind |= SETUP_RGBA; - if (fxMesa->new_state) - fxSetupFXUnits( ctx ); + ind &= fxMesa->setupindex; + } - if (VB->importable_data) - VB->import_data( ctx, VB->importable_data & newinputs, - (VB->ClipOrMask - ? VEC_NOT_WRITEABLE|VEC_BAD_STRIDE - : VEC_BAD_STRIDE)); + if (0) { + _tnl_print_vert_flags("newinputs", newinputs); + fxPrintSetupFlags("setup function", ind); + } - setupfuncs[ind]( ctx, start, count, newinputs ); + if (ind) { + if (fxMesa->new_state) + fxSetupFXUnits( ctx ); + + if (VB->importable_data) + VB->import_data( ctx, VB->importable_data & newinputs, + (VB->ClipOrMask + ? VEC_NOT_WRITEABLE|VEC_BAD_STRIDE + : VEC_BAD_STRIDE)); + + setupfuncs[ind]( ctx, start, count ); + } + } } - void fxAllocVB( GLcontext *ctx ) { fxMesaContext fxMesa = FX_CONTEXT(ctx); diff --git a/src/mesa/drivers/glide/fxvbtmp.h b/src/mesa/drivers/glide/fxvbtmp.h index af21fc40af2..0133758295c 100644 --- a/src/mesa/drivers/glide/fxvbtmp.h +++ b/src/mesa/drivers/glide/fxvbtmp.h @@ -27,7 +27,7 @@ */ -static void NAME(GLcontext *ctx, GLuint start, GLuint end, GLuint newinputs) +static void NAME(GLcontext *ctx, GLuint start, GLuint end ) { fxMesaContext fxMesa = (fxMesaContext)ctx->DriverCtx; fxVertex *verts = fxMesa->verts; diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c index 6148100e222..f26ed3867e1 100644 --- a/src/mesa/drivers/osmesa/osmesa.c +++ b/src/mesa/drivers/osmesa/osmesa.c @@ -1,4 +1,4 @@ -/* $Id: osmesa.c,v 1.36 2001/01/02 22:02:52 brianp Exp $ */ +/* $Id: osmesa.c,v 1.37 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -55,6 +55,7 @@ #include "swrast/s_lines.h" #include "swrast/s_triangle.h" #include "tnl/tnl.h" +#include "array_cache/acache.h" #endif @@ -313,6 +314,7 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, GLcontext *ctx = &osmesa->gl_ctx; _swrast_CreateContext( ctx ); + _ac_CreateContext( ctx ); _tnl_CreateContext( ctx ); _swsetup_CreateContext( ctx ); @@ -1752,5 +1754,6 @@ static void osmesa_update_state( GLcontext *ctx, GLuint new_state ) _swrast_InvalidateState( ctx, new_state ); _swsetup_InvalidateState( ctx, new_state ); + _ac_InvalidateState( ctx, new_state ); _tnl_InvalidateState( ctx, new_state ); } diff --git a/src/mesa/drivers/x11/xm_line.c b/src/mesa/drivers/x11/xm_line.c index c76de401c88..e9bbfbca417 100644 --- a/src/mesa/drivers/x11/xm_line.c +++ b/src/mesa/drivers/x11/xm_line.c @@ -1,4 +1,4 @@ -/* $Id: xm_line.c,v 1.14 2001/01/02 22:02:52 brianp Exp $ */ +/* $Id: xm_line.c,v 1.15 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -127,7 +127,7 @@ static void flat_TRUECOLOR_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; XMesaImage *img = xmesa->xm_buffer->backimage; unsigned long pixel; PACK_TRUECOLOR( pixel, color[0], color[1], color[2] ); @@ -148,7 +148,7 @@ static void flat_8A8B8G8R_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLuint pixel = PACK_8B8G8R( color[0], color[1], color[2] ); #define PIXEL_TYPE GLuint @@ -168,7 +168,7 @@ static void flat_8R8G8B_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] ); #define PIXEL_TYPE GLuint @@ -188,7 +188,7 @@ static void flat_8R8G8B24_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; #define PIXEL_TYPE bgr_t #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) @@ -211,7 +211,7 @@ static void flat_5R6G5B_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLushort pixel = PACK_5R6G5B( color[0], color[1], color[2] ); #define PIXEL_TYPE GLushort @@ -231,7 +231,7 @@ static void flat_DITHER_5R6G5B_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; #define PIXEL_TYPE GLushort #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) @@ -251,7 +251,7 @@ static void flat_DITHER8_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLint r = color[0], g = color[1], b = color[2]; DITHER_SETUP; @@ -273,7 +273,7 @@ static void flat_LOOKUP8_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLubyte pixel; LOOKUP_SETUP; pixel = (GLubyte) LOOKUP( color[0], color[1], color[2] ); @@ -295,7 +295,7 @@ static void flat_HPCR_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLint r = color[0], g = color[1], b = color[2]; #define INTERP_XY 1 @@ -317,7 +317,7 @@ static void flat_TRUECOLOR_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; XMesaImage *img = xmesa->xm_buffer->backimage; unsigned long pixel; PACK_TRUECOLOR( pixel, color[0], color[1], color[2] ); @@ -343,7 +343,7 @@ static void flat_8A8B8G8R_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLuint pixel = PACK_8B8G8R( color[0], color[1], color[2] ); #define INTERP_Z 1 @@ -369,7 +369,7 @@ static void flat_8R8G8B_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLuint pixel = PACK_8R8G8B( color[0], color[1], color[2] ); #define INTERP_Z 1 @@ -395,7 +395,7 @@ static void flat_8R8G8B24_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE @@ -422,7 +422,7 @@ static void flat_5R6G5B_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLushort pixel = PACK_5R6G5B( color[0], color[1], color[2] ); #define INTERP_Z 1 @@ -447,7 +447,7 @@ static void flat_DITHER_5R6G5B_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE @@ -471,7 +471,7 @@ static void flat_DITHER8_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLint r = color[0], g = color[1], b = color[2]; DITHER_SETUP; @@ -498,7 +498,7 @@ static void flat_LOOKUP8_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLubyte pixel; LOOKUP_SETUP; pixel = (GLubyte) LOOKUP( color[0], color[1], color[2] ); @@ -526,7 +526,7 @@ static void flat_HPCR_z_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = vert0->color; + const GLubyte *color = vert1->color; GLint r = color[0], g = color[1], b = color[2]; #define INTERP_XY 1 diff --git a/src/mesa/drivers/x11/xm_tri.c b/src/mesa/drivers/x11/xm_tri.c index dbd252c50c6..12f1f49a48f 100644 --- a/src/mesa/drivers/x11/xm_tri.c +++ b/src/mesa/drivers/x11/xm_tri.c @@ -1,4 +1,4 @@ -/* $Id: xm_tri.c,v 1.15 2001/01/02 22:02:52 brianp Exp $ */ +/* $Id: xm_tri.c,v 1.16 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -451,7 +451,7 @@ static void flat_TRUECOLOR_z_triangle( GLcontext *ctx, #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define SETUP_CODE \ unsigned long pixel; \ - PACK_TRUECOLOR(pixel, v0->color[0], v0->color[1], v0->color[2]); + PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -485,8 +485,8 @@ static void flat_8A8B8G8R_z_triangle( GLcontext *ctx, #define PIXEL_TYPE GLuint #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - unsigned long p = PACK_8B8G8R( v0->color[0], \ - v0->color[1], v0->color[2] ); + unsigned long p = PACK_8B8G8R( v2->color[0], \ + v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint i, len = RIGHT-LEFT; \ @@ -519,8 +519,8 @@ static void flat_8R8G8B_z_triangle( GLcontext *ctx, #define PIXEL_TYPE GLuint #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - unsigned long p = PACK_8R8G8B( v0->color[0], \ - v0->color[1], v0->color[2] ); + unsigned long p = PACK_8R8G8B( v2->color[0], \ + v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint i, len = RIGHT-LEFT; \ @@ -547,7 +547,7 @@ static void flat_8R8G8B24_z_triangle( GLcontext *ctx, const SWvertex *v2 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = v0->color; + const GLubyte *color = v2->color; #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y) @@ -593,8 +593,8 @@ static void flat_TRUEDITHER_z_triangle( GLcontext *ctx, GLdepth z = FixedToDepth(ffz); \ if (z < zRow[i]) { \ unsigned long p; \ - PACK_TRUEDITHER( p, xx, yy, v0->color[0], \ - v0->color[1], v0->color[2] ); \ + PACK_TRUEDITHER( p, xx, yy, v2->color[0], \ + v2->color[1], v2->color[2] ); \ XMesaPutPixel( img, xx, yy, p ); \ zRow[i] = z; \ } \ @@ -620,8 +620,8 @@ static void flat_5R6G5B_z_triangle( GLcontext *ctx, #define PIXEL_TYPE GLushort #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - unsigned long p = PACK_5R6G5B( v0->color[0], \ - v0->color[1], v0->color[2] ); + unsigned long p = PACK_5R6G5B( v2->color[0], \ + v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint i, len = RIGHT-LEFT; \ @@ -648,7 +648,7 @@ static void flat_DITHER_5R6G5B_z_triangle( GLcontext *ctx, const SWvertex *v2 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = v0->color; + const GLubyte *color = v2->color; #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) @@ -688,7 +688,7 @@ static void flat_DITHER8_z_triangle( GLcontext *ctx, #define PIXEL_TYPE GLubyte #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - FLAT_DITHER_SETUP( v0->color[0], v0->color[1], v0->color[2] ); + FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -721,7 +721,7 @@ static void flat_DITHER_z_triangle( GLcontext *ctx, #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define SETUP_CODE \ - FLAT_DITHER_SETUP( v0->color[0], v0->color[1], v0->color[2] ); + FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -757,9 +757,9 @@ static void flat_HPCR_z_triangle( GLcontext *ctx, #define PIXEL_TYPE GLubyte #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - GLubyte r = v0->color[0]; \ - GLubyte g = v0->color[1]; \ - GLubyte b = v0->color[2]; + GLubyte r = v2->color[0]; \ + GLubyte g = v2->color[1]; \ + GLubyte b = v2->color[2]; #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \ @@ -793,9 +793,9 @@ static void flat_LOOKUP8_z_triangle( GLcontext *ctx, #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ LOOKUP_SETUP; \ - GLubyte r = v0->color[0]; \ - GLubyte g = v0->color[1]; \ - GLubyte b = v0->color[2]; \ + GLubyte r = v2->color[0]; \ + GLubyte g = v2->color[1]; \ + GLubyte b = v2->color[2]; \ GLubyte p = LOOKUP(r,g,b); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -1128,7 +1128,7 @@ static void flat_TRUECOLOR_triangle( GLcontext *ctx, XMesaImage *img = xmesa->xm_buffer->backimage; #define SETUP_CODE \ unsigned long pixel; \ - PACK_TRUECOLOR(pixel, v0->color[0], v0->color[1], v0->color[2]); + PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -1154,8 +1154,8 @@ static void flat_8A8B8G8R_triangle( GLcontext *ctx, #define PIXEL_TYPE GLuint #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - unsigned long p = PACK_8B8G8R( v0->color[0], \ - v0->color[1], v0->color[2] ); + unsigned long p = PACK_8B8G8R( v2->color[0], \ + v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint xx; \ @@ -1181,8 +1181,8 @@ static void flat_8R8G8B_triangle( GLcontext *ctx, #define PIXEL_TYPE GLuint #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - unsigned long p = PACK_8R8G8B( v0->color[0], \ - v0->color[1], v0->color[2] ); + unsigned long p = PACK_8R8G8B( v2->color[0], \ + v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint xx; \ @@ -1204,7 +1204,7 @@ static void flat_8R8G8B24_triangle( GLcontext *ctx, const SWvertex *v2 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = v0->color; + const GLubyte *color = v2->color; #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y) #define PIXEL_TYPE bgr_t #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) @@ -1237,8 +1237,8 @@ static void flat_TRUEDITHER_triangle( GLcontext *ctx, GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \ for (xx=LEFT;xx<RIGHT;xx++) { \ unsigned long p; \ - PACK_TRUEDITHER( p, xx, yy, v0->color[0], \ - v0->color[1], v0->color[2] ); \ + PACK_TRUEDITHER( p, xx, yy, v2->color[0], \ + v2->color[1], v2->color[2] ); \ XMesaPutPixel( img, xx, yy, p ); \ } \ } @@ -1260,8 +1260,8 @@ static void flat_5R6G5B_triangle( GLcontext *ctx, #define PIXEL_TYPE GLushort #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - unsigned long p = PACK_5R6G5B( v0->color[0], \ - v0->color[1], v0->color[2] ); + unsigned long p = PACK_5R6G5B( v2->color[0], \ + v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint xx; \ @@ -1283,7 +1283,7 @@ static void flat_DITHER_5R6G5B_triangle( GLcontext *ctx, const SWvertex *v2 ) { XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; - const GLubyte *color = v0->color; + const GLubyte *color = v2->color; #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) #define PIXEL_TYPE GLushort #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) @@ -1313,7 +1313,7 @@ static void flat_DITHER8_triangle( GLcontext *ctx, #define PIXEL_TYPE GLubyte #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - FLAT_DITHER_SETUP( v0->color[0], v0->color[1], v0->color[2] ); + FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -1339,7 +1339,7 @@ static void flat_DITHER_triangle( GLcontext *ctx, XMesaContext xmesa = (XMesaContext) ctx->DriverCtx; XMesaImage *img = xmesa->xm_buffer->backimage; #define SETUP_CODE \ - FLAT_DITHER_SETUP( v0->color[0], v0->color[1], v0->color[2] ); + FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -1367,9 +1367,9 @@ static void flat_HPCR_triangle( GLcontext *ctx, #define PIXEL_TYPE GLubyte #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ - GLubyte r = v0->color[0]; \ - GLubyte g = v0->color[1]; \ - GLubyte b = v0->color[2]; + GLubyte r = v2->color[0]; \ + GLubyte g = v2->color[1]; \ + GLubyte b = v2->color[2]; #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \ @@ -1396,9 +1396,9 @@ static void flat_LOOKUP8_triangle( GLcontext *ctx, #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) #define SETUP_CODE \ LOOKUP_SETUP; \ - GLubyte r = v0->color[0]; \ - GLubyte g = v0->color[1]; \ - GLubyte b = v0->color[2]; \ + GLubyte r = v2->color[0]; \ + GLubyte g = v2->color[1]; \ + GLubyte b = v2->color[2]; \ GLubyte p = LOOKUP(r,g,b); #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 2706c705fc1..9f265381ae0 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -1,5 +1,5 @@ -/* $Id: api_validate.c,v 1.2 2001/01/02 21:40:57 brianp Exp $ */ +/* $Id: api_validate.c,v 1.3 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -31,6 +31,7 @@ #include "mtypes.h" #include "state.h" + GLboolean _mesa_validate_DrawElements(GLcontext *ctx, GLenum mode, GLsizei count, GLenum type, diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index da1e6125c98..c67c8e865ec 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -1,4 +1,4 @@ -/* $Id: buffers.c,v 1.21 2000/12/26 05:09:27 keithw Exp $ */ +/* $Id: buffers.c,v 1.22 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -373,8 +373,9 @@ void _mesa_ResizeBuffersMESA( void ) { GLcontext *ctx = _mesa_get_current_context(); - GLuint buf_width, buf_height; + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx ); + if (MESA_VERBOSE & VERBOSE_API) fprintf(stderr, "glResizeBuffersMESA\n"); diff --git a/src/mesa/main/convolve.c b/src/mesa/main/convolve.c index 24bdd9c4b0f..1a32acb41e2 100644 --- a/src/mesa/main/convolve.c +++ b/src/mesa/main/convolve.c @@ -1,4 +1,4 @@ -/* $Id: convolve.c,v 1.17 2000/12/26 05:09:28 keithw Exp $ */ +/* $Id: convolve.c,v 1.18 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -268,7 +268,7 @@ _mesa_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param) { GET_CURRENT_CONTEXT(ctx); GLuint c; - ASSERT_OUTSIDE_BEGIN_END(ctx); + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); switch (target) { case GL_CONVOLUTION_1D: diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index cfac5f2ab22..9c600783dc0 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -1,4 +1,4 @@ -/* $Id: dd.h,v 1.44 2000/12/26 05:09:28 keithw Exp $ */ +/* $Id: dd.h,v 1.45 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -126,13 +126,16 @@ struct gl_pixelstore_attrib; */ typedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last ); -typedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2, GLuint pv ); +typedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2 ); typedef void (*triangle_func)( GLcontext *ctx, - GLuint v1, GLuint v2, GLuint v3, GLuint pv ); + GLuint v1, GLuint v2, GLuint v3 ); typedef void (*quad_func)( GLcontext *ctx, GLuint v1, GLuint v2, - GLuint v3, GLuint v4, GLuint pv ); + GLuint v3, GLuint v4 ); + +typedef void (*render_func)( GLcontext *ctx, GLuint start, GLuint count, + GLuint flags ); /* @@ -758,19 +761,21 @@ struct dd_function_table { triangle_func TriangleFunc; quad_func QuadFunc; + render_func *RenderTabVerts; + render_func *RenderTabElts; + void (*ResetLineStipple)( GLcontext *ctx ); - void (*BuildProjectedVertices)( GLcontext *ctx, GLuint start, GLuint end, GLuint new_inputs); - /* This function, if not NULL, is called whenever new vertices are - * required for rendering. The vertices in question are those n - * such that start <= n < end. The new_inputs parameter indicates - * those fields of the vertex which need to be updated, if only a - * partial repair of the vertex is required. + /* This function is called whenever new vertices are required for + * rendering. The vertices in question are those n such that start + * <= n < end. The new_inputs parameter indicates those fields of + * the vertex which need to be updated, if only a partial repair of + * the vertex is required. * - * This function is called only from _tnl_render_stage in tnl/t_render.c. + * This function is called only from _tnl_render_stage in tnl/t_render.c. */ diff --git a/src/mesa/main/fog.c b/src/mesa/main/fog.c index 2a225d4d876..c0e4b4a907c 100644 --- a/src/mesa/main/fog.c +++ b/src/mesa/main/fog.c @@ -1,4 +1,4 @@ -/* $Id: fog.c,v 1.31 2000/12/26 05:09:28 keithw Exp $ */ +/* $Id: fog.c,v 1.32 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -89,8 +89,6 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params ) switch (pname) { case GL_FOG_MODE: m = (GLenum) (GLint) *params; - if (ctx->Fog.Mode == m) - return; switch (m) { case GL_LINEAR: case GL_EXP: @@ -100,6 +98,8 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params ) gl_error( ctx, GL_INVALID_ENUM, "glFog" ); return; } + if (ctx->Fog.Mode == m) + return; FLUSH_VERTICES(ctx, _NEW_FOG); ctx->Fog.Mode = m; break; @@ -132,7 +132,7 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params ) ctx->Fog.Index = *params; break; case GL_FOG_COLOR: - if (TEST_EQ_4V(ctx->Fog.Color, params)) + if (TEST_EQ_4V(ctx->Fog.Color, params)) return; FLUSH_VERTICES(ctx, _NEW_FOG); ctx->Fog.Color[0] = params[0]; @@ -142,12 +142,12 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params ) break; case GL_FOG_COORDINATE_SOURCE_EXT: { GLenum p = (GLenum)(GLint) *params; - if (ctx->Fog.FogCoordinateSource == p) - return; if (p != GL_FOG_COORDINATE_EXT && p != GL_FRAGMENT_DEPTH_EXT) { gl_error( ctx, GL_INVALID_ENUM, "glFog" ); return; } + if (ctx->Fog.FogCoordinateSource == p) + return; FLUSH_VERTICES(ctx, _NEW_FOG); ctx->Fog.FogCoordinateSource = p; break; @@ -160,8 +160,6 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params ) if (ctx->Driver.Fogfv) { (*ctx->Driver.Fogfv)( ctx, pname, params ); } - - ctx->NewState |= _NEW_FOG; } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 7992b00304e..913c2f2fb5b 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1,4 +1,4 @@ -/* $Id: mtypes.h,v 1.9 2001/01/02 22:02:51 brianp Exp $ */ +/* $Id: mtypes.h,v 1.10 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -35,7 +35,6 @@ #include "glthread.h" #include "math/m_matrix.h" /* GLmatrix */ -#include "math/m_translate.h" /* trans_XXX_func */ #if defined(MESA_TRACE) #include "Trace/tr_context.h" diff --git a/src/mesa/swrast/s_aalinetemp.h b/src/mesa/swrast/s_aalinetemp.h index d16fe2c1290..f36c1f433fe 100644 --- a/src/mesa/swrast/s_aalinetemp.h +++ b/src/mesa/swrast/s_aalinetemp.h @@ -1,4 +1,4 @@ -/* $Id: s_aalinetemp.h,v 1.3 2001/01/04 15:32:32 brianp Exp $ */ +/* $Id: s_aalinetemp.h,v 1.4 2001/01/05 02:26:48 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -195,10 +195,10 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1) v0->color[ACOMP], v1->color[ACOMP], line.aPlane); } else { - constant_plane(v0->color[RCOMP], line.rPlane); - constant_plane(v0->color[GCOMP], line.gPlane); - constant_plane(v0->color[BCOMP], line.bPlane); - constant_plane(v0->color[ACOMP], line.aPlane); + constant_plane(v1->color[RCOMP], line.rPlane); + constant_plane(v1->color[GCOMP], line.gPlane); + constant_plane(v1->color[BCOMP], line.bPlane); + constant_plane(v1->color[ACOMP], line.aPlane); } #endif #ifdef DO_SPEC @@ -211,9 +211,9 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1) v0->specular[BCOMP], v1->specular[BCOMP], line.sbPlane); } else { - constant_plane(v0->specular[RCOMP], line.srPlane); - constant_plane(v0->specular[GCOMP], line.sgPlane); - constant_plane(v0->specular[BCOMP], line.sbPlane); + constant_plane(v1->specular[RCOMP], line.srPlane); + constant_plane(v1->specular[GCOMP], line.sgPlane); + constant_plane(v1->specular[BCOMP], line.sbPlane); } #endif #ifdef DO_INDEX @@ -222,7 +222,7 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1) v0->index, v1->index, line.iPlane); } else { - constant_plane(v0->index, line.iPlane); + constant_plane(v1->index, line.iPlane); } #endif #ifdef DO_TEX diff --git a/src/mesa/swrast/s_aatritemp.h b/src/mesa/swrast/s_aatritemp.h index 247c7ac85a2..c50680c0070 100644 --- a/src/mesa/swrast/s_aatritemp.h +++ b/src/mesa/swrast/s_aatritemp.h @@ -1,4 +1,4 @@ -/* $Id: s_aatritemp.h,v 1.4 2000/11/19 23:10:26 brianp Exp $ */ +/* $Id: s_aatritemp.h,v 1.5 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -151,10 +151,10 @@ compute_plane(p0, p1, p2, v0->color[3], v1->color[3], v2->color[3], aPlane); } else { - constant_plane(v0->color[RCOMP], rPlane); - constant_plane(v0->color[GCOMP], gPlane); - constant_plane(v0->color[BCOMP], bPlane); - constant_plane(v0->color[ACOMP], aPlane); + constant_plane(v2->color[RCOMP], rPlane); + constant_plane(v2->color[GCOMP], gPlane); + constant_plane(v2->color[BCOMP], bPlane); + constant_plane(v2->color[ACOMP], aPlane); } #endif #ifdef DO_INDEX @@ -163,15 +163,21 @@ v1->index, v2->index, iPlane); } else { - constant_plane(v0->index, iPlane); + constant_plane(v2->index, iPlane); } #endif #ifdef DO_SPEC - { + if (ctx->Light.ShadeModel == GL_SMOOTH) { compute_plane(p0, p1, p2, v0->specular[0], v1->specular[0], v2->specular[0],srPlane); compute_plane(p0, p1, p2, v0->specular[1], v1->specular[1], v2->specular[1],sgPlane); compute_plane(p0, p1, p2, v0->specular[2], v1->specular[2], v2->specular[2],sbPlane); } + else { + /* KW: added this */ + constant_plane(v2->specular[RCOMP], srPlane); + constant_plane(v2->specular[GCOMP], sgPlane); + constant_plane(v2->specular[BCOMP], sbPlane); + } #endif #ifdef DO_TEX { diff --git a/src/mesa/swrast/s_feedback.c b/src/mesa/swrast/s_feedback.c index a635569153d..c63e11d17b3 100644 --- a/src/mesa/swrast/s_feedback.c +++ b/src/mesa/swrast/s_feedback.c @@ -1,4 +1,4 @@ -/* $Id: s_feedback.c,v 1.3 2000/11/19 23:10:26 brianp Exp $ */ +/* $Id: s_feedback.c,v 1.4 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -100,9 +100,9 @@ void gl_feedback_triangle( GLcontext *ctx, feedback_vertex( ctx, v1, v1 ); feedback_vertex( ctx, v2, v2 ); } else { - feedback_vertex( ctx, v0, v0 ); - feedback_vertex( ctx, v1, v0 ); - feedback_vertex( ctx, v2, v0 ); + feedback_vertex( ctx, v0, v2 ); + feedback_vertex( ctx, v1, v2 ); + feedback_vertex( ctx, v2, v2 ); } } } @@ -122,8 +122,8 @@ void gl_feedback_line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 ) feedback_vertex( ctx, v0, v0 ); feedback_vertex( ctx, v1, v1 ); } else { - feedback_vertex( ctx, v0, v0 ); - feedback_vertex( ctx, v1, v0 ); + feedback_vertex( ctx, v0, v1 ); + feedback_vertex( ctx, v1, v1 ); } swrast->StippleCounter++; diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index 6c232cb694c..b61d4401e1b 100644 --- a/src/mesa/swrast/s_triangle.c +++ b/src/mesa/swrast/s_triangle.c @@ -1,4 +1,4 @@ -/* $Id: s_triangle.c,v 1.7 2000/12/12 00:31:45 brianp Exp $ */ +/* $Id: s_triangle.c,v 1.8 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -160,7 +160,7 @@ static void flat_rgba_triangle( GLcontext *ctx, fffog += fdfogdx; \ } \ gl_write_monocolor_span( ctx, n, LEFT, Y, zspan, \ - fogspan, v0->color, \ + fogspan, v2->color, \ GL_POLYGON ); \ } \ } @@ -1613,10 +1613,10 @@ static void general_textured_triangle( GLcontext *ctx, GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ GLint r, g, b, a; \ if (flat_shade) { \ - r = v0->color[0]; \ - g = v0->color[1]; \ - b = v0->color[2]; \ - a = v0->color[3]; \ + r = v2->color[0]; \ + g = v2->color[1]; \ + b = v2->color[2]; \ + a = v2->color[3]; \ } #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -1708,13 +1708,13 @@ static void general_textured_spec_triangle1( GLcontext *ctx, GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ GLint r, g, b, a, sr, sg, sb; \ if (flat_shade) { \ - r = v0->color[0]; \ - g = v0->color[1]; \ - b = v0->color[2]; \ - a = v0->color[3]; \ - sr = v0->specular[0]; \ - sg = v0->specular[1]; \ - sb = v0->specular[2]; \ + r = v2->color[0]; \ + g = v2->color[1]; \ + b = v2->color[2]; \ + a = v2->color[3]; \ + sr = v2->specular[0]; \ + sg = v2->specular[1]; \ + sb = v2->specular[2]; \ } #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ @@ -1837,10 +1837,10 @@ static void lambda_textured_triangle1( GLcontext *ctx, const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ GLint r, g, b, a; \ if (flat_shade) { \ - r = v0->color[0]; \ - g = v0->color[1]; \ - b = v0->color[2]; \ - a = v0->color[3]; \ + r = v2->color[0]; \ + g = v2->color[1]; \ + b = v2->color[2]; \ + a = v2->color[3]; \ } #define INNER_LOOP( LEFT, RIGHT, Y ) \ @@ -1942,13 +1942,13 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ GLint r, g, b, a, sr, sg, sb; \ if (flat_shade) { \ - r = v0->color[0]; \ - g = v0->color[1]; \ - b = v0->color[2]; \ - a = v0->color[3]; \ - sr = v0->specular[0]; \ - sg = v0->specular[1]; \ - sb = v0->specular[2]; \ + r = v2->color[0]; \ + g = v2->color[1]; \ + b = v2->color[2]; \ + a = v2->color[3]; \ + sr = v2->specular[0]; \ + sg = v2->specular[1]; \ + sb = v2->specular[2]; \ } #define INNER_LOOP( LEFT, RIGHT, Y ) \ @@ -2055,10 +2055,10 @@ lambda_multitextured_triangle1( GLcontext *ctx, GLfloat twidth[MAX_TEXTURE_UNITS], theight[MAX_TEXTURE_UNITS]; \ GLint r, g, b, a; \ if (flat_shade) { \ - r = v0->color[0]; \ - g = v0->color[1]; \ - b = v0->color[2]; \ - a = v0->color[3]; \ + r = v2->color[0]; \ + g = v2->color[1]; \ + b = v2->color[2]; \ + a = v2->color[3]; \ } \ { \ GLuint unit; \ diff --git a/src/mesa/swrast/swrast.h b/src/mesa/swrast/swrast.h index d07f30a5ab6..056435ee702 100644 --- a/src/mesa/swrast/swrast.h +++ b/src/mesa/swrast/swrast.h @@ -131,6 +131,8 @@ _swrast_ResetLineStipple( GLcontext *ctx ); /* These will always render the correct point/line/triangle for the * current state. + * + * For flatshaded primitives, the provoking vertex is the final one. */ extern void _swrast_Point( GLcontext *ctx, const SWvertex *v ); @@ -164,6 +166,8 @@ _swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value ); extern void _swrast_allow_pixel_fog( GLcontext *ctx, GLboolean value ); +/* Debug: + */ extern void _swrast_print_vertex( GLcontext *ctx, const SWvertex *v ); diff --git a/src/mesa/swrast_setup/ss_context.c b/src/mesa/swrast_setup/ss_context.c index 84c313db8eb..408438ca0b7 100644 --- a/src/mesa/swrast_setup/ss_context.c +++ b/src/mesa/swrast_setup/ss_context.c @@ -1,4 +1,4 @@ -/* $Id: ss_context.c,v 1.5 2000/12/26 05:09:32 keithw Exp $ */ +/* $Id: ss_context.c,v 1.6 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -45,25 +45,24 @@ */ static void _swsetup_validate_quad( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint v3, GLuint pv ) + GLuint v2, GLuint v3 ) { _swsetup_choose_trifuncs( ctx ); - SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3, pv ); + SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3 ); } static void -_swsetup_validate_triangle( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint pv ) +_swsetup_validate_triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2 ) { _swsetup_choose_trifuncs( ctx ); - SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2, pv ); + SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 ); } static void -_swsetup_validate_line( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv ) +_swsetup_validate_line( GLcontext *ctx, GLuint v0, GLuint v1 ) { _swsetup_choose_trifuncs( ctx ); - SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1, pv ); + SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1 ); } @@ -129,22 +128,22 @@ _swsetup_invalidate_state( GLcontext *ctx, GLuint new_state ) */ void _swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint v3, GLuint pv ) + GLuint v2, GLuint v3 ) { - SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3, pv ); + SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3 ); } void _swsetup_Triangle( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint pv ) + GLuint v2 ) { - SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2, pv ); + SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 ); } void -_swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv ) +_swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1 ) { - SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1, pv ); + SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1 ); } diff --git a/src/mesa/swrast_setup/ss_context.h b/src/mesa/swrast_setup/ss_context.h index f4dcb4e7d10..601ae9eb34c 100644 --- a/src/mesa/swrast_setup/ss_context.h +++ b/src/mesa/swrast_setup/ss_context.h @@ -44,12 +44,12 @@ typedef struct { GLuint start, GLuint end, GLuint new_inputs ); void (*Quad)( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint v3, GLuint pv ); + GLuint v2, GLuint v3 ); void (*Triangle)( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint pv ); + GLuint v2 ); - void (*Line)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv ); + void (*Line)( GLcontext *ctx, GLuint v0, GLuint v1 ); void (*Points)( GLcontext *ctx, GLuint first, GLuint last ); diff --git a/src/mesa/swrast_setup/ss_triangle.c b/src/mesa/swrast_setup/ss_triangle.c index a3f8cd6cec5..5fd5cd0f57f 100644 --- a/src/mesa/swrast_setup/ss_triangle.c +++ b/src/mesa/swrast_setup/ss_triangle.c @@ -34,15 +34,13 @@ #include "ss_triangle.h" #include "ss_context.h" -#define SS_FLAT_BIT 0x1 +#define SS_RGBA_BIT 0x1 #define SS_OFFSET_BIT 0x2 #define SS_TWOSIDE_BIT 0x4 -#define SS_UNFILLED_BIT 0x10 -#define SS_RGBA_BIT 0x20 -#define SS_MAX_TRIFUNC 0x80 +#define SS_UNFILLED_BIT 0x8 +#define SS_MAX_TRIFUNC 0x10 static triangle_func tri_tab[SS_MAX_TRIFUNC]; -static line_func line_tab[SS_MAX_TRIFUNC]; static quad_func quad_tab[SS_MAX_TRIFUNC]; @@ -54,168 +52,88 @@ static quad_func quad_tab[SS_MAX_TRIFUNC]; #define TAG(x) x #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT) -#define TAG(x) x##_flat -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT) #define TAG(x) x##_offset #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT) -#define TAG(x) x##_flat_offset -#include "ss_tritmp.h" - #define IND (SS_TWOSIDE_BIT) #define TAG(x) x##_twoside #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_TWOSIDE_BIT) -#define TAG(x) x##_flat_twoside -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT) #define TAG(x) x##_offset_twoside #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_TWOSIDE_BIT) -#define TAG(x) x##_flat_offset_twoside -#include "ss_tritmp.h" - #define IND (SS_UNFILLED_BIT) #define TAG(x) x##_unfilled #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_UNFILLED_BIT) -#define TAG(x) x##_flat_unfilled -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT|SS_UNFILLED_BIT) #define TAG(x) x##_offset_unfilled #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_UNFILLED_BIT) -#define TAG(x) x##_flat_offset_unfilled -#include "ss_tritmp.h" - #define IND (SS_TWOSIDE_BIT|SS_UNFILLED_BIT) #define TAG(x) x##_twoside_unfilled #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT) -#define TAG(x) x##_flat_twoside_unfilled -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT) #define TAG(x) x##_offset_twoside_unfilled #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT) -#define TAG(x) x##_flat_offset_twoside_unfilled -#include "ss_tritmp.h" - #define IND (0|SS_RGBA_BIT) #define TAG(x) x##_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_rgba -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT|SS_RGBA_BIT) #define TAG(x) x##_offset_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_offset_rgba -#include "ss_tritmp.h" - #define IND (SS_TWOSIDE_BIT|SS_RGBA_BIT) #define TAG(x) x##_twoside_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_TWOSIDE_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_twoside_rgba -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_RGBA_BIT) #define TAG(x) x##_offset_twoside_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_offset_twoside_rgba -#include "ss_tritmp.h" - #define IND (SS_UNFILLED_BIT|SS_RGBA_BIT) #define TAG(x) x##_unfilled_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_unfilled_rgba -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT) #define TAG(x) x##_offset_unfilled_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_offset_unfilled_rgba -#include "ss_tritmp.h" - #define IND (SS_TWOSIDE_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT) #define TAG(x) x##_twoside_unfilled_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_twoside_unfilled_rgba -#include "ss_tritmp.h" - #define IND (SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT) #define TAG(x) x##_offset_twoside_unfilled_rgba #include "ss_tritmp.h" -#define IND (SS_FLAT_BIT|SS_OFFSET_BIT|SS_TWOSIDE_BIT|SS_UNFILLED_BIT|SS_RGBA_BIT) -#define TAG(x) x##_flat_offset_twoside_unfilled_rgba -#include "ss_tritmp.h" - void _swsetup_trifuncs_init( GLcontext *ctx ) { (void) ctx; init(); - init_flat(); init_offset(); - init_flat_offset(); init_twoside(); - init_flat_twoside(); init_offset_twoside(); - init_flat_offset_twoside(); init_unfilled(); - init_flat_unfilled(); init_offset_unfilled(); - init_flat_offset_unfilled(); init_twoside_unfilled(); - init_flat_twoside_unfilled(); init_offset_twoside_unfilled(); - init_flat_offset_twoside_unfilled(); init_rgba(); - init_flat_rgba(); init_offset_rgba(); - init_flat_offset_rgba(); init_twoside_rgba(); - init_flat_twoside_rgba(); init_offset_twoside_rgba(); - init_flat_offset_twoside_rgba(); init_unfilled_rgba(); - init_flat_unfilled_rgba(); init_offset_unfilled_rgba(); - init_flat_offset_unfilled_rgba(); init_twoside_unfilled_rgba(); - init_flat_twoside_unfilled_rgba(); init_offset_twoside_unfilled_rgba(); - init_flat_offset_twoside_unfilled_rgba(); } @@ -236,14 +154,19 @@ static void swsetup_points( GLcontext *ctx, GLuint first, GLuint last ) } } +static void swsetup_line( GLcontext *ctx, GLuint v0, GLuint v1 ) +{ + SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts; + _swrast_Line( ctx, &verts[v0], &verts[v1] ); +} + + + void _swsetup_choose_trifuncs( GLcontext *ctx ) { SScontext *swsetup = SWSETUP_CONTEXT(ctx); GLuint ind = 0; - if (ctx->Light.ShadeModel == GL_FLAT) - ind |= SS_FLAT_BIT; - if (ctx->Polygon._OffsetAny) ind |= SS_OFFSET_BIT; @@ -257,8 +180,8 @@ void _swsetup_choose_trifuncs( GLcontext *ctx ) ind |= SS_RGBA_BIT; swsetup->Triangle = tri_tab[ind]; - swsetup->Line = line_tab[ind]; swsetup->Quad = quad_tab[ind]; + swsetup->Line = swsetup_line; swsetup->Points = swsetup_points; } diff --git a/src/mesa/swrast_setup/ss_tritmp.h b/src/mesa/swrast_setup/ss_tritmp.h index d04a36b18b5..936774aba4e 100644 --- a/src/mesa/swrast_setup/ss_tritmp.h +++ b/src/mesa/swrast_setup/ss_tritmp.h @@ -26,44 +26,20 @@ */ -static void TAG(triangle)(GLcontext *ctx, - GLuint e0, GLuint e1, GLuint e2, - GLuint pv) +static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) { struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts; SWvertex *v[3]; - GLfloat offset; GLfloat z[3]; - GLubyte c[3][4], s[3][4]; - GLuint i[3]; + GLfloat offset; GLenum mode = GL_FILL; + GLuint facing; v[0] = &verts[e0]; v[1] = &verts[e1]; v[2] = &verts[e2]; - if (IND & (SS_TWOSIDE_BIT | SS_FLAT_BIT)) { - if (IND & SS_RGBA_BIT) { - SS_COLOR(c[0], v[0]->color); - SS_SPEC(s[0], v[0]->specular); - - if (IND & SS_TWOSIDE_BIT) { - SS_COLOR(c[1], v[1]->color); - SS_COLOR(c[2], v[2]->color); - - SS_SPEC(s[1], v[1]->specular); - SS_SPEC(s[2], v[2]->specular); - } - } else { - SS_IND(i[0], v[0]->index); - - if (IND & SS_TWOSIDE_BIT) { - SS_IND(i[1], v[1]->index); - SS_IND(i[2], v[2]->index); - } - } - } if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT)) { @@ -75,46 +51,24 @@ static void TAG(triangle)(GLcontext *ctx, if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT)) { - GLuint facing = (cc < 0.0) ^ ctx->Polygon._FrontBit; + facing = (cc < 0.0) ^ ctx->Polygon._FrontBit; if (IND & SS_UNFILLED_BIT) mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode; - if (IND & SS_TWOSIDE_BIT) { - if (IND & SS_FLAT_BIT) { + if (facing == 1) { + if (IND & SS_TWOSIDE_BIT) { if (IND & SS_RGBA_BIT) { - GLubyte (*vbcolor)[4] = VB->ColorPtr[facing]->data; - GLubyte (*vbspec)[4] = VB->SecondaryColorPtr[facing]->data; - - SS_COLOR(v[0]->color, vbcolor[pv]); - SS_COLOR(v[1]->color, vbcolor[pv]); - SS_COLOR(v[2]->color, vbcolor[pv]); - - SS_SPEC(v[0]->specular, vbspec[pv]); - SS_SPEC(v[1]->specular, vbspec[pv]); - SS_SPEC(v[2]->specular, vbspec[pv]); - } else { - GLuint *vbindex = VB->IndexPtr[facing]->data; - - SS_IND(v[0]->index, vbindex[pv]); - SS_IND(v[1]->index, vbindex[pv]); - SS_IND(v[2]->index, vbindex[pv]); - } - } else { - if (IND & SS_RGBA_BIT) { - GLubyte (*vbcolor)[4] = VB->ColorPtr[facing]->data; - GLubyte (*vbspec)[4] = VB->SecondaryColorPtr[facing]->data; - + GLubyte (*vbcolor)[4] = VB->ColorPtr[1]->data; + GLubyte (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; SS_COLOR(v[0]->color, vbcolor[e0]); SS_COLOR(v[1]->color, vbcolor[e1]); SS_COLOR(v[2]->color, vbcolor[e2]); - SS_SPEC(v[0]->specular, vbspec[e0]); SS_SPEC(v[1]->specular, vbspec[e1]); SS_SPEC(v[2]->specular, vbspec[e2]); } else { - GLuint *vbindex = VB->IndexPtr[facing]->data; - + GLuint *vbindex = VB->IndexPtr[1]->data; SS_IND(v[0]->index, vbindex[e0]); SS_IND(v[1]->index, vbindex[e1]); SS_IND(v[2]->index, vbindex[e2]); @@ -143,23 +97,9 @@ static void TAG(triangle)(GLcontext *ctx, } } } - else if (IND & SS_FLAT_BIT) - { - if (IND & SS_RGBA_BIT) { - GLubyte *color = VB->ColorPtr[0]->data[pv]; - GLubyte *spec = VB->SecondaryColorPtr[0]->data[pv]; - - SS_COLOR(v[0]->color, color); - SS_SPEC(v[0]->specular, spec); - } - else { - GLuint index = VB->IndexPtr[0]->data[pv]; - SS_IND(v[0]->index, index); - } - } if (mode == GL_POINT) { - GLubyte *ef = VB->EdgeFlagPtr->data; + GLubyte *ef = VB->EdgeFlag; if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetPoint) { v[0]->win[2] += offset; v[1]->win[2] += offset; @@ -169,7 +109,7 @@ static void TAG(triangle)(GLcontext *ctx, if (ef[e1]) _swrast_Point( ctx, v[1] ); if (ef[e2]) _swrast_Point( ctx, v[2] ); } else if (mode == GL_LINE) { - GLubyte *ef = VB->EdgeFlagPtr->data; + GLubyte *ef = VB->EdgeFlag; if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetLine) { v[0]->win[2] += offset; v[1]->win[2] += offset; @@ -193,27 +133,25 @@ static void TAG(triangle)(GLcontext *ctx, v[2]->win[2] = z[2]; } - if (IND & (SS_FLAT_BIT | SS_TWOSIDE_BIT)) { - if (IND & SS_RGBA_BIT) { - SS_COLOR(v[0]->color, c[0]); - SS_SPEC(v[0]->specular, s[0]); - - if (IND & SS_TWOSIDE_BIT) { - SS_COLOR(v[1]->color, c[1]); - SS_COLOR(v[2]->color, c[2]); - SS_SPEC(v[1]->specular, s[1]); - SS_SPEC(v[2]->specular, s[2]); - } - } - else { - SS_IND(v[0]->index, i[0]); - - if (IND & SS_TWOSIDE_BIT) { - SS_IND(v[1]->index, i[1]); - SS_IND(v[2]->index, i[2]); + if (IND & SS_TWOSIDE_BIT) { + if (facing == 1) { + if (IND & SS_RGBA_BIT) { + GLubyte (*vbcolor)[4] = VB->ColorPtr[0]->data; + GLubyte (*vbspec)[4] = VB->SecondaryColorPtr[0]->data; + SS_COLOR(v[0]->color, vbcolor[e0]); + SS_COLOR(v[1]->color, vbcolor[e1]); + SS_COLOR(v[2]->color, vbcolor[e2]); + SS_SPEC(v[0]->specular, vbspec[e0]); + SS_SPEC(v[1]->specular, vbspec[e1]); + SS_SPEC(v[2]->specular, vbspec[e2]); + } else { + GLuint *vbindex = VB->IndexPtr[0]->data; + SS_IND(v[0]->index, vbindex[e0]); + SS_IND(v[1]->index, vbindex[e1]); + SS_IND(v[2]->index, vbindex[e2]); } } - } + } } @@ -221,75 +159,31 @@ static void TAG(triangle)(GLcontext *ctx, /* Need to do something with edgeflags: */ static void TAG(quad)( GLcontext *ctx, GLuint v0, - GLuint v1, GLuint v2, GLuint v3, - GLuint pv ) + GLuint v1, GLuint v2, GLuint v3 ) { if (IND & SS_UNFILLED_BIT) { struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLubyte ef1 = VB->EdgeFlagPtr->data[v1]; - GLubyte ef3 = VB->EdgeFlagPtr->data[v3]; - VB->EdgeFlagPtr->data[v1] = 0; - TAG(triangle)( ctx, v0, v1, v3, pv ); - VB->EdgeFlagPtr->data[v1] = ef1; - VB->EdgeFlagPtr->data[v3] = 0; - TAG(triangle)( ctx, v1, v2, v3, pv ); - VB->EdgeFlagPtr->data[v3] = ef3; + GLubyte ef1 = VB->EdgeFlag[v1]; + GLubyte ef3 = VB->EdgeFlag[v3]; + VB->EdgeFlag[v1] = 0; + TAG(triangle)( ctx, v0, v1, v3 ); + VB->EdgeFlag[v1] = ef1; + VB->EdgeFlag[v3] = 0; + TAG(triangle)( ctx, v1, v2, v3 ); + VB->EdgeFlag[v3] = ef3; } else { - TAG(triangle)( ctx, v0, v1, v3, pv ); - TAG(triangle)( ctx, v1, v2, v3, pv ); + TAG(triangle)( ctx, v0, v1, v3 ); + TAG(triangle)( ctx, v1, v2, v3 ); } } -static void TAG(line)( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts; - GLubyte c[2][4], s[2][4]; - GLuint i[2]; - SWvertex *vert0 = &verts[v0]; - SWvertex *vert1 = &verts[v1]; - - - if (IND & SS_FLAT_BIT) { - if (IND & SS_RGBA_BIT) { - GLubyte *color = VB->ColorPtr[0]->data[pv]; - GLubyte *spec = VB->SecondaryColorPtr[0]->data[pv]; - - SS_COLOR(c[0], vert0->color); - SS_COLOR(vert0->color, color); - - SS_SPEC(s[0], vert0->specular); - SS_SPEC(vert0->specular, spec); - } - else { - GLuint index = VB->IndexPtr[0]->data[pv]; - - SS_IND(i[0], vert0->index); - SS_IND(vert0->index, index); - } - } - - _swrast_Line( ctx, vert0, vert1 ); - - if (IND & SS_FLAT_BIT) { - if (IND & SS_RGBA_BIT) { - SS_COLOR(vert0->color, c[0]); - SS_SPEC(vert0->specular, s[0]); - } - else { - SS_IND(vert0->index, i[0]); - } - } -} - static void TAG(init)( void ) { tri_tab[IND] = TAG(triangle); quad_tab[IND] = TAG(quad); - line_tab[IND] = TAG(line); } diff --git a/src/mesa/swrast_setup/swrast_setup.h b/src/mesa/swrast_setup/swrast_setup.h index e5ea9668219..fd9c94d4e5b 100644 --- a/src/mesa/swrast_setup/swrast_setup.h +++ b/src/mesa/swrast_setup/swrast_setup.h @@ -47,23 +47,16 @@ _swsetup_BuildProjectedVertices( GLcontext *ctx, GLuint new_inputs ); extern void -_swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint v3, GLuint pv ); +_swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3 ); extern void -_swsetup_Triangle( GLcontext *ctx, GLuint v0, GLuint v1, - GLuint v2, GLuint pv ); - +_swsetup_Triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2 ); extern void -_swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1, GLuint pv ); - +_swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1 ); extern void _swsetup_Points( GLcontext *ctx, GLuint first, GLuint last ); -extern void -_swsetup_IndexedPoints( GLcontext *ctx, GLuint first, GLuint last ); - #endif diff --git a/src/mesa/tnl/t_array_import.c b/src/mesa/tnl/t_array_import.c index fc2c3d19447..008cc23c64e 100644 --- a/src/mesa/tnl/t_array_import.c +++ b/src/mesa/tnl/t_array_import.c @@ -1,4 +1,4 @@ -/* $Id: t_array_import.c,v 1.3 2000/12/28 22:11:05 keithw Exp $ */ +/* $Id: t_array_import.c,v 1.4 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -301,11 +301,6 @@ static void _tnl_upgrade_client_data( GLcontext *ctx, _tnl_import_texcoord( ctx, i, writeable, stride ); } - if ((required & VERT_EDGE) && (VB->EdgeFlagPtr->flags & flags)) { - ASSERT(VB->EdgeFlagPtr == &inputs->EdgeFlag); - _tnl_import_edgeflag( ctx, writeable, stride ); - } - VB->importable_data &= ~required; } @@ -386,11 +381,8 @@ void _tnl_vb_bind_arrays( GLcontext *ctx, GLint start, GLsizei count ) } if (inputs & VERT_EDGE) { - if (imports & VERT_EDGE) { - _tnl_import_edgeflag( ctx, 0, 0 ); - tmp->EdgeFlag.count = VB->Count; - } - VB->EdgeFlagPtr = &tmp->EdgeFlag; + _tnl_import_edgeflag( ctx, GL_TRUE, sizeof(GLboolean) ); + VB->EdgeFlag = (GLboolean *) tmp->EdgeFlag.data; } if (inputs & VERT_SPEC_RGB) { diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c index 5b879d8a831..7d04210eb66 100644 --- a/src/mesa/tnl/t_context.c +++ b/src/mesa/tnl/t_context.c @@ -1,4 +1,4 @@ -/* $Id: t_context.c,v 1.7 2000/12/26 05:09:32 keithw Exp $ */ +/* $Id: t_context.c,v 1.8 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -69,6 +69,9 @@ install_driver_callbacks( GLcontext *ctx ) ctx->Driver.MakeCurrent = _tnl_MakeCurrent; ctx->Driver.BeginCallList = _tnl_BeginCallList; ctx->Driver.EndCallList = _tnl_EndCallList; + + ctx->Driver.RenderTabElts = _tnl_render_tab_elts; + ctx->Driver.RenderTabVerts = _tnl_render_tab_verts; } @@ -111,7 +114,7 @@ _tnl_CreateContext( GLcontext *ctx ) /* Set a few default values in the driver struct. */ install_driver_callbacks(ctx); - ctx->Driver.NeedFlush = FLUSH_UPDATE_CURRENT|FLUSH_STORED_VERTICES; + ctx->Driver.NeedFlush = FLUSH_UPDATE_CURRENT; ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END; ctx->Driver.CurrentSavePrimitive = PRIM_UNKNOWN; diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h index 62d260681cc..8e3952a4127 100644 --- a/src/mesa/tnl/t_context.h +++ b/src/mesa/tnl/t_context.h @@ -1,4 +1,4 @@ -/* $Id: t_context.h,v 1.8 2000/12/27 22:30:29 keithw Exp $ */ +/* $Id: t_context.h,v 1.9 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -226,6 +226,12 @@ struct vertex_arrays typedef struct gl_material GLmaterial; +typedef void (*interp_func)( GLcontext *ctx, + GLfloat t, GLuint dst, GLuint in, GLuint out, + GLboolean force_boundary ); + +typedef void (*copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src ); + /* Contains the current state of a running pipeline. */ typedef struct vertex_buffer @@ -251,7 +257,7 @@ typedef struct vertex_buffer GLubyte *ClipMask; /* VERT_CLIP (4) */ GLvector3f *NormalPtr; /* VERT_NORM */ GLfloat *NormalLengthPtr; /* VERT_NORM (optional) */ - GLvector1ub *EdgeFlagPtr; /* VERT_EDGE */ + GLboolean *EdgeFlag; /* VERT_EDGE */ GLvector4f *TexCoordPtr[MAX_TEXTURE_UNITS]; /* VERT_TEX_0..n */ GLvector1ui *IndexPtr[2]; /* VERT_INDEX */ GLvector4ub *ColorPtr[2]; /* VERT_RGBA */ @@ -276,9 +282,10 @@ typedef struct vertex_buffer */ GLuint LastClipped; - void *interpfunc; - /* Two pieces of private data from _tnl_render_stage that have no - * business being in this struct. + interp_func interpfunc; + copy_pv_func copypvfunc; + /* Private data from _tnl_render_stage that has no business being + * in this struct. */ } TNLvertexbuffer; diff --git a/src/mesa/tnl/t_imm_api.c b/src/mesa/tnl/t_imm_api.c index 528f1016612..aeca38dd4ff 100644 --- a/src/mesa/tnl/t_imm_api.c +++ b/src/mesa/tnl/t_imm_api.c @@ -292,7 +292,7 @@ _tnl_end( GLcontext *ctx ) IM->FlushElt = 0; } - ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; +/* ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; */ } IM->BeginState = state; diff --git a/src/mesa/tnl/t_imm_exec.c b/src/mesa/tnl/t_imm_exec.c index 1549fa53af4..4bdce0d18dd 100644 --- a/src/mesa/tnl/t_imm_exec.c +++ b/src/mesa/tnl/t_imm_exec.c @@ -1,4 +1,4 @@ -/* $Id: t_imm_exec.c,v 1.4 2000/12/28 22:11:05 keithw Exp $ */ +/* $Id: t_imm_exec.c,v 1.5 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -198,7 +198,7 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM ) VB->NormalPtr = 0; VB->NormalLengthPtr = 0; VB->FogCoordPtr = 0; - VB->EdgeFlagPtr = 0; + VB->EdgeFlag = 0; VB->IndexPtr[0] = 0; VB->IndexPtr[1] = 0; VB->ColorPtr[0] = 0; @@ -259,10 +259,7 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM ) } if (inputs & VERT_EDGE) { - tmp->EdgeFlag.data = IM->EdgeFlag + start; - tmp->EdgeFlag.start = IM->EdgeFlag + start; - tmp->EdgeFlag.count = count; - VB->EdgeFlagPtr = &tmp->EdgeFlag; + VB->EdgeFlag = IM->EdgeFlag + start; } if (inputs & VERT_RGBA) { @@ -451,8 +448,8 @@ void _tnl_execute_cassette( GLcontext *ctx, struct immediate *IM ) */ _tnl_copy_immediate_vertices( ctx, IM ); -/* if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) */ -/* ctx->Driver.NeedFlush &= ~FLUSH_STORED_VERTICES; */ + if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) + ctx->Driver.NeedFlush &= ~FLUSH_STORED_VERTICES; } diff --git a/src/mesa/tnl/t_pipeline.h b/src/mesa/tnl/t_pipeline.h index 9d433bde0a7..3f64eb8ed9f 100644 --- a/src/mesa/tnl/t_pipeline.h +++ b/src/mesa/tnl/t_pipeline.h @@ -1,4 +1,4 @@ -/* $Id: t_pipeline.h,v 1.4 2000/12/26 05:09:33 keithw Exp $ */ +/* $Id: t_pipeline.h,v 1.5 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -62,4 +62,10 @@ extern const struct gl_pipeline_stage _tnl_render_stage; */ extern const struct gl_pipeline_stage *_tnl_default_pipeline[]; + +/* Convenience routines provided by t_vb_render.c: + */ +extern render_func _tnl_render_tab_elts[]; +extern render_func _tnl_render_tab_verts[]; + #endif diff --git a/src/mesa/tnl/t_vb_cliptmp.h b/src/mesa/tnl/t_vb_cliptmp.h index 1aeb014e159..5957f4960cc 100644 --- a/src/mesa/tnl/t_vb_cliptmp.h +++ b/src/mesa/tnl/t_vb_cliptmp.h @@ -1,4 +1,4 @@ -/* $Id: t_vb_cliptmp.h,v 1.4 2000/12/28 22:11:05 keithw Exp $ */ +/* $Id: t_vb_cliptmp.h,v 1.5 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -28,340 +28,45 @@ */ -#define INSIDE( J ) !NEGATIVE(J) -#define OUTSIDE( J ) NEGATIVE(J) +#define CLIP_DOTPROD(K, A, B, C, D) X(K)*A + Y(K)*B + Z(K)*C + W(K)*D - - - -static GLuint TAG(userclip_line)( GLcontext *ctx, - GLuint *i, GLuint *j, - interp_func interp ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLfloat (*coord)[4] = VB->ClipPtr->data; - GLuint ii = *i; - GLuint jj = *j; - GLuint p; - - for (p=0;p<MAX_CLIP_PLANES;p++) { - if (ctx->Transform.ClipEnabled[p]) { - GLfloat a = ctx->Transform._ClipUserPlane[p][0]; - GLfloat b = ctx->Transform._ClipUserPlane[p][1]; - GLfloat c = ctx->Transform._ClipUserPlane[p][2]; - GLfloat d = ctx->Transform._ClipUserPlane[p][3]; - - GLfloat dpI = d*W(ii) + c*Z(ii) + b*Y(ii) + a*X(ii); - GLfloat dpJ = d*W(jj) + c*Z(jj) + b*Y(jj) + a*X(jj); - - GLuint flagI = OUTSIDE( dpI ); - GLuint flagJ = OUTSIDE( dpJ ); - - if (flagI ^ flagJ) { - if (flagJ) { - GLfloat t = dpI / (dpI - dpJ); - VB->ClipMask[jj] |= CLIP_USER_BIT; - jj = interp( ctx, t, ii, jj, GL_FALSE ); - VB->ClipMask[jj] = 0; - } else { - GLfloat t = dpJ / (dpJ - dpI); - VB->ClipMask[ii] |= CLIP_USER_BIT; - ii = interp( ctx, t, jj, ii, GL_FALSE ); - VB->ClipMask[ii] = 0; - } - } - else if (flagI) - return 0; - } - } - - *i = ii; - *j = jj; - return 1; -} - - -static GLuint TAG(userclip_polygon)( GLcontext *ctx, - GLuint n, - GLuint vlist[], - interp_func interp ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLfloat (*coord)[4] = VB->ClipPtr->data; - GLuint vlist2[MAX_CLIPPED_VERTICES]; - GLuint *inlist = vlist, *outlist = vlist2; - GLubyte *clipmask = VB->ClipMask; - GLuint p; - -#define CLIP_DOTPROD(xx) d*W(xx) + c*Z(xx) + b*Y(xx) + a*X(xx) - - /* Can be speeded up to if vertex_stage actually saves the - * UserClipMask, and if it is used in this loop (after computing a - * UserClipOrMask). - */ - for (p=0;p<MAX_CLIP_PLANES;p++) { - if (ctx->Transform.ClipEnabled[p]) { - register float a = ctx->Transform._ClipUserPlane[p][0]; - register float b = ctx->Transform._ClipUserPlane[p][1]; - register float c = ctx->Transform._ClipUserPlane[p][2]; - register float d = ctx->Transform._ClipUserPlane[p][3]; - - /* initialize prev to be last in the input list */ - GLuint idxPrev = inlist[n-1]; - GLfloat dpPrev = CLIP_DOTPROD(idxPrev); - GLuint outcount = 0; - GLuint i; - - for (i = 0 ; i < n ; i++) { - GLuint idx = inlist[i]; - GLfloat dp = CLIP_DOTPROD(idx); - - if (!NEGATIVE(dpPrev)) { - outlist[outcount++] = idxPrev; - clipmask[idxPrev] &= ~CLIP_USER_BIT; - } else { - clipmask[idxPrev] |= CLIP_USER_BIT; - } - - - if (DIFFERENT_SIGNS(dp, dpPrev)) { - GLuint newvert; - if (NEGATIVE(dp)) { - /* Going out of bounds. Avoid division by zero as we - * know dp != dpPrev from DIFFERENT_SIGNS, above. - */ - GLfloat t = dp / (dp - dpPrev); - newvert = interp( ctx, t, idx, idxPrev, GL_TRUE ); - } else { - /* Coming back in. - */ - GLfloat t = dpPrev / (dpPrev - dp); - newvert = interp( ctx, t, idxPrev, idx, GL_FALSE ); - } - clipmask[newvert] = 0; - outlist[outcount++] = newvert; - } - - idxPrev = idx; - dpPrev = dp; - } - - if (outcount < 3) - return 0; - - { - GLuint *tmp; - tmp = inlist; - inlist = outlist; - outlist = tmp; - n = outcount; - } - } /* if */ - } /* for p */ - - if (inlist!=vlist) { - GLuint i; - for (i = 0 ; i < n ; i++) - vlist[i] = inlist[i]; - } - - return n; -} - - -/* This now calls the user clip functions if required. - */ -static void TAG(viewclip_line)( GLcontext *ctx, - GLuint i, GLuint j, - GLubyte mask ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - interp_func interp = (interp_func) VB->interpfunc; - GLfloat (*coord)[4] = VB->ClipPtr->data; - GLuint ii = i, jj = j; - GLuint vlist[2]; - GLuint n; - - VB->LastClipped = VB->FirstClipped; - -/* - * We use 6 instances of this code to clip against the 6 planes. - */ -#define GENERAL_CLIP \ - if (mask & PLANE) { \ - GLfloat dpI = CLIP_DOTPROD( ii ); \ - GLfloat dpJ = CLIP_DOTPROD( jj ); \ - \ - if (DIFFERENT_SIGNS(dpI, dpJ)) { \ - if (NEGATIVE(dpJ)) { \ - GLfloat t = dpI / (dpI - dpJ); \ - VB->ClipMask[jj] |= PLANE; \ - jj = interp( ctx, t, ii, jj, GL_FALSE ); \ - VB->ClipMask[jj] = 0; \ - } else { \ - GLfloat t = dpJ / (dpJ - dpI); \ - VB->ClipMask[ii] |= PLANE; \ - ii = interp( ctx, t, jj, ii, GL_FALSE ); \ - VB->ClipMask[ii] = 0; \ - } \ - } \ - else if (NEGATIVE(dpI)) \ - return; \ - } - -#undef CLIP_DOTPROD -#define PLANE CLIP_RIGHT_BIT -#define CLIP_DOTPROD(K) (- X(K) + W(K)) - - GENERAL_CLIP - -#undef CLIP_DOTPROD -#undef PLANE -#define PLANE CLIP_LEFT_BIT -#define CLIP_DOTPROD(K) (X(K) + W(K)) - - GENERAL_CLIP - -#undef CLIP_DOTPROD -#undef PLANE -#define PLANE CLIP_TOP_BIT -#define CLIP_DOTPROD(K) (- Y(K) + W(K)) - - GENERAL_CLIP - -#undef CLIP_DOTPROD -#undef PLANE -#define PLANE CLIP_BOTTOM_BIT -#define CLIP_DOTPROD(K) (Y(K) + W(K)) - - GENERAL_CLIP - -#undef CLIP_DOTPROD -#undef PLANE -#define PLANE CLIP_FAR_BIT -#define CLIP_DOTPROD(K) (- Z(K) + W(K)) - - if (SIZE >= 3) { - GENERAL_CLIP - } - -#undef CLIP_DOTPROD -#undef PLANE -#define PLANE CLIP_NEAR_BIT -#define CLIP_DOTPROD(K) (Z(K) + W(K)) - - if (SIZE >=3 ) { - GENERAL_CLIP - } - -#undef CLIP_DOTPROD -#undef PLANE -#undef GENERAL_CLIP - - - if (mask & CLIP_USER_BIT) { - if ( TAG(userclip_line)( ctx, &ii, &jj, interp ) == 0 ) - return; - } - - vlist[0] = ii; - vlist[1] = jj; - n = 2; - - /* If necessary, project new vertices. - */ - { - GLuint i, j; - GLfloat (*proj)[4] = VB->ProjectedClipPtr->data; - GLuint start = VB->FirstClipped; - - for (i = 0; i < n; i++) { - j = vlist[i]; - if (j >= start) { - if (SIZE == 4 && W(j) != 0.0F) { - GLfloat wInv = 1.0F / W(j); - proj[j][0] = X(j) * wInv; - proj[j][1] = Y(j) * wInv; - proj[j][2] = Z(j) * wInv; - proj[j][3] = wInv; - } else { - proj[j][0] = X(j); - proj[j][1] = Y(j); - proj[j][2] = Z(j); - proj[j][3] = W(j); - } - } - } - } - - if (ctx->Driver.BuildProjectedVertices) - ctx->Driver.BuildProjectedVertices(ctx, - VB->FirstClipped, - VB->LastClipped, - ~0); - - - /* Render the new line. - */ - ctx->Driver.LineFunc( ctx, ii, jj, j ); -} - -/* We now clip polygon triangles individually. This is necessary to - * avoid artifacts dependent on where the boundary of the VB falls - * within the polygon. As a result, there is an upper bound on the - * number of vertices which may be created, and the test against VB_SIZE - * is redundant. - */ -static void TAG(viewclip_polygon)( GLcontext *ctx, - GLuint n, GLuint vlist[], GLuint pv, - GLubyte mask ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - interp_func interp = (interp_func) VB->interpfunc; - GLfloat (*coord)[4] = VB->ClipPtr->data; - GLuint vlist2[MAX_CLIPPED_VERTICES]; - GLuint *inlist = vlist, *outlist = vlist2; - GLuint i; - GLubyte *clipmask = VB->ClipMask; - - VB->LastClipped = VB->FirstClipped; - - if (mask & CLIP_ALL_BITS) { - -#define GENERAL_CLIP \ +#define POLY_CLIP( PLANE, A, B, C, D ) \ +do { \ if (mask & PLANE) { \ - GLuint idxPrev = inlist[n-1]; \ - GLfloat dpPrev = CLIP_DOTPROD(idxPrev); \ + GLuint idxPrev = inlist[0]; \ + GLfloat dpPrev = CLIP_DOTPROD(idxPrev, A, B, C, D ); \ GLuint outcount = 0; \ GLuint i; \ - \ - mask &= ~PLANE; \ - \ - for (i = 0; i < n; i++) { \ + \ + inlist[n] = inlist[0]; /* prevent rotation of vertices */ \ + for (i = 1; i <= n; i++) { \ GLuint idx = inlist[i]; \ - GLfloat dp = CLIP_DOTPROD(idx); \ + GLfloat dp = CLIP_DOTPROD(idx, A, B, C, D ); \ \ + clipmask[idxPrev] |= PLANE; \ if (!NEGATIVE(dpPrev)) { \ outlist[outcount++] = idxPrev; \ clipmask[idxPrev] &= ~PLANE; \ } \ \ if (DIFFERENT_SIGNS(dp, dpPrev)) { \ - GLuint newvert; \ + GLuint newvert = VB->LastClipped++; \ + VB->ClipMask[newvert] = 0; \ + outlist[outcount++] = newvert; \ if (NEGATIVE(dp)) { \ /* Going out of bounds. Avoid division by zero as we \ * know dp != dpPrev from DIFFERENT_SIGNS, above. \ */ \ GLfloat t = dp / (dp - dpPrev); \ - newvert = interp( ctx, t, idx, idxPrev, GL_TRUE ); \ - } else { \ + LINTERP_SZ( t, coord, newvert, idx, idxPrev, SIZE ); \ + interp( ctx, t, newvert, idx, idxPrev, GL_TRUE ); \ + } else { \ /* Coming back in. \ */ \ GLfloat t = dpPrev / (dpPrev - dp); \ - newvert = interp( ctx, t, idxPrev, idx, GL_FALSE ); \ + LINTERP_SZ( t, coord, newvert, idxPrev, idx, SIZE ); \ + interp( ctx, t, newvert, idxPrev, idx, GL_FALSE ); \ } \ - clipmask[newvert] = mask; \ - outlist[outcount++] = newvert; \ } \ \ idxPrev = idx; \ @@ -377,125 +82,184 @@ static void TAG(viewclip_polygon)( GLcontext *ctx, outlist = tmp; \ n = outcount; \ } \ - } - - -#define PLANE CLIP_RIGHT_BIT -#define CLIP_DOTPROD(K) (- X(K) + W(K)) - - GENERAL_CLIP - -#undef CLIP_DOTPROD -#undef PLANE - - -#define PLANE CLIP_LEFT_BIT -#define CLIP_DOTPROD(K) (X(K) + W(K)) - - GENERAL_CLIP + } \ +} while (0) + + +#define LINE_CLIP(PLANE, A, B, C, D ) \ +do { \ + if (mask & PLANE) { \ + GLfloat dpI = CLIP_DOTPROD( ii, A, B, C, D ); \ + GLfloat dpJ = CLIP_DOTPROD( jj, A, B, C, D ); \ + \ + if (DIFFERENT_SIGNS(dpI, dpJ)) { \ + GLuint newvert = VB->LastClipped++; \ + VB->ClipMask[newvert] = 0; \ + if (NEGATIVE(dpJ)) { \ + GLfloat t = dpI / (dpI - dpJ); \ + VB->ClipMask[jj] |= PLANE; \ + LINTERP_SZ( t, coord, newvert, ii, jj, SIZE ); \ + interp( ctx, t, newvert, ii, jj, GL_FALSE ); \ + jj = newvert; \ + } else { \ + GLfloat t = dpJ / (dpJ - dpI); \ + VB->ClipMask[ii] |= PLANE; \ + LINTERP_SZ( t, coord, newvert, jj, ii, SIZE ); \ + interp( ctx, t, newvert, jj, ii, GL_FALSE ); \ + ii = newvert; \ + } \ + } \ + else if (NEGATIVE(dpI)) \ + return; \ + } \ +} while (0) + + +/* Project if necessary. + */ +static void TAG(build_proj_verts)( GLcontext *ctx ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + GLfloat (*coord)[4] = VB->ClipPtr->data; + GLfloat (*proj)[4] = VB->ProjectedClipPtr->data; + GLuint last = VB->LastClipped; + GLuint i; -#undef CLIP_DOTPROD -#undef PLANE + for (i = VB->FirstClipped; i < last; i++) { + if (VB->ClipMask[i] == 0) { + if (SIZE == 4 && W(i) != 0.0F) { + GLfloat wInv = 1.0F / W(i); + proj[i][0] = X(i) * wInv; + proj[i][1] = Y(i) * wInv; + proj[i][2] = Z(i) * wInv; + proj[i][3] = wInv; + } else { + proj[i][0] = X(i); + proj[i][1] = Y(i); + proj[i][2] = Z(i); + proj[i][3] = W(i); + } + } + } -#define PLANE CLIP_TOP_BIT -#define CLIP_DOTPROD(K) (- Y(K) + W(K)) + ctx->Driver.BuildProjectedVertices(ctx, + VB->FirstClipped, + VB->LastClipped, + ~0); +} - GENERAL_CLIP +/* Clip a line against the viewport and user clip planes. + */ +static void TAG(clip_line)( GLcontext *ctx, + GLuint i, GLuint j, + GLubyte mask ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + interp_func interp = (interp_func) VB->interpfunc; + GLfloat (*coord)[4] = VB->ClipPtr->data; + GLuint ii = i, jj = j, p; -#undef CLIP_DOTPROD -#undef PLANE + VB->LastClipped = VB->FirstClipped; -#define PLANE CLIP_BOTTOM_BIT -#define CLIP_DOTPROD(K) (Y(K) + W(K)) + if (mask & 0x3f) { + LINE_CLIP( CLIP_RIGHT_BIT, -1, 0, 0, 1 ); + LINE_CLIP( CLIP_LEFT_BIT, 1, 0, 0, 1 ); + LINE_CLIP( CLIP_TOP_BIT, 0, -1, 0, 1 ); + LINE_CLIP( CLIP_BOTTOM_BIT, 0, 1, 0, 1 ); + LINE_CLIP( CLIP_FAR_BIT, 0, 0, -1, 1 ); + LINE_CLIP( CLIP_NEAR_BIT, 0, 0, 1, 1 ); + } - GENERAL_CLIP + if (mask & CLIP_USER_BIT) { + for (p=0;p<MAX_CLIP_PLANES;p++) { + if (ctx->Transform.ClipEnabled[p]) { + GLfloat a = ctx->Transform._ClipUserPlane[p][0]; + GLfloat b = ctx->Transform._ClipUserPlane[p][1]; + GLfloat c = ctx->Transform._ClipUserPlane[p][2]; + GLfloat d = ctx->Transform._ClipUserPlane[p][3]; + LINE_CLIP( CLIP_USER_BIT, a, b, c, d ); + } + } + } -#undef CLIP_DOTPROD -#undef PLANE + TAG(build_proj_verts)( ctx ); -#define PLANE CLIP_FAR_BIT -#define CLIP_DOTPROD(K) (- Z(K) + W(K)) + if ((ctx->_TriangleCaps & DD_FLATSHADE) && j != jj) + VB->copypvfunc( ctx, jj, j ); - if (SIZE >= 3) { - GENERAL_CLIP - } + /* Render the new line. + */ + ctx->Driver.LineFunc( ctx, ii, jj ); -#undef CLIP_DOTPROD -#undef PLANE +} -#define PLANE CLIP_NEAR_BIT -#define CLIP_DOTPROD(K) (Z(K) + W(K)) - if (SIZE >=3 ) { - GENERAL_CLIP - } +/* Clip a triangle or quad against the viewport and user clip planes. + */ +static void TAG(clip_polygon)( GLcontext *ctx, + GLuint n, GLuint vlist[], + GLubyte mask ) +{ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; + interp_func interp = (interp_func) VB->interpfunc; + GLfloat (*coord)[4] = VB->ClipPtr->data; + GLuint pv = vlist[0]; + GLuint vlist2[MAX_CLIPPED_VERTICES]; + GLuint *inlist = vlist, *outlist = vlist2; + GLuint p; + GLubyte *clipmask = VB->ClipMask; -#undef CLIP_DOTPROD -#undef PLANE -#undef GENERAL_CLIP + VB->LastClipped = VB->FirstClipped; - if (inlist != vlist) - for (i = 0 ; i < n ; i++) - vlist[i] = inlist[i]; + if (mask & 0x3f) { + POLY_CLIP( CLIP_RIGHT_BIT, -1, 0, 0, 1 ); + POLY_CLIP( CLIP_LEFT_BIT, 1, 0, 0, 1 ); + POLY_CLIP( CLIP_TOP_BIT, 0, -1, 0, 1 ); + POLY_CLIP( CLIP_BOTTOM_BIT, 0, 1, 0, 1 ); + POLY_CLIP( CLIP_FAR_BIT, 0, 0, -1, 1 ); + POLY_CLIP( CLIP_NEAR_BIT, 0, 0, 1, 1 ); } - /* Clip against user clipping planes in clip space. - */ if (mask & CLIP_USER_BIT) { - n = TAG(userclip_polygon)( ctx, n, vlist, interp ); - if (n < 3) return; + for (p=0;p<MAX_CLIP_PLANES;p++) { + if (ctx->Transform.ClipEnabled[p]) { + GLfloat a = ctx->Transform._ClipUserPlane[p][0]; + GLfloat b = ctx->Transform._ClipUserPlane[p][1]; + GLfloat c = ctx->Transform._ClipUserPlane[p][2]; + GLfloat d = ctx->Transform._ClipUserPlane[p][3]; + POLY_CLIP( CLIP_USER_BIT, a, b, c, d ); + } + } } - /* Project if necessary. - */ - { - GLuint i; - GLfloat (*proj)[4] = VB->ProjectedClipPtr->data; - GLuint first = VB->FirstClipped; - - for (i = 0; i < n; i++) { - GLuint j = vlist[i]; - if (j >= first) { - if (SIZE == 4 && W(j) != 0.0F) { - GLfloat wInv = 1.0F / W(j); - proj[j][0] = X(j) * wInv; - proj[j][1] = Y(j) * wInv; - proj[j][2] = Z(j) * wInv; - proj[j][3] = wInv; - } else { - proj[j][0] = X(j); - proj[j][1] = Y(j); - proj[j][2] = Z(j); - proj[j][3] = W(j); - } - } + if (ctx->_TriangleCaps & DD_FLATSHADE) { + if (pv != inlist[0]) { + ASSERT( inlist[0] >= VB->FirstClipped ); + VB->copypvfunc( ctx, inlist[0], pv ); } } - if (ctx->Driver.BuildProjectedVertices) - ctx->Driver.BuildProjectedVertices(ctx, - VB->FirstClipped, - VB->LastClipped, - ~0); + TAG(build_proj_verts)( ctx ); /* Render the new vertices as an unclipped polygon. - * Argh - need to pass in pv... */ { GLuint *tmp = VB->Elts; - VB->Elts = vlist; - render_poly_pv_raw_elts( ctx, 0, n, PRIM_BEGIN|PRIM_END, pv ); + VB->Elts = inlist; + ctx->Driver.RenderTabElts[GL_POLYGON]( ctx, 0, n, PRIM_BEGIN|PRIM_END ); VB->Elts = tmp; } } + + #undef W #undef Z #undef Y #undef X #undef SIZE #undef TAG -#undef INSIDE -#undef OUTSIDE +#undef POLY_CLIP +#undef LINE_CLIP diff --git a/src/mesa/tnl/t_vb_render.c b/src/mesa/tnl/t_vb_render.c index b3fef235019..2616d294d3b 100644 --- a/src/mesa/tnl/t_vb_render.c +++ b/src/mesa/tnl/t_vb_render.c @@ -1,4 +1,4 @@ -/* $Id: t_vb_render.c,v 1.5 2001/01/03 15:59:31 brianp Exp $ */ +/* $Id: t_vb_render.c,v 1.6 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -22,6 +22,9 @@ * 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]> */ @@ -33,11 +36,16 @@ * and triangle rasterizers via the function pointers: * * context->Driver.BuildProjectedVertices() + * * context->Driver.PointsFunc() * context->Driver.LineFunc() * context->Driver.TriangleFunc() * context->Driver.QuadFunc() * + * context->Driver.RenderTabVerts[] + * context->Driver.RenderTabElts[] + * + * None of these may be null. */ @@ -55,9 +63,6 @@ #include "t_pipeline.h" -typedef GLuint (*interp_func)( GLcontext *ctx, - GLfloat t, GLuint in, GLuint out, - GLboolean force_boundary ); typedef void (*clip_line_func)( GLcontext *ctx, GLuint i, GLuint j, @@ -65,13 +70,8 @@ typedef void (*clip_line_func)( GLcontext *ctx, typedef void (*clip_poly_func)( GLcontext *ctx, GLuint n, GLuint vlist[], - GLuint pv, GLubyte mask ); - + GLubyte mask ); -typedef void (*render_func)( GLcontext *ctx, - GLuint start, - GLuint count, - GLuint flags ); @@ -79,33 +79,19 @@ struct render_stage_data { /* Clipping functions for current state. */ - interp_func interp; /* Clip interpolation function */ - GLuint _ClipInputs; /* Inputs referenced by interpfunc */ - + interp_func interp; /* Clip interpolation function */ + copy_pv_func copypv; /* Flatshade fixup function */ + GLuint _ClipInputs; /* Inputs referenced by interpfunc */ }; #define RENDER_STAGE_DATA(stage) ((struct render_stage_data *)stage->private) -static void render_poly_pv_raw_elts( GLcontext *ctx, - GLuint start, - GLuint count, - GLuint flags, - GLuint pv ); /**********************************************************************/ /* Interpolate between pairs of vertices */ /**********************************************************************/ -#define INTERP_RGBA 0x1 -#define INTERP_TEX 0x2 -#define INTERP_INDEX 0x4 -#define INTERP_SPEC 0x8 -#define INTERP_FOG 0x10 -#define INTERP_EDGE 0x20 -#define MAX_INTERP 0x40 - - #define LINTERP_SZ( t, vec, to, a, b, sz ) \ do { \ switch (sz) { \ @@ -146,8 +132,50 @@ do { \ -static interp_func interp_tab[0x80]; +#define INTERP_RGBA 0x1 +#define INTERP_TEX 0x2 +#define INTERP_INDEX 0x4 +#define INTERP_SPEC 0x8 +#define INTERP_FOG 0x10 +#define INTERP_EDGE 0x20 +#define MAX_INTERP 0x40 + +static interp_func interp_tab[MAX_INTERP]; +static copy_pv_func copy_tab[MAX_INTERP]; + + +#define IND (0) +#define NAME interp_none +#include "t_vb_interptmp.h" + +#define IND (INTERP_FOG) +#define NAME interp_FOG +#include "t_vb_interptmp.h" + +#define IND (INTERP_TEX) +#define NAME interp_TEX +#include "t_vb_interptmp.h" + +#define IND (INTERP_FOG|INTERP_TEX) +#define NAME interp_FOG_TEX +#include "t_vb_interptmp.h" + +#define IND (INTERP_EDGE) +#define NAME interp_EDGE +#include "t_vb_interptmp.h" + +#define IND (INTERP_FOG|INTERP_EDGE) +#define NAME interp_FOG_EDGE +#include "t_vb_interptmp.h" + +#define IND (INTERP_TEX|INTERP_EDGE) +#define NAME interp_TEX_EDGE +#include "t_vb_interptmp.h" + +#define IND (INTERP_FOG|INTERP_TEX|INTERP_EDGE) +#define NAME interp_FOG_TEX_EDGE +#include "t_vb_interptmp.h" #define IND (INTERP_RGBA) #define NAME interp_RGBA @@ -246,15 +274,34 @@ static interp_func interp_tab[0x80]; #include "t_vb_interptmp.h" +#define IND (INTERP_RGBA) +#define NAME copy_RGBA +#include "t_vb_flattmp.h" + +#define IND (INTERP_RGBA|INTERP_SPEC) +#define NAME copy_RGBA_SPEC +#include "t_vb_flattmp.h" + +#define IND (INTERP_INDEX) +#define NAME copy_INDEX +#include "t_vb_flattmp.h" + + + -static GLuint interp_invalid( GLcontext *ctx, - GLfloat t, - GLuint in, GLuint out, - GLboolean boundary ) +static void interp_invalid( GLcontext *ctx, + GLfloat t, + GLuint dst, GLuint in, GLuint out, + GLboolean boundary ) { (void)(ctx && t && in && out && boundary); fprintf(stderr, "Invalid interpolation function in t_vbrender.c\n"); - return in; +} + +static void copy_invalid( GLcontext *ctx, GLuint dst, GLuint src ) +{ + (void)(ctx && dst && src); + fprintf(stderr, "Invalid copy function in t_vbrender.c\n"); } @@ -266,8 +313,19 @@ static void interp_init( void ) * the non-implemented combinations are reachable, but this gives * some safety from crashes. */ - for (i = 0 ; i < Elements(interp_tab) ; i++) + for (i = 0 ; i < Elements(interp_tab) ; i++) { interp_tab[i] = interp_invalid; + copy_tab[i] = copy_invalid; + } + + interp_tab[0] = interp_none; + interp_tab[INTERP_FOG] = interp_FOG; + interp_tab[INTERP_TEX] = interp_TEX; + interp_tab[INTERP_FOG|INTERP_TEX] = interp_FOG_TEX; + interp_tab[INTERP_EDGE] = interp_EDGE; + interp_tab[INTERP_FOG|INTERP_EDGE] = interp_FOG_EDGE; + interp_tab[INTERP_TEX|INTERP_EDGE] = interp_TEX_EDGE; + interp_tab[INTERP_FOG|INTERP_TEX|INTERP_EDGE] = interp_FOG_TEX_EDGE; interp_tab[INTERP_RGBA] = interp_RGBA; interp_tab[INTERP_RGBA|INTERP_SPEC] = interp_RGBA_SPEC; @@ -276,7 +334,8 @@ static void interp_init( void ) interp_tab[INTERP_RGBA|INTERP_TEX] = interp_RGBA_TEX; interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_TEX] = interp_RGBA_SPEC_TEX; interp_tab[INTERP_RGBA|INTERP_FOG|INTERP_TEX] = interp_RGBA_FOG_TEX; - interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX] = interp_RGBA_SPEC_FOG_TEX; + interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX] = + interp_RGBA_SPEC_FOG_TEX; interp_tab[INTERP_INDEX] = interp_INDEX; interp_tab[INTERP_FOG|INTERP_INDEX] = interp_FOG_INDEX; interp_tab[INTERP_TEX|INTERP_INDEX] = interp_TEX_INDEX; @@ -284,15 +343,26 @@ static void interp_init( void ) interp_tab[INTERP_RGBA|INTERP_EDGE] = interp_RGBA_EDGE; interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_EDGE] = interp_RGBA_SPEC_EDGE; interp_tab[INTERP_RGBA|INTERP_FOG|INTERP_EDGE] = interp_RGBA_FOG_EDGE; - interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_EDGE] = interp_RGBA_SPEC_FOG_EDGE; + interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_EDGE] = + interp_RGBA_SPEC_FOG_EDGE; interp_tab[INTERP_RGBA|INTERP_TEX|INTERP_EDGE] = interp_RGBA_TEX_EDGE; - interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_TEX|INTERP_EDGE] = interp_RGBA_SPEC_TEX_EDGE; - interp_tab[INTERP_RGBA|INTERP_FOG|INTERP_TEX|INTERP_EDGE] = interp_RGBA_FOG_TEX_EDGE; - interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX|INTERP_EDGE] = interp_RGBA_SPEC_FOG_TEX_EDGE; + interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_TEX|INTERP_EDGE] = + interp_RGBA_SPEC_TEX_EDGE; + interp_tab[INTERP_RGBA|INTERP_FOG|INTERP_TEX|INTERP_EDGE] = + interp_RGBA_FOG_TEX_EDGE; + interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX|INTERP_EDGE] = + interp_RGBA_SPEC_FOG_TEX_EDGE; interp_tab[INTERP_INDEX|INTERP_EDGE] = interp_INDEX_EDGE; interp_tab[INTERP_FOG|INTERP_INDEX|INTERP_EDGE] = interp_FOG_INDEX_EDGE; interp_tab[INTERP_TEX|INTERP_INDEX|INTERP_EDGE] = interp_TEX_INDEX_EDGE; - interp_tab[INTERP_FOG|INTERP_TEX|INTERP_INDEX|INTERP_EDGE] = interp_FOG_TEX_INDEX_EDGE; + interp_tab[INTERP_FOG|INTERP_TEX|INTERP_INDEX|INTERP_EDGE] = + interp_FOG_TEX_INDEX_EDGE; + + + copy_tab[INTERP_RGBA] = copy_RGBA; + copy_tab[INTERP_RGBA|INTERP_SPEC] = copy_RGBA_SPEC; + copy_tab[INTERP_INDEX] = copy_INDEX; + } @@ -301,12 +371,15 @@ static void interp_init( void ) /**********************************************************************/ -#if 0 -#define NEGATIVE(x) ((*(int *)&x)<0) -#define DIFFERENT_SIGNS(a,b) ((a*b) < 0) +#if defined(USE_IEEE) +#define NEGATIVE(x) ((*(GLuint *)&x) & (1<<31)) +#define DIFFERENT_SIGNS(x,y) (((*(GLuint *)&x)^(*(GLuint *)&y)) & (1<<31)) #else #define NEGATIVE(x) (x < 0) -#define DIFFERENT_SIGNS(a,b) ((a*b) < 0) +#define DIFFERENT_SIGNS(x,y) (x * y <= 0 && x - y != 0) +/* Could just use (x*y<0) except for the flatshading requirements. + * Maybe there's a better way? + */ #endif #define W(i) coord[i][3] @@ -336,176 +409,151 @@ static void interp_init( void ) static clip_poly_func clip_poly_tab[5] = { 0, 0, - viewclip_polygon_2, - viewclip_polygon_3, - viewclip_polygon_4 + clip_polygon_2, + clip_polygon_3, + clip_polygon_4 }; static clip_line_func clip_line_tab[5] = { 0, 0, - viewclip_line_2, - viewclip_line_3, - viewclip_line_4 + clip_line_2, + clip_line_3, + clip_line_4 }; - /**********************************************************************/ -/* Clip and render single primitives */ -/**********************************************************************/ - - - -static INLINE void draw_line(GLcontext *ctx, GLuint v1, GLuint v2 ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLubyte c1 = VB->ClipMask[v1], c2 = VB->ClipMask[v2]; - GLubyte ormask = c1|c2; - if (!ormask) - ctx->Driver.LineFunc( ctx, v1, v2, v2 ); - else if (!(c1 & c2 & 0x3f)) - clip_line_tab[VB->ClipPtr->size]( ctx, v1, v2, ormask ); -} - -static INLINE void draw_triangle(GLcontext *ctx, - GLuint v1, GLuint v2, GLuint v3, - GLuint pv ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLubyte c1 = VB->ClipMask[v1], c2 = VB->ClipMask[v2], c3 = VB->ClipMask[v3]; - GLubyte ormask = c1|c2|c3; - if (!ormask) - ctx->Driver.TriangleFunc( ctx, v1, v2, v3, pv ); - else if (!(c1 & c2 & c3 & 0x3f)) { - GLuint vlist[MAX_CLIPPED_VERTICES]; - ASSIGN_3V(vlist, v1, v2, v3 ); - clip_poly_tab[VB->ClipPtr->size]( ctx, 3, vlist, pv, ormask ); - } -} - - -static INLINE void draw_quad( GLcontext *ctx, - GLuint v1, GLuint v2, GLuint v3, - GLuint v4, GLuint pv ) -{ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - GLubyte c1 = VB->ClipMask[v1], c2 = VB->ClipMask[v2]; - GLubyte c3 = VB->ClipMask[v3], c4 = VB->ClipMask[v4]; - GLubyte ormask = c1|c2|c3|c4; - if (!ormask) - ctx->Driver.QuadFunc( ctx, v1, v2, v3, v4, pv ); - else if (!(c1 & c2 & c3 & c4 & 0x3f)) { - GLuint vlist[MAX_CLIPPED_VERTICES]; - ASSIGN_4V(vlist, v1, v2, v3, v4 ); - clip_poly_tab[VB->ClipPtr->size]( ctx, 4, vlist, pv, ormask ); - } -} - - -/**********************************************************************/ -/* Clip and render whole begin/end objects */ +/* Clip and render whole begin/end objects */ /**********************************************************************/ #define NEED_EDGEFLAG_SETUP (ctx->_TriangleCaps & DD_TRI_UNFILLED) -#define EDGEFLAG_GET(idx) VB->EdgeFlagPtr->data[idx] -#define EDGEFLAG_SET(idx, val) VB->EdgeFlagPtr->data[idx] = val +#define EDGEFLAG_GET(idx) VB->EdgeFlag[idx] +#define EDGEFLAG_SET(idx, val) VB->EdgeFlag[idx] = val -/* Vertices, no clipping. +/* Vertices, with the possibility of clipping. */ #define RENDER_POINTS( start, count ) \ - ctx->Driver.PointsFunc( ctx, start, count-1 ) + ctx->Driver.PointsFunc( ctx, start, count ) -#define RENDER_LINE( i1, i ) \ - ctx->Driver.LineFunc( ctx, i1, i, i ) +#define RENDER_LINE( v1, v2 ) \ +do { \ + GLubyte c1 = mask[v1], c2 = mask[v2]; \ + GLubyte ormask = c1|c2; \ + if (!ormask) \ + LineFunc( ctx, v1, v2 ); \ + else if (!(c1 & c2 & 0x3f)) \ + clip_line_tab[sz]( ctx, v1, v2, ormask ); \ +} while (0) -#define RENDER_TRI( i2, i1, i, pv, parity ) \ +#define RENDER_TRI( v1, v2, v3 ) \ do { \ - if (parity) \ - ctx->Driver.TriangleFunc( ctx, i1, i2, i, pv ); \ - else \ - ctx->Driver.TriangleFunc( ctx, i2, i1, i, pv ); \ + GLubyte c1 = mask[v1], c2 = mask[v2], c3 = mask[v3]; \ + GLubyte ormask = c1|c2|c3; \ + if (!ormask) \ + TriangleFunc( ctx, v1, v2, v3 ); \ + else if (!(c1 & c2 & c3 & 0x3f)) { \ + GLuint vlist[MAX_CLIPPED_VERTICES]; \ + ASSIGN_3V(vlist, v3, v1, v2 ); \ + clip_poly_tab[sz]( ctx, 3, vlist, ormask ); \ + } \ } while (0) -#define RENDER_QUAD( i3, i2, i1, i, pv ) \ - ctx->Driver.QuadFunc( ctx, i3, i2, i1, i, pv ); - -#define TAG(x) x##_raw +#define RENDER_QUAD( v1, v2, v3, v4 ) \ +do { \ + GLubyte c1 = mask[v1], c2 = mask[v2]; \ + GLubyte c3 = mask[v3], c4 = mask[v4]; \ + GLubyte ormask = c1|c2|c3|c4; \ + if (!ormask) \ + QuadFunc( ctx, v1, v2, v3, v4 ); \ + else if (!(c1 & c2 & c3 & c4 & 0x3f)) { \ + GLuint vlist[MAX_CLIPPED_VERTICES]; \ + ASSIGN_4V(vlist, v4, v1, v2, v3 ); \ + clip_poly_tab[sz]( ctx, 4, vlist, ormask ); \ + } \ +} while (0) -#define LOCAL_VARS \ - struct vertex_buffer *VB = &(TNL_CONTEXT(ctx)->vb); \ - (void) VB; +#define LOCAL_VARS \ + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; \ + const GLuint * const elt = VB->Elts; \ + const GLubyte *mask = VB->ClipMask; \ + const GLuint sz = VB->ClipPtr->size; \ + const line_func LineFunc = ctx->Driver.LineFunc; \ + const triangle_func TriangleFunc = ctx->Driver.TriangleFunc; \ + const quad_func QuadFunc = ctx->Driver.QuadFunc; \ + (void) (LineFunc && TriangleFunc && QuadFunc); \ + (void) elt; (void) mask; (void) sz; + +#define TAG(x) clip_##x##_verts #define RESET_STIPPLE ctx->Driver.ResetLineStipple( ctx ) #define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE; #define PRESERVE_VB_DEFS #include "t_vb_rendertmp.h" -/* Elts, no clipping. + +/* Elts, with the possibility of clipping. */ #undef ELT #undef TAG -#undef LOCAL_VARS -#define TAG(x) x##_raw_elts #define ELT(x) elt[x] -#define LOCAL_VARS \ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; \ - const GLuint * const elt = VB->Elts; \ - (void) elt; +#define TAG(x) clip_##x##_elts #include "t_vb_rendertmp.h" +/**********************************************************************/ +/* Render whole begin/end objects */ +/**********************************************************************/ +#define NEED_EDGEFLAG_SETUP (ctx->_TriangleCaps & DD_TRI_UNFILLED) +#define EDGEFLAG_GET(idx) VB->EdgeFlag[idx] +#define EDGEFLAG_SET(idx, val) VB->EdgeFlag[idx] = val -/* Vertices, with the possibility of clipping. + +/* Vertices, no clipping. */ -#define RENDER_POINTS( start, count ) \ - ctx->Driver.PointsFunc( ctx, start, count-1 ) +#define RENDER_POINTS( start, count ) \ + ctx->Driver.PointsFunc( ctx, start, count ) -#define RENDER_LINE( i1, i ) \ - draw_line( ctx, i1, i ) +#define RENDER_LINE( v1, v2 ) \ + LineFunc( ctx, v1, v2 ) -#define RENDER_TRI( i2, i1, i, pv, parity) \ -do { \ - GLuint e2=i2, e1=i1; \ - if (parity) { GLuint t=e2; e2=e1; e1=t; } \ - draw_triangle(ctx,e2,e1,i,pv); \ -} while (0) +#define RENDER_TRI( v1, v2, v3 ) \ + TriangleFunc( ctx, v1, v2, v3 ) -#define RENDER_QUAD( i3, i2, i1, i, pv) \ - draw_quad(ctx,i3,i2,i1,i,pv) +#define RENDER_QUAD( v1, v2, v3, v4 ) \ + QuadFunc( ctx, v1, v2, v3, v4 ) +#define TAG(x) _tnl_##x##_verts #define LOCAL_VARS \ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; \ - (void)VB; + struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; \ + const GLuint * const elt = VB->Elts; \ + const line_func LineFunc = ctx->Driver.LineFunc; \ + const triangle_func TriangleFunc = ctx->Driver.TriangleFunc; \ + const quad_func QuadFunc = ctx->Driver.QuadFunc; \ + (void) (LineFunc && TriangleFunc && QuadFunc); \ + (void) elt; -#define TAG(x) x##_clipped #define RESET_STIPPLE ctx->Driver.ResetLineStipple( ctx ) #define RESET_OCCLUSION ctx->OcclusionResult = GL_TRUE; +#define RENDER_TAB_QUALIFIER #define PRESERVE_VB_DEFS #include "t_vb_rendertmp.h" - -/* Elts, with the possibility of clipping. +/* Elts, no clipping. */ #undef ELT -#undef TAG -#undef LOCAL_VARS +#define TAG(x) _tnl_##x##_elts #define ELT(x) elt[x] -#define LOCAL_VARS \ - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; \ - const GLuint * const elt = VB->Elts; \ - (void) elt; -#define TAG(x) x##_clipped_elts - #include "t_vb_rendertmp.h" + /**********************************************************************/ /* Clip and render whole vertex buffers */ /**********************************************************************/ @@ -520,40 +568,29 @@ static GLboolean run_render( GLcontext *ctx, render_func *tab; GLint pass = 0; -/* return GL_FALSE; */ + VB->interpfunc = RENDER_STAGE_DATA(stage)->interp; + VB->copypvfunc = RENDER_STAGE_DATA(stage)->copypv; - VB->interpfunc = (void *)RENDER_STAGE_DATA(stage)->interp; + /* Allow the drivers to lock before projected verts are built so + * that window coordinates are guarenteed not to change before + * rendering. + */ + if (ctx->Driver.RenderStart) + ctx->Driver.RenderStart( ctx ); - if (new_inputs) { - GLuint importable = new_inputs & VB->importable_data; - GLuint interested = 0; - - if (VB->ClipOrMask) - interested = ~0; - - if (ctx->_TriangleCaps & DD_TRI_UNFILLED) - interested |= VERT_EDGE; - - importable &= interested; - - if (importable) - VB->import_data( ctx, importable, VEC_NOT_WRITEABLE|VEC_BAD_STRIDE); - - if (ctx->Driver.BuildProjectedVertices) - ctx->Driver.BuildProjectedVertices( ctx, 0, VB->Count, new_inputs); - } + if (VB->ClipOrMask) { + tab = VB->Elts ? clip_render_tab_elts : clip_render_tab_verts; - /* Rendering is considered a side-effect, and must be repeated each - * time the stage is run, even if no inputs have changed. - */ - if (VB->Elts) { - tab = VB->ClipOrMask ? render_tab_clipped_elts : render_tab_raw_elts; - } else { - tab = VB->ClipOrMask ? render_tab_clipped : render_tab_raw; + if (new_inputs & VB->importable_data) + VB->import_data( ctx, + new_inputs & VB->importable_data, + VEC_NOT_WRITEABLE|VEC_BAD_STRIDE); } + else { + tab = VB->Elts ? ctx->Driver.RenderTabElts : ctx->Driver.RenderTabVerts; + } - if (ctx->Driver.RenderStart) - ctx->Driver.RenderStart( ctx ); + ctx->Driver.BuildProjectedVertices( ctx, 0, VB->Count, new_inputs ); do { @@ -564,9 +601,6 @@ static GLboolean run_render( GLcontext *ctx, length= VB->PrimitiveLength[i]; ASSERT(length || (flags & PRIM_LAST)); ASSERT((flags & PRIM_MODE_MASK) <= GL_POLYGON+1); -/* fprintf(stderr, "render %s %d..%d\n", */ -/* _mesa_prim_name[flags & PRIM_MODE_MASK], */ -/* i, i+length); */ if (length) tab[flags & PRIM_MODE_MASK]( ctx, i, i + length, flags ); } @@ -595,6 +629,7 @@ static void check_render( GLcontext *ctx, struct gl_pipeline_stage *stage ) { struct render_stage_data *store = RENDER_STAGE_DATA(stage); GLuint interp = 0; + GLuint copy = 0; GLuint inputs = VERT_CLIP; GLuint i; @@ -643,6 +678,12 @@ static void check_render( GLcontext *ctx, struct gl_pipeline_stage *stage ) inputs |= VERT_TEX_ANY; } + if (ctx->_TriangleCaps & DD_FLATSHADE) { + copy = interp & (INTERP_RGBA|INTERP_SPEC|INTERP_INDEX); + interp &= ~copy; + } + + store->copypv = copy_tab[copy]; store->interp = interp_tab[interp]; stage->inputs = inputs; } @@ -688,6 +729,7 @@ const struct gl_pipeline_stage _tnl_render_stage = "render", (_NEW_BUFFERS | _DD_NEW_SEPERATE_SPECULAR | + _DD_NEW_FLATSHADE | _NEW_TEXTURE| _NEW_LIGHT| _NEW_POINT| diff --git a/src/mesa/tnl/t_vb_rendertmp.h b/src/mesa/tnl/t_vb_rendertmp.h index 5712d342d27..9c9271ff226 100644 --- a/src/mesa/tnl/t_vb_rendertmp.h +++ b/src/mesa/tnl/t_vb_rendertmp.h @@ -1,4 +1,4 @@ -/* $Id: t_vb_rendertmp.h,v 1.3 2000/12/28 22:11:06 keithw Exp $ */ +/* $Id: t_vb_rendertmp.h,v 1.4 2001/01/05 02:26:49 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -60,6 +60,10 @@ #define ELT(x) x #endif +#ifndef RENDER_TAB_QUALIFIER +#define RENDER_TAB_QUALIFIER static +#endif + static void TAG(render_points)( GLcontext *ctx, GLuint start, GLuint count, @@ -68,7 +72,6 @@ static void TAG(render_points)( GLcontext *ctx, LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ RESET_OCCLUSION; INIT(GL_POINTS); RENDER_POINTS( start, count ); @@ -84,7 +87,6 @@ static void TAG(render_lines)( GLcontext *ctx, LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ RESET_OCCLUSION; INIT(GL_LINES); for (j=start+1; j<count; j+=2 ) { @@ -104,7 +106,6 @@ static void TAG(render_line_strip)( GLcontext *ctx, LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ RESET_OCCLUSION; INIT(GL_LINES); @@ -128,7 +129,6 @@ static void TAG(render_line_loop)( GLcontext *ctx, (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ RESET_OCCLUSION; INIT(GL_LINES); @@ -160,18 +160,17 @@ static void TAG(render_triangles)( GLcontext *ctx, LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ INIT(GL_POLYGON); if (NEED_EDGEFLAG_SETUP) { for (j=start+2; j<count; j+=3) { /* Leave the edgeflags as supplied by the user. */ - RENDER_TRI( ELT(j-2), ELT(j-1), ELT(j), ELT(j), 0 ); + RENDER_TRI( ELT(j-2), ELT(j-1), ELT(j) ); RESET_STIPPLE; } } else { for (j=start+2; j<count; j+=3) { - RENDER_TRI( ELT(j-2), ELT(j-1), ELT(j), ELT(j), 0 ); + RENDER_TRI( ELT(j-2), ELT(j-1), ELT(j) ); } } POSTFIX; @@ -191,15 +190,11 @@ static void TAG(render_tri_strip)( GLcontext *ctx, if (TEST_PRIM_PARITY(flags)) parity = 1; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ INIT(GL_POLYGON); if (NEED_EDGEFLAG_SETUP) { for (j=start+2;j<count;j++,parity^=1) { - /* All edges are boundary. Set edgeflags to 1, draw the - * triangle, and restore them to the original values. - */ - GLuint ej2 = ELT(j-2); - GLuint ej1 = ELT(j-1); + GLuint ej2 = ELT(j-2+parity); + GLuint ej1 = ELT(j-1-parity); GLuint ej = ELT(j); GLboolean ef2 = EDGEFLAG_GET( ej2 ); GLboolean ef1 = EDGEFLAG_GET( ej1 ); @@ -207,15 +202,15 @@ static void TAG(render_tri_strip)( GLcontext *ctx, EDGEFLAG_SET( ej2, GL_TRUE ); EDGEFLAG_SET( ej1, GL_TRUE ); EDGEFLAG_SET( ej, GL_TRUE ); - RENDER_TRI( ej2, ej1, ej, ej, parity ); + RENDER_TRI( ej2, ej1, ej ); EDGEFLAG_SET( ej2, ef2 ); EDGEFLAG_SET( ej1, ef1 ); EDGEFLAG_SET( ej, ef ); RESET_STIPPLE; } } else { - for (j=start+2;j<count;j++,parity^=1) { - RENDER_TRI( ELT(j-2), ELT(j-1), ELT(j), ELT(j), parity ); + for (j=start+2; j<count ; j++, parity^=1) { + RENDER_TRI( ELT(j-2+parity), ELT(j-1-parity), ELT(j) ); } } POSTFIX; @@ -231,7 +226,6 @@ static void TAG(render_tri_fan)( GLcontext *ctx, LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ INIT(GL_POLYGON); if (NEED_EDGEFLAG_SETUP) { for (j=start+2;j<count;j++) { @@ -246,7 +240,7 @@ static void TAG(render_tri_fan)( GLcontext *ctx, EDGEFLAG_SET( ejs, GL_TRUE ); EDGEFLAG_SET( ej1, GL_TRUE ); EDGEFLAG_SET( ej, GL_TRUE ); - RENDER_TRI( ejs, ej1, ej, ej, 0); + RENDER_TRI( ejs, ej1, ej); EDGEFLAG_SET( ejs, efs ); EDGEFLAG_SET( ej1, ef1 ); EDGEFLAG_SET( ej, ef ); @@ -254,7 +248,7 @@ static void TAG(render_tri_fan)( GLcontext *ctx, } } else { for (j=start+2;j<count;j++) { - RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(j), 0 ); + RENDER_TRI( ELT(start), ELT(j-1), ELT(j) ); } } @@ -262,22 +256,15 @@ static void TAG(render_tri_fan)( GLcontext *ctx, } -/* This is a bit of a hack. Clipping produces polygons and really - * wants to use this function to render them (in particular to get the - * edgeflags right). However, the rule that pv==start for polys - * doens't hold there, hence the extra arg and the wrapper below. - */ -static void TAG(render_poly_pv)( GLcontext *ctx, - GLuint start, - GLuint count, - GLuint flags, - GLuint pv ) +static void TAG(render_poly)( GLcontext *ctx, + GLuint start, + GLuint count, + GLuint flags ) { GLuint j = start+2; LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ INIT(GL_POLYGON); if (NEED_EDGEFLAG_SETUP) { GLboolean efstart = EDGEFLAG_GET( ELT(start) ); @@ -300,7 +287,7 @@ static void TAG(render_poly_pv)( GLcontext *ctx, if (j<count-1) { GLboolean ef = EDGEFLAG_GET( ELT(j) ); EDGEFLAG_SET( ELT(j), GL_FALSE ); - RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(pv), 0 ); + RENDER_TRI( ELT(start), ELT(j-1), ELT(j) ); EDGEFLAG_SET( ELT(j), ef ); j++; @@ -311,7 +298,7 @@ static void TAG(render_poly_pv)( GLcontext *ctx, for (;j<count-1;j++) { GLboolean efj = EDGEFLAG_GET( ELT(j) ); EDGEFLAG_SET( ELT(j), GL_FALSE ); - RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(pv), 0 ); + RENDER_TRI( ELT(start), ELT(j-1), ELT(j) ); EDGEFLAG_SET( ELT(j), efj ); } } @@ -319,7 +306,7 @@ static void TAG(render_poly_pv)( GLcontext *ctx, /* Draw the last or only triangle */ if (j < count) - RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(pv), 0 ); + RENDER_TRI( ELT(j-1), ELT(j), ELT(start) ); /* Restore the first and last edgeflags: */ @@ -332,21 +319,12 @@ static void TAG(render_poly_pv)( GLcontext *ctx, } else { for (j=start+2;j<count;j++) { - RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(start), 0 ); + RENDER_TRI( ELT(j-1), ELT(j), ELT(start) ); } } POSTFIX; } -static void TAG(render_poly)( GLcontext *ctx, - GLuint start, - GLuint count, - GLuint flags ) -{ -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ - TAG(render_poly_pv)( ctx, start, count, flags, start ); -} - static void TAG(render_quads)( GLcontext *ctx, GLuint start, GLuint count, @@ -356,18 +334,17 @@ static void TAG(render_quads)( GLcontext *ctx, LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ INIT(GL_POLYGON); if (NEED_EDGEFLAG_SETUP) { for (j=start+3; j<count; j+=4) { /* Use user-specified edgeflags for quads. */ - RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j-1), ELT(j), ELT(j) ); + RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j-1), ELT(j) ); RESET_STIPPLE; } } else { for (j=start+3; j<count; j+=4) { - RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j-1), ELT(j), ELT(j) ); + RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j-1), ELT(j) ); } } POSTFIX; @@ -382,7 +359,6 @@ static void TAG(render_quad_strip)( GLcontext *ctx, LOCAL_VARS; (void) flags; -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ INIT(GL_POLYGON); if (NEED_EDGEFLAG_SETUP) { for (j=start+3;j<count;j+=2) { @@ -397,7 +373,7 @@ static void TAG(render_quad_strip)( GLcontext *ctx, EDGEFLAG_SET( ELT(j-2), GL_TRUE ); EDGEFLAG_SET( ELT(j-1), GL_TRUE ); EDGEFLAG_SET( ELT(j), GL_TRUE ); - RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j), ELT(j-1), ELT(j) ); + RENDER_QUAD( ELT(j-1), ELT(j-3), ELT(j-2), ELT(j) ); EDGEFLAG_SET( ELT(j-3), ef3 ); EDGEFLAG_SET( ELT(j-2), ef2 ); EDGEFLAG_SET( ELT(j-1), ef1 ); @@ -406,7 +382,7 @@ static void TAG(render_quad_strip)( GLcontext *ctx, } } else { for (j=start+3;j<count;j+=2) { - RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j), ELT(j-1), ELT(j) ); + RENDER_QUAD( ELT(j-1), ELT(j-3), ELT(j-2), ELT(j) ); } } POSTFIX; @@ -417,14 +393,13 @@ static void TAG(render_noop)( GLcontext *ctx, GLuint count, GLuint flags ) { -/* fprintf(stderr, "%s %d..%d\n", __FUNCTION__, start, count); */ (void)(ctx && start && count && flags); } -static void (*TAG(render_tab)[GL_POLYGON+2])(GLcontext *, - GLuint, - GLuint, - GLuint) = +RENDER_TAB_QUALIFIER void (*TAG(render_tab)[GL_POLYGON+2])(GLcontext *, + GLuint, + GLuint, + GLuint) = { TAG(render_points), TAG(render_lines), @@ -452,6 +427,7 @@ static void (*TAG(render_tab)[GL_POLYGON+2])(GLcontext *, #undef RESET_STIPPLE #undef DBG #undef ELT +#undef RENDER_TAB_QUALIFIER #endif #ifndef PRESERVE_TAG |