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 <ian.d.romanick@intel.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user