1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008-2009 VMware, Inc.  All rights reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obtaining a copy of this software and associated documentation
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * files (the "Software"), to deal in the Software without
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restriction, including without limitation the rights to use, copy,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software, and to permit persons to whom the Software is
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * furnished to do so, subject to the following conditions:
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in all copies or substantial portions of the Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************/
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_context.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_hw_reg.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Hardware frontwinding is always set up as SVGA3D_FRONTWINDING_CW.
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic SVGA3dFace svga_translate_cullmode( unsigned mode,
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           unsigned front_ccw )
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int hw_front_ccw = 0;  /* hardware is always CW */
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FACE_NONE:
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return SVGA3D_FACE_NONE;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FACE_FRONT:
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return front_ccw == hw_front_ccw ? SVGA3D_FACE_FRONT : SVGA3D_FACE_BACK;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FACE_BACK:
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return front_ccw == hw_front_ccw ? SVGA3D_FACE_BACK : SVGA3D_FACE_FRONT;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FACE_FRONT_AND_BACK:
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return SVGA3D_FACE_FRONT_BACK;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return SVGA3D_FACE_NONE;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic SVGA3dShadeMode svga_translate_flatshade( unsigned mode )
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return mode ? SVGA3D_SHADEMODE_FLAT : SVGA3D_SHADEMODE_SMOOTH;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_create_rasterizer_state(struct pipe_context *pipe,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct pipe_rasterizer_state *templ)
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_context *svga = svga_context(pipe);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_rasterizer_state *rast = CALLOC_STRUCT( svga_rasterizer_state );
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* need this for draw module. */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->templ = *templ;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* light_twoside          - XXX: need fragment shader variant */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* poly_smooth            - XXX: no fallback available */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* poly_stipple_enable    - draw module */
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* sprite_coord_enable    - ? */
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* point_quad_rasterization - ? */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* point_size_per_vertex  - ? */
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* sprite_coord_mode      - ??? */
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* flatshade_first        - handled by index translation */
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* gl_rasterization_rules - XXX - viewport code */
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* line_width             - draw module */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* fill_cw, fill_ccw      - draw module or index translation */
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->shademode = svga_translate_flatshade( templ->flatshade );
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->cullmode = svga_translate_cullmode( templ->cull_face,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             templ->front_ccw );
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->scissortestenable = templ->scissor;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->multisampleantialias = templ->multisample;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->antialiasedlineenable = templ->line_smooth;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->lastpixel = templ->line_last_pixel;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->pointsprite = templ->sprite_coord_enable != 0x0;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->pointsize = templ->point_size;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rast->hw_unfilled = PIPE_POLYGON_MODE_FILL;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Use swtnl + decomposition implement these:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->poly_stipple_enable) {
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline_tris_str = "poly stipple";
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->line_width >= 1.5f &&
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !svga->debug.no_line_width) {
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline_lines_str = "line width";
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->line_stipple_enable) {
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* XXX: LinePattern not implemented on all backends, and there is no
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * mechanism to query it.
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!svga->debug.force_hw_line_stipple) {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SVGA3dLinePattern lp;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         lp.repeat = templ->line_stipple_factor + 1;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         lp.pattern = templ->line_stipple_pattern;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->linepattern = lp.uintValue;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline_lines_str = "line stipple";
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->point_smooth) {
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline |= SVGA_PIPELINE_FLAG_POINTS;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline_points_str = "smooth points";
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (templ->line_smooth) {
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->need_pipeline_lines_str = "smooth lines";
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int fill_front = templ->fill_front;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int fill_back = templ->fill_back;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int fill = PIPE_POLYGON_MODE_FILL;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean offset_front = util_get_offset(templ, fill_front);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean offset_back = util_get_offset(templ, fill_back);
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean offset  = 0;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (templ->cull_face) {
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PIPE_FACE_FRONT_AND_BACK:
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         offset = 0;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fill = PIPE_POLYGON_MODE_FILL;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PIPE_FACE_FRONT:
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         offset = offset_front;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fill = fill_front;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PIPE_FACE_BACK:
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         offset = offset_back;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fill = fill_back;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PIPE_FACE_NONE:
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (fill_front != fill_back || offset_front != offset_back)
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         {
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Always need the draw module to work out different
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * front/back fill modes:
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            rast->need_pipeline_tris_str = "different front/back fillmodes";
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            offset = offset_front;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fill = fill_front;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Unfilled primitive modes aren't implemented on all virtual
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * hardware.  We can do some unfilled processing with index
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * translation, but otherwise need the draw module:
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fill != PIPE_POLYGON_MODE_FILL &&
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (templ->flatshade ||
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           templ->light_twoside ||
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           offset ||
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           templ->cull_face != PIPE_FACE_NONE))
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fill = PIPE_POLYGON_MODE_FILL;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline_tris_str = "unfilled primitives with no index manipulation";
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* If we are decomposing to lines, and lines need the pipeline,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * then we also need the pipeline for tris.
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fill == PIPE_POLYGON_MODE_LINE &&
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (rast->need_pipeline & SVGA_PIPELINE_FLAG_LINES))
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fill = PIPE_POLYGON_MODE_FILL;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline_tris_str = "decomposing lines";
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Similarly for points:
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fill == PIPE_POLYGON_MODE_POINT &&
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (rast->need_pipeline & SVGA_PIPELINE_FLAG_POINTS))
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fill = PIPE_POLYGON_MODE_FILL;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->need_pipeline_tris_str = "decomposing points";
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (offset) {
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->slopescaledepthbias = templ->offset_scale;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rast->depthbias = templ->offset_units;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->hw_unfilled = fill;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rast->need_pipeline & SVGA_PIPELINE_FLAG_TRIS) {
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Turn off stuff which will get done in the draw module:
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->hw_unfilled = PIPE_POLYGON_MODE_FILL;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->slopescaledepthbias = 0;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rast->depthbias = 0;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return rast;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void svga_bind_rasterizer_state( struct pipe_context *pipe,
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        void *state )
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_context *svga = svga_context(pipe);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_rasterizer_state *raster = (struct svga_rasterizer_state *)state;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_set_rasterizer_state(svga->swtnl.draw, raster ? &raster->templ : NULL,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             state);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->curr.rast = raster;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->dirty |= SVGA_NEW_RAST;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void svga_delete_rasterizer_state(struct pipe_context *pipe,
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         void *raster)
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(raster);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid svga_init_rasterizer_functions( struct svga_context *svga )
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->pipe.create_rasterizer_state = svga_create_rasterizer_state;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->pipe.bind_rasterizer_state = svga_bind_rasterizer_state;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->pipe.delete_rasterizer_state = svga_delete_rasterizer_state;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Hardware state update
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267