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