13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "draw/draw_context.h" 2728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Hardware frontwinding is always set up as SVGA3D_FRONTWINDING_CW. 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic SVGA3dFace svga_translate_cullmode( unsigned mode, 390bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell unsigned front_ccw ) 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 410bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell const int hw_front_ccw = 0; /* hardware is always CW */ 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz switch (mode) { 430bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_NONE: 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_FACE_NONE; 450bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_FRONT: 460bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell return front_ccw == hw_front_ccw ? SVGA3D_FACE_FRONT : SVGA3D_FACE_BACK; 470bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_BACK: 480bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell return front_ccw == hw_front_ccw ? SVGA3D_FACE_BACK : SVGA3D_FACE_FRONT; 490bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_FRONT_AND_BACK: 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_FACE_FRONT_BACK; 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz default: 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(0); 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return SVGA3D_FACE_NONE; 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic SVGA3dShadeMode svga_translate_flatshade( unsigned mode ) 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return mode ? SVGA3D_SHADEMODE_FLAT : SVGA3D_SHADEMODE_SMOOTH; 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void * 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_create_rasterizer_state(struct pipe_context *pipe, 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct pipe_rasterizer_state *templ) 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 67c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz struct svga_context *svga = svga_context(pipe); 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_rasterizer_state *rast = CALLOC_STRUCT( svga_rasterizer_state ); 69c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* need this for draw module. */ 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->templ = *templ; 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 732bd9b386e6c8f47537c8da50d2f5378b287b3c4fBrian Paul /* light_twoside - XXX: need fragment shader variant */ 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* poly_smooth - XXX: no fallback available */ 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* poly_stipple_enable - draw module */ 764a4daa75a85db22cd37ebd533ebbccb427e07077Roland Scheidegger /* sprite_coord_enable - ? */ 7768f93ea3eb83cfad014b8ec93cec3564c1aa9833Roland Scheidegger /* point_quad_rasterization - ? */ 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* point_size_per_vertex - ? */ 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* sprite_coord_mode - ??? */ 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* flatshade_first - handled by index translation */ 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* gl_rasterization_rules - XXX - viewport code */ 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* line_width - draw module */ 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* fill_cw, fill_ccw - draw module or index translation */ 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->shademode = svga_translate_flatshade( templ->flatshade ); 869c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell rast->cullmode = svga_translate_cullmode( templ->cull_face, 870bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell templ->front_ccw ); 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->scissortestenable = templ->scissor; 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->multisampleantialias = templ->multisample; 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->antialiasedlineenable = templ->line_smooth; 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->lastpixel = templ->line_last_pixel; 922f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul rast->pointsprite = templ->sprite_coord_enable != 0x0; 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->pointsize = templ->point_size; 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->hw_unfilled = PIPE_POLYGON_MODE_FILL; 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Use swtnl + decomposition implement these: 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 98c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz if (templ->poly_stipple_enable) { 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS; 100c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_tris_str = "poly stipple"; 101c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz } 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 10357a3d36a685b4d6e39988d6c10a3201be789befcJosé Fonseca if (templ->line_width >= 1.5f && 104c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz !svga->debug.no_line_width) { 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES; 106c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_lines_str = "line width"; 107c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz } 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (templ->line_stipple_enable) { 110f0ca9f71341f494be961aacc08bddd9cea28fca2José Fonseca /* XXX: LinePattern not implemented on all backends, and there is no 111f0ca9f71341f494be961aacc08bddd9cea28fca2José Fonseca * mechanism to query it. 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 113c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz if (!svga->debug.force_hw_line_stipple) { 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dLinePattern lp; 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz lp.repeat = templ->line_stipple_factor + 1; 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz lp.pattern = templ->line_stipple_pattern; 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->linepattern = lp.uintValue; 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES; 121c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_lines_str = "line stipple"; 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 125c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz if (templ->point_smooth) { 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_POINTS; 127c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_points_str = "smooth points"; 128c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz } 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1306ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca if (templ->line_smooth) { 1316ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca rast->need_pipeline |= SVGA_PIPELINE_FLAG_LINES; 1326ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca rast->need_pipeline_lines_str = "smooth lines"; 1336ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca } 1346ed0f2ac112d22278cf051c2cee9c2199a9025eaJosé Fonseca 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1369c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell int fill_front = templ->fill_front; 1379c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell int fill_back = templ->fill_back; 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int fill = PIPE_POLYGON_MODE_FILL; 1399c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell boolean offset_front = util_get_offset(templ, fill_front); 1409c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell boolean offset_back = util_get_offset(templ, fill_back); 1419c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell boolean offset = 0; 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1430bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell switch (templ->cull_face) { 1440bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_FRONT_AND_BACK: 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz offset = 0; 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz fill = PIPE_POLYGON_MODE_FILL; 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz break; 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1490bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_FRONT: 1500bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell offset = offset_front; 1510bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell fill = fill_front; 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz break; 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1540bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_BACK: 1550bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell offset = offset_back; 1560bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell fill = fill_back; 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz break; 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1590bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell case PIPE_FACE_NONE: 1600bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell if (fill_front != fill_back || offset_front != offset_back) 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Always need the draw module to work out different 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * front/back fill modes: 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS; 166c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_tris_str = "different front/back fillmodes"; 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 1690bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell offset = offset_front; 1700bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell fill = fill_front; 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz break; 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz default: 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(0); 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz break; 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Unfilled primitive modes aren't implemented on all virtual 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * hardware. We can do some unfilled processing with index 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * translation, but otherwise need the draw module: 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (fill != PIPE_POLYGON_MODE_FILL && 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (templ->flatshade || 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz templ->light_twoside || 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz offset || 1870bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell templ->cull_face != PIPE_FACE_NONE)) 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz fill = PIPE_POLYGON_MODE_FILL; 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS; 191c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_tris_str = "unfilled primitives with no index manipulation"; 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* If we are decomposing to lines, and lines need the pipeline, 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * then we also need the pipeline for tris. 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (fill == PIPE_POLYGON_MODE_LINE && 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (rast->need_pipeline & SVGA_PIPELINE_FLAG_LINES)) 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz fill = PIPE_POLYGON_MODE_FILL; 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS; 202c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_tris_str = "decomposing lines"; 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Similarly for points: 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (fill == PIPE_POLYGON_MODE_POINT && 2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (rast->need_pipeline & SVGA_PIPELINE_FLAG_POINTS)) 2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz fill = PIPE_POLYGON_MODE_FILL; 2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->need_pipeline |= SVGA_PIPELINE_FLAG_TRIS; 212c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz rast->need_pipeline_tris_str = "decomposing points"; 2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (offset) { 2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->slopescaledepthbias = templ->offset_scale; 2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->depthbias = templ->offset_units; 2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->hw_unfilled = fill; 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (rast->need_pipeline & SVGA_PIPELINE_FLAG_TRIS) { 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Turn off stuff which will get done in the draw module: 2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->hw_unfilled = PIPE_POLYGON_MODE_FILL; 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->slopescaledepthbias = 0; 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rast->depthbias = 0; 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return rast; 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_bind_rasterizer_state( struct pipe_context *pipe, 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz void *state ) 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context(pipe); 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_rasterizer_state *raster = (struct svga_rasterizer_state *)state; 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 241e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw_set_rasterizer_state(svga->swtnl.draw, raster ? &raster->templ : NULL, 242e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul state); 243831de96db87ee1f16b60d3aff308a423fece3407Zack Rusin svga->curr.rast = raster; 244831de96db87ee1f16b60d3aff308a423fece3407Zack Rusin 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty |= SVGA_NEW_RAST; 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_delete_rasterizer_state(struct pipe_context *pipe, 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz void *raster) 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(raster); 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_init_rasterizer_functions( struct svga_context *svga ) 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.create_rasterizer_state = svga_create_rasterizer_state; 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.bind_rasterizer_state = svga_bind_rasterizer_state; 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.delete_rasterizer_state = svga_delete_rasterizer_state; 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*********************************************************************** 2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Hardware state update 2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 267