summaryrefslogtreecommitdiffstats
path: root/src/mesa/tnl/t_vb_vertex.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/tnl/t_vb_vertex.c')
-rw-r--r--src/mesa/tnl/t_vb_vertex.c215
1 files changed, 74 insertions, 141 deletions
diff --git a/src/mesa/tnl/t_vb_vertex.c b/src/mesa/tnl/t_vb_vertex.c
index ec303187a54..b3defaad05e 100644
--- a/src/mesa/tnl/t_vb_vertex.c
+++ b/src/mesa/tnl/t_vb_vertex.c
@@ -47,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)
@@ -134,137 +126,90 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
- ASSERT(!ctx->VertexProgram._Enabled);
-
- 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 0
- /* examine some eye coordinates */
- {
- GLuint i;
- GLfloat *v = VB->EyePtr->start;
- for (i = 0; i < 4; i++) {
- _mesa_printf("eye[%d] = %g, %g, %g, %g\n",
- i, v[0], v[1], v[2], v[3]);
- v += 4;
- }
- }
-#endif
- }
-
- 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;
- }
-
-#if 0
- /* examine some clip coordinates */
- {
- GLuint i;
- GLfloat *v = VB->ClipPtr->start;
- for (i = 0; i < 4; i++) {
- _mesa_printf("clip[%d] = %g, %g, %g, %g\n",
- i, v[0], v[1], v[2], v[3]);
- v += 4;
- }
- }
-#endif
-
- /* Cliptest and perspective divide. Clip functions must clear
- * the clipmask.
+ if (ctx->VertexProgram._Enabled)
+ 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 = NULL;
- _mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr,
- NULL,
- 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->ClipAndMask = store->andmask;
- VB->ClipOrMask = store->ormask;
- VB->ClipMask = store->clipmask;
-
- 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_ALL_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->ClipAndMask = store->andmask;
- VB->ClipOrMask = store->ormask;
+ 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 tnl_pipeline_stage *stage )
-{
- stage->active = !ctx->VertexProgram._Enabled;
-}
-
static GLboolean init_vertex_stage( GLcontext *ctx,
struct tnl_pipeline_stage *stage )
{
@@ -289,10 +234,7 @@ 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 tnl_pipeline_stage *stage )
@@ -314,18 +256,9 @@ static void dtr( struct tnl_pipeline_stage *stage )
const struct tnl_pipeline_stage _tnl_vertex_transform_stage =
{
"modelview/project/cliptest/divide",
- _NEW_PROGRAM, /* check_state: only care about vertex prog */
- _MESA_NEW_NEED_EYE_COORDS | /* run_state: when to invalidate / re-run */
- _NEW_MODELVIEW|
- _NEW_PROJECTION|
- _NEW_PROGRAM|
- _NEW_TRANSFORM,
- GL_TRUE, /* active */
- _TNL_BIT_POS, /* inputs */
- _TNL_BIT_POS, /* 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 */
};