Merge branch 'gallium-front-ccw'
authorKeith Whitwell <keithw@vmware.com>
Fri, 21 May 2010 14:41:06 +0000 (15:41 +0100)
committerKeith Whitwell <keithw@vmware.com>
Fri, 21 May 2010 14:41:06 +0000 (15:41 +0100)
33 files changed:
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_pipe_cull.c
src/gallium/auxiliary/draw/draw_pipe_twoside.c
src/gallium/auxiliary/draw/draw_pipe_unfilled.c
src/gallium/auxiliary/draw/draw_pipe_validate.c
src/gallium/auxiliary/util/u_blit.c
src/gallium/auxiliary/util/u_blitter.c
src/gallium/auxiliary/util/u_dump_state.c
src/gallium/auxiliary/util/u_gen_mipmap.c
src/gallium/auxiliary/util/u_inlines.h
src/gallium/docs/source/cso/rasterizer.rst
src/gallium/drivers/i915/i915_state.c
src/gallium/drivers/i965/brw_pipe_rast.c
src/gallium/drivers/i965/brw_sf.c
src/gallium/drivers/i965/brw_sf_state.c
src/gallium/drivers/i965/brw_wm_state.c
src/gallium/drivers/llvmpipe/lp_setup_tri.c
src/gallium/drivers/llvmpipe/lp_state_rasterizer.c
src/gallium/drivers/nv50/nv50_state.c
src/gallium/drivers/nvfx/nvfx_state.c
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/softpipe/sp_context.h
src/gallium/drivers/softpipe/sp_setup.c
src/gallium/drivers/svga/svga_pipe_rasterizer.c
src/gallium/drivers/svga/svga_state_fs.c
src/gallium/drivers/svga/svga_state_rss.c
src/gallium/drivers/svga/svga_tgsi.h
src/gallium/drivers/svga/svga_tgsi_insn.c
src/gallium/drivers/trace/tr_dump_state.c
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_state.h
src/gallium/state_trackers/vega/polygon.c
src/mesa/state_tracker/st_atom_rasterizer.c

index 02abddf1491ba7c137c14593b6cf30db31671eb3..61980c3e4f54901a9a67eb2337bd32baca09abf8 100644 (file)
@@ -566,7 +566,7 @@ draw_get_rasterizer_no_cull( struct draw_context *draw,
       memset(&rast, 0, sizeof(rast));
       rast.scissor = scissor;
       rast.flatshade = flatshade;
-      rast.front_winding = PIPE_WINDING_CCW;
+      rast.front_ccw = 1;
       rast.gl_rasterization_rules = draw->rasterizer->gl_rasterization_rules;
 
       draw->rasterizer_no_cull[scissor][flatshade] =
index dc66c65a56c2ab78bb65005df1492bf761b79637..bf84ce30ed1cf3aabeaf45b497a8909cea7525e5 100644 (file)
@@ -40,7 +40,8 @@
 
 struct cull_stage {
    struct draw_stage stage;
-   unsigned winding;  /**< which winding(s) to cull (one of PIPE_WINDING_x) */
+   unsigned cull_face;  /**< which face(s) to cull (one of PIPE_FACE_x) */
+   unsigned front_ccw;
 };
 
 
@@ -73,9 +74,12 @@ static void cull_tri( struct draw_stage *stage,
       /* if det < 0 then Z points toward the camera and the triangle is 
        * counter-clockwise winding.
        */
-      unsigned winding = (header->det < 0) ? PIPE_WINDING_CCW : PIPE_WINDING_CW;
+      unsigned ccw = (header->det < 0);
+      unsigned face = ((ccw == cull_stage(stage)->front_ccw) ?
+                       PIPE_FACE_FRONT :
+                       PIPE_FACE_BACK);
 
-      if ((winding & cull_stage(stage)->winding) == 0) {
+      if ((face & cull_stage(stage)->cull_face) == 0) {
          /* triangle is not culled, pass to next stage */
         stage->next->tri( stage->next, header );
       }
@@ -88,7 +92,8 @@ static void cull_first_tri( struct draw_stage *stage,
 {
    struct cull_stage *cull = cull_stage(stage);
 
-   cull->winding = stage->draw->rasterizer->cull_mode;
+   cull->cull_face = stage->draw->rasterizer->cull_face;
+   cull->front_ccw = stage->draw->rasterizer->front_ccw;
 
    stage->tri = cull_tri;
    stage->tri( stage, header );
index eef0238b157f89392a72868ea893e633324d4cb0..808b2fb0b58611a1d2fc7013a2ff4c83d1ea8621 100644 (file)
@@ -141,7 +141,7 @@ static void twoside_first_tri( struct draw_stage *stage,
     * if the triangle is back-facing (negative).
     * sign = -1 for CCW, +1 for CW
     */
-   twoside->sign = (stage->draw->rasterizer->front_winding == PIPE_WINDING_CCW) ? -1.0f : 1.0f;
+   twoside->sign = stage->draw->rasterizer->front_ccw ? -1.0f : 1.0f;
 
    stage->tri = twoside_tri;
    stage->tri( stage, header );
index a30fada86a0913b64fa7ec608cfc110e9249a301..e333d26a9320a8775203490dff252a057f059849 100644 (file)
@@ -134,7 +134,8 @@ static void unfilled_tri( struct draw_stage *stage,
                          struct prim_header *header )
 {
    struct unfilled_stage *unfilled = unfilled_stage(stage);
-   unsigned mode = unfilled->mode[header->det >= 0.0];
+   unsigned cw = header->det >= 0.0;
+   unsigned mode = unfilled->mode[cw];
   
    if (0)
       print_header_flags(header->flags);
@@ -159,9 +160,10 @@ static void unfilled_first_tri( struct draw_stage *stage,
                                struct prim_header *header )
 {
    struct unfilled_stage *unfilled = unfilled_stage(stage);
+   const struct pipe_rasterizer_state *rast = stage->draw->rasterizer;
 
-   unfilled->mode[0] = stage->draw->rasterizer->fill_ccw; /* front */
-   unfilled->mode[1] = stage->draw->rasterizer->fill_cw;  /* back */
+   unfilled->mode[0] = rast->front_ccw ? rast->fill_front : rast->fill_back;
+   unfilled->mode[1] = rast->front_ccw ? rast->fill_back : rast->fill_front;
 
    stage->tri = unfilled_tri;
    stage->tri( stage, header );
index 2a50af7a414a0ed41c363a35df8f1f35660266e9..eafa29276ffcd9bad39725a49e19a8a159db2684 100644 (file)
@@ -122,12 +122,14 @@ draw_need_pipeline(const struct draw_context *draw,
          return TRUE;
 
       /* unfilled polygons */
-      if (rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL ||
-          rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL)
+      if (rasterizer->fill_front != PIPE_POLYGON_MODE_FILL ||
+          rasterizer->fill_back != PIPE_POLYGON_MODE_FILL)
          return TRUE;
       
       /* polygon offset */
-      if (rasterizer->offset_cw || rasterizer->offset_ccw)
+      if (rasterizer->offset_point ||
+          rasterizer->offset_line ||
+          rasterizer->offset_tri)
          return TRUE;
 
       /* two-side lighting */
@@ -222,8 +224,8 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
       next = draw->pipeline.pstipple;
    }
 
-   if (rast->fill_cw != PIPE_POLYGON_MODE_FILL ||
-       rast->fill_ccw != PIPE_POLYGON_MODE_FILL) {
+   if (rast->fill_front != PIPE_POLYGON_MODE_FILL ||
+       rast->fill_back != PIPE_POLYGON_MODE_FILL) {
       draw->pipeline.unfilled->next = next;
       next = draw->pipeline.unfilled;
       precalc_flat = TRUE;             /* only needed for triangles really */
@@ -235,8 +237,9 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
       next = draw->pipeline.flatshade;
    }
         
-   if (rast->offset_cw ||
-       rast->offset_ccw) {
+   if (rast->offset_point ||
+       rast->offset_line ||
+       rast->offset_tri) {
       draw->pipeline.offset->next = next;
       next = draw->pipeline.offset;
       need_det = TRUE;
@@ -255,7 +258,7 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )
     * to less work emitting vertices, smaller vertex buffers, etc.
     * It's difficult to say whether this will be true in general.
     */
-   if (need_det || rast->cull_mode) {
+   if (need_det || rast->cull_face != PIPE_FACE_NONE) {
       draw->pipeline.cull->next = next;
       next = draw->pipeline.cull;
    }
index e3b7839a92a265cf0f0deb624e28c7c59ecbd441..f6f6e481d9467bd7341195c75881e674d574d51f 100644 (file)
@@ -101,8 +101,7 @@ util_create_blit(struct pipe_context *pipe, struct cso_context *cso)
 
    /* rasterizer */
    memset(&ctx->rasterizer, 0, sizeof(ctx->rasterizer));
-   ctx->rasterizer.front_winding = PIPE_WINDING_CW;
-   ctx->rasterizer.cull_mode = PIPE_WINDING_NONE;
+   ctx->rasterizer.cull_face = PIPE_FACE_NONE;
    ctx->rasterizer.gl_rasterization_rules = 1;
 
    /* samplers */
index 157b3853e45fc41674697891093e0b917686fe8f..3a7c4db6f3445aac7ddbc4f69e48758e8cf3438c 100644 (file)
@@ -175,8 +175,7 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
 
    /* rasterizer state */
    memset(&rs_state, 0, sizeof(rs_state));
-   rs_state.front_winding = PIPE_WINDING_CW;
-   rs_state.cull_mode = PIPE_WINDING_NONE;
+   rs_state.cull_face = PIPE_FACE_NONE;
    rs_state.gl_rasterization_rules = 1;
    rs_state.flatshade = 1;
    ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
index 2ce643e90cdf02abc0a8bada4f99085a2d72370b..cda5b8ba512881b06ea84535be8a2c590826f7fd 100644 (file)
@@ -300,12 +300,13 @@ util_dump_rasterizer_state(struct os_stream *stream, const struct pipe_rasterize
 
    util_dump_member(stream, bool, state, flatshade);
    util_dump_member(stream, bool, state, light_twoside);
-   util_dump_member(stream, uint, state, front_winding);
-   util_dump_member(stream, uint, state, cull_mode);
-   util_dump_member(stream, uint, state, fill_cw);
-   util_dump_member(stream, uint, state, fill_ccw);
-   util_dump_member(stream, bool, state, offset_cw);
-   util_dump_member(stream, bool, state, offset_ccw);
+   util_dump_member(stream, uint, state, front_ccw);
+   util_dump_member(stream, uint, state, cull_face);
+   util_dump_member(stream, uint, state, fill_front);
+   util_dump_member(stream, uint, state, fill_back);
+   util_dump_member(stream, bool, state, offset_point);
+   util_dump_member(stream, bool, state, offset_line);
+   util_dump_member(stream, bool, state, offset_tri);
    util_dump_member(stream, bool, state, scissor);
    util_dump_member(stream, bool, state, poly_smooth);
    util_dump_member(stream, bool, state, poly_stipple_enable);
index eee6030ddcc84aa696c599564f03afdda1896bbe..1553e08d6cec9b3b02cca4c582bb93f2131fc7af 100644 (file)
@@ -1295,8 +1295,7 @@ util_create_gen_mipmap(struct pipe_context *pipe,
 
    /* rasterizer */
    memset(&ctx->rasterizer, 0, sizeof(ctx->rasterizer));
-   ctx->rasterizer.front_winding = PIPE_WINDING_CW;
-   ctx->rasterizer.cull_mode = PIPE_WINDING_NONE;
+   ctx->rasterizer.cull_face = PIPE_FACE_NONE;
    ctx->rasterizer.gl_rasterization_rules = 1;
 
    /* sampler state */
index a48689ee8be78329b271975a106ba0f68d35676b..540305c1465765a90c3fd141ca484520e5a0a285 100644 (file)
@@ -369,6 +369,24 @@ pipe_transfer_destroy( struct pipe_context *context,
 }
 
 
+static INLINE boolean util_get_offset( 
+   const struct pipe_rasterizer_state *templ,
+   unsigned fill_mode)
+{
+   switch(fill_mode) {
+   case PIPE_POLYGON_MODE_POINT:
+      return templ->offset_point;
+   case PIPE_POLYGON_MODE_LINE:
+      return templ->offset_line;
+   case PIPE_POLYGON_MODE_FILL:
+      return templ->offset_tri;
+   default:
+      assert(0);
+      return FALSE;
+   }
+}
+
+
 #ifdef __cplusplus
 }
 #endif
index 56a601a8d06470a6f6f7e0b5075849566c0a9c8f..ad1612f93e31e104826a8c5ed8b0cae8418e7d20 100644 (file)
@@ -46,6 +46,78 @@ There are several important exceptions to the specification of this rule.
   second vertex, not the first. This permits each segment of the fan to have
   a different color.
 
+Polygons
+--------
+
+light_twoside
+^^^^^^^^^^^^^
+
+If set, there are per-vertex back-facing colors.  The hardware
+(perhaps assisted by :ref:`Draw`) should be set up to use this state
+along with the front/back information to set the final vertex colors
+prior to rasterization.
+
+The frontface vertex shader color output is marked with TGSI semantic
+COLOR[0], and backface COLOR[1].
+
+front_ccw
+    Indicates whether the window order of front-facing polygons is
+    counter-clockwise (TRUE) or clockwise (FALSE).
+
+cull_mode
+    Indicates which faces of polygons to cull, either PIPE_FACE_NONE
+    (cull no polygons), PIPE_FACE_FRONT (cull front-facing polygons),
+    PIPE_FACE_BACK (cull back-facing polygons), or
+    PIPE_FACE_FRONT_AND_BACK (cull all polygons).
+
+fill_front
+    Indicates how to fill front-facing polygons, either
+    PIPE_POLYGON_MODE_FILL, PIPE_POLYGON_MODE_LINE or
+    PIPE_POLYGON_MODE_POINT.
+fill_back
+    Indicates how to fill back-facing polygons, either
+    PIPE_POLYGON_MODE_FILL, PIPE_POLYGON_MODE_LINE or
+    PIPE_POLYGON_MODE_POINT.
+
+poly_stipple_enable
+    Whether polygon stippling is enabled.
+poly_smooth
+    Controls OpenGL-style polygon smoothing/antialiasing
+
+offset_point
+    If set, point-filled polygons will have polygon offset factors applied
+offset_line
+    If set, line-filled polygons will have polygon offset factors applied
+offset_tri
+    If set, filled polygons will have polygon offset factors applied
+
+offset_units
+    Specifies the polygon offset bias
+offset_scale
+    Specifies the polygon offset scale
+
+
+
+Lines
+-----
+
+line_width
+    The width of lines.
+line_smooth
+    Whether lines should be smoothed. Line smoothing is simply anti-aliasing.
+line_stipple_enable
+    Whether line stippling is enabled.
+line_stipple_pattern
+    16-bit bitfield of on/off flags, used to pattern the line stipple.
+line_stipple_factor
+    When drawing a stippled line, each bit in the stipple pattern is
+    repeated N times, where N = line_stipple_factor + 1.
+line_last_pixel
+    Controls whether the last pixel in a line is drawn or not.  OpenGL
+    omits the last pixel to avoid double-drawing pixels at the ends of lines
+    when drawing connected lines.
+
+
 Points
 ------
 
@@ -89,68 +161,21 @@ coordinates are not generated.
    Some renderers always internally translate points into quads; this state
    still affects those renderers by overriding other rasterization state.
 
-Other Members
-^^^^^^^^^^^^^
-
-light_twoside
-    If set, there are per-vertex back-facing colors. :ref:`Draw`
-    uses this state along with the front/back information to set the
-    final vertex colors prior to rasterization.
-
-front_winding
-    Indicates the window order of front-facing polygons, either
-    PIPE_WINDING_CW or PIPE_WINDING_CCW
-
-cull_mode
-    Indicates which polygons to cull, either PIPE_WINDING_NONE (cull no
-    polygons), PIPE_WINDING_CW (cull clockwise-winding polygons),
-    PIPE_WINDING_CCW (cull counter clockwise-winding polygons), or
-    PIPE_WINDING_BOTH (cull all polygons).
-
-fill_cw
-    Indicates how to fill clockwise polygons, either PIPE_POLYGON_MODE_FILL,
-    PIPE_POLYGON_MODE_LINE or PIPE_POLYGON_MODE_POINT.
-fill_ccw
-    Indicates how to fill counter clockwise polygons, either
-    PIPE_POLYGON_MODE_FILL, PIPE_POLYGON_MODE_LINE or PIPE_POLYGON_MODE_POINT.
-
-poly_stipple_enable
-    Whether polygon stippling is enabled.
-poly_smooth
-    Controls OpenGL-style polygon smoothing/antialiasing
-offset_cw
-    If set, clockwise polygons will have polygon offset factors applied
-offset_ccw
-    If set, counter clockwise polygons will have polygon offset factors applied
-offset_units
-    Specifies the polygon offset bias
-offset_scale
-    Specifies the polygon offset scale
-
-line_width
-    The width of lines.
-line_smooth
-    Whether lines should be smoothed. Line smoothing is simply anti-aliasing.
-line_stipple_enable
-    Whether line stippling is enabled.
-line_stipple_pattern
-    16-bit bitfield of on/off flags, used to pattern the line stipple.
-line_stipple_factor
-    When drawing a stippled line, each bit in the stipple pattern is
-    repeated N times, where N = line_stipple_factor + 1.
-line_last_pixel
-    Controls whether the last pixel in a line is drawn or not.  OpenGL
-    omits the last pixel to avoid double-drawing pixels at the ends of lines
-    when drawing connected lines.
-
 point_smooth
     Whether points should be smoothed. Point smoothing turns rectangular
     points into circles or ovals.
 point_size_per_vertex
-    Whether vertices have a point size element.
+    Whether the vertex shader is expected to have a point size output.
+    Undefined behaviour is permitted if there is disagreement between
+    this flag and the actual bound shader.
 point_size
     The size of points, if not specified per-vertex.
 
+
+
+Other Members
+-------------
+
 scissor
     Whether the scissor test is enabled.
 
index f883883852a14f59f04fc41cf6cd796fd5ef3f52..cd963e4df75f5fb64f801f51966f7cb4ef2f68b5 100644 (file)
@@ -686,17 +686,23 @@ i915_create_rasterizer_state(struct pipe_context *pipe,
    else
       cso->sc[0] = _3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT;
 
-   switch (rasterizer->cull_mode) {
-   case PIPE_WINDING_NONE:
+   switch (rasterizer->cull_face) {
+   case PIPE_FACE_NONE:
       cso->LIS4 |= S4_CULLMODE_NONE;
       break;
-   case PIPE_WINDING_CW:
-      cso->LIS4 |= S4_CULLMODE_CW;
+   case PIPE_FACE_FRONT:
+      if (rasterizer->front_ccw)
+         cso->LIS4 |= S4_CULLMODE_CCW;
+      else 
+         cso->LIS4 |= S4_CULLMODE_CW;
       break;
-   case PIPE_WINDING_CCW:
-      cso->LIS4 |= S4_CULLMODE_CCW;
+   case PIPE_FACE_BACK:
+      if (rasterizer->front_ccw)
+         cso->LIS4 |= S4_CULLMODE_CW;
+      else 
+         cso->LIS4 |= S4_CULLMODE_CCW;
       break;
-   case PIPE_WINDING_BOTH:
+   case PIPE_FACE_FRONT_AND_BACK:
       cso->LIS4 |= S4_CULLMODE_BOTH;
       break;
    }
index 2117e91a9e453bd99b0a100a5e625f753b64d55d..4c1a6d7dcdfde014ae3248c9457395e9279c4dfa 100644 (file)
@@ -42,7 +42,7 @@ calculate_clip_key_rast( const struct brw_context *brw,
 
    key->do_flat_shading = templ->flatshade;
 
-   if (templ->cull_mode == PIPE_WINDING_BOTH) {
+   if (templ->cull_face == PIPE_FACE_FRONT_AND_BACK) {
       key->clip_mode = BRW_CLIPMODE_REJECT_ALL;
       return;
    }
@@ -50,12 +50,18 @@ calculate_clip_key_rast( const struct brw_context *brw,
    key->fill_ccw = CLIP_CULL;
    key->fill_cw = CLIP_CULL;
 
-   if (!(templ->cull_mode & PIPE_WINDING_CCW)) {
-      key->fill_ccw = translate_fill(templ->fill_ccw);
+   if (!(templ->cull_face & PIPE_FACE_FRONT)) {
+      if (templ->front_ccw)
+         key->fill_ccw = translate_fill(templ->fill_front);
+      else 
+         key->fill_cw = translate_fill(templ->fill_front);
    }
 
-   if (!(templ->cull_mode & PIPE_WINDING_CW)) {
-      key->fill_cw = translate_fill(templ->fill_cw);
+   if (!(templ->cull_face & PIPE_FACE_BACK)) {
+      if (templ->front_ccw)
+         key->fill_cw = translate_fill(templ->fill_back);
+      else 
+         key->fill_ccw = translate_fill(templ->fill_back);
    }
 
    if (key->fill_cw == CLIP_LINE ||
@@ -66,8 +72,29 @@ calculate_clip_key_rast( const struct brw_context *brw,
       key->clip_mode = BRW_CLIPMODE_CLIP_NON_REJECTED;
    }
 
-   key->offset_ccw = templ->offset_ccw;
-   key->offset_cw = templ->offset_cw;
+   switch (key->fill_cw) {
+   case CLIP_POINT:
+      key->offset_cw = templ->offset_point;
+      break;
+   case CLIP_LINE:
+      key->offset_cw = templ->offset_line;
+      break;
+   case CLIP_FILL:
+      key->offset_cw = templ->offset_tri;
+      break;
+   }
+
+   switch (key->fill_ccw) {
+   case CLIP_POINT:
+      key->offset_ccw = templ->offset_point;
+      break;
+   case CLIP_LINE:
+      key->offset_ccw = templ->offset_line;
+      break;
+   case CLIP_FILL:
+      key->offset_ccw = templ->offset_tri;
+      break;
+   }
 
    if (templ->light_twoside && key->fill_cw != CLIP_CULL) 
       key->copy_bfc_cw = 1;
@@ -111,12 +138,12 @@ static void *brw_create_rasterizer_state( struct pipe_context *pipe,
    /* Caclculate lookup value for WM IZ table.
     */
    if (templ->line_smooth) {
-      if (templ->fill_cw == PIPE_POLYGON_MODE_LINE &&
-         templ->fill_ccw == PIPE_POLYGON_MODE_LINE) {
+      if (templ->fill_front == PIPE_POLYGON_MODE_LINE &&
+         templ->fill_back == PIPE_POLYGON_MODE_LINE) {
         rast->unfilled_aa_line = AA_ALWAYS;
       }
-      else if (templ->fill_cw == PIPE_POLYGON_MODE_LINE ||
-              templ->fill_ccw == PIPE_POLYGON_MODE_LINE) {
+      else if (templ->fill_front == PIPE_POLYGON_MODE_LINE ||
+              templ->fill_back == PIPE_POLYGON_MODE_LINE) {
         rast->unfilled_aa_line = AA_SOMETIMES;
       }
       else {
index 9cceb4dbe525d9522b9a3b0345d05c6646d5b004..5abf3848ab4e6d7865c505e5215845443cbb7946 100644 (file)
@@ -166,8 +166,8 @@ static enum pipe_error upload_sf_prog(struct brw_context *brw)
    case PIPE_PRIM_TRIANGLES: 
       /* PIPE_NEW_RAST
        */
-      if (rast->fill_cw != PIPE_POLYGON_MODE_FILL ||
-         rast->fill_ccw != PIPE_POLYGON_MODE_FILL)
+      if (rast->fill_front != PIPE_POLYGON_MODE_FILL ||
+         rast->fill_back != PIPE_POLYGON_MODE_FILL)
         key.primitive = SF_UNFILLED_TRIS;
       else
         key.primitive = SF_TRIANGLES;
@@ -187,7 +187,7 @@ static enum pipe_error upload_sf_prog(struct brw_context *brw)
    key.do_twoside_color = rast->light_twoside;
 
    if (key.do_twoside_color) {
-      key.frontface_ccw = (rast->front_winding == PIPE_WINDING_CCW);
+      key.frontface_ccw = rast->front_ccw;
    }
 
    if (brw_search_cache(&brw->cache, BRW_SF_PROG,
index 0ad91e03072afb345f5ef63e9a098f7b43ad45e1..6c299a86b4986a0f2d5a793ff4348df0a229f377 100644 (file)
@@ -89,8 +89,8 @@ struct brw_sf_unit_key {
    unsigned line_smooth:1;
    unsigned point_sprite:1;
    unsigned point_attenuated:1;
-   unsigned front_face:2;
-   unsigned cull_mode:2;
+   unsigned front_ccw:1;
+   unsigned cull_face:2;
    unsigned flatshade_first:1;
    unsigned gl_rasterization_rules:1;
    unsigned line_last_pixel_enable:1;
@@ -115,8 +115,8 @@ sf_unit_populate_key(struct brw_context *brw, struct brw_sf_unit_key *key)
 
    /* PIPE_NEW_RAST */
    key->scissor = rast->scissor;
-   key->front_face = rast->front_winding;
-   key->cull_mode = rast->cull_mode;
+   key->front_ccw = rast->front_ccw;
+   key->cull_face = rast->cull_face;
    key->line_smooth = rast->line_smooth;
    key->line_width = rast->line_width;
    key->flatshade_first = rast->flatshade_first;
@@ -183,22 +183,22 @@ sf_unit_create_from_key(struct brw_context *brw,
    if (key->scissor)
       sf.sf6.scissor = 1;
 
-   if (key->front_face == PIPE_WINDING_CCW)
+   if (key->front_ccw)
       sf.sf5.front_winding = BRW_FRONTWINDING_CCW;
    else
       sf.sf5.front_winding = BRW_FRONTWINDING_CW;
 
-   switch (key->cull_mode) {
-   case PIPE_WINDING_CCW:
-   case PIPE_WINDING_CW:
-      sf.sf6.cull_mode = (key->front_face == key->cull_mode ?
-                         BRW_CULLMODE_FRONT :
-                         BRW_CULLMODE_BACK);
+   switch (key->cull_face) {
+   case PIPE_FACE_FRONT:
+      sf.sf6.cull_mode = BRW_CULLMODE_FRONT;
       break;
-   case PIPE_WINDING_BOTH:
+   case PIPE_FACE_BACK:
+      sf.sf6.cull_mode = BRW_CULLMODE_BACK;
+      break;
+   case PIPE_FACE_FRONT_AND_BACK:
       sf.sf6.cull_mode = BRW_CULLMODE_BOTH;
       break;
-   case PIPE_WINDING_NONE:
+   case PIPE_FACE_NONE:
       sf.sf6.cull_mode = BRW_CULLMODE_NONE;
       break;
    default:
@@ -284,7 +284,7 @@ static enum pipe_error upload_sf_unit( struct brw_context *brw )
     */
    total_grf = (align(key.total_grf, 16) / 16 - 1);
    viewport_transform = 1;
-   front_winding = (key.front_face == PIPE_WINDING_CCW ?
+   front_winding = (key.front_ccw ?
                     BRW_FRONTWINDING_CCW :
                     BRW_FRONTWINDING_CW);
 
index ee970ac75bcd0a53a019e6aa2e7b8e5a880d8281..efc2d96be135a60427fc37ac5ec4310bee04de68 100644 (file)
@@ -128,8 +128,9 @@ wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)
    key->line_stipple = brw->curr.rast->templ.line_stipple_enable;
 
 
-   key->offset_enable = (brw->curr.rast->templ.offset_cw ||
-                        brw->curr.rast->templ.offset_ccw);
+   key->offset_enable = (brw->curr.rast->templ.offset_point ||
+                        brw->curr.rast->templ.offset_line ||
+                        brw->curr.rast->templ.offset_tri);
 
    key->offset_units = brw->curr.rast->templ.offset_units;
    key->offset_factor = brw->curr.rast->templ.offset_scale;
index 53b91690b68a4598497d68058e08a6ba1143ac64..306cb6e27d2895dcb8a667ae332a4441549fbd54 100644 (file)
@@ -671,14 +671,14 @@ void
 lp_setup_choose_triangle( struct lp_setup_context *setup )
 {
    switch (setup->cullmode) {
-   case PIPE_WINDING_NONE:
+   case PIPE_FACE_NONE:
       setup->triangle = triangle_both;
       break;
-   case PIPE_WINDING_CCW:
-      setup->triangle = triangle_cw;
+   case PIPE_FACE_BACK:
+      setup->triangle = setup->ccw_is_frontface ? triangle_ccw : triangle_cw;
       break;
-   case PIPE_WINDING_CW:
-      setup->triangle = triangle_ccw;
+   case PIPE_FACE_FRONT:
+      setup->triangle = setup->ccw_is_frontface ? triangle_cw : triangle_ccw;
       break;
    default:
       setup->triangle = triangle_nop;
index 622eb47ff4535629c2863155e40af2ef1539137b..afd3e0b21c912c043a7672b41de020f3077e4c2d 100644 (file)
@@ -67,8 +67,8 @@ llvmpipe_bind_rasterizer_state(struct pipe_context *pipe, void *handle)
     */
    if (llvmpipe->rasterizer) {
       lp_setup_set_triangle_state( llvmpipe->setup,
-                   llvmpipe->rasterizer->cull_mode,
-                   llvmpipe->rasterizer->front_winding == PIPE_WINDING_CCW,
+                   llvmpipe->rasterizer->cull_face,
+                   llvmpipe->rasterizer->front_ccw,
                    llvmpipe->rasterizer->scissor,
                    llvmpipe->rasterizer->gl_rasterization_rules);
       lp_setup_set_flatshade_first( llvmpipe->setup,
index e885a2b719686087e9df50c296cf24a16d973a2d..b20781fa1fbdd6808f86c43c34ce80072cf7a1e9 100644 (file)
@@ -345,7 +345,7 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
                CALLOC_STRUCT(nv50_rasterizer_stateobj);
 
        /*XXX: ignored
-        *      - light_twosize
+        *      - light_twoside
         *      - point_smooth
         *      - multisample
         *      - point_sprite / sprite_coord_mode
@@ -385,72 +385,44 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
        so_data  (so, cso->point_quad_rasterization ? 1 : 0);
 
        so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
-       if (cso->front_winding == PIPE_WINDING_CCW) {
-               so_data(so, nvgl_polygon_mode(cso->fill_ccw));
-               so_data(so, nvgl_polygon_mode(cso->fill_cw));
-       } else {
-               so_data(so, nvgl_polygon_mode(cso->fill_cw));
-               so_data(so, nvgl_polygon_mode(cso->fill_ccw));
-       }
+        so_data(so, nvgl_polygon_mode(cso->fill_front));
+        so_data(so, nvgl_polygon_mode(cso->fill_back));
        so_data(so, cso->poly_smooth ? 1 : 0);
 
        so_method(so, tesla, NV50TCL_CULL_FACE_ENABLE, 3);
-       so_data  (so, cso->cull_mode != PIPE_WINDING_NONE);
-       if (cso->front_winding == PIPE_WINDING_CCW) {
+       so_data  (so, cso->cull_face != PIPE_FACE_NONE);
+       if (cso->front_ccw) {
                so_data(so, NV50TCL_FRONT_FACE_CCW);
-               switch (cso->cull_mode) {
-               case PIPE_WINDING_CCW:
-                       so_data(so, NV50TCL_CULL_FACE_FRONT);
-                       break;
-               case PIPE_WINDING_CW:
-                       so_data(so, NV50TCL_CULL_FACE_BACK);
-                       break;
-               case PIPE_WINDING_BOTH:
-                       so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
-                       break;
-               default:
-                       so_data(so, NV50TCL_CULL_FACE_BACK);
-                       break;
-               }
-       } else {
+        }
+        else {
                so_data(so, NV50TCL_FRONT_FACE_CW);
-               switch (cso->cull_mode) {
-               case PIPE_WINDING_CCW:
-                       so_data(so, NV50TCL_CULL_FACE_BACK);
-                       break;
-               case PIPE_WINDING_CW:
-                       so_data(so, NV50TCL_CULL_FACE_FRONT);
-                       break;
-               case PIPE_WINDING_BOTH:
-                       so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
-                       break;
-               default:
-                       so_data(so, NV50TCL_CULL_FACE_BACK);
-                       break;
-               }
+        }
+       switch (cso->cull_face) {
+       case PIPE_FACE_FRONT:
+               so_data(so, NV50TCL_CULL_FACE_FRONT);
+               break;
+       case PIPE_FACE_BACK:
+               so_data(so, NV50TCL_CULL_FACE_BACK);
+               break;
+       case PIPE_FACE_FRONT_AND_BACK:
+               so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
+               break;
+       default:
+               so_data(so, NV50TCL_CULL_FACE_BACK);
+               break;
        }
 
        so_method(so, tesla, NV50TCL_POLYGON_STIPPLE_ENABLE, 1);
        so_data  (so, cso->poly_stipple_enable ? 1 : 0);
 
        so_method(so, tesla, NV50TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
-       if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_POINT) ||
-           (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_POINT))
-               so_data(so, 1);
-       else
-               so_data(so, 0);
-       if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_LINE) ||
-           (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_LINE))
-               so_data(so, 1);
-       else
-               so_data(so, 0);
-       if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_FILL) ||
-           (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_FILL))
-               so_data(so, 1);
-       else
-               so_data(so, 0);
+        so_data(so, cso->offset_point);
+        so_data(so, cso->offset_line);
+        so_data(so, cso->offset_tri);
 
-       if (cso->offset_cw || cso->offset_ccw) {
+       if (cso->offset_point ||
+            cso->offset_line ||
+            cso->offset_tri) {
                so_method(so, tesla, NV50TCL_POLYGON_OFFSET_FACTOR, 1);
                so_data  (so, fui(cso->offset_scale));
                so_method(so, tesla, NV50TCL_POLYGON_OFFSET_UNITS, 1);
index 315de492dab2c4d143b00ffa3a1b9fda2fe8a22e..17f3f701406ea3360081e6986f262a160bd80fc5 100644 (file)
@@ -216,66 +216,39 @@ nvfx_rasterizer_state_create(struct pipe_context *pipe,
        sb_data(sb, fui(cso->point_size));
 
        sb_method(sb, NV34TCL_POLYGON_MODE_FRONT, 6);
-       if (cso->front_winding == PIPE_WINDING_CCW) {
-               sb_data(sb, nvgl_polygon_mode(cso->fill_ccw));
-               sb_data(sb, nvgl_polygon_mode(cso->fill_cw));
-               switch (cso->cull_mode) {
-               case PIPE_WINDING_CCW:
-                       sb_data(sb, NV34TCL_CULL_FACE_FRONT);
-                       break;
-               case PIPE_WINDING_CW:
-                       sb_data(sb, NV34TCL_CULL_FACE_BACK);
-                       break;
-               case PIPE_WINDING_BOTH:
-                       sb_data(sb, NV34TCL_CULL_FACE_FRONT_AND_BACK);
-                       break;
-               default:
-                       sb_data(sb, NV34TCL_CULL_FACE_BACK);
-                       break;
-               }
+        sb_data(sb, nvgl_polygon_mode(cso->fill_front));
+        sb_data(sb, nvgl_polygon_mode(cso->fill_back));
+       switch (cso->cull_face) {
+       case PIPE_FACE_FRONT:
+               sb_data(sb, NV34TCL_CULL_FACE_FRONT);
+               break;
+       case PIPE_FACE_BACK:
+               sb_data(sb, NV34TCL_CULL_FACE_BACK);
+               break;
+       case PIPE_FACE_FRONT_AND_BACK:
+               sb_data(sb, NV34TCL_CULL_FACE_FRONT_AND_BACK);
+               break;
+       default:
+               sb_data(sb, NV34TCL_CULL_FACE_BACK);
+               break;
+       }
+       if (cso->front_ccw) {
                sb_data(sb, NV34TCL_FRONT_FACE_CCW);
        } else {
-               sb_data(sb, nvgl_polygon_mode(cso->fill_cw));
-               sb_data(sb, nvgl_polygon_mode(cso->fill_ccw));
-               switch (cso->cull_mode) {
-               case PIPE_WINDING_CCW:
-                       sb_data(sb, NV34TCL_CULL_FACE_BACK);
-                       break;
-               case PIPE_WINDING_CW:
-                       sb_data(sb, NV34TCL_CULL_FACE_FRONT);
-                       break;
-               case PIPE_WINDING_BOTH:
-                       sb_data(sb, NV34TCL_CULL_FACE_FRONT_AND_BACK);
-                       break;
-               default:
-                       sb_data(sb, NV34TCL_CULL_FACE_BACK);
-                       break;
-               }
                sb_data(sb, NV34TCL_FRONT_FACE_CW);
        }
        sb_data(sb, cso->poly_smooth ? 1 : 0);
-       sb_data(sb, (cso->cull_mode != PIPE_WINDING_NONE) ? 1 : 0);
+       sb_data(sb, (cso->cull_face != PIPE_FACE_NONE) ? 1 : 0);
 
        sb_method(sb, NV34TCL_POLYGON_STIPPLE_ENABLE, 1);
        sb_data(sb, cso->poly_stipple_enable ? 1 : 0);
 
        sb_method(sb, NV34TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
-       if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_POINT) ||
-           (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_POINT))
-               sb_data(sb, 1);
-       else
-               sb_data(sb, 0);
-       if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_LINE) ||
-           (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_LINE))
-               sb_data(sb, 1);
-       else
-               sb_data(sb, 0);
-       if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_FILL) ||
-           (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_FILL))
-               sb_data(sb, 1);
-       else
-               sb_data(sb, 0);
-       if (cso->offset_cw || cso->offset_ccw) {
+        sb_data(sb, cso->offset_point);
+        sb_data(sb, cso->offset_line);
+        sb_data(sb, cso->offset_tri);
+
+       if (cso->offset_point || cso->offset_line || cso->offset_tri) {
                sb_method(sb, NV34TCL_POLYGON_OFFSET_FACTOR, 2);
                sb_data(sb, fui(cso->offset_scale));
                sb_data(sb, fui(cso->offset_units * 2));
index ac4e87abe09419888977f2cb0830fbdcea32092a..11c10e2f2a85e360835334c7f46827e3910a3785 100644 (file)
@@ -801,53 +801,37 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
         R300_GA_LINE_CNTL_END_TYPE_COMP;
 
     /* Enable polygon mode */
-    if (state->fill_cw != PIPE_POLYGON_MODE_FILL ||
-        state->fill_ccw != PIPE_POLYGON_MODE_FILL) {
+    if (state->fill_front != PIPE_POLYGON_MODE_FILL ||
+        state->fill_back != PIPE_POLYGON_MODE_FILL) {
         rs->polygon_mode = R300_GA_POLY_MODE_DUAL;
     }
 
-    /* Radeons don't think in "CW/CCW", they think in "front/back". */
-    if (state->front_winding == PIPE_WINDING_CW) {
-        rs->cull_mode = R300_FRONT_FACE_CW;
-
-        /* Polygon offset */
-        if (state->offset_cw) {
-            rs->polygon_offset_enable |= R300_FRONT_ENABLE;
-        }
-        if (state->offset_ccw) {
-            rs->polygon_offset_enable |= R300_BACK_ENABLE;
-        }
-
-        /* Polygon mode */
-        if (rs->polygon_mode) {
-            rs->polygon_mode |=
-                r300_translate_polygon_mode_front(state->fill_cw);
-            rs->polygon_mode |=
-                r300_translate_polygon_mode_back(state->fill_ccw);
-        }
-    } else {
+    /* Front face */
+    if (state->front_ccw) 
         rs->cull_mode = R300_FRONT_FACE_CCW;
+    else
+        rs->cull_mode = R300_FRONT_FACE_CW;
 
-        /* Polygon offset */
-        if (state->offset_ccw) {
-            rs->polygon_offset_enable |= R300_FRONT_ENABLE;
-        }
-        if (state->offset_cw) {
-            rs->polygon_offset_enable |= R300_BACK_ENABLE;
-        }
+    /* Polygon offset */
+    if (util_get_offset(state, state->fill_front)) {
+       rs->polygon_offset_enable |= R300_FRONT_ENABLE;
+    }
+    if (util_get_offset(state, state->fill_back)) {
+       rs->polygon_offset_enable |= R300_BACK_ENABLE;
+    }
 
-        /* Polygon mode */
-        if (rs->polygon_mode) {
-            rs->polygon_mode |=
-                r300_translate_polygon_mode_front(state->fill_ccw);
-            rs->polygon_mode |=
-                r300_translate_polygon_mode_back(state->fill_cw);
-        }
+    /* Polygon mode */
+    if (rs->polygon_mode) {
+       rs->polygon_mode |=
+          r300_translate_polygon_mode_front(state->fill_front);
+       rs->polygon_mode |=
+          r300_translate_polygon_mode_back(state->fill_back);
     }
-    if (state->front_winding & state->cull_mode) {
+
+    if (state->cull_face & PIPE_FACE_FRONT) {
         rs->cull_mode |= R300_CULL_FRONT;
     }
-    if (~(state->front_winding) & state->cull_mode) {
+    if (state->cull_face & PIPE_FACE_BACK) {
         rs->cull_mode |= R300_CULL_BACK;
     }
 
@@ -914,7 +898,9 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
     }
 
     if (rs) {
-        r300->polygon_offset_enabled = rs->rs.offset_cw || rs->rs.offset_ccw;
+        r300->polygon_offset_enabled = (rs->rs.offset_point ||
+                                        rs->rs.offset_line ||
+                                        rs->rs.offset_tri);
         r300->sprite_coord_enable = rs->rs.sprite_coord_enable;
         r300->two_sided_color = rs->rs.light_twoside;
     } else {
index aa696257688be82f4af951320aa0f02eff1df1ee..b3d3fe620fd794ab2160f330ecbfab651199b924 100644 (file)
@@ -109,6 +109,9 @@ struct softpipe_context {
    /** The reduced version of the primitive supplied by the state tracker */
    unsigned reduced_api_prim;
 
+   /** Derived information about which winding orders to cull */
+   unsigned cull_mode;
+
    /**
     * The reduced primitive after unfilled triangles, wide-line decomposition,
     * etc, are taken into account.  This is the primitive type that's actually
index 35ef9e698d58e3d2648c5b14d409539f930166af..5d727dc00df0952ebdfe7ca1676aa28da45ff60b 100644 (file)
@@ -111,34 +111,13 @@ struct setup_context {
    uint numFragsWritten;  /**< per primitive */
 #endif
 
-   unsigned winding;           /* which winding to cull */
+   unsigned cull_face;         /* which faces cull */
    unsigned nr_vertex_attrs;
 };
 
 
 
 
-/**
- * Do triangle cull test using tri determinant (sign indicates orientation)
- * \return true if triangle is to be culled.
- */
-static INLINE boolean
-cull_tri(const struct setup_context *setup, float det)
-{
-   if (det != 0) {   
-      /* if (det < 0 then Z points toward camera and triangle is 
-       * counter-clockwise winding.
-       */
-      unsigned winding = (det < 0) ? PIPE_WINDING_CCW : PIPE_WINDING_CW;
-
-      if ((winding & setup->winding) == 0)
-        return FALSE;
-   }
-
-   /* Culled:
-    */
-   return TRUE;
-}
 
 
 
@@ -393,8 +372,16 @@ setup_sort_vertices(struct setup_context *setup,
     * 0 = front-facing, 1 = back-facing
     */
    setup->facing = 
-      ((det > 0.0) ^ 
-       (setup->softpipe->rasterizer->front_winding == PIPE_WINDING_CW));
+      ((det < 0.0) ^ 
+       (setup->softpipe->rasterizer->front_ccw));
+
+   {
+      unsigned face = setup->facing == 0 ? PIPE_FACE_FRONT : PIPE_FACE_BACK;
+
+      if (face & setup->cull_face)
+        return FALSE;
+   }
+
 
    /* Prepare pixel offset for rasterisation:
     *  - pixel center (0.5, 0.5) for GL, or
@@ -832,11 +819,9 @@ sp_setup_tri(struct setup_context *setup,
    setup->numFragsWritten = 0;
 #endif
 
-   if (cull_tri( setup, det ))
-      return;
-
    if (!setup_sort_vertices( setup, det, v0, v1, v2 ))
       return;
+
    setup_tri_coefficients( setup );
    setup_tri_edges( setup );
 
@@ -1420,14 +1405,14 @@ sp_setup_prepare(struct setup_context *setup)
    sp->quad.first->begin( sp->quad.first );
 
    if (sp->reduced_api_prim == PIPE_PRIM_TRIANGLES &&
-       sp->rasterizer->fill_cw == PIPE_POLYGON_MODE_FILL &&
-       sp->rasterizer->fill_ccw == PIPE_POLYGON_MODE_FILL) {
+       sp->rasterizer->fill_front == PIPE_POLYGON_MODE_FILL &&
+       sp->rasterizer->fill_back == PIPE_POLYGON_MODE_FILL) {
       /* we'll do culling */
-      setup->winding = sp->rasterizer->cull_mode;
+      setup->cull_face = sp->rasterizer->cull_face;
    }
    else {
       /* 'draw' will do culling */
-      setup->winding = PIPE_WINDING_NONE;
+      setup->cull_face = PIPE_FACE_NONE;
    }
 }
 
index 5253c45cb202180c083dd3d56e73cfc40c0981f6..660eb0757a6778bfc0c2fdf434a30d20da2039ab 100644 (file)
 /* Hardware frontwinding is always set up as SVGA3D_FRONTWINDING_CW.
  */
 static SVGA3dFace svga_translate_cullmode( unsigned mode,
-                                           unsigned front_winding )
+                                           unsigned front_ccw )
 {
+   const int hw_front_ccw = 0;  /* hardware is always CW */
    switch (mode) {
-   case PIPE_WINDING_NONE:
+   case PIPE_FACE_NONE:
       return SVGA3D_FACE_NONE;
-   case PIPE_WINDING_CCW:
-      return SVGA3D_FACE_BACK;
-   case PIPE_WINDING_CW:
-      return SVGA3D_FACE_FRONT;
-   case PIPE_WINDING_BOTH:
+   case PIPE_FACE_FRONT:
+      return front_ccw == hw_front_ccw ? SVGA3D_FACE_FRONT : SVGA3D_FACE_BACK;
+   case PIPE_FACE_BACK:
+      return front_ccw == hw_front_ccw ? SVGA3D_FACE_BACK : SVGA3D_FACE_FRONT;
+   case PIPE_FACE_FRONT_AND_BACK:
       return SVGA3D_FACE_FRONT_BACK;
    default:
       assert(0);
@@ -81,8 +82,8 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
    /* fill_cw, fill_ccw      - draw module or index translation */
 
    rast->shademode = svga_translate_flatshade( templ->flatshade );
-   rast->cullmode = svga_translate_cullmode( templ->cull_mode, 
-                                             templ->front_winding );
+   rast->cullmode = svga_translate_cullmode( templ->cull_face, 
+                                             templ->front_ccw );
    rast->scissortestenable = templ->scissor;
    rast->multisampleantialias = templ->multisample;
    rast->antialiasedlineenable = templ->line_smooth;
@@ -117,31 +118,31 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
       rast->need_pipeline |= SVGA_PIPELINE_FLAG_POINTS;
 
    {
-      boolean offset_cw = templ->offset_cw;
-      boolean offset_ccw = templ->offset_ccw;
-      boolean offset  = 0;
-      int fill_cw = templ->fill_cw;
-      int fill_ccw = templ->fill_ccw;
+      int fill_front = templ->fill_front;
+      int fill_back = templ->fill_back;
       int fill = PIPE_POLYGON_MODE_FILL;
+      boolean offset_front = util_get_offset(templ, fill_front);
+      boolean offset_back = util_get_offset(templ, fill_back);
+      boolean offset  = 0;
 
-      switch (templ->cull_mode) {
-      case PIPE_WINDING_BOTH:
+      switch (templ->cull_face) {
+      case PIPE_FACE_FRONT_AND_BACK:
          offset = 0;
          fill = PIPE_POLYGON_MODE_FILL;
          break;
 
-      case PIPE_WINDING_CW:
-         offset = offset_ccw;
-         fill = fill_ccw;
+      case PIPE_FACE_FRONT:
+         offset = offset_front;
+         fill = fill_front;
          break;
 
-      case PIPE_WINDING_CCW:
-         offset = offset_cw;
-         fill = fill_cw;
+      case PIPE_FACE_BACK:
+         offset = offset_back;
+         fill = fill_back;
          break;
 
-      case PIPE_WINDING_NONE:
-         if (fill_cw != fill_ccw || offset_cw != offset_ccw
+      case PIPE_FACE_NONE:
+         if (fill_front != fill_back || offset_front != offset_back
          {
             /* Always need the draw module to work out different
              * front/back fill modes:
@@ -149,8 +150,8 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
             rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
          }
          else {
-            offset = offset_ccw;
-            fill = fill_ccw;
+            offset = offset_front;
+            fill = fill_front;
          }
          break;
 
@@ -167,7 +168,7 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
           (templ->flatshade ||
            templ->light_twoside ||
            offset ||
-           templ->cull_mode != PIPE_WINDING_NONE)) 
+           templ->cull_face != PIPE_FACE_NONE)) 
       {
          fill = PIPE_POLYGON_MODE_FILL;
          rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
index 1310fd9825fa8a71d7f686cf0107fce422b331c7..ad6f2947137633bb21672c130ffe1addfcda6db2 100644 (file)
@@ -131,8 +131,7 @@ static int make_fs_key( const struct svga_context *svga,
       /* SVGA_NEW_RAST
        */
       key->light_twoside = svga->curr.rast->templ.light_twoside;
-      key->front_cw = (svga->curr.rast->templ.front_winding == 
-                       PIPE_WINDING_CW);
+      key->front_ccw = svga->curr.rast->templ.front_ccw;
    }
 
    /* The blend workaround for simulating logicop xor behaviour
index b7195d246bc87c0b41b27aeb73b6948f964d69de..ab13f3fdf19eaaf4207f6af3d8b24950691d48bd 100644 (file)
@@ -146,13 +146,13 @@ static int emit_rss( struct svga_context *svga,
           * then our definition of front face agrees with hardware.
           * Otherwise need to flip.
           */
-         if (rast->templ.front_winding == PIPE_WINDING_CW) {
-            cw = 0;
-            ccw = 1;
+         if (rast->templ.front_ccw) {
+            ccw = 0;
+            cw = 1;
          }
          else {
-            cw = 1;
-            ccw = 0;
+            ccw = 1;
+            cw = 0;
          }
 
          /* Twoside stencil
index 063c9cf4221574cf06e8aeca54cd646c40a81d7c..7ea909c37bfe889961df19d0571de0b1d8da11e2 100644 (file)
@@ -48,7 +48,7 @@ struct svga_vs_compile_key
 struct svga_fs_compile_key
 {
    unsigned light_twoside:1;
-   unsigned front_cw:1;
+   unsigned front_ccw:1;
    unsigned white_fragments:1;
    unsigned num_textures:8;
    unsigned num_unnormalized_coords:8;
index 7d7024c4a7d721bc840c94565a07cd2032d4a428..67e1f22a70138c618ef3b751ac88c5634fe0c4de 100644 (file)
@@ -2588,10 +2588,10 @@ static boolean emit_light_twoside( struct svga_shader_emitter *emit )
    
    if_token = inst_token( SVGA3DOP_IFC );
 
-   if (emit->key.fkey.front_cw)
-      if_token.control = SVGA3DOPCOMP_GT;
-   else
+   if (emit->key.fkey.front_ccw)
       if_token.control = SVGA3DOPCOMP_LT;
+   else
+      if_token.control = SVGA3DOPCOMP_GT;
 
    zero = scalar(zero, TGSI_SWIZZLE_X);
 
@@ -2639,12 +2639,12 @@ static boolean emit_frontface( struct svga_shader_emitter *emit )
    temp = dst_register( SVGA3DREG_TEMP,
                         emit->nr_hw_temp++ );
 
-   if (emit->key.fkey.front_cw) {
-      pass = scalar( zero, TGSI_SWIZZLE_W );
-      fail = scalar( zero, TGSI_SWIZZLE_X );
-   } else {
+   if (emit->key.fkey.front_ccw) {
       pass = scalar( zero, TGSI_SWIZZLE_X );
       fail = scalar( zero, TGSI_SWIZZLE_W );
+   } else {
+      pass = scalar( zero, TGSI_SWIZZLE_W );
+      fail = scalar( zero, TGSI_SWIZZLE_X );
    }
 
    if (!emit_conditional(emit, PIPE_FUNC_GREATER,
index f148a859ff36544c28b4710686df460013f3be5a..1727c2a02069538c54945a6d70197a0daa710ebd 100644 (file)
@@ -136,12 +136,13 @@ void trace_dump_rasterizer_state(const struct pipe_rasterizer_state *state)
 
    trace_dump_member(bool, state, flatshade);
    trace_dump_member(bool, state, light_twoside);
-   trace_dump_member(uint, state, front_winding);
-   trace_dump_member(uint, state, cull_mode);
-   trace_dump_member(uint, state, fill_cw);
-   trace_dump_member(uint, state, fill_ccw);
-   trace_dump_member(bool, state, offset_cw);
-   trace_dump_member(bool, state, offset_ccw);
+   trace_dump_member(uint, state, front_ccw);
+   trace_dump_member(uint, state, cull_face);
+   trace_dump_member(uint, state, fill_front);
+   trace_dump_member(uint, state, fill_back);
+   trace_dump_member(bool, state, offset_point);
+   trace_dump_member(bool, state, offset_line);
+   trace_dump_member(bool, state, offset_tri);
    trace_dump_member(bool, state, scissor);
    trace_dump_member(bool, state, poly_smooth);
    trace_dump_member(bool, state, poly_stipple_enable);
index 29c55ff094cf27d09634a2a91867d9a315778938..8201c29ac7622a312251b708d02d823101fbbc2a 100644 (file)
@@ -119,11 +119,11 @@ enum pipe_error {
 #define PIPE_POLYGON_MODE_LINE  1
 #define PIPE_POLYGON_MODE_POINT 2
 
-/** Polygon front/back window, also for culling */
-#define PIPE_WINDING_NONE 0
-#define PIPE_WINDING_CW   1
-#define PIPE_WINDING_CCW  2
-#define PIPE_WINDING_BOTH (PIPE_WINDING_CW | PIPE_WINDING_CCW)
+/** Polygon face specification, eg for culling */
+#define PIPE_FACE_NONE           0
+#define PIPE_FACE_FRONT          1
+#define PIPE_FACE_BACK           2
+#define PIPE_FACE_FRONT_AND_BACK (PIPE_FACE_FRONT | PIPE_FACE_BACK)
 
 /** Stencil ops */
 #define PIPE_STENCIL_OP_KEEP       0
index a504757c472687bd34ccb4b1c12013a6f7bbf346..a01698d7674c47da78835df6b45fc8c49471fe5b 100644 (file)
@@ -79,12 +79,13 @@ struct pipe_rasterizer_state
 {
    unsigned flatshade:1;
    unsigned light_twoside:1;
-   unsigned front_winding:2;  /**< PIPE_WINDING_x */
-   unsigned cull_mode:2;      /**< PIPE_WINDING_x */
-   unsigned fill_cw:2;        /**< PIPE_POLYGON_MODE_x */
-   unsigned fill_ccw:2;       /**< PIPE_POLYGON_MODE_x */
-   unsigned offset_cw:1;
-   unsigned offset_ccw:1;
+   unsigned front_ccw:1;
+   unsigned cull_face:2;      /**< PIPE_FACE_x */
+   unsigned fill_front:2;     /**< PIPE_POLYGON_MODE_x */
+   unsigned fill_back:2;      /**< PIPE_POLYGON_MODE_x */
+   unsigned offset_point:1;
+   unsigned offset_line:1;
+   unsigned offset_tri:1;
    unsigned scissor:1;
    unsigned poly_smooth:1;
    unsigned poly_stipple_enable:1;
index d2b7e489124ad607cf11cf43f40c32eba61af839..e9c8f03137396628efda862e8495f455964257ea 100644 (file)
@@ -379,7 +379,7 @@ void polygon_fill(struct polygon *poly, struct vg_context *ctx)
          dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
          dsa.stencil[0].valuemask = ~0;
 
-         raster.cull_mode = raster.front_winding ^ PIPE_WINDING_BOTH;
+         raster.cull_face = PIPE_FACE_BACK;
          dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
@@ -389,7 +389,7 @@ void polygon_fill(struct polygon *poly, struct vg_context *ctx)
          cso_set_rasterizer(ctx->cso_context, &raster);
          draw_polygon(ctx, poly);
 
-         raster.cull_mode = raster.front_winding;
+         raster.cull_face = PIPE_FACE_FRONT;
          dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
@@ -501,7 +501,7 @@ void polygon_array_fill(struct polygon_array *polyarray, struct vg_context *ctx)
          dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
          dsa.stencil[0].valuemask = ~0;
 
-         raster.cull_mode = raster.front_winding ^ PIPE_WINDING_BOTH;
+         raster.cull_face = PIPE_FACE_BACK;
          dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
@@ -514,7 +514,7 @@ void polygon_array_fill(struct polygon_array *polyarray, struct vg_context *ctx)
             draw_polygon(ctx, poly);
          }
 
-         raster.cull_mode = raster.front_winding;
+         raster.cull_face = PIPE_FACE_FRONT;
          dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
          dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
index 5669b1f82af0053d78f509fcb374236684a932c2..2599bd5ca0339b6b9a81608b0c8782a60cc4e158 100644 (file)
@@ -53,21 +53,6 @@ static GLuint translate_fill( GLenum mode )
    }
 }
 
-static GLboolean get_offset_flag( GLuint fill_mode, 
-                                 const struct gl_polygon_attrib *p )
-{
-   switch (fill_mode) {
-   case PIPE_POLYGON_MODE_POINT:
-      return p->OffsetPoint;
-   case PIPE_POLYGON_MODE_LINE:
-      return p->OffsetLine;
-   case PIPE_POLYGON_MODE_FILL:
-      return p->OffsetFill;
-   default:
-      assert(0);
-      return 0;
-   }
-}
 
 
 static void update_raster_state( struct st_context *st )
@@ -82,10 +67,7 @@ static void update_raster_state( struct st_context *st )
    /* _NEW_POLYGON, _NEW_BUFFERS
     */
    {
-      if (ctx->Polygon.FrontFace == GL_CCW)
-         raster->front_winding = PIPE_WINDING_CCW;
-      else
-         raster->front_winding = PIPE_WINDING_CW;
+      raster->front_ccw = (ctx->Polygon.FrontFace == GL_CCW);
 
       /* XXX
        * I think the intention here is that user-created framebuffer objects
@@ -94,7 +76,7 @@ static void update_raster_state( struct st_context *st )
        * But this is an implementation/driver-specific artifact - remove...
        */
       if (ctx->DrawBuffer && ctx->DrawBuffer->Name != 0)
-         raster->front_winding ^= PIPE_WINDING_BOTH;
+         raster->front_ccw ^= 1;
    }
 
    /* _NEW_LIGHT
@@ -131,40 +113,36 @@ static void update_raster_state( struct st_context *st )
    /* _NEW_POLYGON
     */
    if (ctx->Polygon.CullFlag) {
-      if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) {
-        raster->cull_mode = PIPE_WINDING_BOTH;
-      }
-      else if (ctx->Polygon.CullFaceMode == GL_FRONT) {
-        raster->cull_mode = raster->front_winding;
-      }
-      else {
-        raster->cull_mode = raster->front_winding ^ PIPE_WINDING_BOTH;
+      switch (ctx->Polygon.CullFaceMode) {
+      case GL_FRONT:
+        raster->cull_face = PIPE_FACE_FRONT;
+         break;
+      case GL_BACK:
+        raster->cull_face = PIPE_FACE_BACK;
+         break;
+      case GL_FRONT_AND_BACK:
+        raster->cull_face = PIPE_FACE_FRONT_AND_BACK;
+         break;
       }
    }
+   else {
+      raster->cull_face = PIPE_FACE_NONE;
+   }
 
    /* _NEW_POLYGON
     */
    {
-      GLuint fill_front = translate_fill( ctx->Polygon.FrontMode );
-      GLuint fill_back = translate_fill( ctx->Polygon.BackMode );
-      
-      if (raster->front_winding == PIPE_WINDING_CW) {
-        raster->fill_cw = fill_front;
-        raster->fill_ccw = fill_back;
-      }
-      else {
-        raster->fill_cw = fill_back;
-        raster->fill_ccw = fill_front;
-      }
+      raster->fill_front = translate_fill( ctx->Polygon.FrontMode );
+      raster->fill_back = translate_fill( ctx->Polygon.BackMode );
 
       /* Simplify when culling is active:
        */
-      if (raster->cull_mode & PIPE_WINDING_CW) {
-        raster->fill_cw = raster->fill_ccw;
+      if (raster->cull_face & PIPE_FACE_FRONT) {
+        raster->fill_front = raster->fill_back;
       }
       
-      if (raster->cull_mode & PIPE_WINDING_CCW) {
-        raster->fill_ccw = raster->fill_cw;
+      if (raster->cull_face & PIPE_FACE_BACK) {
+        raster->fill_back = raster->fill_front;
       }
    }
 
@@ -172,8 +150,14 @@ static void update_raster_state( struct st_context *st )
     */
    if (ctx->Polygon.OffsetUnits != 0.0 ||
        ctx->Polygon.OffsetFactor != 0.0) {
-      raster->offset_cw = get_offset_flag( raster->fill_cw, &ctx->Polygon );
-      raster->offset_ccw = get_offset_flag( raster->fill_ccw, &ctx->Polygon );
+      raster->offset_point = ctx->Polygon.OffsetPoint;
+      raster->offset_line = ctx->Polygon.OffsetLine;
+      raster->offset_tri = ctx->Polygon.OffsetFill;
+   }
+
+   if (ctx->Polygon.OffsetPoint ||
+       ctx->Polygon.OffsetLine ||
+       ctx->Polygon.OffsetFill) {
       raster->offset_units = ctx->Polygon.OffsetUnits;
       raster->offset_scale = ctx->Polygon.OffsetFactor;
    }