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#ifndef SVGA_DRAW_H_
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_DRAW_H_
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_compiler.h"
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h"
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "indices/u_indices.h"
3290afd7b7ef897f7ba126006d866d1e726235b974Brian Paul#include "util/u_prim.h"
3390afd7b7ef897f7ba126006d866d1e726235b974Brian Paul#include "svga_context.h"
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h"
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga3d_shaderdefs.h"
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_context;
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct u_upload_mgr;
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
401e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul/**
411e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * Mask indicating which types of gallium primitives are actually
421e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * handled by the svga device.  Other types will be converted to
431e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * these types by the index/translation code.
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic const unsigned svga_hw_prims =
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ((1 << PIPE_PRIM_POINTS) |
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    (1 << PIPE_PRIM_LINES) |
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    (1 << PIPE_PRIM_LINE_STRIP) |
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    (1 << PIPE_PRIM_TRIANGLES) |
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    (1 << PIPE_PRIM_TRIANGLE_STRIP) |
51e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul    (1 << PIPE_PRIM_TRIANGLE_FAN) |
52e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul    (1 << PIPE_PRIM_LINES_ADJACENCY) |
53e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul    (1 << PIPE_PRIM_LINE_STRIP_ADJACENCY) |
54e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul    (1 << PIPE_PRIM_TRIANGLES_ADJACENCY) |
55e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul    (1 << PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY));
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
581e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul/**
591e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * Translate a gallium PIPE_PRIM_x value to an SVGA3D_PRIMITIVE_x value.
601e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * Also, compute the number of primitives that'll be drawn given a
611e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * vertex count.
621e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * Note that this function doesn't have to handle PIPE_PRIM_LINE_LOOP,
631e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * PIPE_PRIM_QUADS, PIPE_PRIM_QUAD_STRIP or PIPE_PRIM_POLYGON.  We convert
641e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * those to other types of primitives with index/translation code.
651e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul */
66e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulstatic inline SVGA3dPrimitiveType
67e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paulsvga_translate_prim(unsigned mode, unsigned vcount, unsigned *prim_count)
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   switch (mode) {
703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_POINTS:
711e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul      *prim_count = vcount;
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_PRIMITIVE_POINTLIST;
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_LINES:
751e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul      *prim_count = vcount / 2;
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_PRIMITIVE_LINELIST;
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_LINE_STRIP:
791e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul      *prim_count = vcount - 1;
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_PRIMITIVE_LINESTRIP;
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_TRIANGLES:
831e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul      *prim_count = vcount / 3;
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_PRIMITIVE_TRIANGLELIST;
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_TRIANGLE_STRIP:
871e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul      *prim_count = vcount - 2;
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_PRIMITIVE_TRIANGLESTRIP;
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case PIPE_PRIM_TRIANGLE_FAN:
911e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul      *prim_count = vcount - 2;
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return SVGA3D_PRIMITIVE_TRIANGLEFAN;
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
94e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_PRIM_LINES_ADJACENCY:
95e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      *prim_count = vcount / 4;
96e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_PRIMITIVE_LINELIST_ADJ;
97e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
98e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_PRIM_LINE_STRIP_ADJACENCY:
99e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      *prim_count = vcount - 3;
100e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_PRIMITIVE_LINESTRIP_ADJ;
101e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
102e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_PRIM_TRIANGLES_ADJACENCY:
103e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      *prim_count = vcount / 6;
104e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_PRIMITIVE_TRIANGLELIST_ADJ;
105e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
106e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
107e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      *prim_count = vcount / 2 - 2 ;
108e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul      return SVGA3D_PRIMITIVE_TRIANGLESTRIP_ADJ;
109e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   default:
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      assert(0);
1121e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul      *prim_count = 0;
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return 0;
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct index_cache {
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   u_generate_func generate;
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned gen_nr;
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* If non-null, this buffer is filled by calling
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    *   generate(nr, map(buffer))
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
125287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *buffer;
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
128b9c8b2a1f1b2fe2e02b314790ebdc465f0ffec6eBrian Paul
129b9c8b2a1f1b2fe2e02b314790ebdc465f0ffec6eBrian Paul/** Max number of primitives per draw call */
130b9c8b2a1f1b2fe2e02b314790ebdc465f0ffec6eBrian Paul#define QSZ SVGA3D_MAX_DRAW_PRIMITIVE_RANGES
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct draw_cmd {
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_winsys_context *swc;
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
135e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   /* vertex layout info */
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dVertexDecl vdecl[SVGA3D_INPUTREG_MAX];
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned vdecl_count;
138e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   SVGA3dElementLayoutId vdecl_layout_id;
139e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   unsigned vdecl_buffer_index[SVGA3D_INPUTREG_MAX];
140e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul
141e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   /* vertex buffer info */
142e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   struct pipe_vertex_buffer vbufs[SVGA3D_INPUTREG_MAX];
143e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   unsigned vbuf_count;
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dPrimitiveRange prim[QSZ];
146287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *prim_ib[QSZ];
147e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul   unsigned prim_count;   /**< number of primitives for this draw */
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned min_index[QSZ];
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned max_index[QSZ];
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define IDX_CACHE_MAX  8
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct svga_hwtnl {
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct svga_context *svga;
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct u_upload_mgr *upload_ib;
1572b301df4aa00cbf4f88c716bda292d0c7126ff95Thomas Hellstrom
1582b301df4aa00cbf4f88c716bda292d0c7126ff95Thomas Hellstrom   /* Additional negative index bias due to partial buffer uploads
1592b301df4aa00cbf4f88c716bda292d0c7126ff95Thomas Hellstrom    * This is compensated for in the offset associated with all
1602b301df4aa00cbf4f88c716bda292d0c7126ff95Thomas Hellstrom    * vertex buffers.
1612b301df4aa00cbf4f88c716bda292d0c7126ff95Thomas Hellstrom    */
1622b301df4aa00cbf4f88c716bda292d0c7126ff95Thomas Hellstrom   int index_bias;
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1642c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul   /* Provoking vertex information (for flat shading). */
1652c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul   unsigned api_pv;  /**< app-requested PV mode (PV_FIRST or PV_LAST) */
1662c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul   unsigned hw_pv;   /**< device-supported PV mode (PV_FIRST or PV_LAST) */
1672c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul
1682c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul   /* The triangle fillmode for the device (one of PIPE_POLYGON_MODE_{FILL,
1692c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul    * LINE,POINT}).  If the polygon front mode matches the back mode,
1702c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul    * api_fillmode will be that mode.  Otherwise, api_fillmode will be
1712c07c40d2f65e3c7ac25db21b247e647c846edcfBrian Paul    * PIPE_POLYGON_MODE_FILL.
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned api_fillmode;
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Cache the results of running a particular generate func on each
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * primitive type.
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct index_cache index_cache[PIPE_PRIM_MAX][IDX_CACHE_MAX];
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /* Try to build the maximal draw command packet before emitting:
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct draw_cmd cmd;
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz};
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
18790afd7b7ef897f7ba126006d866d1e726235b974Brian Paul/**
18890afd7b7ef897f7ba126006d866d1e726235b974Brian Paul * Do we need to use the gallium 'indices' helper to render unfilled
18990afd7b7ef897f7ba126006d866d1e726235b974Brian Paul * triangles?
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
19190afd7b7ef897f7ba126006d866d1e726235b974Brian Paulstatic inline boolean
192d21a309c6c00122b0562284d78fce5138fa2ad30Brian Paulsvga_need_unfilled_fallback(const struct svga_hwtnl *hwtnl,
193d21a309c6c00122b0562284d78fce5138fa2ad30Brian Paul                            enum pipe_prim_type prim)
19490afd7b7ef897f7ba126006d866d1e726235b974Brian Paul{
19590afd7b7ef897f7ba126006d866d1e726235b974Brian Paul   const struct svga_context *svga = hwtnl->svga;
19690afd7b7ef897f7ba126006d866d1e726235b974Brian Paul
19790afd7b7ef897f7ba126006d866d1e726235b974Brian Paul   if (u_reduced_prim(prim) != PIPE_PRIM_TRIANGLES) {
19890afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      /* if we're drawing points or lines, no fallback needed */
19990afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      return FALSE;
20090afd7b7ef897f7ba126006d866d1e726235b974Brian Paul   }
20190afd7b7ef897f7ba126006d866d1e726235b974Brian Paul
20290afd7b7ef897f7ba126006d866d1e726235b974Brian Paul   if (svga_have_vgpu10(svga)) {
20390afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      /* vgpu10 supports polygon fill and line modes */
20490afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      if ((prim == PIPE_PRIM_QUADS ||
20590afd7b7ef897f7ba126006d866d1e726235b974Brian Paul           prim == PIPE_PRIM_QUAD_STRIP ||
20690afd7b7ef897f7ba126006d866d1e726235b974Brian Paul           prim == PIPE_PRIM_POLYGON) &&
20790afd7b7ef897f7ba126006d866d1e726235b974Brian Paul          hwtnl->api_fillmode == PIPE_POLYGON_MODE_LINE) {
20890afd7b7ef897f7ba126006d866d1e726235b974Brian Paul         /* VGPU10 doesn't directly render quads or polygons.  They're
20990afd7b7ef897f7ba126006d866d1e726235b974Brian Paul          * converted to triangles.  If we let the device draw the triangle
21090afd7b7ef897f7ba126006d866d1e726235b974Brian Paul          * outlines we'll get an extra, stray lines in the interiors.
21190afd7b7ef897f7ba126006d866d1e726235b974Brian Paul          * So, to draw unfilled quads correctly, we need the fallback.
21290afd7b7ef897f7ba126006d866d1e726235b974Brian Paul          */
21390afd7b7ef897f7ba126006d866d1e726235b974Brian Paul         return true;
21490afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      }
21590afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      return hwtnl->api_fillmode == PIPE_POLYGON_MODE_POINT;
21690afd7b7ef897f7ba126006d866d1e726235b974Brian Paul   } else {
21790afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      /* vgpu9 doesn't support line or point fill modes */
21890afd7b7ef897f7ba126006d866d1e726235b974Brian Paul      return hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL;
21990afd7b7ef897f7ba126006d866d1e726235b974Brian Paul   }
22090afd7b7ef897f7ba126006d866d1e726235b974Brian Paul}
22190afd7b7ef897f7ba126006d866d1e726235b974Brian Paul
22290afd7b7ef897f7ba126006d866d1e726235b974Brian Paul
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_hwtnl_prim( struct svga_hwtnl *hwtnl,
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 const SVGA3dPrimitiveRange *range,
226e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                 unsigned vcount,
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 unsigned min_index,
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 unsigned max_index,
229e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                 struct pipe_resource *ib,
230e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                 unsigned start_instance, unsigned instance_count);
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzsvga_hwtnl_simple_draw_range_elements( struct svga_hwtnl *hwtnl,
234287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                       struct pipe_resource *indexBuffer,
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                       unsigned index_size,
2369515b78859b52b4532cc9e06366428f2c49c7869José Fonseca                                       int index_bias,
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                       unsigned min_index,
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                       unsigned max_index,
239d21a309c6c00122b0562284d78fce5138fa2ad30Brian Paul                                       enum pipe_prim_type prim,
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                       unsigned start,
241e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                       unsigned count,
242e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                       unsigned start_instance,
243e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul                                       unsigned instance_count);
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif
247