summaryrefslogtreecommitdiffstats
path: root/src/mesa/tnl/t_vb_program.c
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2009-10-08 17:28:02 -0700
committerIan Romanick <[email protected]>2009-10-13 15:15:20 -0700
commitf058b25881e08c9d89a33345e5c84e1357396932 (patch)
tree6cb9994881adeb9f6b14dc860b1bf10cacc66436 /src/mesa/tnl/t_vb_program.c
parentcf33aaf8fe2b1d22e394f431735b76f3ab04b854 (diff)
Store clipping distance for user clip planes as part of vertex processing
Once the clipping distance is calculated and stored per vertex, the distances can be re-used when clipping is actually performed. This doesn't have any immediate benefit, but it paves the way for implementing gl_ClipDistance in vertex shaders and result.clip[] in vertex programs. This has not produces any oglconform regressions on my G31 system which uses software TNL. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src/mesa/tnl/t_vb_program.c')
-rw-r--r--src/mesa/tnl/t_vb_program.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/mesa/tnl/t_vb_program.c b/src/mesa/tnl/t_vb_program.c
index c10a27614ff..5fb83c2b01b 100644
--- a/src/mesa/tnl/t_vb_program.c
+++ b/src/mesa/tnl/t_vb_program.c
@@ -66,6 +66,7 @@ struct vp_stage_data {
GLvector4f results[VERT_RESULT_MAX];
GLvector4f ndcCoords; /**< normalized device coords */
+ GLfloat *clipdistance[MAX_CLIP_PLANES];
GLubyte *clipmask; /**< clip flags */
GLubyte ormask, andmask; /**< for clipping */
};
@@ -77,6 +78,7 @@ struct vp_stage_data {
static void
userclip( GLcontext *ctx,
GLvector4f *clip,
+ GLfloat *clipdistance[MAX_CLIP_PLANES],
GLubyte *clipmask,
GLubyte *clipormask,
GLubyte *clipandmask )
@@ -105,6 +107,8 @@ userclip( GLcontext *ctx,
clipmask[i] |= CLIP_USER_BIT;
}
+ clipdistance[p][i] = dp;
+
STRIDE_F(coord, stride);
}
@@ -164,6 +168,7 @@ do_ndc_cliptest(GLcontext *ctx, struct vp_stage_data *store)
ctx->VertexProgram.Current->IsPositionInvariant)) {
userclip( ctx,
VB->ClipPtr,
+ store->clipdistance,
store->clipmask,
&store->ormask,
&store->andmask );
@@ -171,6 +176,9 @@ do_ndc_cliptest(GLcontext *ctx, struct vp_stage_data *store)
if (store->andmask) {
return GL_FALSE;
}
+
+ memcpy(VB->ClipDistancePtr, store->clipdistance,
+ sizeof(store->clipdistance));
}
VB->ClipAndMask = store->andmask;
@@ -514,6 +522,10 @@ init_vp(GLcontext *ctx, struct tnl_pipeline_stage *stage)
_mesa_vector4f_alloc( &store->ndcCoords, 0, size, 32 );
store->clipmask = (GLubyte *) ALIGN_MALLOC(sizeof(GLubyte)*size, 32 );
+ for (i = 0; i < MAX_CLIP_PLANES; i++)
+ store->clipdistance[i] =
+ (GLfloat *) ALIGN_MALLOC(sizeof(GLfloat) * size, 32);
+
return GL_TRUE;
}
@@ -537,6 +549,9 @@ dtr(struct tnl_pipeline_stage *stage)
_mesa_vector4f_free( &store->ndcCoords );
ALIGN_FREE( store->clipmask );
+ for (i = 0; i < MAX_CLIP_PLANES; i++)
+ ALIGN_FREE(store->clipdistance[i]);
+
FREE( store );
stage->privatePtr = NULL;
}