svga_state_rss.c revision 9773370eda1765b1014ba11a699d10244b88757c
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 2628486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 27e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca#include "util/u_memory.h" 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 329773370eda1765b1014ba11a699d10244b88757cJosé Fonseca#include "svga_screen.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct rs_queue { 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned rs_count; 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dRenderState rs[SVGA3D_RS_MAX]; 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define EMIT_RS(svga, value, token, fail) \ 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzdo { \ 45e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(SVGA3D_RS_##token < Elements(svga->state.hw_draw.rs)); \ 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->state.hw_draw.rs[SVGA3D_RS_##token] != value) { \ 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_queue_rs( &queue, SVGA3D_RS_##token, value ); \ 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.rs[SVGA3D_RS_##token] = value; \ 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } \ 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} while (0) 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define EMIT_RS_FLOAT(svga, fvalue, token, fail) \ 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzdo { \ 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned value = fui(fvalue); \ 55e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(SVGA3D_RS_##token < Elements(svga->state.hw_draw.rs)); \ 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->state.hw_draw.rs[SVGA3D_RS_##token] != value) { \ 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_queue_rs( &queue, SVGA3D_RS_##token, value ); \ 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.rs[SVGA3D_RS_##token] = value; \ 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } \ 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} while (0) 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE void 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_queue_rs( struct rs_queue *q, 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned rss, 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned value ) 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->rs[q->rs_count].state = rss; 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->rs[q->rs_count].uintValue = value; 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->rs_count++; 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Compare old and new render states and emit differences between them 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * to hardware. Simplest implementation would be to emit the whole of 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * the "to" state. 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int emit_rss( struct svga_context *svga, 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned dirty ) 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 819773370eda1765b1014ba11a699d10244b88757cJosé Fonseca struct svga_screen *screen = svga_screen(svga->pipe.screen); 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct rs_queue queue; 83cb43954308f44717814b53f40672163384cc005eMarek Olšák float point_size_min; 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs_count = 0; 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dirty & SVGA_NEW_BLEND) { 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_blend_state *curr = svga->curr.blend; 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].writemask, COLORWRITEENABLE, fail ); 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].blend_enable, BLENDENABLE, fail ); 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->rt[0].blend_enable) { 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].srcblend, SRCBLEND, fail ); 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].dstblend, DSTBLEND, fail ); 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].blendeq, BLENDEQUATION, fail ); 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].separate_alpha_blend_enable, 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SEPARATEALPHABLENDENABLE, fail ); 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->rt[0].separate_alpha_blend_enable) { 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].srcblend_alpha, SRCBLENDALPHA, fail ); 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].dstblend_alpha, DSTBLENDALPHA, fail ); 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].blendeq_alpha, BLENDEQUATIONALPHA, fail ); 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1099381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger if (dirty & SVGA_NEW_BLEND_COLOR) { 110cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 color; 111cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 r = float_to_ubyte(svga->curr.blend_color.color[0]); 112cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 g = float_to_ubyte(svga->curr.blend_color.color[1]); 113cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 b = float_to_ubyte(svga->curr.blend_color.color[2]); 114cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 a = float_to_ubyte(svga->curr.blend_color.color[3]); 1159381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger 116cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca color = (a << 24) | (r << 16) | (g << 8) | b; 1179381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger 118cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca EMIT_RS( svga, color, BLENDCOLOR, fail ); 1199381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger } 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dirty & (SVGA_NEW_DEPTH_STENCIL | SVGA_NEW_RAST)) { 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_depth_stencil_state *curr = svga->curr.depth; 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_rasterizer_state *rast = svga->curr.rast; 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!curr->stencil[0].enabled) 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Stencil disabled 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, FALSE, STENCILENABLE, fail ); 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, FALSE, STENCILENABLE2SIDED, fail ); 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else if (curr->stencil[0].enabled && !curr->stencil[1].enabled) 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Regular stencil 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, TRUE, STENCILENABLE, fail ); 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, FALSE, STENCILENABLE2SIDED, fail ); 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].func, STENCILFUNC, fail ); 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].fail, STENCILFAIL, fail ); 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].zfail, STENCILZFAIL, fail ); 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].pass, STENCILPASS, fail ); 1439381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_mask, STENCILMASK, fail ); 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_writemask, STENCILWRITEMASK, fail ); 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int cw, ccw; 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Hardware frontwinding is always CW, so if ours is also CW, 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * then our definition of front face agrees with hardware. 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Otherwise need to flip. 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1550bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell if (rast->templ.front_ccw) { 1560bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell ccw = 0; 1570bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell cw = 1; 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 1600bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell ccw = 1; 1610bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell cw = 0; 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Twoside stencil 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, TRUE, STENCILENABLE, fail ); 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, TRUE, STENCILENABLE2SIDED, fail ); 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].func, STENCILFUNC, fail ); 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].fail, STENCILFAIL, fail ); 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].zfail, STENCILZFAIL, fail ); 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].pass, STENCILPASS, fail ); 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].func, CCWSTENCILFUNC, fail ); 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].fail, CCWSTENCILFAIL, fail ); 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].zfail, CCWSTENCILZFAIL, fail ); 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].pass, CCWSTENCILPASS, fail ); 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_mask, STENCILMASK, fail ); 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_writemask, STENCILWRITEMASK, fail ); 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->zenable, ZENABLE, fail ); 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->zenable) { 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->zfunc, ZFUNC, fail ); 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->zwriteenable, ZWRITEENABLE, fail ); 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->alphatestenable, ALPHATESTENABLE, fail ); 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->alphatestenable) { 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->alphafunc, ALPHAFUNC, fail ); 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, curr->alpharef, ALPHAREF, fail ); 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1969381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger if (dirty & SVGA_NEW_STENCIL_REF) { 1979381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger EMIT_RS( svga, svga->curr.stencil_ref.ref_value[0], STENCILREF, fail ); 1989381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger } 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 200dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell if (dirty & (SVGA_NEW_RAST | SVGA_NEW_NEED_PIPELINE)) 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_rasterizer_state *curr = svga->curr.rast; 203dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell unsigned cullmode = curr->cullmode; 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Shademode: still need to rearrange index list to move 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * flat-shading PV first vertex. 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->shademode, SHADEMODE, fail ); 209dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell 210dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell /* Don't do culling while the software pipeline is active. It 211dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell * does it for us, and additionally introduces potentially 212dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell * back-facing triangles. 213dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell */ 214dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell if (svga->state.sw.need_pipeline) 215dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell cullmode = SVGA3D_FACE_NONE; 216dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell 217cb43954308f44717814b53f40672163384cc005eMarek Olšák point_size_min = util_get_min_point_size(&curr->templ); 218cb43954308f44717814b53f40672163384cc005eMarek Olšák 219dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell EMIT_RS( svga, cullmode, CULLMODE, fail ); 2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->scissortestenable, SCISSORTESTENABLE, fail ); 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->multisampleantialias, MULTISAMPLEANTIALIAS, fail ); 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->lastpixel, LASTPIXEL, fail ); 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->linepattern, LINEPATTERN, fail ); 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, curr->pointsize, POINTSIZE, fail ); 225cb43954308f44717814b53f40672163384cc005eMarek Olšák EMIT_RS_FLOAT( svga, point_size_min, POINTSIZEMIN, fail ); 2269773370eda1765b1014ba11a699d10244b88757cJosé Fonseca EMIT_RS_FLOAT( svga, screen->maxPointSize, POINTSIZEMAX, fail ); 2272f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul EMIT_RS( svga, curr->pointsprite, POINTSPRITEENABLE, fail); 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dirty & (SVGA_NEW_RAST | SVGA_NEW_FRAME_BUFFER | SVGA_NEW_NEED_PIPELINE)) 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_rasterizer_state *curr = svga->curr.rast; 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz float slope = 0.0; 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz float bias = 0.0; 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Need to modify depth bias according to bound depthbuffer 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * format. Don't do hardware depthbias while the software 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * pipeline is active. 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->state.sw.need_pipeline && 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->curr.framebuffer.zsbuf) 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz slope = curr->slopescaledepthbias; 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz bias = svga->curr.depthscale * curr->depthbias; 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, slope, SLOPESCALEDEPTHBIAS, fail ); 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, bias, DEPTHBIAS, fail ); 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 251ce2929dde021e5754a3926b77b86b4de3208f4b0José Fonseca if (dirty & SVGA_NEW_RAST) { 252ce2929dde021e5754a3926b77b86b4de3208f4b0José Fonseca /* bitmask of the enabled clip planes */ 253dc4c821f0817a3db716f965692fb701079f66340Marek Olšák unsigned enabled = svga->curr.rast->templ.clip_plane_enable; 2540be6ae74e9a56e84df088392ef3b09229508404fBrian Paul EMIT_RS( svga, enabled, CLIPPLANEENABLE, fail ); 2550be6ae74e9a56e84df088392ef3b09229508404fBrian Paul } 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (queue.rs_count) { 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dRenderState *rs; 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (SVGA3D_BeginSetRenderState( svga->swc, 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz &rs, 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs_count ) != PIPE_OK) 2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memcpy( rs, 2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs, 2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs_count * sizeof queue.rs[0]); 2687082c47d1499bdc9348cf7a80ff3749d299898faRoland Scheidegger 2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_FIFOCommitAll( svga->swc ); 2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return 0; 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* XXX: need to poison cached hardware state on failure to ensure 2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * dirty state gets re-emitted. Fix this by re-instating partial 2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFOCommit command and only updating cached hw state once the 2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * initial allocation has succeeded. 2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(svga->state.hw_draw.rs, 0xcd, sizeof(svga->state.hw_draw.rs)); 2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_OUT_OF_MEMORY; 2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_rss = 2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "hw rss state", 2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (SVGA_NEW_BLEND | 2919381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger SVGA_NEW_BLEND_COLOR | 2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_DEPTH_STENCIL | 2939381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger SVGA_NEW_STENCIL_REF | 2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_RAST | 2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_FRAME_BUFFER | 2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_NEED_PIPELINE), 2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz emit_rss 2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 300