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"
2728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_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
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h"
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Hardware frontwinding is always set up as SVGA3D_FRONTWINDING_CW.
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic SVGA3dFace svga_translate_cullmode( unsigned mode,
390bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell                                           unsigned front_ccw )
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
410bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   const int hw_front_ccw = 0;  /* hardware is always CW */
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   switch (mode) {
430bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_NONE:
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_NONE;
450bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_FRONT:
460bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      return front_ccw == hw_front_ccw ? SVGA3D_FACE_FRONT : SVGA3D_FACE_BACK;
470bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_BACK:
480bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      return front_ccw == hw_front_ccw ? SVGA3D_FACE_BACK : SVGA3D_FACE_FRONT;
490bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_FRONT_AND_BACK:
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{
67c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   struct svga_context *svga = svga_context(pipe);
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_rasterizer_state *rast = CALLOC_STRUCT( svga_rasterizer_state );
69c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* need this for draw module. */
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->templ = *templ;
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
732bd9b386e6c8f47537c8da50d2f5378b287b3c4fBrian Paul   /* light_twoside          - XXX: need fragment shader variant */
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* poly_smooth            - XXX: no fallback available */
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* poly_stipple_enable    - draw module */
764a4daa75a85db22cd37ebd533ebbccb427e07077Roland Scheidegger   /* sprite_coord_enable    - ? */
7768f93ea3eb83cfad014b8ec93cec3564c1aa9833Roland Scheidegger   /* point_quad_rasterization - ? */
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* point_size_per_vertex  - ? */
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* sprite_coord_mode      - ??? */
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* flatshade_first        - handled by index translation */
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* gl_rasterization_rules - XXX - viewport code */
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* line_width             - draw module */
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* fill_cw, fill_ccw      - draw module or index translation */
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->shademode = svga_translate_flatshade( templ->flatshade );
869c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell   rast->cullmode = svga_translate_cullmode( templ->cull_face,
870bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell                                             templ->front_ccw );
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->scissortestenable = templ->scissor;
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->multisampleantialias = templ->multisample;
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->antialiasedlineenable = templ->line_smooth;
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->lastpixel = templ->line_last_pixel;
922f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul   rast->pointsprite = templ->sprite_coord_enable != 0x0;
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->pointsize = templ->point_size;
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->hw_unfilled = PIPE_POLYGON_MODE_FILL;
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Use swtnl + decomposition implement these:
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
98c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   if (templ->poly_stipple_enable) {
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
100c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz      rast->need_pipeline_tris_str = "poly stipple";
101c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   }
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10357a3d36a685b4d6e39988d6c10a3201be789befcJosé Fonseca   if (templ->line_width >= 1.5f &&
104c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz       !svga->debug.no_line_width) {
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
106c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz      rast->need_pipeline_lines_str = "line width";
107c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   }
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (templ->line_stipple_enable) {
110f0ca9f71341f494be961aacc08bddd9cea28fca2José Fonseca      /* XXX: LinePattern not implemented on all backends, and there is no
111f0ca9f71341f494be961aacc08bddd9cea28fca2José Fonseca       * mechanism to query it.
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
113c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz      if (!svga->debug.force_hw_line_stipple) {
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         SVGA3dLinePattern lp;
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         lp.repeat = templ->line_stipple_factor + 1;
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         lp.pattern = templ->line_stipple_pattern;
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->linepattern = lp.uintValue;
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      else {
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
121c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_lines_str = "line stipple";
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
125c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   if (templ->point_smooth) {
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_POINTS;
127c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz      rast->need_pipeline_points_str = "smooth points";
128c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   }
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1306ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca   if (templ->line_smooth) {
1316ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca      rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
1326ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca      rast->need_pipeline_lines_str = "smooth lines";
1336ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca   }
1346ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   {
1369c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      int fill_front = templ->fill_front;
1379c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      int fill_back = templ->fill_back;
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int fill = PIPE_POLYGON_MODE_FILL;
1399c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      boolean offset_front = util_get_offset(templ, fill_front);
1409c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      boolean offset_back = util_get_offset(templ, fill_back);
1419c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      boolean offset  = 0;
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1430bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      switch (templ->cull_face) {
1440bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_FRONT_AND_BACK:
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         offset = 0;
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1490bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_FRONT:
1500bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         offset = offset_front;
1510bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         fill = fill_front;
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1540bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_BACK:
1550bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         offset = offset_back;
1560bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         fill = fill_back;
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1590bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_NONE:
1600bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         if (fill_front != fill_back || offset_front != offset_back)
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         {
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            /* Always need the draw module to work out different
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz             * front/back fill modes:
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz             */
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
166c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz            rast->need_pipeline_tris_str = "different front/back fillmodes";
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         }
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         else {
1690bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell            offset = offset_front;
1700bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell            fill = fill_front;
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         }
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      default:
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         assert(0);
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Unfilled primitive modes aren't implemented on all virtual
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * hardware.  We can do some unfilled processing with index
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * translation, but otherwise need the draw module:
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill != PIPE_POLYGON_MODE_FILL &&
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (templ->flatshade ||
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz           templ->light_twoside ||
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz           offset ||
1870bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell           templ->cull_face != PIPE_FACE_NONE))
1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
191c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_tris_str = "unfilled primitives with no index manipulation";
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* If we are decomposing to lines, and lines need the pipeline,
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * then we also need the pipeline for tris.
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill == PIPE_POLYGON_MODE_LINE &&
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (rast->need_pipeline & SVGA_PIPELINE_FLAG_LINES))
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
202c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_tris_str = "decomposing lines";
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Similarly for points:
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill == PIPE_POLYGON_MODE_POINT &&
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (rast->need_pipeline & SVGA_PIPELINE_FLAG_POINTS))
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
212c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_tris_str = "decomposing points";
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (offset) {
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->slopescaledepthbias = templ->offset_scale;
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->depthbias = templ->offset_units;
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->hw_unfilled = fill;
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (rast->need_pipeline & SVGA_PIPELINE_FLAG_TRIS) {
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Turn off stuff which will get done in the draw module:
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->hw_unfilled = PIPE_POLYGON_MODE_FILL;
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->slopescaledepthbias = 0;
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->depthbias = 0;
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return rast;
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_bind_rasterizer_state( struct pipe_context *pipe,
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                        void *state )
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_context *svga = svga_context(pipe);
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_rasterizer_state *raster = (struct svga_rasterizer_state *)state;
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
241e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   draw_set_rasterizer_state(svga->swtnl.draw, raster ? &raster->templ : NULL,
242e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                             state);
243831de96db87ee1f16b60d3aff308a423fece3407Zack Rusin   svga->curr.rast = raster;
244831de96db87ee1f16b60d3aff308a423fece3407Zack Rusin
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->dirty |= SVGA_NEW_RAST;
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_delete_rasterizer_state(struct pipe_context *pipe,
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                         void *raster)
2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   FREE(raster);
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_init_rasterizer_functions( struct svga_context *svga )
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.create_rasterizer_state = svga_create_rasterizer_state;
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.bind_rasterizer_state = svga_bind_rasterizer_state;
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.delete_rasterizer_state = svga_delete_rasterizer_state;
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/***********************************************************************
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Hardware state update
2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
267