return true if one of the vertices has been clipped
authorZack Rusin <zack@tungstengraphics.com>
Fri, 11 Apr 2008 23:58:22 +0000 (19:58 -0400)
committerKeith Whitwell <keith@tungstengraphics.com>
Mon, 14 Apr 2008 10:00:35 +0000 (11:00 +0100)
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_vs_exec.c
src/gallium/auxiliary/draw/draw_vs_llvm.c
src/gallium/auxiliary/draw/draw_vs_sse.c

index f9aea9f3550088870fd4e4d29c3e8e0901576dd9..5c710667fc64e88a75d1a52b5da1aa6507734452 100644 (file)
@@ -148,12 +148,12 @@ struct draw_vertex_shader {
    /* Run the shader - this interface will get cleaned up in the
     * future:
     */
-   void (*run)( struct draw_vertex_shader *shader,
-               struct draw_context *draw,
-               const unsigned *elts, 
-               unsigned count,
-               struct vertex_header *vOut[] );
-                   
+   boolean (*run)( struct draw_vertex_shader *shader,
+                   struct draw_context *draw,
+                   const unsigned *elts,
+                   unsigned count,
+                   struct vertex_header *vOut[] );
+
 
    void (*delete)( struct draw_vertex_shader * );
 };
index df0051d6939de4a3eac59fa3d25fb8addd0bcc6c..09e0d0eaabc2b7b6507d6ee6508e75a57dd0e9b6 100644 (file)
@@ -64,7 +64,7 @@ vs_exec_prepare( struct draw_vertex_shader *shader,
  * \param count  number of vertices to shade [1..4]
  * \param vOut  array of pointers to four output vertices
  */
-static void
+static boolean
 vs_exec_run( struct draw_vertex_shader *shader,
             struct draw_context *draw,
             const unsigned *elts, 
@@ -73,6 +73,7 @@ vs_exec_run( struct draw_vertex_shader *shader,
 {
    struct tgsi_exec_machine *machine = &draw->machine;
    unsigned int i, j;
+   unsigned int clipped = 0;
 
    ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS);
    ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS);
@@ -120,6 +121,7 @@ vs_exec_run( struct draw_vertex_shader *shader,
          if (!draw->rasterizer->bypass_clipping) {
             vOut[i + j]->clipmask = compute_clipmask(vOut[i + j]->clip, draw->plane,
                                                      draw->nr_planes);
+            clipped += vOut[i + j]->clipmask;
 
             /* divide by w */
             w = 1.0f / w;
@@ -168,6 +170,7 @@ vs_exec_run( struct draw_vertex_shader *shader,
 #endif
       } /* loop over vertices */
    }
+   return clipped != 0;
 }
 
 
index 7e48428cdda09158ca17ba00a291fbedc088fddb..6db1e65a2da84180259e98c70604145f10b71c8b 100644 (file)
@@ -67,18 +67,19 @@ vs_llvm_prepare( struct draw_vertex_shader *base,
  * \param count  number of vertices to shade [1..4]
  * \param vOut  array of pointers to four output vertices
  */
-static void
+static boolean
 vs_llvm_run( struct draw_vertex_shader *base,
-            struct draw_context *draw, 
-            const unsigned *elts, 
+            struct draw_context *draw,
+            const unsigned *elts,
             unsigned count,
             struct vertex_header *vOut[] )
 {
-   struct draw_llvm_vertex_shader *shader = 
+   struct draw_llvm_vertex_shader *shader =
       (struct draw_llvm_vertex_shader *)base;
 
    struct tgsi_exec_machine *machine = &draw->machine;
    unsigned int j;
+   unsigned int clipped = 0;
 
    ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS);
    ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS);
@@ -125,19 +126,21 @@ vs_llvm_run( struct draw_vertex_shader *base,
       w = vOut[j]->clip[3] = machine->Outputs[0].xyzw[3].f[j];
 
       if (!draw->rasterizer->bypass_clipping) {
-         vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane, draw->nr_planes);
+         vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane,
+                                              draw->nr_planes);
+         clipped += vOut[j]->clipmask;
 
          /* divide by w */
          w = 1.0f / w;
          x *= w;
          y *= w;
-         z *= w;         
+         z *= w;
       }
       else {
          vOut[j]->clipmask = 0;
       }
       vOut[j]->edgeflag = 1;
-         
+
       if (!draw->identity_viewport) {
          /* Viewport mapping */
          vOut[j]->data[0][0] = x * scale[0] + trans[0];
@@ -162,6 +165,7 @@ vs_llvm_run( struct draw_vertex_shader *base,
          vOut[j]->data[slot][3] = machine->Outputs[slot].xyzw[3].f[j];
       }
    } /* loop over vertices */
+   return clipped != 0;
 }
 
 static void
index bfec89254eb5ff1e518ce4dac65e09836ee69ca0..6e8d2021f5ca47acc308e037cf8b59891b61f855 100644 (file)
@@ -78,7 +78,7 @@ vs_sse_prepare( struct draw_vertex_shader *base,
  * \param count  number of vertices to shade [1..4]
  * \param vOut  array of pointers to four output vertices
  */
-static void
+static boolean
 vs_sse_run( struct draw_vertex_shader *base,
            struct draw_context *draw, 
            const unsigned *elts, 
@@ -88,6 +88,7 @@ vs_sse_run( struct draw_vertex_shader *base,
    struct draw_sse_vertex_shader *shader = (struct draw_sse_vertex_shader *)base;
    struct tgsi_exec_machine *machine = &draw->machine;
    unsigned int i, j;
+   unsigned int clipped = 0;
 
    ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS);
    ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS);
@@ -143,6 +144,7 @@ vs_sse_run( struct draw_vertex_shader *base,
          if (!draw->rasterizer->bypass_clipping) {
             vOut[i + j]->clipmask = compute_clipmask(vOut[i + j]->clip, draw->plane,
                                                      draw->nr_planes);
+            clipped += vOut[i + j]->clipmask;
 
             /* divide by w */
             w = 1.0f / w;
@@ -180,6 +182,7 @@ vs_sse_run( struct draw_vertex_shader *base,
          }
       }
    }
+   return clipped != 0;
 }