Mesa (master): st/mesa: add support for clip vertex.

Dave Airlie airlied at kemper.freedesktop.org
Sat Jan 7 08:39:11 UTC 2012


Module: Mesa
Branch: master
Commit: a103c61d278b7f56208818c4b949c408c00286fa
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a103c61d278b7f56208818c4b949c408c00286fa

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Jan  4 11:49:26 2012 +0000

st/mesa: add support for clip vertex.

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..236d3cf 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 (ctx->Shader.CurrentVertexProgram)
+         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 35d0e0f..8d7469d 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -255,6 +255,10 @@ st_prepare_vertex_program(struct gl_context *ctx,
          case VERT_RESULT_EDGE:
             assert(0);
             break;
+         case VERT_RESULT_CLIP_VERTEX:
+            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX;
+            stvp->output_semantic_index[slot] = 0;
+            break;
 
          case VERT_RESULT_TEX0:
          case VERT_RESULT_TEX1:




More information about the mesa-commit mailing list