X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Ftnl%2Ft_vb_vertex.c;h=30aa7c4086835b880466844b06e312e373b5aa4a;hb=9b70c33e735ff060ddad7d0b501d19c670f41618;hp=aa414bc5b1881d19a82bea55d5ecb1b46c8a4be8;hpb=05a4b37707d2c598ea68c05d07a3d65bcbf5a076;p=mesa.git diff --git a/src/mesa/tnl/t_vb_vertex.c b/src/mesa/tnl/t_vb_vertex.c index aa414bc5b18..30aa7c40868 100644 --- a/src/mesa/tnl/t_vb_vertex.c +++ b/src/mesa/tnl/t_vb_vertex.c @@ -1,10 +1,8 @@ -/* $Id: t_vb_vertex.c,v 1.16 2002/10/29 20:29:04 brianp Exp $ */ - /* * Mesa 3-D graphics library - * Version: 3.5 + * Version: 6.5 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -28,13 +26,12 @@ */ -#include "glheader.h" -#include "colormac.h" -#include "context.h" -#include "macros.h" -#include "imports.h" -#include "mmath.h" -#include "mtypes.h" +#include "main/glheader.h" +#include "main/colormac.h" +#include "main/context.h" +#include "main/macros.h" +#include "main/imports.h" +#include "main/mtypes.h" #include "math/m_xform.h" @@ -50,14 +47,6 @@ struct vertex_stage_data { GLubyte *clipmask; GLubyte ormask; GLubyte andmask; - - - /* Need these because it's difficult to replay the sideeffects - * analytically. - */ - GLvector4f *save_eyeptr; - GLvector4f *save_clipptr; - GLvector4f *save_ndcptr; }; #define VERTEX_STAGE_DATA(stage) ((struct vertex_stage_data *)stage->privatePtr) @@ -121,8 +110,8 @@ static void (*(usercliptab[5]))( GLcontext *, GLvector4f *, GLubyte *, GLubyte *, GLubyte * ) = { - 0, - 0, + NULL, + NULL, userclip2, userclip3, userclip4 @@ -131,133 +120,98 @@ static void (*(usercliptab[5]))( GLcontext *, static GLboolean run_vertex_stage( GLcontext *ctx, - struct gl_pipeline_stage *stage ) + struct tnl_pipeline_stage *stage ) { struct vertex_stage_data *store = (struct vertex_stage_data *)stage->privatePtr; TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; - if (stage->changed_inputs) { - - if (ctx->_NeedEyeCoords) { - /* Separate modelview transformation: - * Use combined ModelProject to avoid some depth artifacts - */ - if (ctx->ModelviewMatrixStack.Top->type == MATRIX_IDENTITY) - VB->EyePtr = VB->ObjPtr; - else - VB->EyePtr = TransformRaw( &store->eye, - ctx->ModelviewMatrixStack.Top, - VB->ObjPtr); - - if (ctx->ProjectionMatrixStack.Top->type == MATRIX_IDENTITY) - VB->ClipPtr = VB->EyePtr; - else - VB->ClipPtr = TransformRaw( &store->clip, - &ctx->_ModelProjectMatrix, - VB->ObjPtr ); - } - else { - /* Combined modelviewproject transform: - */ - if (ctx->_ModelProjectMatrix.type == MATRIX_IDENTITY) - VB->ClipPtr = VB->ObjPtr; - else - VB->ClipPtr = TransformRaw( &store->clip, - &ctx->_ModelProjectMatrix, - VB->ObjPtr ); - } - - /* Drivers expect this to be clean to element 4... - */ - if (VB->ClipPtr->size < 4) { - if (VB->ClipPtr->flags & VEC_NOT_WRITEABLE) { - ASSERT(VB->ClipPtr == VB->ObjPtr); - VB->import_data( ctx, VERT_BIT_POS, VEC_NOT_WRITEABLE ); - VB->ClipPtr = VB->ObjPtr; - } - if (VB->ClipPtr->size == 2) - _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 2 ); - _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 3 ); - } - - /* Cliptest and perspective divide. Clip functions must clear - * the clipmask. + if (ctx->VertexProgram._Current) + return GL_TRUE; + + if (ctx->_NeedEyeCoords) { + /* Separate modelview transformation: + * Use combined ModelProject to avoid some depth artifacts */ - store->ormask = 0; - store->andmask = CLIP_ALL_BITS; - - if (tnl->NeedNdcCoords) { - VB->NdcPtr = - _mesa_clip_tab[VB->ClipPtr->size]( VB->ClipPtr, - &store->proj, - store->clipmask, - &store->ormask, - &store->andmask ); - - } - else { - VB->NdcPtr = 0; - _mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr, - 0, - store->clipmask, - &store->ormask, - &store->andmask ); - } + if (ctx->ModelviewMatrixStack.Top->type == MATRIX_IDENTITY) + VB->EyePtr = VB->ObjPtr; + else + VB->EyePtr = TransformRaw( &store->eye, + ctx->ModelviewMatrixStack.Top, + VB->ObjPtr); + } - if (store->andmask) - return GL_FALSE; + VB->ClipPtr = TransformRaw( &store->clip, + &ctx->_ModelProjectMatrix, + VB->ObjPtr ); + /* Drivers expect this to be clean to element 4... + */ + switch (VB->ClipPtr->size) { + case 1: + /* impossible */ + case 2: + _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 2 ); + /* fall-through */ + case 3: + _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 3 ); + /* fall-through */ + case 4: + break; + } - /* Test userclip planes. This contributes to VB->ClipMask, so - * is essentially required to be in this stage. - */ - if (ctx->Transform.ClipPlanesEnabled) { - usercliptab[VB->ClipPtr->size]( ctx, - VB->ClipPtr, - store->clipmask, - &store->ormask, - &store->andmask ); - - if (store->andmask) - return GL_FALSE; - } - - VB->ClipOrMask = store->ormask; - VB->ClipMask = store->clipmask; - - if (VB->ClipPtr == VB->ObjPtr && (VB->importable_data & VERT_BIT_POS)) - VB->importable_data |= VERT_BIT_CLIP; - - store->save_eyeptr = VB->EyePtr; - store->save_clipptr = VB->ClipPtr; - store->save_ndcptr = VB->NdcPtr; + + /* Cliptest and perspective divide. Clip functions must clear + * the clipmask. + */ + store->ormask = 0; + store->andmask = CLIP_FRUSTUM_BITS; + + if (tnl->NeedNdcCoords) { + VB->NdcPtr = + _mesa_clip_tab[VB->ClipPtr->size]( VB->ClipPtr, + &store->proj, + store->clipmask, + &store->ormask, + &store->andmask ); } else { - /* Replay the sideeffects. - */ - VB->EyePtr = store->save_eyeptr; - VB->ClipPtr = store->save_clipptr; - VB->NdcPtr = store->save_ndcptr; - VB->ClipMask = store->clipmask; - VB->ClipOrMask = store->ormask; - if (VB->ClipPtr == VB->ObjPtr && (VB->importable_data & VERT_BIT_POS)) - VB->importable_data |= VERT_BIT_CLIP; + VB->NdcPtr = NULL; + _mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr, + NULL, + store->clipmask, + &store->ormask, + &store->andmask ); + } + + if (store->andmask) + return GL_FALSE; + + + /* Test userclip planes. This contributes to VB->ClipMask, so + * is essentially required to be in this stage. + */ + if (ctx->Transform.ClipPlanesEnabled) { + usercliptab[VB->ClipPtr->size]( ctx, + VB->ClipPtr, + store->clipmask, + &store->ormask, + &store->andmask ); + if (store->andmask) return GL_FALSE; } + VB->ClipAndMask = store->andmask; + VB->ClipOrMask = store->ormask; + VB->ClipMask = store->clipmask; + return GL_TRUE; } -static void check_vertex( GLcontext *ctx, struct gl_pipeline_stage *stage ) -{ - stage->active = !ctx->VertexProgram.Enabled; -} - static GLboolean init_vertex_stage( GLcontext *ctx, - struct gl_pipeline_stage *stage ) + struct tnl_pipeline_stage *stage ) { struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; struct vertex_stage_data *store; @@ -280,13 +234,10 @@ static GLboolean init_vertex_stage( GLcontext *ctx, !store->proj.data) return GL_FALSE; - /* Now run the stage. - */ - stage->run = run_vertex_stage; - return stage->run( ctx, stage ); + return GL_TRUE; } -static void dtr( struct gl_pipeline_stage *stage ) +static void dtr( struct tnl_pipeline_stage *stage ) { struct vertex_stage_data *store = VERTEX_STAGE_DATA(stage); @@ -302,20 +253,12 @@ static void dtr( struct gl_pipeline_stage *stage ) } -const struct gl_pipeline_stage _tnl_vertex_transform_stage = +const struct tnl_pipeline_stage _tnl_vertex_transform_stage = { "modelview/project/cliptest/divide", - 0, /* re-check -- always on */ - _MESA_NEW_NEED_EYE_COORDS | - _NEW_MODELVIEW| - _NEW_PROJECTION| - _NEW_TRANSFORM, /* re-run */ - GL_TRUE, /* active */ - VERT_BIT_POS, /* inputs */ - VERT_BIT_EYE|VERT_BIT_CLIP, /* outputs */ - 0, /* changed_inputs */ NULL, /* private data */ + init_vertex_stage, dtr, /* destructor */ - check_vertex, /* check */ - init_vertex_stage /* run -- initially set to init */ + NULL, + run_vertex_stage /* run -- initially set to init */ };