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 262389fcc8025458e4872b83feb72727ab38f07f33Brian Paul#include "util/u_format.h" 2728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 28e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca#include "util/u_memory.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 339773370eda1765b1014ba11a699d10244b88757cJosé Fonseca#include "svga_screen.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct rs_queue { 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned rs_count; 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dRenderState rs[SVGA3D_RS_MAX]; 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define EMIT_RS(svga, value, token, fail) \ 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzdo { \ 46e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(SVGA3D_RS_##token < Elements(svga->state.hw_draw.rs)); \ 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->state.hw_draw.rs[SVGA3D_RS_##token] != value) { \ 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_queue_rs( &queue, SVGA3D_RS_##token, value ); \ 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.rs[SVGA3D_RS_##token] = value; \ 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } \ 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} while (0) 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define EMIT_RS_FLOAT(svga, fvalue, token, fail) \ 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzdo { \ 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned value = fui(fvalue); \ 56e33447aac62da5e7fe8f6a262cacaa97ce212ef5José Fonseca assert(SVGA3D_RS_##token < Elements(svga->state.hw_draw.rs)); \ 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->state.hw_draw.rs[SVGA3D_RS_##token] != value) { \ 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_queue_rs( &queue, SVGA3D_RS_##token, value ); \ 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.rs[SVGA3D_RS_##token] = value; \ 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } \ 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} while (0) 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE void 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_queue_rs( struct rs_queue *q, 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned rss, 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned value ) 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->rs[q->rs_count].state = rss; 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->rs[q->rs_count].uintValue = value; 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz q->rs_count++; 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* Compare old and new render states and emit differences between them 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * to hardware. Simplest implementation would be to emit the whole of 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * the "to" state. 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 792786343896030ed4abcf6674a3e66f3a0d246e0dBrian Paulstatic enum pipe_error 802786343896030ed4abcf6674a3e66f3a0d246e0dBrian Paulemit_rss(struct svga_context *svga, unsigned dirty) 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 829773370eda1765b1014ba11a699d10244b88757cJosé Fonseca struct svga_screen *screen = svga_screen(svga->pipe.screen); 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct rs_queue queue; 84cb43954308f44717814b53f40672163384cc005eMarek Olšák float point_size_min; 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs_count = 0; 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dirty & SVGA_NEW_BLEND) { 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_blend_state *curr = svga->curr.blend; 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].writemask, COLORWRITEENABLE, fail ); 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].blend_enable, BLENDENABLE, fail ); 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->rt[0].blend_enable) { 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].srcblend, SRCBLEND, fail ); 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].dstblend, DSTBLEND, fail ); 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].blendeq, BLENDEQUATION, fail ); 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].separate_alpha_blend_enable, 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SEPARATEALPHABLENDENABLE, fail ); 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->rt[0].separate_alpha_blend_enable) { 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].srcblend_alpha, SRCBLENDALPHA, fail ); 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].dstblend_alpha, DSTBLENDALPHA, fail ); 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->rt[0].blendeq_alpha, BLENDEQUATIONALPHA, fail ); 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1109381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger if (dirty & SVGA_NEW_BLEND_COLOR) { 111cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 color; 112cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 r = float_to_ubyte(svga->curr.blend_color.color[0]); 113cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 g = float_to_ubyte(svga->curr.blend_color.color[1]); 114cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 b = float_to_ubyte(svga->curr.blend_color.color[2]); 115cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca uint32 a = float_to_ubyte(svga->curr.blend_color.color[3]); 1169381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger 117cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca color = (a << 24) | (r << 16) | (g << 8) | b; 1189381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger 119cd5d7608897a435623b26e3d5d6391734b9197e8José Fonseca EMIT_RS( svga, color, BLENDCOLOR, fail ); 1209381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger } 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dirty & (SVGA_NEW_DEPTH_STENCIL | SVGA_NEW_RAST)) { 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_depth_stencil_state *curr = svga->curr.depth; 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_rasterizer_state *rast = svga->curr.rast; 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!curr->stencil[0].enabled) 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Stencil disabled 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, FALSE, STENCILENABLE, fail ); 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, FALSE, STENCILENABLE2SIDED, fail ); 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else if (curr->stencil[0].enabled && !curr->stencil[1].enabled) 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Regular stencil 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, TRUE, STENCILENABLE, fail ); 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, FALSE, STENCILENABLE2SIDED, fail ); 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].func, STENCILFUNC, fail ); 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].fail, STENCILFAIL, fail ); 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].zfail, STENCILZFAIL, fail ); 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[0].pass, STENCILPASS, fail ); 1449381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_mask, STENCILMASK, fail ); 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_writemask, STENCILWRITEMASK, fail ); 1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int cw, ccw; 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Hardware frontwinding is always CW, so if ours is also CW, 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * then our definition of front face agrees with hardware. 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Otherwise need to flip. 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1560bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell if (rast->templ.front_ccw) { 1570bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell ccw = 0; 1580bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell cw = 1; 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 1610bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell ccw = 1; 1620bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell cw = 0; 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Twoside stencil 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, TRUE, STENCILENABLE, fail ); 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, TRUE, STENCILENABLE2SIDED, fail ); 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].func, STENCILFUNC, fail ); 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].fail, STENCILFAIL, fail ); 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].zfail, STENCILZFAIL, fail ); 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[cw].pass, STENCILPASS, fail ); 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].func, CCWSTENCILFUNC, fail ); 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].fail, CCWSTENCILFAIL, fail ); 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].zfail, CCWSTENCILZFAIL, fail ); 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil[ccw].pass, CCWSTENCILPASS, fail ); 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_mask, STENCILMASK, fail ); 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->stencil_writemask, STENCILWRITEMASK, fail ); 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->zenable, ZENABLE, fail ); 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->zenable) { 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->zfunc, ZFUNC, fail ); 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->zwriteenable, ZWRITEENABLE, fail ); 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->alphatestenable, ALPHATESTENABLE, fail ); 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (curr->alphatestenable) { 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->alphafunc, ALPHAFUNC, fail ); 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, curr->alpharef, ALPHAREF, fail ); 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1979381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger if (dirty & SVGA_NEW_STENCIL_REF) { 1989381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger EMIT_RS( svga, svga->curr.stencil_ref.ref_value[0], STENCILREF, fail ); 1999381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger } 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 201dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell if (dirty & (SVGA_NEW_RAST | SVGA_NEW_NEED_PIPELINE)) 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_rasterizer_state *curr = svga->curr.rast; 204dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell unsigned cullmode = curr->cullmode; 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Shademode: still need to rearrange index list to move 2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * flat-shading PV first vertex. 2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->shademode, SHADEMODE, fail ); 210dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell 211dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell /* Don't do culling while the software pipeline is active. It 212dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell * does it for us, and additionally introduces potentially 213dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell * back-facing triangles. 214dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell */ 215dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell if (svga->state.sw.need_pipeline) 216dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell cullmode = SVGA3D_FACE_NONE; 217dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell 218cb43954308f44717814b53f40672163384cc005eMarek Olšák point_size_min = util_get_min_point_size(&curr->templ); 219cb43954308f44717814b53f40672163384cc005eMarek Olšák 220dc1e4cf87fdab5a57049fbf4180e3597d80323cdKeith Whitwell EMIT_RS( svga, cullmode, CULLMODE, fail ); 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->scissortestenable, SCISSORTESTENABLE, fail ); 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->multisampleantialias, MULTISAMPLEANTIALIAS, fail ); 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->lastpixel, LASTPIXEL, fail ); 2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS( svga, curr->linepattern, LINEPATTERN, fail ); 2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, curr->pointsize, POINTSIZE, fail ); 226cb43954308f44717814b53f40672163384cc005eMarek Olšák EMIT_RS_FLOAT( svga, point_size_min, POINTSIZEMIN, fail ); 2279773370eda1765b1014ba11a699d10244b88757cJosé Fonseca EMIT_RS_FLOAT( svga, screen->maxPointSize, POINTSIZEMAX, fail ); 2282f40e4aac7ab79deb06ff6ab9ae03a896d7a9169Brian Paul EMIT_RS( svga, curr->pointsprite, POINTSPRITEENABLE, fail); 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dirty & (SVGA_NEW_RAST | SVGA_NEW_FRAME_BUFFER | SVGA_NEW_NEED_PIPELINE)) 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz const struct svga_rasterizer_state *curr = svga->curr.rast; 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz float slope = 0.0; 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz float bias = 0.0; 2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Need to modify depth bias according to bound depthbuffer 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * format. Don't do hardware depthbias while the software 2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * pipeline is active. 2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (!svga->state.sw.need_pipeline && 2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->curr.framebuffer.zsbuf) 2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz { 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz slope = curr->slopescaledepthbias; 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz bias = svga->curr.depthscale * curr->depthbias; 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, slope, SLOPESCALEDEPTHBIAS, fail ); 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz EMIT_RS_FLOAT( svga, bias, DEPTHBIAS, fail ); 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2522389fcc8025458e4872b83feb72727ab38f07f33Brian Paul if (dirty & SVGA_NEW_FRAME_BUFFER) { 2532389fcc8025458e4872b83feb72727ab38f07f33Brian Paul /* XXX: we only look at the first color buffer's sRGB state */ 2542389fcc8025458e4872b83feb72727ab38f07f33Brian Paul float gamma = 1.0f; 2552389fcc8025458e4872b83feb72727ab38f07f33Brian Paul if (svga->curr.framebuffer.cbufs[0] && 2562389fcc8025458e4872b83feb72727ab38f07f33Brian Paul util_format_is_srgb(svga->curr.framebuffer.cbufs[0]->format)) { 2572389fcc8025458e4872b83feb72727ab38f07f33Brian Paul gamma = 2.2f; 2582389fcc8025458e4872b83feb72727ab38f07f33Brian Paul } 2592389fcc8025458e4872b83feb72727ab38f07f33Brian Paul EMIT_RS_FLOAT(svga, gamma, OUTPUTGAMMA, fail); 2602389fcc8025458e4872b83feb72727ab38f07f33Brian Paul } 2612389fcc8025458e4872b83feb72727ab38f07f33Brian Paul 262ce2929dde021e5754a3926b77b86b4de3208f4b0José Fonseca if (dirty & SVGA_NEW_RAST) { 263ce2929dde021e5754a3926b77b86b4de3208f4b0José Fonseca /* bitmask of the enabled clip planes */ 264dc4c821f0817a3db716f965692fb701079f66340Marek Olšák unsigned enabled = svga->curr.rast->templ.clip_plane_enable; 2650be6ae74e9a56e84df088392ef3b09229508404fBrian Paul EMIT_RS( svga, enabled, CLIPPLANEENABLE, fail ); 2660be6ae74e9a56e84df088392ef3b09229508404fBrian Paul } 2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (queue.rs_count) { 2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dRenderState *rs; 2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (SVGA3D_BeginSetRenderState( svga->swc, 2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz &rs, 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs_count ) != PIPE_OK) 2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memcpy( rs, 2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs, 2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz queue.rs_count * sizeof queue.rs[0]); 2797082c47d1499bdc9348cf7a80ff3749d299898faRoland Scheidegger 2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_FIFOCommitAll( svga->swc ); 2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2832786343896030ed4abcf6674a3e66f3a0d246e0dBrian Paul return PIPE_OK; 2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* XXX: need to poison cached hardware state on failure to ensure 2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * dirty state gets re-emitted. Fix this by re-instating partial 2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * FIFOCommit command and only updating cached hw state once the 2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * initial allocation has succeeded. 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(svga->state.hw_draw.rs, 0xcd, sizeof(svga->state.hw_draw.rs)); 2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_OUT_OF_MEMORY; 2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_hw_rss = 2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz "hw rss state", 3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (SVGA_NEW_BLEND | 3029381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger SVGA_NEW_BLEND_COLOR | 3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_DEPTH_STENCIL | 3049381a2777c1a36c1b88de9edf04141c485569259Roland Scheidegger SVGA_NEW_STENCIL_REF | 3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_RAST | 3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_FRAME_BUFFER | 3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_NEW_NEED_PIPELINE), 3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz emit_rss 3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}; 311