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