[Mesa-dev] [PATCH 2/3] st/mesa: add support for clip vertex.

2012-01-04 Thread Dave Airlie
From: Dave Airlie 

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 
---
 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
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 2/3] st/mesa: add support for clip vertex.

2012-01-04 Thread Brian Paul

On 01/04/2012 05:13 AM, Dave Airlie wrote:

From: Dave Airlie

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
---
  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 
*/


Whitespace before/after the | is a little more readable.



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);


Would you mind moving this case up so it follows VERT_RESULT_EDGE so 
that the switch cases more closely match the enum order?


-Brian
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev