svga_pipe_rasterizer.c revision 68f93ea3eb83cfad014b8ec93cec3564c1aa9833
13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc.  All rights reserved.
33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person
53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation
63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without
73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy,
83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies
93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is
103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions:
113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be
133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software.
143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE.
233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/
253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "draw/draw_context.h"
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_inlines.h"
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h"
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h"
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h"
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h"
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h"
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h"
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Hardware frontwinding is always set up as SVGA3D_FRONTWINDING_CW.
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic SVGA3dFace svga_translate_cullmode( unsigned mode,
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                           unsigned front_winding )
413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   switch (mode) {
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_WINDING_NONE:
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_NONE;
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_WINDING_CCW:
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_BACK;
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_WINDING_CW:
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_FRONT;
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_WINDING_BOTH:
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_FRONT_BACK;
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   default:
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      assert(0);
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_NONE;
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic SVGA3dShadeMode svga_translate_flatshade( unsigned mode )
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return mode ? SVGA3D_SHADEMODE_FLAT : SVGA3D_SHADEMODE_SMOOTH;
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void *
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_create_rasterizer_state(struct pipe_context *pipe,
653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                             const struct pipe_rasterizer_state *templ)
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_rasterizer_state *rast = CALLOC_STRUCT( svga_rasterizer_state );
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* need this for draw module. */
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->templ = *templ;
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* light_twoside          - XXX: need fragment shader varient */
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* poly_smooth            - XXX: no fallback available */
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* poly_stipple_enable    - draw module */
744a4daa75a85db22cd37ebd533ebbccb427e07077Roland Scheidegger   /* sprite_coord_enable    - ? */
7568f93ea3eb83cfad014b8ec93cec3564c1aa9833Roland Scheidegger   /* point_quad_rasterization - ? */
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* point_size_per_vertex  - ? */
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* sprite_coord_mode      - ??? */
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* bypass_vs_viewport_and_clip        - handled by viewport setup */
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* flatshade_first        - handled by index translation */
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* gl_rasterization_rules - XXX - viewport code */
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* line_width             - draw module */
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* fill_cw, fill_ccw      - draw module or index translation */
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->shademode = svga_translate_flatshade( templ->flatshade );
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->cullmode = svga_translate_cullmode( templ->cull_mode,
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                             templ->front_winding );
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->scissortestenable = templ->scissor;
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->multisampleantialias = templ->multisample;
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->antialiasedlineenable = templ->line_smooth;
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->lastpixel = templ->line_last_pixel;
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->pointsize = templ->point_size;
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->hw_unfilled = PIPE_POLYGON_MODE_FILL;
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Use swtnl + decomposition implement these:
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (templ->poly_stipple_enable)
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (templ->line_width != 1.0 &&
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       templ->line_width != 0.0)
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (templ->line_stipple_enable) {
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* LinePattern not implemented on all backends.
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (0) {
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         SVGA3dLinePattern lp;
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         lp.repeat = templ->line_stipple_factor + 1;
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         lp.pattern = templ->line_stipple_pattern;
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->linepattern = lp.uintValue;
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      else {
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (templ->point_smooth)
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_POINTS;
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   {
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      boolean offset_cw = templ->offset_cw;
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      boolean offset_ccw = templ->offset_ccw;
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      boolean offset  = 0;
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int fill_cw = templ->fill_cw;
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int fill_ccw = templ->fill_ccw;
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int fill = PIPE_POLYGON_MODE_FILL;
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      switch (templ->cull_mode) {
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case PIPE_WINDING_BOTH:
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         offset = 0;
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case PIPE_WINDING_CW:
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         offset = offset_ccw;
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = fill_ccw;
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case PIPE_WINDING_CCW:
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         offset = offset_cw;
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = fill_cw;
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case PIPE_WINDING_NONE:
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         if (fill_cw != fill_ccw || offset_cw != offset_ccw)
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         {
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            /* Always need the draw module to work out different
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz             * front/back fill modes:
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz             */
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         }
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         else {
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            offset = offset_ccw;
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            fill = fill_ccw;
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         }
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      default:
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         assert(0);
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Unfilled primitive modes aren't implemented on all virtual
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * hardware.  We can do some unfilled processing with index
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * translation, but otherwise need the draw module:
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill != PIPE_POLYGON_MODE_FILL &&
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (templ->flatshade ||
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz           templ->light_twoside ||
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz           offset ||
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz           templ->cull_mode != PIPE_WINDING_NONE))
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* If we are decomposing to lines, and lines need the pipeline,
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * then we also need the pipeline for tris.
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill == PIPE_POLYGON_MODE_LINE &&
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (rast->need_pipeline & SVGA_PIPELINE_FLAG_LINES))
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Similarly for points:
1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill == PIPE_POLYGON_MODE_POINT &&
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (rast->need_pipeline & SVGA_PIPELINE_FLAG_POINTS))
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (offset) {
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->slopescaledepthbias = templ->offset_scale;
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->depthbias = templ->offset_units;
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->hw_unfilled = fill;
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (rast->need_pipeline & SVGA_PIPELINE_FLAG_TRIS) {
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Turn off stuff which will get done in the draw module:
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->hw_unfilled = PIPE_POLYGON_MODE_FILL;
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->slopescaledepthbias = 0;
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->depthbias = 0;
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return rast;
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_bind_rasterizer_state( struct pipe_context *pipe,
2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                        void *state )
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_context *svga = svga_context(pipe);
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_rasterizer_state *raster = (struct svga_rasterizer_state *)state;
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->curr.rast = raster;
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   draw_set_rasterizer_state(svga->swtnl.draw, raster ? &raster->templ : NULL);
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->dirty |= SVGA_NEW_RAST;
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_delete_rasterizer_state(struct pipe_context *pipe,
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                         void *raster)
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   FREE(raster);
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_init_rasterizer_functions( struct svga_context *svga )
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.create_rasterizer_state = svga_create_rasterizer_state;
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.bind_rasterizer_state = svga_bind_rasterizer_state;
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.delete_rasterizer_state = svga_delete_rasterizer_state;
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/***********************************************************************
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Hardware state update
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
250