draw_pt_vsplit.c revision a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9
104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/* 204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Mesa 3-D graphics library 304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 4877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007-2008 VMware, Inc. 504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Copyright (C) 2010 LunarG Inc. 604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * copy of this software and associated documentation files (the "Software"), 904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * to deal in the Software without restriction, including without limitation 1004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 1404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * The above copyright notice and this permission notice shall be included 1504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * in all copies or substantial portions of the Software. 1604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 1704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * DEALINGS IN THE SOFTWARE. 2404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */ 2504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 2604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "util/u_math.h" 2704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "util/u_memory.h" 2804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 2904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw/draw_context.h" 3004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw/draw_private.h" 3104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw/draw_pt.h" 3204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 3304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define SEGMENT_SIZE 1024 3404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define MAP_SIZE 256 3504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 36bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin/* The largest possible index withing an index buffer */ 37bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin#define MAX_ELT_IDX 0xffffffff 38bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 3904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustruct vsplit_frontend { 4004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct draw_pt_front_end base; 4104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct draw_context *draw; 4204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 4304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned prim; 4404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 4504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct draw_pt_middle_end *middle; 4604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 4704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned max_vertices; 4804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ushort segment_size; 4904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 5004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu /* buffers for splitting */ 5104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned fetch_elts[SEGMENT_SIZE]; 5204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ushort draw_elts[SEGMENT_SIZE]; 5304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ushort identity_draw_elts[SEGMENT_SIZE]; 5404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 5504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct { 5604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu /* map a fetch element to a draw element */ 5704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned fetches[MAP_SIZE]; 5804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ushort draws[MAP_SIZE]; 5904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu boolean has_max_fetch; 6004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 6104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ushort num_fetch_elts; 6204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ushort num_draw_elts; 6304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } cache; 6404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}; 6504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 6604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 6704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 6804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_clear_cache(struct vsplit_frontend *vsplit) 6904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 7004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu memset(vsplit->cache.fetches, 0xff, sizeof(vsplit->cache.fetches)); 7104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->cache.has_max_fetch = FALSE; 7204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->cache.num_fetch_elts = 0; 7304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->cache.num_draw_elts = 0; 7404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 7504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 7604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 7704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_flush_cache(struct vsplit_frontend *vsplit, unsigned flags) 7804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 7904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->middle->run(vsplit->middle, 8004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->fetch_elts, vsplit->cache.num_fetch_elts, 8104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->draw_elts, vsplit->cache.num_draw_elts, flags); 8204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 8304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 8404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/** 8504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Add a fetch element and add it to the draw elements. 8604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */ 87a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 88bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusinvsplit_add_cache(struct vsplit_frontend *vsplit, unsigned fetch, unsigned ofbias) 8904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 903733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca unsigned hash; 913733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca 923733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca hash = fetch % MAP_SIZE; 9304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 942d5af04bae0668ce9e081f06f1dd4b25528e27e8Andres Gomez /* If the value isn't in the cache or it's an overflow due to the 95bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * element bias */ 96bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (vsplit->cache.fetches[hash] != fetch || ofbias) { 9704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu /* update cache */ 9804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->cache.fetches[hash] = fetch; 9904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->cache.draws[hash] = vsplit->cache.num_fetch_elts; 10004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 10104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu /* add fetch */ 10204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu assert(vsplit->cache.num_fetch_elts < vsplit->segment_size); 10304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->fetch_elts[vsplit->cache.num_fetch_elts++] = fetch; 10404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 10504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 10604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->draw_elts[vsplit->cache.num_draw_elts++] = vsplit->cache.draws[hash]; 10704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 10804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 109bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin/** 110bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * Returns the base index to the elements array. 111bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * The value is checked for overflows (both integer overflows 112bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * and the elements array overflow). 113bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin */ 114a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 115bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusinvsplit_get_base_idx(struct vsplit_frontend *vsplit, 116bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned start, unsigned fetch, unsigned *ofbit) 117bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin{ 118bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin struct draw_context *draw = vsplit->draw; 119bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned elt_idx = draw_overflow_uadd(start, fetch, MAX_ELT_IDX); 120bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (ofbit) 121bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin *ofbit = 0; 122bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 123bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin /* Overflown indices need to wrap to the first element 124bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * in the index buffer */ 125bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (elt_idx >= draw->pt.user.eltMax) { 126bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (ofbit) 127bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin *ofbit = 1; 128bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin elt_idx = 0; 129bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin } 130bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 131bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin return elt_idx; 132bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin} 133bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 134bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin/** 135bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * Returns the element index adjust for the element bias. 136bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * The final element index is created from the actual element 137bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * index, plus the element bias, clamped to maximum elememt 138bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin * index if that addition overflows. 139bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin */ 140a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 141bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusinvsplit_get_bias_idx(struct vsplit_frontend *vsplit, 142bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin int idx, int bias, unsigned *ofbias) 143bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin{ 144bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin int res = idx + bias; 145bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 146bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (ofbias) 147bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin *ofbias = 0; 148bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 149bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (idx > 0 && bias > 0) { 150bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (res < idx || res < bias) { 151bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin res = DRAW_MAX_FETCH_IDX; 152bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (ofbias) 153bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin *ofbias = 1; 154bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin } 155bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin } else if (idx < 0 && bias < 0) { 156bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (res > idx || res > bias) { 157bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin res = DRAW_MAX_FETCH_IDX; 158bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (ofbias) 159bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin *ofbias = 1; 160bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin } 161bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin } 162bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 163bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin return res; 164bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin} 165bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 166bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin#define VSPLIT_CREATE_IDX(elts, start, fetch, elt_bias) \ 167bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned elt_idx; \ 168bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned ofbit; \ 169bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned ofbias; \ 170bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin elt_idx = vsplit_get_base_idx(vsplit, start, fetch, &ofbit); \ 171bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin elt_idx = vsplit_get_bias_idx(vsplit, ofbit ? 0 : DRAW_GET_IDX(elts, elt_idx), elt_bias, &ofbias) 172bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 173a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 174bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusinvsplit_add_cache_ubyte(struct vsplit_frontend *vsplit, const ubyte *elts, 175bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned start, unsigned fetch, int elt_bias) 176bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin{ 177bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin struct draw_context *draw = vsplit->draw; 178bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin VSPLIT_CREATE_IDX(elts, start, fetch, elt_bias); 179bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin vsplit_add_cache(vsplit, elt_idx, ofbias); 180bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin} 181bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 182a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 183bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusinvsplit_add_cache_ushort(struct vsplit_frontend *vsplit, const ushort *elts, 184bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned start, unsigned fetch, int elt_bias) 185bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin{ 186bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin struct draw_context *draw = vsplit->draw; 187bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin VSPLIT_CREATE_IDX(elts, start, fetch, elt_bias); 188bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin vsplit_add_cache(vsplit, elt_idx, ofbias); 189bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin} 190bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 19104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 19204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/** 19304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Add a fetch element and add it to the draw elements. The fetch element is 19404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * in full range (uint). 19504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */ 196a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 197bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusinvsplit_add_cache_uint(struct vsplit_frontend *vsplit, const uint *elts, 198bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned start, unsigned fetch, int elt_bias) 19904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 200bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin struct draw_context *draw = vsplit->draw; 201bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin unsigned raw_elem_idx = start + fetch + elt_bias; 202bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin VSPLIT_CREATE_IDX(elts, start, fetch, elt_bias); 203bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin 204bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin /* special care for DRAW_MAX_FETCH_IDX */ 205bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin if (raw_elem_idx == DRAW_MAX_FETCH_IDX && !vsplit->cache.has_max_fetch) { 20604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned hash = fetch % MAP_SIZE; 207bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin vsplit->cache.fetches[hash] = raw_elem_idx - 1; /* force update */ 20804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->cache.has_max_fetch = TRUE; 20904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 21004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 211bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin vsplit_add_cache(vsplit, elt_idx, ofbias); 21204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 21304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 21404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 21504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_linear 21604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h" 21704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 21804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_ubyte 21904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ELT_TYPE ubyte 220bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin#define ADD_CACHE(vsplit, ib, start, fetch, bias) vsplit_add_cache_ubyte(vsplit,ib,start,fetch,bias) 22104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h" 22204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 22304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_ushort 22404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ELT_TYPE ushort 225bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin#define ADD_CACHE(vsplit, ib, start, fetch, bias) vsplit_add_cache_ushort(vsplit,ib,start,fetch, bias) 22604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h" 22704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 22804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_uint 22904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ELT_TYPE uint 230bbd1e60198548a12be3405fc32dd39a87e8968abZack Rusin#define ADD_CACHE(vsplit, ib, start, fetch, bias) vsplit_add_cache_uint(vsplit, ib, start, fetch, bias) 23104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h" 23204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 23304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 23404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void vsplit_prepare(struct draw_pt_front_end *frontend, 23504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned in_prim, 23604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct draw_pt_middle_end *middle, 23704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned opt) 23804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 23904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend; 24004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 24104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu switch (vsplit->draw->pt.user.eltSize) { 24204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu case 0: 24304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->base.run = vsplit_run_linear; 24404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu break; 24504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu case 1: 24604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->base.run = vsplit_run_ubyte; 24704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu break; 24804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu case 2: 24904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->base.run = vsplit_run_ushort; 25004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu break; 25104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu case 4: 25204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->base.run = vsplit_run_uint; 25304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu break; 25404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu default: 25504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu assert(0); 25604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu break; 25704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 25804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 25904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu /* split only */ 26004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->prim = in_prim; 26104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 26204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->middle = middle; 26304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu middle->prepare(middle, vsplit->prim, opt, &vsplit->max_vertices); 26404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 26504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->segment_size = MIN2(SEGMENT_SIZE, vsplit->max_vertices); 26604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 26704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 26804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 269b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantzstatic void vsplit_flush(struct draw_pt_front_end *frontend, unsigned flags) 27004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 27104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend; 272b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 2734b73cdb864aef6d64c35a7ab9a59e4ee4e3f9d0fBrian Paul if (flags & DRAW_FLUSH_STATE_CHANGE) { 274b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz vsplit->middle->finish(vsplit->middle); 275b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz vsplit->middle = NULL; 276b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz } 27704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 27804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 27904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 28004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void vsplit_destroy(struct draw_pt_front_end *frontend) 28104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 28204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu FREE(frontend); 28304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 28404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 28504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 28604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustruct draw_pt_front_end *draw_pt_vsplit(struct draw_context *draw) 28704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 28804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct vsplit_frontend *vsplit = CALLOC_STRUCT(vsplit_frontend); 28904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ushort i; 29004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 29104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (!vsplit) 29204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return NULL; 29304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 29404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->base.prepare = vsplit_prepare; 29504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->base.run = NULL; 296b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz vsplit->base.flush = vsplit_flush; 29704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->base.destroy = vsplit_destroy; 29804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->draw = draw; 29904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 30004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = 0; i < SEGMENT_SIZE; i++) 30104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->identity_draw_elts[i] = i; 30204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 30304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return &vsplit->base; 30404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 305