104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/* 204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Mesa 3-D graphics library 304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Version: 7.9 404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Copyright (C) 2010 LunarG Inc. 704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * copy of this software and associated documentation files (the "Software"), 1004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * to deal in the Software without restriction, including without limitation 1104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 1504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * The above copyright notice and this permission notice shall be included 1604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * in all copies or substantial portions of the Software. 1704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 1804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * DEALINGS IN THE SOFTWARE. 2504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */ 2604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 2704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define CONCAT2(name, elt_type) name ## elt_type 2804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define CONCAT(name, elt_type) CONCAT2(name, elt_type) 2904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 3004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#ifdef ELT_TYPE 3104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 3204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/** 3304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Fetch all elements in [min_index, max_index] with bias, and use the 3404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * (rebased) index buffer as the draw elements. 3504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */ 3604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic boolean 37a072f0e186522f9de2848989422ad0244f65c961Chia-I WuCONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit, 38a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu unsigned istart, unsigned icount) 3904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 4004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct draw_context *draw = vsplit->draw; 41185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; 4204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned min_index = draw->pt.user.min_index; 4304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned max_index = draw->pt.user.max_index; 4404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const int elt_bias = draw->pt.user.eltBias; 4504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned fetch_start, fetch_count; 46a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu const ushort *draw_elts = NULL; 4704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned i; 4804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 49713230ff39cd22a2082c12b937889c3ef81973acJosé Fonseca ib += istart; 50713230ff39cd22a2082c12b937889c3ef81973acJosé Fonseca 51a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu /* use the ib directly */ 52a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu if (min_index == 0 && sizeof(ib[0]) == sizeof(draw_elts[0])) { 53a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu if (icount > vsplit->max_vertices) 54a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu return FALSE; 55a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu 56a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu for (i = 0; i < icount; i++) { 57713230ff39cd22a2082c12b937889c3ef81973acJosé Fonseca ELT_TYPE idx = ib[i]; 58dcbc9be38ecea30506198d0db037cbf532f070e4José Fonseca if (idx < min_index || idx > max_index) { 593733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca debug_printf("warning: index out of range\n"); 603733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca } 61a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu } 62a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu draw_elts = (const ushort *) ib; 63a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu } 64a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu else { 65a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu /* have to go through vsplit->draw_elts */ 66a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu if (icount > vsplit->segment_size) 67a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu return FALSE; 68a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu } 6904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 7004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu /* this is faster only when we fetch less elements than the normal path */ 713dedd39cdd198afa54ba5b53384d6be2040f9485José Fonseca if (max_index - min_index > icount - 1) 7204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return FALSE; 7304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 7404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (elt_bias < 0 && min_index < -elt_bias) 7504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return FALSE; 7604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 7704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu /* why this check? */ 7804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = 0; i < draw->pt.nr_vertex_elements; i++) { 7904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (draw->pt.vertex_element[i].instance_divisor) 8004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return FALSE; 8104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 8204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 833dedd39cdd198afa54ba5b53384d6be2040f9485José Fonseca fetch_start = min_index + elt_bias; 843dedd39cdd198afa54ba5b53384d6be2040f9485José Fonseca fetch_count = max_index - min_index + 1; 853dedd39cdd198afa54ba5b53384d6be2040f9485José Fonseca 86a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu if (!draw_elts) { 8704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (min_index == 0) { 8804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = 0; i < icount; i++) { 89713230ff39cd22a2082c12b937889c3ef81973acJosé Fonseca ELT_TYPE idx = ib[i]; 9004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 91dcbc9be38ecea30506198d0db037cbf532f070e4José Fonseca if (idx < min_index || idx > max_index) { 923733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca debug_printf("warning: index out of range\n"); 933733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca } 9404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->draw_elts[i] = (ushort) idx; 9504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 9604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 9704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu else { 9804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = 0; i < icount; i++) { 99dcad6fb670ccc533167d1ae360833989c1eb4823José Fonseca ELT_TYPE idx = ib[i]; 10004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 101dcbc9be38ecea30506198d0db037cbf532f070e4José Fonseca if (idx < min_index || idx > max_index) { 1023733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca debug_printf("warning: index out of range\n"); 1033733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca } 10404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->draw_elts[i] = (ushort) (idx - min_index); 10504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 10604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 10704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 10804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu draw_elts = vsplit->draw_elts; 10904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 11004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 11104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return vsplit->middle->run_linear_elts(vsplit->middle, 11204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu fetch_start, fetch_count, 113a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu draw_elts, icount, 0x0); 11404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 11504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 11604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/** 11704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Use the cache to prepare the fetch and draw elements, and flush. 11804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * 11904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * When spoken is TRUE, ispoken replaces istart; When close is TRUE, iclose is 12004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * appended. 12104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */ 12204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic INLINE void 12304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I WuCONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit, 12404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned flags, 12504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned istart, unsigned icount, 12604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu boolean spoken, unsigned ispoken, 12704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu boolean close, unsigned iclose) 12804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 12904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct draw_context *draw = vsplit->draw; 130185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; 13104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const int ibias = draw->pt.user.eltBias; 13204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned i; 13304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 13404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu assert(icount + !!close <= vsplit->segment_size); 13504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 13604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit_clear_cache(vsplit); 13704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 13804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu spoken = !!spoken; 13904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (ibias == 0) { 14004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (spoken) 14104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, ib[ispoken]); 14204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 14304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = spoken; i < icount; i++) 14404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, ib[istart + i]); 14504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 14604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (close) 14704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, ib[iclose]); 14804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 14904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu else if (ibias > 0) { 15004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (spoken) 15104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, (uint) ib[ispoken] + ibias); 15204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 15304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = spoken; i < icount; i++) 15404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, (uint) ib[istart + i] + ibias); 15504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 15604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (close) 15704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, (uint) ib[iclose] + ibias); 15804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 15904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu else { 16004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (spoken) { 16104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (ib[ispoken] < -ibias) 16204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return; 16304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, ib[ispoken] + ibias); 16404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 16504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 16604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = spoken; i < icount; i++) { 16704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (ib[istart + i] < -ibias) 16804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return; 16904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, ib[istart + i] + ibias); 17004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 17104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 17204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (close) { 17304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (ib[iclose] < -ibias) 17404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu return; 17504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu ADD_CACHE(vsplit, ib[iclose] + ibias); 17604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 17704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 17804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 17904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit_flush_cache(vsplit, flags); 18004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 18104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 18204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 18304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I WuCONCAT(vsplit_segment_simple_, ELT_TYPE)(struct vsplit_frontend *vsplit, 18404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned flags, 18504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned istart, 18604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned icount) 18704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 18804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu CONCAT(vsplit_segment_cache_, ELT_TYPE)(vsplit, 18904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu flags, istart, icount, FALSE, 0, FALSE, 0); 19004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 19104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 19204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 19304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I WuCONCAT(vsplit_segment_loop_, ELT_TYPE)(struct vsplit_frontend *vsplit, 19404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned flags, 19504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned istart, 19604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned icount, 19704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned i0) 19804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 19904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const boolean close_loop = ((flags) == DRAW_SPLIT_BEFORE); 20004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 20104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu CONCAT(vsplit_segment_cache_, ELT_TYPE)(vsplit, 20204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu flags, istart, icount, FALSE, 0, close_loop, i0); 20304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 20404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 20504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 20604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I WuCONCAT(vsplit_segment_fan_, ELT_TYPE)(struct vsplit_frontend *vsplit, 20704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned flags, 20804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned istart, 20904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned icount, 21004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned i0) 21104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 21204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const boolean use_spoken = (((flags) & DRAW_SPLIT_BEFORE) != 0); 21304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 21404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu CONCAT(vsplit_segment_cache_, ELT_TYPE)(vsplit, 21504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu flags, istart, icount, use_spoken, i0, FALSE, 0); 21604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 21704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 21804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define LOCAL_VARS \ 21904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend; \ 22004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned prim = vsplit->prim; \ 22104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned max_count_simple = vsplit->segment_size; \ 22204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned max_count_loop = vsplit->segment_size - 1; \ 22304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned max_count_fan = vsplit->segment_size; 22404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 225a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu#define PRIMITIVE(istart, icount) \ 226a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu CONCAT(vsplit_primitive_, ELT_TYPE)(vsplit, istart, icount) 227a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu 22804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#else /* ELT_TYPE */ 22904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 23004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 23104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_segment_simple_linear(struct vsplit_frontend *vsplit, unsigned flags, 23204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned istart, unsigned icount) 23304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 23404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu assert(icount <= vsplit->max_vertices); 23504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); 23604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 23704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 23804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 23904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_segment_loop_linear(struct vsplit_frontend *vsplit, unsigned flags, 24004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned istart, unsigned icount, unsigned i0) 24104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 24204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu boolean close_loop = (flags == DRAW_SPLIT_BEFORE); 24304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned nr; 24404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 24504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu assert(icount + !!close_loop <= vsplit->segment_size); 24604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 24704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (close_loop) { 24804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (nr = 0; nr < icount; nr++) 24904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->fetch_elts[nr] = istart + nr; 25004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->fetch_elts[nr++] = i0; 25104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 25204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->middle->run(vsplit->middle, vsplit->fetch_elts, nr, 25304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->identity_draw_elts, nr, flags); 25404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 25504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu else { 25604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); 25704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 25804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 25904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 26004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void 26104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_segment_fan_linear(struct vsplit_frontend *vsplit, unsigned flags, 26204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned istart, unsigned icount, unsigned i0) 26304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{ 26404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu boolean use_spoken = ((flags & DRAW_SPLIT_BEFORE) != 0); 26504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned nr = 0, i; 26604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 267abbb1c8f084c6739bc9d6f559caf26f3f71b2fabChia-I Wu assert(icount <= vsplit->segment_size); 26804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 26904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu if (use_spoken) { 270abbb1c8f084c6739bc9d6f559caf26f3f71b2fabChia-I Wu /* replace istart by i0 */ 27104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->fetch_elts[nr++] = i0; 27204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu for (i = 1 ; i < icount; i++) 27304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->fetch_elts[nr++] = istart + i; 27404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 27504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->middle->run(vsplit->middle, vsplit->fetch_elts, nr, 27604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->identity_draw_elts, nr, flags); 27704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 27804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu else { 27904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); 28004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu } 28104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu} 28204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 28304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define LOCAL_VARS \ 28404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend; \ 28504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned prim = vsplit->prim; \ 28604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned max_count_simple = vsplit->max_vertices; \ 28704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned max_count_loop = vsplit->segment_size - 1; \ 28804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu const unsigned max_count_fan = vsplit->segment_size; 28904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 290a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu#define PRIMITIVE(istart, icount) FALSE 291a072f0e186522f9de2848989422ad0244f65c961Chia-I Wu 29204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ELT_TYPE linear 29304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 29404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#endif /* ELT_TYPE */ 29504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 29604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC_VARS \ 29704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu struct draw_pt_front_end *frontend, \ 29804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned start, \ 29904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu unsigned count 30004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 30104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define SEGMENT_SIMPLE(flags, istart, icount) \ 30204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu CONCAT(vsplit_segment_simple_, ELT_TYPE)(vsplit, flags, istart, icount) 30304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 30404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define SEGMENT_LOOP(flags, istart, icount, i0) \ 30504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu CONCAT(vsplit_segment_loop_, ELT_TYPE)(vsplit, flags, istart, icount, i0) 30604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 30704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define SEGMENT_FAN(flags, istart, icount, i0) \ 30804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu CONCAT(vsplit_segment_fan_, ELT_TYPE)(vsplit, flags, istart, icount, i0) 30904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 31004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_split_tmp.h" 31104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 31204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#undef CONCAT2 31304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#undef CONCAT 31404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu 31504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#undef ELT_TYPE 31604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#undef ADD_CACHE 317