init machine->Samplers (fixes vertex program texture fetches)
[mesa.git] / src / mesa / tnl / t_vb_vertex.c
index b483a9522d1f5793db32c2ee0087bc34b74b90c1..276305b5e67fd76e0bd2e1f65c0de21f33849481 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.1
+ * Version:  6.5
  *
- * Copyright (C) 1999-2004  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"),
@@ -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)
@@ -118,8 +110,8 @@ static void (*(usercliptab[5]))( GLcontext *,
                                 GLvector4f *, GLubyte *,
                                 GLubyte *, GLubyte * ) =
 {
-   0,
-   0,
+   NULL,
+   NULL,
    userclip2,
    userclip3,
    userclip4
@@ -134,108 +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->VertexProgram._Current) 
+      return GL_TRUE;
 
-      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);
-      }
-
-      VB->ClipPtr = TransformRaw( &store->clip,
-                                 &ctx->_ModelProjectMatrix,
-                                 VB->ObjPtr );
-
-      /* Drivers expect this to be clean to element 4...
+   if (ctx->_NeedEyeCoords) {
+      /* Separate modelview transformation:
+       * Use combined ModelProject to avoid some depth artifacts
        */
-      switch (VB->ClipPtr->size) {
-      case 1:                  
-        /* impossible */
-      case 2:
-        _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 2 );
-      case 3:
-        _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 3 );
-      case 4:
-        break;
-      }
-
-      /* 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 {
-        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;
-
-      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;
+      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 )
 {
@@ -260,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 )
@@ -285,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 */
 };