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
26e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul#include "pipe/p_defines.h"
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "draw/draw_context.h"
28e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul#include "util/u_bitmask.h"
2928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h"
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h"
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
33e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul#include "svga_cmd.h"
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h"
35e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul#include "svga_hw_reg.h"
36ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul#include "svga_screen.h"
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Hardware frontwinding is always set up as SVGA3D_FRONTWINDING_CW.
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
4177e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulstatic SVGA3dFace
4277e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulsvga_translate_cullmode(unsigned mode, unsigned front_ccw)
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
440bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   const int hw_front_ccw = 0;  /* hardware is always CW */
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   switch (mode) {
460bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_NONE:
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_NONE;
480bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_FRONT:
490bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      return front_ccw == hw_front_ccw ? SVGA3D_FACE_FRONT : SVGA3D_FACE_BACK;
500bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_BACK:
510bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      return front_ccw == hw_front_ccw ? SVGA3D_FACE_BACK : SVGA3D_FACE_FRONT;
520bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell   case PIPE_FACE_FRONT_AND_BACK:
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_FRONT_BACK;
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   default:
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      assert(0);
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_FACE_NONE;
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6077e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulstatic SVGA3dShadeMode
6177e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulsvga_translate_flatshade(unsigned mode)
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return mode ? SVGA3D_SHADEMODE_FLAT : SVGA3D_SHADEMODE_SMOOTH;
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
67e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstatic unsigned
68e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paultranslate_fill_mode(unsigned fill)
69e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul{
70e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   switch (fill) {
71e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_POLYGON_MODE_POINT:
72e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_FILLMODE_POINT;
73e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_POLYGON_MODE_LINE:
74e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_FILLMODE_LINE;
75e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_POLYGON_MODE_FILL:
76e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_FILLMODE_FILL;
77e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   default:
78e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      assert(!"Bad fill mode");
79e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_FILLMODE_FILL;
80e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
81e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul}
82e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
83e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
84e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstatic unsigned
85e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paultranslate_cull_mode(unsigned cull)
86e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul{
87e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   switch (cull) {
88e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_FACE_NONE:
89e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_CULL_NONE;
90e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_FACE_FRONT:
91e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_CULL_FRONT;
92e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_FACE_BACK:
93e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_CULL_BACK;
94e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_FACE_FRONT_AND_BACK:
95e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      /* NOTE: we simply no-op polygon drawing in svga_draw_vbo() */
96e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_CULL_NONE;
97e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   default:
98e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      assert(!"Bad cull mode");
99e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_CULL_NONE;
100e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
101e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul}
102e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
103e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
104e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstatic void
105e054251ed11e25a080f64b92db9334c9b07c8c76Brian Pauldefine_rasterizer_object(struct svga_context *svga,
106e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                         struct svga_rasterizer_state *rast)
107e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul{
108ca531aeeb120cdda966120a17cdf50aa14c3129bBrian Paul   struct svga_screen *svgascreen = svga_screen(svga->pipe.screen);
109e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   unsigned fill_mode = translate_fill_mode(rast->templ.fill_front);
11088efaf987823802926c211401c401081a0e2f17aBrian Paul   const unsigned cull_mode = translate_cull_mode(rast->templ.cull_face);
11188efaf987823802926c211401c401081a0e2f17aBrian Paul   const int depth_bias = rast->templ.offset_units;
11288efaf987823802926c211401c401081a0e2f17aBrian Paul   const float slope_scaled_depth_bias = rast->templ.offset_scale;
11388efaf987823802926c211401c401081a0e2f17aBrian Paul   /* PIPE_CAP_POLYGON_OFFSET_CLAMP not supported: */
11488efaf987823802926c211401c401081a0e2f17aBrian Paul   const float depth_bias_clamp = 0.0;
115e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   const float line_width = rast->templ.line_width > 0.0f ?
116e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      rast->templ.line_width : 1.0f;
117e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   const uint8 line_factor = rast->templ.line_stipple_enable ?
118e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      rast->templ.line_stipple_factor : 0;
119e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   const uint16 line_pattern = rast->templ.line_stipple_enable ?
120e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      rast->templ.line_stipple_pattern : 0;
12188efaf987823802926c211401c401081a0e2f17aBrian Paul   unsigned try;
122e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
123e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   rast->id = util_bitmask_add(svga->rast_object_id_bm);
124e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
125e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   if (rast->templ.fill_front != rast->templ.fill_back) {
126e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      /* The VGPU10 device can't handle different front/back fill modes.
127e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul       * We'll handle that with a swtnl/draw fallback.  But we need to
128e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul       * make sure we always fill triangles in that case.
129e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul       */
130e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      fill_mode = SVGA3D_FILLMODE_FILL;
131e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
132e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
133e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   for (try = 0; try < 2; try++) {
134ca531aeeb120cdda966120a17cdf50aa14c3129bBrian Paul      const uint8 pv_last = !rast->templ.flatshade_first &&
135ca531aeeb120cdda966120a17cdf50aa14c3129bBrian Paul         svgascreen->haveProvokingVertex;
136e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      enum pipe_error ret =
137e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul         SVGA3D_vgpu10_DefineRasterizerState(svga->swc,
138e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             rast->id,
139e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             fill_mode,
140e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             cull_mode,
141e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             rast->templ.front_ccw,
142e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             depth_bias,
143e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             depth_bias_clamp,
144e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             slope_scaled_depth_bias,
145e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             rast->templ.depth_clip,
146e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             rast->templ.scissor,
147e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             rast->templ.multisample,
148e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             rast->templ.line_smooth,
149e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             line_width,
150e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             rast->templ.line_stipple_enable,
151e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             line_factor,
152e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                             line_pattern,
153ca531aeeb120cdda966120a17cdf50aa14c3129bBrian Paul                                             pv_last);
154e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      if (ret == PIPE_OK)
155e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul         return;
156e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      svga_context_flush(svga, NULL);
157e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
158e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul}
159e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
160e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void *
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_create_rasterizer_state(struct pipe_context *pipe,
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                             const struct pipe_rasterizer_state *templ)
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
165c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   struct svga_context *svga = svga_context(pipe);
16677e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paul   struct svga_rasterizer_state *rast = CALLOC_STRUCT(svga_rasterizer_state);
167ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   struct svga_screen *screen = svga_screen(pipe->screen);
168c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz
1699f443af449515240169e69b98bdb3746f38e7f35Brian Paul   if (!rast)
1709f443af449515240169e69b98bdb3746f38e7f35Brian Paul      return NULL;
1719f443af449515240169e69b98bdb3746f38e7f35Brian Paul
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* need this for draw module. */
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->templ = *templ;
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1752bd9b386e6c8f47537c8da50d2f5378b287b3c4fBrian Paul   /* light_twoside          - XXX: need fragment shader variant */
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* poly_smooth            - XXX: no fallback available */
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* poly_stipple_enable    - draw module */
1784a4daa75a85db22cd37ebd533ebbccb427e07077Roland Scheidegger   /* sprite_coord_enable    - ? */
17968f93ea3eb83cfad014b8ec93cec3564c1aa9833Roland Scheidegger   /* point_quad_rasterization - ? */
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* point_size_per_vertex  - ? */
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* sprite_coord_mode      - ??? */
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* flatshade_first        - handled by index translation */
1832737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   /* half_pixel_center      - XXX - viewport code */
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* line_width             - draw module */
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* fill_cw, fill_ccw      - draw module or index translation */
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
18777e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paul   rast->shademode = svga_translate_flatshade(templ->flatshade);
18877e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paul   rast->cullmode = svga_translate_cullmode(templ->cull_face, templ->front_ccw);
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->scissortestenable = templ->scissor;
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->multisampleantialias = templ->multisample;
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->antialiasedlineenable = templ->line_smooth;
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rast->lastpixel = templ->line_last_pixel;
1932f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul   rast->pointsprite = templ->sprite_coord_enable != 0x0;
194e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
195e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   if (templ->point_smooth) {
196e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      /* For smooth points we need to generate fragments for at least
197e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul       * a 2x2 region.  Otherwise the quad we draw may be too small and
198e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul       * we may generate no fragments at all.
199e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul       */
200e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      rast->pointsize = MAX2(2.0f, templ->point_size);
201e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
202e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   else {
203e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      rast->pointsize = templ->point_size;
204e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
205e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
206e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   rast->hw_fillmode = PIPE_POLYGON_MODE_FILL;
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Use swtnl + decomposition implement these:
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
211e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   if (templ->line_width <= screen->maxLineWidth) {
212ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      /* pass line width to device */
213ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      rast->linewidth = MAX2(1.0F, templ->line_width);
214ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   }
215ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   else if (svga->debug.no_line_width) {
216ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      /* nothing */
217ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   }
218ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   else {
219ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      /* use 'draw' pipeline for wide line */
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
221c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz      rast->need_pipeline_lines_str = "line width";
222c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   }
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (templ->line_stipple_enable) {
225ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      if (screen->haveLineStipple || svga->debug.force_hw_line_stipple) {
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         SVGA3dLinePattern lp;
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         lp.repeat = templ->line_stipple_factor + 1;
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         lp.pattern = templ->line_stipple_pattern;
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->linepattern = lp.uintValue;
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      else {
232ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul         /* use 'draw' module to decompose into short line segments */
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
234c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_lines_str = "line stipple";
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
238e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   if (!svga_have_vgpu10(svga) && templ->point_smooth) {
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->need_pipeline |= SVGA_PIPELINE_FLAG_POINTS;
240c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz      rast->need_pipeline_points_str = "smooth points";
241c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz   }
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
243ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   if (templ->line_smooth && !screen->haveLineSmooth) {
244ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      /*
245ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul       * XXX: Enabling the pipeline slows down performance immensely, so ignore
246ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul       * line smooth state, where there is very little visual improvement.
247ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul       * Smooth lines will still be drawn for wide lines.
248ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul       */
249ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul#if 0
2506ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca      rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
2516ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca      rast->need_pipeline_lines_str = "smooth lines";
252ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul#endif
2536ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca   }
2546ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   {
2569c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      int fill_front = templ->fill_front;
2579c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      int fill_back = templ->fill_back;
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int fill = PIPE_POLYGON_MODE_FILL;
2599c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      boolean offset_front = util_get_offset(templ, fill_front);
2609c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell      boolean offset_back = util_get_offset(templ, fill_back);
2611737189f0a0b2bd22feb47818e86ba4b8133c404Brian Paul      boolean offset = FALSE;
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2630bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      switch (templ->cull_face) {
2640bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_FRONT_AND_BACK:
2651737189f0a0b2bd22feb47818e86ba4b8133c404Brian Paul         offset = FALSE;
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2690bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_FRONT:
2700bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         offset = offset_front;
2710bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         fill = fill_front;
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2740bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_BACK:
2750bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         offset = offset_back;
2760bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         fill = fill_back;
2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2790bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      case PIPE_FACE_NONE:
2800bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell         if (fill_front != fill_back || offset_front != offset_back)
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         {
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            /* Always need the draw module to work out different
2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz             * front/back fill modes:
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz             */
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz            rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
286c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz            rast->need_pipeline_tris_str = "different front/back fillmodes";
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         }
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         else {
2890bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell            offset = offset_front;
2900bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell            fill = fill_front;
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         }
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      default:
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         assert(0);
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Unfilled primitive modes aren't implemented on all virtual
3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * hardware.  We can do some unfilled processing with index
3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * translation, but otherwise need the draw module:
3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill != PIPE_POLYGON_MODE_FILL &&
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (templ->flatshade ||
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz           templ->light_twoside ||
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz           offset ||
3070bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell           templ->cull_face != PIPE_FACE_NONE))
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
311c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_tris_str = "unfilled primitives with no index manipulation";
3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* If we are decomposing to lines, and lines need the pipeline,
3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * then we also need the pipeline for tris.
3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill == PIPE_POLYGON_MODE_LINE &&
3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (rast->need_pipeline & SVGA_PIPELINE_FLAG_LINES))
3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
3213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
322c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_tris_str = "decomposing lines";
3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
3243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Similarly for points:
3263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
3273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (fill == PIPE_POLYGON_MODE_POINT &&
3283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (rast->need_pipeline & SVGA_PIPELINE_FLAG_POINTS))
3293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
3303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         fill = PIPE_POLYGON_MODE_FILL;
3313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
332c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz         rast->need_pipeline_tris_str = "decomposing points";
3333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
3343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if (offset) {
3363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->slopescaledepthbias = templ->offset_scale;
3373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         rast->depthbias = templ->offset_units;
3383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
3393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
340e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      rast->hw_fillmode = fill;
3413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
3423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (rast->need_pipeline & SVGA_PIPELINE_FLAG_TRIS) {
3443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* Turn off stuff which will get done in the draw module:
3453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
346e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      rast->hw_fillmode = PIPE_POLYGON_MODE_FILL;
3473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->slopescaledepthbias = 0;
3483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      rast->depthbias = 0;
3493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
3503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
351ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   if (0 && rast->need_pipeline) {
352ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      debug_printf("svga: rast need_pipeline = 0x%x\n", rast->need_pipeline);
353ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      debug_printf(" pnts: %s \n", rast->need_pipeline_points_str);
354ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      debug_printf(" lins: %s \n", rast->need_pipeline_lines_str);
355ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul      debug_printf(" tris: %s \n", rast->need_pipeline_tris_str);
356ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul   }
357ccd6bf8272cba7c57e4ae09ab8a03db63472648eBrian Paul
358e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   if (svga_have_vgpu10(svga)) {
359e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      define_rasterizer_object(svga, rast);
360e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
361e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
36232a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul   if (templ->poly_smooth) {
36332a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul      pipe_debug_message(&svga->debug.callback, CONFORMANCE,
36432a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul                         "GL_POLYGON_SMOOTH not supported");
36532a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul   }
36632a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul
367464d6080c60e6f97d286b16f5b09fde94ab37cfcBrian Paul   svga->hud.num_rasterizer_objects++;
3682e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee   SVGA_STATS_COUNT_INC(svga_screen(svga->pipe.screen)->sws,
3692e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee                        SVGA_STATS_COUNT_RASTERIZERSTATE);
3709bc7e3105aeadbe360ca9f060c50a181d3fa7a3dNeha Bhende
3713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return rast;
3723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
37477e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paul
37577e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulstatic void
37677e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulsvga_bind_rasterizer_state(struct pipe_context *pipe, void *state)
3773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_context *svga = svga_context(pipe);
3793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_rasterizer_state *raster = (struct svga_rasterizer_state *)state;
3803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
381eec8d7e7e059c19b86cce0360cb7db28aef1f1ddBrian Paul   if (!raster ||
382eec8d7e7e059c19b86cce0360cb7db28aef1f1ddBrian Paul       !svga->curr.rast ||
383eec8d7e7e059c19b86cce0360cb7db28aef1f1ddBrian Paul       raster->templ.poly_stipple_enable !=
384eec8d7e7e059c19b86cce0360cb7db28aef1f1ddBrian Paul       svga->curr.rast->templ.poly_stipple_enable) {
385eec8d7e7e059c19b86cce0360cb7db28aef1f1ddBrian Paul      svga->dirty |= SVGA_NEW_STIPPLE;
386eec8d7e7e059c19b86cce0360cb7db28aef1f1ddBrian Paul   }
387eec8d7e7e059c19b86cce0360cb7db28aef1f1ddBrian Paul
388831de96db87ee1f16b60d3aff308a423fece3407Zack Rusin   svga->curr.rast = raster;
389831de96db87ee1f16b60d3aff308a423fece3407Zack Rusin
3903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->dirty |= SVGA_NEW_RAST;
3913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
39377e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paul
394e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstatic void
395e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulsvga_delete_rasterizer_state(struct pipe_context *pipe, void *state)
3963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
397e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   struct svga_context *svga = svga_context(pipe);
398e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   struct svga_rasterizer_state *raster =
399e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      (struct svga_rasterizer_state *) state;
400e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
401e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   if (svga_have_vgpu10(svga)) {
402e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      enum pipe_error ret =
403e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul         SVGA3D_vgpu10_DestroyRasterizerState(svga->swc, raster->id);
404e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      if (ret != PIPE_OK) {
405e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul         svga_context_flush(svga, NULL);
406e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul         ret = SVGA3D_vgpu10_DestroyRasterizerState(svga->swc, raster->id);
407e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      }
408e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
409e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      if (raster->id == svga->state.hw_draw.rasterizer_id)
410e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul         svga->state.hw_draw.rasterizer_id = SVGA3D_INVALID_ID;
411e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
412e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      util_bitmask_clear(svga->rast_object_id_bm, raster->id);
413e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   }
414e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
415e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   FREE(state);
416464d6080c60e6f97d286b16f5b09fde94ab37cfcBrian Paul   svga->hud.num_rasterizer_objects--;
4173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
42077e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulvoid
42177e4b41671ecd7bde3a151627d4548106fc5be3cBrian Paulsvga_init_rasterizer_functions(struct svga_context *svga)
4223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.create_rasterizer_state = svga_create_rasterizer_state;
4243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.bind_rasterizer_state = svga_bind_rasterizer_state;
4253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->pipe.delete_rasterizer_state = svga_delete_rasterizer_state;
4263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
427