draw: fix point/line/triangle determination in draw_need_pipeline()
authorBrian Paul <brianp@vmware.com>
Wed, 28 Aug 2013 23:13:11 +0000 (17:13 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 29 Aug 2013 13:29:31 +0000 (07:29 -0600)
The previous point/line/triangle() functions didn't handle GS primitives.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/draw/draw_pipe_validate.c

index 3562acdbcdca6246f40f0f1a47888dbba1531daa..356f4d657aa4a4e51393d90af6cb1164e8fec9f2 100644 (file)
 
 #include "util/u_memory.h"
 #include "util/u_math.h"
+#include "util/u_prim.h"
 #include "pipe/p_defines.h"
 #include "draw_private.h"
 #include "draw_pipe.h"
 #include "draw_context.h"
 #include "draw_vbuf.h"
 
-static boolean points( unsigned prim )
-{
-   return (prim == PIPE_PRIM_POINTS);
-}
-
-static boolean lines( unsigned prim )
-{
-   return (prim == PIPE_PRIM_LINES ||
-           prim == PIPE_PRIM_LINE_STRIP ||
-           prim == PIPE_PRIM_LINE_LOOP);
-}
-
-static boolean triangles( unsigned prim )
-{
-   return prim >= PIPE_PRIM_TRIANGLES;
-}
 
 /**
  * Default version of a function to check if we need any special
@@ -66,6 +51,8 @@ draw_need_pipeline(const struct draw_context *draw,
                    const struct pipe_rasterizer_state *rasterizer,
                    unsigned int prim )
 {
+   unsigned reduced_prim = u_reduced_prim(prim);
+
    /* If the driver has overridden this, use that version: 
     */
    if (draw->render &&
@@ -80,8 +67,7 @@ draw_need_pipeline(const struct draw_context *draw,
     * and triggering the pipeline, because we have to trigger the
     * pipeline *anyway* if unfilled mode is active.
     */
-   if (lines(prim)) 
-   {
+   if (reduced_prim == PIPE_PRIM_LINES) {
       /* line stipple */
       if (rasterizer->line_stipple_enable && draw->pipeline.line_stipple)
          return TRUE;
@@ -97,9 +83,7 @@ draw_need_pipeline(const struct draw_context *draw,
       if (draw_current_shader_num_written_culldistances(draw))
          return TRUE;
    }
-
-   if (points(prim))
-   {
+   else if (reduced_prim == PIPE_PRIM_POINTS) {
       /* large points */
       if (rasterizer->point_size > draw->pipeline.wide_point_threshold)
          return TRUE;
@@ -117,10 +101,7 @@ draw_need_pipeline(const struct draw_context *draw,
       if (rasterizer->sprite_coord_enable && draw->pipeline.point_sprite)
          return TRUE;
    }
-
-
-   if (triangles(prim)) 
-   {
+   else if (reduced_prim == PIPE_PRIM_TRIANGLES) {
       /* polygon stipple */
       if (rasterizer->poly_stipple_enable && draw->pipeline.pstipple)
          return TRUE;