gallium: added draw_need_pipeline() predicate function
authorBrian <brian.paul@tungstengraphics.com>
Thu, 13 Mar 2008 20:34:35 +0000 (14:34 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 13 Mar 2008 20:34:35 +0000 (14:34 -0600)
To test if we need any pipeline stage, or whether we can go into passthrough mode.

src/gallium/auxiliary/draw/draw_validate.c

index b43295b5860b91e0d92c73300878203546b38db9..602fa3429dedece2dc8e7f81d7abc86aa09422d9 100644 (file)
 #include "draw_private.h"
 
 
+/**
+ * Check if we need any special pipeline stages, or whether prims/verts
+ * can go through untouched.
+ */
+boolean
+draw_need_pipeline(const struct draw_context *draw)
+{
+   /* clipping */
+   if (!draw->rasterizer->bypass_clipping)
+      return TRUE;
+
+   /* vertex shader */
+   if (!draw->rasterizer->bypass_vs)
+      return TRUE;
+
+   /* line stipple */
+   if (draw->rasterizer->line_stipple_enable && draw->line_stipple)
+      return TRUE;
+
+   /* wide lines */
+   if (draw->rasterizer->line_width > draw->wide_line_threshold)
+      return TRUE;
+
+   /* large points */
+   if (draw->rasterizer->point_size > draw->wide_point_threshold)
+      return TRUE;
+
+   /* AA lines */
+   if (draw->rasterizer->line_smooth && draw->pipeline.aaline)
+      return TRUE;
+
+   /* AA points */
+   if (draw->rasterizer->point_smooth && draw->pipeline.aapoint)
+      return TRUE;
+
+   /* polygon stipple */
+   if (draw->rasterizer->poly_stipple_enable && draw->pipeline.pstipple)
+      return TRUE;
+
+   /* polygon offset */
+   if (draw->rasterizer->offset_cw || draw->rasterizer->offset_ccw)
+      return TRUE;
+
+   /* two-side lighting */
+   if (draw->rasterizer->light_twoside)
+      return TRUE;
+
+   /* polygon cull */
+   if (draw->rasterizer->cull_mode)
+      return TRUE;
+
+   return FALSE;
+}
 
 
 
@@ -92,7 +145,7 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
       next = draw->pipeline.wide_point;
    }
 
-   if (draw->rasterizer->line_stipple_enable) {
+   if (draw->rasterizer->line_stipple_enable && draw->line_stipple) {
       draw->pipeline.stipple->next = next;
       next = draw->pipeline.stipple;
       precalc_flat = 1;                /* only needed for lines really */