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