diff options
author | Keith Whitwell <[email protected]> | 2000-12-27 19:57:37 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 2000-12-27 19:57:37 +0000 |
commit | 719344b23ed7b1947af1db9281389f3fc74c3fc5 (patch) | |
tree | ed49176faf01d3d616466547a8b33b11d6cec4de /src/mesa/tnl | |
parent | 770169f230a197d969f64df76cfaee1f0e27874f (diff) |
Fixes for compiling assembly (disable unused 'masked' versions)
Fixes for compiling without debug.
Fix line clipping
Fix unfilled polygon clipping (should be correct now).
Diffstat (limited to 'src/mesa/tnl')
-rw-r--r-- | src/mesa/tnl/t_array_import.c | 5 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_cliptmp.h | 130 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_light.c | 4 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_normals.c | 3 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_render.c | 3 | ||||
-rw-r--r-- | src/mesa/tnl/t_vb_rendertmp.h | 75 |
6 files changed, 128 insertions, 92 deletions
diff --git a/src/mesa/tnl/t_array_import.c b/src/mesa/tnl/t_array_import.c index 16a669dc287..1cfed067647 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.1 2000/12/26 05:09:32 keithw Exp $ */ +/* $Id: t_array_import.c,v 1.2 2000/12/27 19:57:37 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -248,9 +248,10 @@ static void _tnl_upgrade_client_data( GLcontext *ctx, { GLuint i; struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; - struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; GLboolean writeable = (flags & VEC_NOT_WRITEABLE) != 0; GLboolean stride = (flags & VEC_BAD_STRIDE) != 0; + struct vertex_arrays *inputs = &TNL_CONTEXT(ctx)->array_inputs; + (void) inputs; if ((required & VERT_CLIP) && VB->ClipPtr == VB->ObjPtr) required |= VERT_OBJ; diff --git a/src/mesa/tnl/t_vb_cliptmp.h b/src/mesa/tnl/t_vb_cliptmp.h index 8a73e87de30..34f0a4f1e1b 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.1 2000/12/26 05:09:33 keithw Exp $ */ +/* $Id: t_vb_cliptmp.h,v 1.2 2000/12/27 19:57:37 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -60,10 +60,14 @@ static GLuint TAG(userclip_line)( GLcontext *ctx, 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) @@ -86,8 +90,15 @@ static GLuint TAG(userclip_polygon)( GLcontext *ctx, 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]; @@ -96,47 +107,63 @@ static GLuint TAG(userclip_polygon)( GLcontext *ctx, register float d = ctx->Transform._ClipUserPlane[p][3]; /* initialize prev to be last in the input list */ - GLuint prevj = inlist[0]; - GLfloat dpJ = d*W(prevj) + c*Z(prevj) + b*Y(prevj) + a*X(prevj); + GLuint idxPrev = inlist[n-1]; + GLfloat dpPrev = CLIP_DOTPROD(idxPrev); GLuint outcount = 0; - GLuint curri; - - inlist[n] = inlist[0]; - - for (curri=1;curri<n+1;curri++) { GLuint currj = inlist[curri]; - GLfloat dpI = d*W(currj) + c*Z(currj) + b*Y(currj) + a*X(currj); - - if (!NEGATIVE(dpJ)) { - outlist[outcount++] = prevj; - VB->ClipMask[prevj] &= ~CLIP_USER_BIT; + 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 { - VB->ClipMask[prevj] |= CLIP_USER_BIT; + clipmask[idxPrev] |= CLIP_USER_BIT; } - if (DIFFERENT_SIGNS(dpI, dpJ)) { - if (NEGATIVE(dpI)) { - GLfloat t = dpI/(dpI-dpJ); - outlist[outcount++] = interp( ctx, t, currj, prevj, GL_TRUE); + + 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 ); +/* fprintf(stderr,"Goint out: in: %d/%d out: %d/%d new: %d/%d\n", */ +/* idxPrev, VB->EdgeFlagPtr->data[idxPrev], */ +/* idx, VB->EdgeFlagPtr->data[idx], */ +/* newvert, VB->EdgeFlagPtr->data[newvert]); */ } else { - GLfloat t = dpJ/(dpJ-dpI); - outlist[outcount++] = interp( ctx, t, prevj, currj, GL_FALSE); - } + /* Coming back in. + */ + GLfloat t = dpPrev / (dpPrev - dp); + newvert = interp( ctx, t, idxPrev, idx, GL_FALSE ); +/* fprintf(stderr,"coming in: in: %d/%d out: %d/%d new: %d/%d\n", */ +/* idx, VB->EdgeFlagPtr->data[idx], */ +/* idxPrev, VB->EdgeFlagPtr->data[idxPrev], */ +/* newvert, VB->EdgeFlagPtr->data[newvert]); */ + } + clipmask[newvert] = 0; + outlist[outcount++] = newvert; } - - prevj = currj; - dpJ = dpI; - } + + idxPrev = idx; + dpPrev = dp; + } if (outcount < 3) return 0; - else { + + { GLuint *tmp; tmp = inlist; inlist = outlist; outlist = tmp; n = outcount; } - } /* if */ } /* for p */ @@ -146,6 +173,10 @@ static GLuint TAG(userclip_polygon)( GLcontext *ctx, vlist[i] = inlist[i]; } +/* fprintf(stderr, "%s: finally:\n", __FUNCTION__); */ +/* for (i = 0 ; i < n ; i++) */ +/* fprintf(stderr, "%d: %d\n", vlist[i], VB->EdgeFlagPtr->data[vlist[i]]); */ + return n; } @@ -168,25 +199,29 @@ static void TAG(viewclip_line)( GLcontext *ctx, /* * 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); \ - jj = interp( ctx, t, ii, jj, GL_FALSE ); \ - } else { \ - GLfloat t = dpJ / (dpJ - dpI); \ - ii = interp( ctx, t, jj, ii, GL_FALSE ); \ - } \ - } \ - else if (NEGATIVE(dpI)) \ - return; \ - } - +#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)) @@ -271,11 +306,12 @@ static void TAG(viewclip_line)( GLcontext *ctx, } } - if (ctx->Driver.BuildProjectedVertices) + if (ctx->Driver.BuildProjectedVertices) ctx->Driver.BuildProjectedVertices(ctx, VB->FirstClipped, VB->LastClipped, ~0); + /* Render the new line. */ diff --git a/src/mesa/tnl/t_vb_light.c b/src/mesa/tnl/t_vb_light.c index b55cda38588..043eb7302fc 100644 --- a/src/mesa/tnl/t_vb_light.c +++ b/src/mesa/tnl/t_vb_light.c @@ -1,4 +1,4 @@ -/* $Id: t_vb_light.c,v 1.1 2000/12/26 05:09:33 keithw Exp $ */ +/* $Id: t_vb_light.c,v 1.2 2000/12/27 19:57:37 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -176,6 +176,8 @@ static GLboolean run_validate_lighting( GLcontext *ctx, } /* tab = _tnl_light_tab; */ } + else + tab = _tnl_light_ci_tab; if (ctx->Light.ColorMaterialEnabled) ind |= LIGHT_COLORMATERIAL; diff --git a/src/mesa/tnl/t_vb_normals.c b/src/mesa/tnl/t_vb_normals.c index 97e7b9bb356..e55520cb5c2 100644 --- a/src/mesa/tnl/t_vb_normals.c +++ b/src/mesa/tnl/t_vb_normals.c @@ -1,4 +1,4 @@ -/* $Id: t_vb_normals.c,v 1.1 2000/12/26 05:09:33 keithw Exp $ */ +/* $Id: t_vb_normals.c,v 1.2 2000/12/27 19:57:37 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -64,6 +64,7 @@ static GLboolean run_normal_stage( GLcontext *ctx, if (VB->NormalLengthPtr) { GLfloat diff = VB->NormalLengthPtr[0] - 1.0/LEN_3FV(VB->NormalPtr->data[0]); + (void)diff; ASSERT((diff*diff) < .01); } diff --git a/src/mesa/tnl/t_vb_render.c b/src/mesa/tnl/t_vb_render.c index 5707f21c901..15afe6118db 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.1 2000/12/26 05:09:33 keithw Exp $ */ +/* $Id: t_vb_render.c,v 1.2 2000/12/27 19:57:37 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -630,6 +630,7 @@ static void check_render( GLcontext *ctx, struct gl_pipeline_stage *stage ) if (ctx->_TriangleCaps & DD_TRI_UNFILLED) { inputs |= VERT_EDGE; + interp |= INTERP_EDGE; } if (ctx->RenderMode==GL_FEEDBACK) { diff --git a/src/mesa/tnl/t_vb_rendertmp.h b/src/mesa/tnl/t_vb_rendertmp.h index de8adb23ec5..bd77b9668a0 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.1 2000/12/26 05:09:33 keithw Exp $ */ +/* $Id: t_vb_rendertmp.h,v 1.2 2000/12/27 19:57:37 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -105,9 +105,8 @@ static void TAG(render_line_strip)( GLcontext *ctx, RESET_OCCLUSION; INIT(GL_LINES); - for (j=start+1; j<count; j++ ) { + for (j=start+1; j<count; j++ ) RENDER_LINE( ELT(j-1), ELT(j) ); - } if (TEST_PRIM_END(flags)) RESET_STIPPLE; @@ -273,55 +272,51 @@ static void TAG(render_poly_pv)( GLcontext *ctx, INIT(GL_POLYGON); if (NEED_EDGEFLAG_SETUP) { - if (start+3 < count) { - GLboolean efstart = EDGEFLAG_GET( ELT(start) ); - GLboolean efcount = EDGEFLAG_GET( ELT(count-1) ); + GLboolean efstart = EDGEFLAG_GET( ELT(start) ); + GLboolean efcount = EDGEFLAG_GET( ELT(count-1) ); - - /* If the primitive does not begin here, the first edge - * is non-boundary. - */ - if (!TEST_PRIM_BEGIN(flags)) - EDGEFLAG_SET( ELT(start), GL_FALSE ); + /* If the primitive does not begin here, the first edge + * is non-boundary. + */ + if (!TEST_PRIM_BEGIN(flags)) + EDGEFLAG_SET( ELT(start), GL_FALSE ); - /* If the primitive does not end here, the final edge is - * non-boundary. - */ - if (!TEST_PRIM_END(flags)) - EDGEFLAG_SET( ELT(count-1), GL_FALSE ); + /* If the primitive does not end here, the final edge is + * non-boundary. + */ + if (!TEST_PRIM_END(flags)) + EDGEFLAG_SET( ELT(count-1), GL_FALSE ); - /* Draw the first triangle (possibly also the last). - */ - if (j<count) { - GLboolean ef = EDGEFLAG_GET( ELT(j) ); - EDGEFLAG_SET( ELT(j), GL_FALSE ); - RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(pv), 0 ); - EDGEFLAG_SET( ELT(j), ef ); - j++; - } + /* Draw the first triangles (possibly zero) + */ + 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 ); + EDGEFLAG_SET( ELT(j), ef ); + j++; - /* For internal tris, the first and last edges are non-boundary. + /* Don't render the first edge again: */ EDGEFLAG_SET( ELT(start), GL_FALSE ); + for (;j<count-1;j++) { - GLboolean ef = EDGEFLAG_GET( ELT(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 ); - EDGEFLAG_SET( ELT(j), ef ); + EDGEFLAG_SET( ELT(j), efj ); } + } - /* Draw the last triangle - */ - if (j < count) { - RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(pv), 0 ); - j++; - } + /* Draw the last or only triangle + */ + if (j < count) + RENDER_TRI( ELT(start), ELT(j-1), ELT(j), ELT(pv), 0 ); - /* Restore the first, last edgeflags: - */ - EDGEFLAG_SET( ELT(count-1), efcount ); - EDGEFLAG_SET( ELT(start), efstart ); - } + /* Restore the first and last edgeflags: + */ + EDGEFLAG_SET( ELT(count-1), efcount ); + EDGEFLAG_SET( ELT(start), efstart ); if (TEST_PRIM_END(flags)) { RESET_STIPPLE; |