On 01/04/2012 05:13 AM, Dave Airlie wrote:
From: Dave Airlie<airl...@redhat.com>

softpipe always clipped using the position vector, however for unclipped
vertices it stored the position in window coordinates, however when position
and clipping are separated, we need to store the clip-space position and
the clip-space vertex clip, so we can interpolate both separately.

This means we have to take the clip space position and store it to use later.

This allows softpipe to pass all the clip-vertex piglit tests.

Signed-off-by: Dave Airlie<airl...@redhat.com>
---
  src/gallium/auxiliary/draw/draw_cliptest_tmp.h |   18 ++++++++++++------
  src/gallium/auxiliary/draw/draw_context.c      |   10 ++++++++++
  src/gallium/auxiliary/draw/draw_pipe_clip.c    |    9 ++++++---
  src/gallium/auxiliary/draw/draw_private.h      |    5 +++--
  src/gallium/auxiliary/draw/draw_pt_fetch.c     |    4 ++--
  src/gallium/auxiliary/draw/draw_vs.c           |    9 +++++++++
  src/gallium/auxiliary/draw/draw_vs.h           |    1 +
  7 files changed, 43 insertions(+), 13 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_cliptest_tmp.h 
b/src/gallium/auxiliary/draw/draw_cliptest_tmp.h
index 1ca1529..7ae95a6 100644
--- a/src/gallium/auxiliary/draw/draw_cliptest_tmp.h
+++ b/src/gallium/auxiliary/draw/draw_cliptest_tmp.h
@@ -35,11 +35,13 @@ static boolean TAG(do_cliptest)( struct pt_post_vs *pvs,
     const float *trans = pvs->draw->viewport.translate;
     /* const */ float (*plane)[4] = pvs->draw->plane;
     const unsigned pos = draw_current_shader_position_output(pvs->draw);
+   const unsigned cv = draw_current_shader_clipvertex_output(pvs->draw);
     const unsigned ef = pvs->draw->vs.edgeflag_output;
     const unsigned nr = pvs->draw->nr_planes;
     const unsigned flags = (FLAGS);
     unsigned need_pipeline = 0;
     unsigned j;
+   unsigned i;

     for (j = 0; j<  info->count; j++) {
        float *position = out->data[pos];
@@ -49,10 +51,15 @@ static boolean TAG(do_cliptest)( struct pt_post_vs *pvs,

        if (flags&  (DO_CLIP_XY | DO_CLIP_XY_GUARD_BAND |
                     DO_CLIP_FULL_Z | DO_CLIP_HALF_Z | DO_CLIP_USER)) {
-         out->clip[0] = position[0];
-         out->clip[1] = position[1];
-         out->clip[2] = position[2];
-         out->clip[3] = position[3];
+         float *clipvertex = position;
+
+         if ((flags&  DO_CLIP_USER)&&  cv != pos)
+            clipvertex = out->data[cv];
+
+         for (i = 0; i<  4; i++) {
+            out->clip[i] = clipvertex[i];
+            out->pre_clip_pos[i] = position[i];
+         }

           /* Do the hardwired planes first:
            */
@@ -81,9 +88,8 @@ static boolean TAG(do_cliptest)( struct pt_post_vs *pvs,
           }

           if (flags&  DO_CLIP_USER) {
-            unsigned i;
              for (i = 6; i<  nr; i++) {
-               if (dot4(position, plane[i])<  0)
+               if (dot4(clipvertex, plane[i])<  0)
                    mask |= (1<<i);
              }
           }
diff --git a/src/gallium/auxiliary/draw/draw_context.c 
b/src/gallium/auxiliary/draw/draw_context.c
index 9c00687..6b58073 100644
--- a/src/gallium/auxiliary/draw/draw_context.c
+++ b/src/gallium/auxiliary/draw/draw_context.c
@@ -675,6 +675,16 @@ draw_current_shader_position_output(const struct 
draw_context *draw)


  /**
+ * Return the index of the shader output which will contain the
+ * vertex position.
+ */
+uint
+draw_current_shader_clipvertex_output(const struct draw_context *draw)
+{
+   return draw->vs.clipvertex_output;
+}
+
+/**
   * Return a pointer/handle for a driver/CSO rasterizer object which
   * disabled culling, stippling, unfilled tris, etc.
   * This is used by some pipeline stages (such as wide_point, aa_line
diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c 
b/src/gallium/auxiliary/draw/draw_pipe_clip.c
index e1eabe2..fbc8f67 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_clip.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c
@@ -118,6 +118,7 @@ static void interp( const struct clip_stage *clip,
  {
     const unsigned nr_attrs = draw_current_shader_outputs(clip->stage.draw);
     const unsigned pos_attr = 
draw_current_shader_position_output(clip->stage.draw);
+   const unsigned clip_attr = 
draw_current_shader_clipvertex_output(clip->stage.draw);
     unsigned j;

     /* Vertex header.
@@ -130,12 +131,14 @@ static void interp( const struct clip_stage *clip,
     /* Interpolate the clip-space coords.
      */
     interp_attr(dst->clip, t, in->clip, out->clip);
+   /* interpolate the clip-space position */
+   interp_attr(dst->pre_clip_pos, t, in->pre_clip_pos, out->pre_clip_pos);

     /* Do the projective divide and viewport transformation to get
      * new window coordinates:
      */
     {
-      const float *pos = dst->clip;
+      const float *pos = dst->pre_clip_pos;
        const float *scale = clip->stage.draw->viewport.scale;
        const float *trans = clip->stage.draw->viewport.translate;
        const float oow = 1.0f / pos[3];
@@ -149,8 +152,8 @@ static void interp( const struct clip_stage *clip,
     /* Other attributes
      */
     for (j = 0; j<  nr_attrs; j++) {
-      if (j != pos_attr)
-         interp_attr(dst->data[j], t, in->data[j], out->data[j]);
+      if (j != pos_attr&&  j != clip_attr)
+        interp_attr(dst->data[j], t, in->data[j], out->data[j]);
     }
  }

diff --git a/src/gallium/auxiliary/draw/draw_private.h 
b/src/gallium/auxiliary/draw/draw_private.h
index 89653e1..d101c32 100644
--- a/src/gallium/auxiliary/draw/draw_private.h
+++ b/src/gallium/auxiliary/draw/draw_private.h
@@ -76,7 +76,7 @@ struct vertex_header {
     unsigned vertex_id:16;

     float clip[4];
-
+   float pre_clip_pos[4];

I'd like to keep the blank line between this declaration and the following comment.


     /* This will probably become float (*data)[4] soon:
      */
     float data[][4];
@@ -230,6 +230,7 @@ struct draw_context
        uint num_vs_outputs;  /**<  convenience, from vertex_shader */
        uint position_output;
        uint edgeflag_output;
+      uint clipvertex_output;

        /** TGSI program interpreter runtime state */
        struct tgsi_exec_machine *machine;
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to