[Mesa-dev] [PATCH 2/3] st/mesa: add support for clip vertex.
Dave Airlie
airlied at gmail.com
Wed Jan 4 04:13:00 PST 2012
From: Dave Airlie <airlied at redhat.com>
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 <airlied at redhat.com>
---
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
More information about the mesa-dev
mailing list