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" 2932a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul#include "util/u_prim.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "indices/u_indices.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_hw_reg.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_draw.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_draw_private.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 36129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul#include "svga_shader.h" 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define DBG 0 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 42ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulstatic enum pipe_error 43ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulgenerate_indices(struct svga_hwtnl *hwtnl, 44ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned nr, 45ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned index_size, 46ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul u_generate_func generate, struct pipe_resource **out_buf) 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 48287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_context *pipe = &hwtnl->svga->pipe; 49287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_transfer *transfer; 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned size = index_size * nr; 51287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst = NULL; 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz void *dst_map = NULL; 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 54e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul dst = pipe_buffer_create(pipe->screen, PIPE_BIND_INDEX_BUFFER, 55e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul PIPE_USAGE_IMMUTABLE, size); 5613eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan if (!dst) 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 59ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul dst_map = pipe_buffer_map(pipe, dst, PIPE_TRANSFER_WRITE, &transfer); 6013eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan if (!dst_map) 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto fail; 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 6328f3f8d413f6bf29f051d54479d9ae90bb16a55eRob Clark generate(0, nr, dst_map); 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 65ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_buffer_unmap(pipe, transfer); 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *out_buf = dst; 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_OK; 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzfail: 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dst_map) 72ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_buffer_unmap(pipe, transfer); 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (dst) 75ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe->screen->resource_destroy(pipe->screen, dst); 761284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_OUT_OF_MEMORY; 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 801284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 81ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulstatic boolean 82ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulcompare(unsigned cached_nr, unsigned nr, unsigned type) 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (type == U_GENERATE_REUSABLE) 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return cached_nr >= nr; 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return cached_nr == nr; 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 901284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 91ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulstatic enum pipe_error 92ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulretrieve_or_generate_indices(struct svga_hwtnl *hwtnl, 93d21a309c6c00122b0562284d78fce5138fa2ad30Brian Paul enum pipe_prim_type prim, 94ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned gen_type, 95ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned gen_nr, 96ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul unsigned gen_size, 97ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul u_generate_func generate, 98ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul struct pipe_resource **out_buf) 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret = PIPE_OK; 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz int i; 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1032e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee SVGA_STATS_TIME_PUSH(svga_sws(hwtnl->svga), SVGA_STATS_TIME_GENERATEINDICES); 1042e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < IDX_CACHE_MAX; i++) { 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (hwtnl->index_cache[prim][i].buffer != NULL && 107ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->index_cache[prim][i].generate == generate) { 108ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul if (compare(hwtnl->index_cache[prim][i].gen_nr, gen_nr, gen_type)) { 109ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(out_buf, 110ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->index_cache[prim][i].buffer); 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1121284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul if (DBG) 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz debug_printf("%s retrieve %d/%d\n", __FUNCTION__, i, gen_nr); 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1152e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee goto done; 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 117ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul else if (gen_type == U_GENERATE_REUSABLE) { 118ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&hwtnl->index_cache[prim][i].buffer, 119ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul NULL); 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1211284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul if (DBG) 1221284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul debug_printf("%s discard %d/%d\n", __FUNCTION__, 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz i, hwtnl->index_cache[prim][i].gen_nr); 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz break; 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 130ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul if (i == IDX_CACHE_MAX) { 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned smallest = 0; 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned smallest_size = ~0; 1331284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (i = 0; i < IDX_CACHE_MAX && smallest_size; i++) { 135ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul if (hwtnl->index_cache[prim][i].buffer == NULL) { 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest = i; 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest_size = 0; 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 139ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul else if (hwtnl->index_cache[prim][i].gen_nr < smallest) { 1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest = i; 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest_size = hwtnl->index_cache[prim][i].gen_nr; 1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 145ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul assert(smallest != IDX_CACHE_MAX); 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 147ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&hwtnl->index_cache[prim][smallest].buffer, 148ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul NULL); 1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (DBG) 1511284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul debug_printf("%s discard smallest %d/%d\n", __FUNCTION__, 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz smallest, smallest_size); 1531284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz i = smallest; 1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1561284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 157ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul ret = generate_indices(hwtnl, gen_nr, gen_size, generate, out_buf); 1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret != PIPE_OK) 1592e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee goto done; 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz hwtnl->index_cache[prim][i].generate = generate; 1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz hwtnl->index_cache[prim][i].gen_nr = gen_nr; 163ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&hwtnl->index_cache[prim][i].buffer, *out_buf); 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (DBG) 1661284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul debug_printf("%s cache %d/%d\n", __FUNCTION__, 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz i, hwtnl->index_cache[prim][i].gen_nr); 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1692e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Leedone: 1702e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee SVGA_STATS_TIME_POP(svga_sws(hwtnl->svga)); 1712e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee return ret; 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic enum pipe_error 176ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulsimple_draw_arrays(struct svga_hwtnl *hwtnl, 177d21a309c6c00122b0562284d78fce5138fa2ad30Brian Paul enum pipe_prim_type prim, unsigned start, unsigned count, 178e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul unsigned start_instance, unsigned instance_count) 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dPrimitiveRange range; 1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned hw_prim; 1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned hw_count; 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz hw_prim = svga_translate_prim(prim, count, &hw_count); 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (hw_count == 0) 1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return PIPE_ERROR_BAD_INPUT; 1871284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul 1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.primType = hw_prim; 1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.primitiveCount = hw_count; 1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexArray.surfaceId = SVGA3D_INVALID_ID; 1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexArray.offset = 0; 1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexArray.stride = 0; 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexWidth = 0; 1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz range.indexBias = start; 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Min/max index should be calculated prior to applying bias, so we 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * end up with min_index = 0, max_index = count - 1 and everybody 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * looking at those numbers knows to adjust them by 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * range.indexBias. 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 201e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul return svga_hwtnl_prim(hwtnl, &range, count, 202e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul 0, count - 1, NULL, 203e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul start_instance, instance_count); 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2071284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paulenum pipe_error 208ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paulsvga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl, 209d21a309c6c00122b0562284d78fce5138fa2ad30Brian Paul enum pipe_prim_type prim, unsigned start, unsigned count, 210e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul unsigned start_instance, unsigned instance_count) 2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 212a25ae485a6ae17fa78ffa51c3e4c08823cfffd88Brian Paul enum pipe_prim_type gen_prim; 213a25ae485a6ae17fa78ffa51c3e4c08823cfffd88Brian Paul unsigned gen_size, gen_nr; 2143f98c812b30d739b744d70267a28a25afcaa8b13Brian Paul enum indices_mode gen_type; 2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_generate_func gen_func; 2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret = PIPE_OK; 217129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul unsigned api_pv = hwtnl->api_pv; 218129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul struct svga_context *svga = hwtnl->svga; 219129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul 2202e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_HWTNLDRAWARRAYS); 2212e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee 22290afd7b7ef897f7ba126006d866d1e726235b974Brian Paul if (svga->curr.rast->templ.fill_front != 22390afd7b7ef897f7ba126006d866d1e726235b974Brian Paul svga->curr.rast->templ.fill_back) { 22490afd7b7ef897f7ba126006d866d1e726235b974Brian Paul assert(hwtnl->api_fillmode == PIPE_POLYGON_MODE_FILL); 22590afd7b7ef897f7ba126006d866d1e726235b974Brian Paul } 22690afd7b7ef897f7ba126006d866d1e726235b974Brian Paul 227129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul if (svga->curr.rast->templ.flatshade && 228129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul svga->state.hw_draw.fs->constant_color_output) { 229129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul /* The fragment color is a constant, not per-vertex so the whole 230129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul * primitive will be the same color (except for possible blending). 231129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul * We can ignore the current provoking vertex state and use whatever 232129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul * the hardware wants. 233129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul */ 234129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul api_pv = hwtnl->hw_pv; 23599effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul 23699effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul if (hwtnl->api_fillmode == PIPE_POLYGON_MODE_FILL) { 23799effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul /* Do some simple primitive conversions to avoid index buffer 23899effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul * generation below. Note that polygons and quads are not directly 23999effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul * supported by the svga device. Also note, we can only do this 24099effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul * for flat/constant-colored rendering because of provoking vertex. 24199effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul */ 24299effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul if (prim == PIPE_PRIM_POLYGON) { 24399effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul prim = PIPE_PRIM_TRIANGLE_FAN; 24499effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul } 24599effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul else if (prim == PIPE_PRIM_QUADS && count == 4) { 24699effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul prim = PIPE_PRIM_TRIANGLE_FAN; 24799effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul } 24899effaa9658a34eb07255bb1964569c8a86e8ddaBrian Paul } 249129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul } 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 25190afd7b7ef897f7ba126006d866d1e726235b974Brian Paul if (svga_need_unfilled_fallback(hwtnl, prim)) { 2521e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul /* Convert unfilled polygons into points, lines, triangles */ 253ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_type = u_unfilled_generator(prim, 254ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul start, 255ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul count, 256ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->api_fillmode, 257ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul &gen_prim, 258ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul &gen_size, &gen_nr, &gen_func); 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 2611e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul /* Convert PIPE_PRIM_LINE_LOOP to PIPE_PRIM_LINESTRIP, 2621e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * convert PIPE_PRIM_POLYGON to PIPE_PRIM_TRIANGLE_FAN, 2631e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul * etc, if needed (as determined by svga_hw_prims mask). 2641e16e48f8837b9c573de3efdea8b1259b0234b61Brian Paul */ 265ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_type = u_index_generator(svga_hw_prims, 266ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul prim, 267ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul start, 268ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul count, 269129d34da494840628b2bb1cbb6397d50dab3c999Brian Paul api_pv, 270ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul hwtnl->hw_pv, 271ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul &gen_prim, &gen_size, &gen_nr, &gen_func); 2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (gen_type == U_GENERATE_LINEAR) { 2752e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee ret = simple_draw_arrays(hwtnl, gen_prim, start, count, 276e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul start_instance, instance_count); 2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz else { 279287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *gen_buf = NULL; 2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2811284543a447fe5ad416ceb6de4b92a08b7b16cb7Brian Paul /* Need to draw as indexed primitive. 2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Potentially need to run the gen func to build an index buffer. 2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 284ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul ret = retrieve_or_generate_indices(hwtnl, 285ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul prim, 286ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_type, 287ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_nr, 288ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_size, gen_func, &gen_buf); 2895f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz goto done; 2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 29232a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul pipe_debug_message(&svga->debug.callback, PERF_INFO, 29332a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul "generating temporary index buffer for drawing %s", 29432a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul u_prim_name(prim)); 29532a6e081c3c301d0d02cb0f3e4f848a143bfa220Brian Paul 296ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul ret = svga_hwtnl_simple_draw_range_elements(hwtnl, 297ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_buf, 298ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul gen_size, 299ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul start, 300ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul 0, 301ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul count - 1, 302e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul gen_prim, 0, gen_nr, 303e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul start_instance, 304e054251ed11e25a080f64b92db9334c9b07c8c76Brian Paul instance_count); 305ea9fe9ebdbc37648af099848531ce301580fdeecBrian Pauldone: 3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (gen_buf) 307ea9fe9ebdbc37648af099848531ce301580fdeecBrian Paul pipe_resource_reference(&gen_buf, NULL); 3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 3092e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee 3102e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee SVGA_STATS_TIME_POP(svga_sws(svga)); 3112e1cfcc431471c68ba79c9323716bed7da79c909Charmaine Lee return ret; 3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 313