13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc.  All rights reserved.
33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person
53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation
63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without
73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy,
83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies
93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is
103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions:
113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be
133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software.
143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE.
233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/
253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "draw/draw_context.h"
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "draw/draw_vbuf.h"
2828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_state.h"
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h"
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_swtnl.h"
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h"
3458ea42b7db72586563914dea6fed9656caaf7678Brian Paul#include "svga_tgsi.h"
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_swtnl_private.h"
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_POINT_ADJ_X -0.375
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_POINT_ADJ_Y -0.5
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_LINE_ADJ_X -0.5
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_LINE_ADJ_Y -0.5
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_TRIANGLE_ADJ_X -0.375
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_TRIANGLE_ADJ_Y -0.5
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void set_draw_viewport( struct svga_context *svga )
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct pipe_viewport_state vp = svga->curr.viewport;
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   float adjx = 0;
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   float adjy = 0;
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   switch (svga->curr.reduced_prim) {
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_POINTS:
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      adjx = SVGA_POINT_ADJ_X;
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      adjy = SVGA_POINT_ADJ_Y;
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_LINES:
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /* XXX: This is to compensate for the fact that wide lines are
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * going to be drawn with triangles, but we're not catching all
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * cases where that will happen.
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
64f0ca9f71341f494be961aacc08bddd9cea28fca2José Fonseca      if (svga->curr.rast->need_pipeline & SVGA_PIPELINE_FLAG_LINES)
653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      {
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         adjx = SVGA_LINE_ADJ_X + 0.175;
673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         adjy = SVGA_LINE_ADJ_Y - 0.175;
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      else {
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         adjx = SVGA_LINE_ADJ_X;
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         adjy = SVGA_LINE_ADJ_Y;
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_TRIANGLES:
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      adjx += SVGA_TRIANGLE_ADJ_X;
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      adjy += SVGA_TRIANGLE_ADJ_Y;
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vp.translate[0] += adjx;
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vp.translate[1] += adjy;
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   draw_set_viewport_state(svga->swtnl.draw, &vp);
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
86e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecastatic enum pipe_error
87e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecaupdate_swtnl_draw( struct svga_context *svga,
88e8f646fa7e9cf6f6793864384128157735aa03b3José Fonseca                   unsigned dirty )
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   draw_flush( svga->swtnl.draw );
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (dirty & SVGA_NEW_VS)
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      draw_bind_vertex_shader(svga->swtnl.draw,
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                              svga->curr.vs->draw_shader);
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
96022e270b1b972b6d04890f1ac1fc2a4a4ed03ff7Brian Paul   if (dirty & SVGA_NEW_FS)
97022e270b1b972b6d04890f1ac1fc2a4a4ed03ff7Brian Paul      draw_bind_fragment_shader(svga->swtnl.draw,
98022e270b1b972b6d04890f1ac1fc2a4a4ed03ff7Brian Paul                                svga->curr.fs->draw_shader);
99022e270b1b972b6d04890f1ac1fc2a4a4ed03ff7Brian Paul
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (dirty & SVGA_NEW_VBUFFER)
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      draw_set_vertex_buffers(svga->swtnl.draw,
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                              svga->curr.num_vertex_buffers,
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                              svga->curr.vb);
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (dirty & SVGA_NEW_VELEMENT)
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      draw_set_vertex_elements(svga->swtnl.draw,
107b1676a953eb61838e9ef03532792bc723f4d4adaRoland Scheidegger                               svga->curr.velems->count,
108b1676a953eb61838e9ef03532792bc723f4d4adaRoland Scheidegger                               svga->curr.velems->velem );
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (dirty & SVGA_NEW_CLIP)
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      draw_set_clip_state(svga->swtnl.draw,
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          &svga->curr.clip);
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (dirty & (SVGA_NEW_VIEWPORT |
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                SVGA_NEW_REDUCED_PRIMITIVE |
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                SVGA_NEW_RAST))
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      set_draw_viewport( svga );
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (dirty & SVGA_NEW_RAST)
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      draw_set_rasterizer_state(svga->swtnl.draw,
121e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                                &svga->curr.rast->templ,
122e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                                (void *) svga->curr.rast);
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (dirty & SVGA_NEW_FRAME_BUFFER)
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      draw_set_mrd(svga->swtnl.draw,
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                   svga->curr.depthscale);
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return 0;
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_update_swtnl_draw =
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   "update draw module state",
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (SVGA_NEW_VS |
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_NEW_VBUFFER |
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_NEW_VELEMENT |
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_NEW_CLIP |
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_NEW_VIEWPORT |
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_NEW_RAST |
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_NEW_FRAME_BUFFER |
142429f0e3b37e33a33289f8488369474b20bfd5247Roland Scheidegger    SVGA_NEW_REDUCED_PRIMITIVE),
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   update_swtnl_draw
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
147e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecaenum pipe_error
148e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecasvga_swtnl_update_vdecl( struct svga_context *svga )
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_vbuf_render *svga_render = svga_vbuf_render(svga->swtnl.backend);
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct draw_context *draw = svga->swtnl.draw;
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vertex_info *vinfo = &svga_render->vertex_info;
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dVertexDecl vdecl[PIPE_MAX_ATTRIBS];
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   const enum interp_mode colorInterp =
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      svga->curr.rast->templ.flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
1561ca48b3161449945b769b27c33f88f397f98084aBrian Paul   struct svga_fragment_shader *fs = svga->curr.fs;
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int offset = 0;
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int nr_decls = 0;
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int src, i;
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(vinfo, 0, sizeof(*vinfo));
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(vdecl, 0, sizeof(vdecl));
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* always add position */
165b0575151b66c9f5387c0433f41db9c19a848d45eZack Rusin   src = draw_find_shader_output(draw, TGSI_SEMANTIC_POSITION, 0);
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_LINEAR, src);
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vinfo->attrib[0].emit = EMIT_4F;
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vdecl[0].array.offset = offset;
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vdecl[0].identity.type = SVGA3D_DECLTYPE_FLOAT4;
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vdecl[0].identity.usage = SVGA3D_DECLUSAGE_POSITIONT;
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vdecl[0].identity.usageIndex = 0;
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   offset += 16;
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   nr_decls++;
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (i = 0; i < fs->base.info.num_inputs; i++) {
17658ea42b7db72586563914dea6fed9656caaf7678Brian Paul      const unsigned sem_name = fs->base.info.input_semantic_name[i];
17758ea42b7db72586563914dea6fed9656caaf7678Brian Paul      const unsigned sem_index = fs->base.info.input_semantic_index[i];
17858ea42b7db72586563914dea6fed9656caaf7678Brian Paul
17958ea42b7db72586563914dea6fed9656caaf7678Brian Paul      src = draw_find_shader_output(draw, sem_name, sem_index);
18058ea42b7db72586563914dea6fed9656caaf7678Brian Paul
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      vdecl[nr_decls].array.offset = offset;
18258ea42b7db72586563914dea6fed9656caaf7678Brian Paul      vdecl[nr_decls].identity.usageIndex = sem_index;
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
18458ea42b7db72586563914dea6fed9656caaf7678Brian Paul      switch (sem_name) {
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case TGSI_SEMANTIC_COLOR:
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         draw_emit_vertex_attr(vinfo, EMIT_4F, colorInterp, src);
1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         vdecl[nr_decls].identity.usage = SVGA3D_DECLUSAGE_COLOR;
1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         vdecl[nr_decls].identity.type = SVGA3D_DECLTYPE_FLOAT4;
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         offset += 16;
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         nr_decls++;
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case TGSI_SEMANTIC_GENERIC:
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, src);
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         vdecl[nr_decls].identity.usage = SVGA3D_DECLUSAGE_TEXCOORD;
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         vdecl[nr_decls].identity.type = SVGA3D_DECLTYPE_FLOAT4;
19658ea42b7db72586563914dea6fed9656caaf7678Brian Paul         vdecl[nr_decls].identity.usageIndex =
19758ea42b7db72586563914dea6fed9656caaf7678Brian Paul            svga_remap_generic_index(fs->generic_remap_table, sem_index);
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         offset += 16;
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         nr_decls++;
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case TGSI_SEMANTIC_FOG:
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         draw_emit_vertex_attr(vinfo, EMIT_1F, INTERP_PERSPECTIVE, src);
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         vdecl[nr_decls].identity.usage = SVGA3D_DECLUSAGE_TEXCOORD;
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         vdecl[nr_decls].identity.type = SVGA3D_DECLTYPE_FLOAT1;
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         assert(vdecl[nr_decls].identity.usageIndex == 0);
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         offset += 4;
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         nr_decls++;
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      case TGSI_SEMANTIC_POSITION:
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         /* generated internally, not a vertex shader output */
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         break;
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      default:
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         assert(0);
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   draw_compute_vertex_size(vinfo);
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga_render->vdecl_count = nr_decls;
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (i = 0; i < svga_render->vdecl_count; i++)
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      vdecl[i].array.stride = offset;
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if (memcmp(svga_render->vdecl, vdecl, sizeof(vdecl)) == 0)
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return 0;
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memcpy(svga_render->vdecl, vdecl, sizeof(vdecl));
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   svga->swtnl.new_vdecl = TRUE;
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return 0;
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
233e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecastatic enum pipe_error
234e8f646fa7e9cf6f6793864384128157735aa03b3José Fonsecaupdate_swtnl_vdecl( struct svga_context *svga,
235e8f646fa7e9cf6f6793864384128157735aa03b3José Fonseca                    unsigned dirty )
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return svga_swtnl_update_vdecl( svga );
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_tracked_state svga_update_swtnl_vdecl =
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   "update draw module vdecl",
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (SVGA_NEW_VS |
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    SVGA_NEW_FS),
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   update_swtnl_vdecl
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
248