From: Dave Airlie <[email protected]> We need to pass the pre-projection matrix clip planes into the driver, instead of the post for the case we have a vertex shader that writes clip vertex.
Signed-off-by: Dave Airlie <[email protected]> --- src/mesa/state_tracker/st_atom_clip.c | 20 ++++++++++++++------ src/mesa/state_tracker/st_program.c | 4 ++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/mesa/state_tracker/st_atom_clip.c b/src/mesa/state_tracker/st_atom_clip.c index 1330db8..f1a8979 100644 --- a/src/mesa/state_tracker/st_atom_clip.c +++ b/src/mesa/state_tracker/st_atom_clip.c @@ -34,7 +34,7 @@ #include "st_context.h" #include "pipe/p_context.h" #include "st_atom.h" - +#include "st_program.h" #include "cso_cache/cso_context.h" @@ -45,15 +45,23 @@ static void update_clip( struct st_context *st ) struct pipe_clip_state clip; const struct gl_context *ctx = st->ctx; GLuint i; + bool use_eye = FALSE; memset(&clip, 0, sizeof(clip)); + /* if we have a vertex shader that writes clip vertex we need to pass + the pre-projection transformed coordinates into the driver. */ + if (st->vp) { + if (st->vp->Base.Base.OutputsWritten & (1 << VERT_RESULT_CLIP_VERTEX)) + use_eye = TRUE; + } + for (i = 0; i < PIPE_MAX_CLIP_PLANES; i++) { if (ctx->Transform.ClipPlanesEnabled & (1 << i)) { - memcpy(clip.ucp[clip.nr], - ctx->Transform._ClipUserPlane[i], - sizeof(clip.ucp[0])); - clip.nr++; + memcpy(clip.ucp[clip.nr], + use_eye ? ctx->Transform.EyeUserPlane[i] : ctx->Transform._ClipUserPlane[i], + sizeof(clip.ucp[0])); + clip.nr++; } } @@ -69,7 +77,7 @@ static void update_clip( struct st_context *st ) const struct st_tracked_state st_update_clip = { "st_update_clip", /* name */ { /* dirty */ - (_NEW_TRANSFORM), /* mesa */ + (_NEW_TRANSFORM|_NEW_PROGRAM), /* mesa */ 0, /* st */ }, update_clip /* update */ diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index d62bfcd..3d9d45b 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -260,6 +260,10 @@ st_prepare_vertex_program(struct gl_context *ctx, stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; break; + case VERT_RESULT_CLIP_VERTEX: + stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX; + stvp->output_semantic_index[slot] = 0; + break; case VERT_RESULT_VAR0: default: assert(attr < VERT_RESULT_MAX); -- 1.7.7.3 _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
