svga_draw_arrays.c revision 28f3f8d413f6bf29f051d54479d9ae90bb16a55e
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 "svga_cmd.h" 273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "indices/u_indices.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h" 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_draw.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_draw_private.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define DBG 0 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 40ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulstatic enum pipe_error 41ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulgenerate_indices(struct svga_hwtnl *hwtnl, 42ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned nr, 43ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned index_size, 44ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul u_generate_func generate, struct pipe_resource **out_buf) 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 46287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_context *pipe = &hwtnl->svga->pipe; 47287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_transfer *transfer; 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned size = index_size * nr; 49287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst = NULL; 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz void *dst_map = NULL; 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 52ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul dst = pipe_buffer_create(pipe->screen, 53ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_STATIC, size); 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dst == NULL) 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 57ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul dst_map = pipe_buffer_map(pipe, dst, PIPE_TRANSFER_WRITE, &transfer); 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dst_map == NULL) 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 6128f3f8d413f6bf29f051d54479d9ae90bb16a55eRob Clark generate(0, nr, dst_map); 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 63ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_buffer_unmap(pipe, transfer); 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *out_buf = dst; 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dst_map) 70ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_buffer_unmap(pipe, transfer); 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dst) 73ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe->screen->resource_destroy(pipe->screen, dst); 741284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_OUT_OF_MEMORY; 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 781284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 79ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulstatic boolean 80ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulcompare(unsigned cached_nr, unsigned nr, unsigned type) 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (type == U_GENERATE_REUSABLE) 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return cached_nr >= nr; 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return cached_nr == nr; 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 881284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 89ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulstatic enum pipe_error 90ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulretrieve_or_generate_indices(struct svga_hwtnl *hwtnl, 91ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned prim, 92ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned gen_type, 93ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned gen_nr, 94ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned gen_size, 95ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul u_generate_func generate, 96ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul struct pipe_resource **out_buf) 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret = PIPE_OK; 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int i; 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < IDX_CACHE_MAX; i++) { 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (hwtnl->index_cache[prim][i].buffer != NULL && 103ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->index_cache[prim][i].generate == generate) { 104ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul if (compare(hwtnl->index_cache[prim][i].gen_nr, gen_nr, gen_type)) { 105ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(out_buf, 106ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->index_cache[prim][i].buffer); 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1081284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul if (DBG) 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz debug_printf("%s retrieve %d/%d\n", __FUNCTION__, i, gen_nr); 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 113ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul else if (gen_type == U_GENERATE_REUSABLE) { 114ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&hwtnl->index_cache[prim][i].buffer, 115ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul NULL); 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1171284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul if (DBG) 1181284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul debug_printf("%s discard %d/%d\n", __FUNCTION__, 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz i, hwtnl->index_cache[prim][i].gen_nr); 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz break; 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 126ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul if (i == IDX_CACHE_MAX) { 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned smallest = 0; 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned smallest_size = ~0; 1291284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < IDX_CACHE_MAX && smallest_size; i++) { 131ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul if (hwtnl->index_cache[prim][i].buffer == NULL) { 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest = i; 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest_size = 0; 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 135ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul else if (hwtnl->index_cache[prim][i].gen_nr < smallest) { 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest = i; 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest_size = hwtnl->index_cache[prim][i].gen_nr; 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 141ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul assert(smallest != IDX_CACHE_MAX); 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 143ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&hwtnl->index_cache[prim][smallest].buffer, 144ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul NULL); 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (DBG) 1471284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul debug_printf("%s discard smallest %d/%d\n", __FUNCTION__, 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest, smallest_size); 1491284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz i = smallest; 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1521284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 153ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul ret = generate_indices(hwtnl, gen_nr, gen_size, generate, out_buf); 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret != PIPE_OK) 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz hwtnl->index_cache[prim][i].generate = generate; 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz hwtnl->index_cache[prim][i].gen_nr = gen_nr; 159ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&hwtnl->index_cache[prim][i].buffer, *out_buf); 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (DBG) 1621284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul debug_printf("%s cache %d/%d\n", __FUNCTION__, 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz i, hwtnl->index_cache[prim][i].gen_nr); 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic enum pipe_error 170ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulsimple_draw_arrays(struct svga_hwtnl *hwtnl, 171ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned prim, unsigned start, unsigned count) 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dPrimitiveRange range; 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned hw_prim; 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned hw_count; 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz hw_prim = svga_translate_prim(prim, count, &hw_count); 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (hw_count == 0) 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_BAD_INPUT; 1801284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.primType = hw_prim; 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.primitiveCount = hw_count; 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexArray.surfaceId = SVGA3D_INVALID_ID; 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexArray.offset = 0; 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexArray.stride = 0; 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexWidth = 0; 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexBias = start; 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Min/max index should be calculated prior to applying bias, so we 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * end up with min_index = 0, max_index = count - 1 and everybody 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * looking at those numbers knows to adjust them by 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * range.indexBias. 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 194ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul return svga_hwtnl_prim(hwtnl, &range, 0, count - 1, NULL); 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1981284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paulenum pipe_error 199ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulsvga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl, 200ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned prim, unsigned start, unsigned count) 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned gen_prim, gen_size, gen_nr, gen_type; 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_generate_func gen_func; 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret = PIPE_OK; 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2061284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL && 207ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul prim >= PIPE_PRIM_TRIANGLES) { 2081e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul /* Convert unfilled polygons into points, lines, triangles */ 209ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_type = u_unfilled_generator(prim, 210ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul start, 211ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul count, 212ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->api_fillmode, 213ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul &gen_prim, 214ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul &gen_size, &gen_nr, &gen_func); 2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 2171e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul /* Convert PIPE_PRIM_LINE_LOOP to PIPE_PRIM_LINESTRIP, 2181e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * convert PIPE_PRIM_POLYGON to PIPE_PRIM_TRIANGLE_FAN, 2191e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * etc, if needed (as determined by svga_hw_prims mask). 2201e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul */ 221ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_type = u_index_generator(svga_hw_prims, 222ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul prim, 223ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul start, 224ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul count, 225ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->api_pv, 226ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->hw_pv, 227ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul &gen_prim, &gen_size, &gen_nr, &gen_func); 2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (gen_type == U_GENERATE_LINEAR) { 231ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul return simple_draw_arrays(hwtnl, gen_prim, start, count); 2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 234287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *gen_buf = NULL; 2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2361284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul /* Need to draw as indexed primitive. 2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Potentially need to run the gen func to build an index buffer. 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 239ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul ret = retrieve_or_generate_indices(hwtnl, 240ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul prim, 241ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_type, 242ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_nr, 243ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_size, gen_func, &gen_buf); 2445f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto done; 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 247ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul ret = svga_hwtnl_simple_draw_range_elements(hwtnl, 248ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_buf, 249ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_size, 250ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul start, 251ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul 0, 252ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul count - 1, 253ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_prim, 0, gen_nr); 25458590a112aed1354f7592520f8f258df24c89c9bJakob Bornecrantz 2555f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto done; 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 258ea9fe9ebdbc37648af099848531ce301580fdeecBrian Pauldone: 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (gen_buf) 260ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&gen_buf, NULL); 2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 265