swr: fix polygonmode for front==back
authorGeorge Kyriazis <george.kyriazis@intel.com>
Wed, 19 Apr 2017 18:55:26 +0000 (13:55 -0500)
committerGeorge Kyriazis <george.kyriazis@intel.com>
Tue, 9 May 2017 02:28:53 +0000 (21:28 -0500)
Rasterizer core only supports polygonmode front==back.  Add logic for
populating fillMode for the rasterizer only for that case correctly.
Provide enum conversion between mesa enums and core enums.

The core renders lines/points as tris. Previously, code would enable
stipple for polygonmode != FILL.  Modify stipple enable logic so that
this works correctly.

No regressions in vtk tests.
Fixes the following piglit tests:
pointsprite
gl-1.0-edgeflag-const

v2: remove cc stable, and remove "not implemented" assert
v3: modified commit message

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/swr_state.cpp
src/gallium/drivers/swr/swr_state.h

index 56b13746d023f91b3072d673b08de49d4165600e..12b4e9d63986f1284c265e7d86096571e1ce7f78 100644 (file)
@@ -1153,6 +1153,10 @@ swr_update_derived(struct pipe_context *pipe,
          rastState->slopeScaledDepthBias = 0;
          rastState->depthBiasClamp = 0;
       }
+
+      /* translate polygon mode, at least for the front==back case */
+      rastState->fillMode = swr_convert_fill_mode(rasterizer->fill_front);
+
       struct pipe_surface *zb = fb->zsbuf;
       if (zb && swr_resource(zb->texture)->has_depth)
          rastState->depthFormat = swr_resource(zb->texture)->swr.format;
@@ -1423,7 +1427,9 @@ swr_update_derived(struct pipe_context *pipe,
    /* and points, since we rasterize them as triangles, too */
    /* Has to be before fragment shader, since it sets SWR_NEW_FS */
    if (p_draw_info) {
-      bool new_prim_is_poly = (u_reduced_prim(p_draw_info->mode) == PIPE_PRIM_TRIANGLES);
+      bool new_prim_is_poly =
+         (u_reduced_prim(p_draw_info->mode) == PIPE_PRIM_TRIANGLES) &&
+         (ctx->derived.rastState.fillMode == SWR_FILLMODE_SOLID);
       if (new_prim_is_poly != ctx->poly_stipple.prim_is_poly) {
          ctx->dirty |= SWR_NEW_FS;
          ctx->poly_stipple.prim_is_poly = new_prim_is_poly;
index 9a8c4e1311cef30c86fb055016c52d373a45f424..7940a960d93085200e4cae175872bcd40983b09d 100644 (file)
@@ -376,4 +376,24 @@ swr_convert_prim_topology(const unsigned mode)
       return TOP_UNKNOWN;
    }
 };
+
+/*
+ * convert mesa PIPE_POLYGON_MODE_X to SWR enum SWR_FILLMODE
+ */
+static INLINE enum SWR_FILLMODE
+swr_convert_fill_mode(const unsigned mode)
+{
+   switch(mode) {
+   case PIPE_POLYGON_MODE_FILL:
+      return SWR_FILLMODE_SOLID;
+   case PIPE_POLYGON_MODE_LINE:
+      return SWR_FILLMODE_WIREFRAME;
+   case PIPE_POLYGON_MODE_POINT:
+      return SWR_FILLMODE_POINT;
+   default:
+      assert(0 && "Unknown fillmode");
+      return SWR_FILLMODE_SOLID; // at least do something sensible
+   }
+}
+
 #endif