1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.9 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 LunarG Inc. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CONCAT2(name, elt_type) name ## elt_type 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CONCAT(name, elt_type) CONCAT2(name, elt_type) 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef ELT_TYPE 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fetch all elements in [min_index, max_index] with bias, and use the 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (rebased) index buffer as the draw elements. 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit, 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, unsigned icount) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_context *draw = vsplit->draw; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned min_index = draw->pt.user.min_index; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_index = draw->pt.user.max_index; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int elt_bias = draw->pt.user.eltBias; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned fetch_start, fetch_count; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ushort *draw_elts = NULL; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ib += istart; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use the ib directly */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (min_index == 0 && sizeof(ib[0]) == sizeof(draw_elts[0])) { 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (icount > vsplit->max_vertices) 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < icount; i++) { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_TYPE idx = ib[i]; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (idx < min_index || idx > max_index) { 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("warning: index out of range\n"); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_elts = (const ushort *) ib; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* have to go through vsplit->draw_elts */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (icount > vsplit->segment_size) 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this is faster only when we fetch less elements than the normal path */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (max_index - min_index > icount - 1) 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (elt_bias < 0 && min_index < -elt_bias) 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* why this check? */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < draw->pt.nr_vertex_elements; i++) { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.vertex_element[i].instance_divisor) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_start = min_index + elt_bias; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_count = max_index - min_index + 1; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw_elts) { 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (min_index == 0) { 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < icount; i++) { 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_TYPE idx = ib[i]; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (idx < min_index || idx > max_index) { 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("warning: index out of range\n"); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->draw_elts[i] = (ushort) idx; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < icount; i++) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ELT_TYPE idx = ib[i]; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (idx < min_index || idx > max_index) { 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("warning: index out of range\n"); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->draw_elts[i] = (ushort) (idx - min_index); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_elts = vsplit->draw_elts; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return vsplit->middle->run_linear_elts(vsplit->middle, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_start, fetch_count, 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_elts, icount, 0x0); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Use the cache to prepare the fetch and draw elements, and flush. 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When spoken is TRUE, ispoken replaces istart; When close is TRUE, iclose is 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * appended. 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, unsigned icount, 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean spoken, unsigned ispoken, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean close, unsigned iclose) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_context *draw = vsplit->draw; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int ibias = draw->pt.user.eltBias; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(icount + !!close <= vsplit->segment_size); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit_clear_cache(vsplit); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org spoken = !!spoken; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ibias == 0) { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (spoken) 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, ib[ispoken]); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = spoken; i < icount; i++) 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, ib[istart + i]); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (close) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, ib[iclose]); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ibias > 0) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (spoken) 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, (uint) ib[ispoken] + ibias); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = spoken; i < icount; i++) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, (uint) ib[istart + i] + ibias); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (close) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, (uint) ib[iclose] + ibias); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (spoken) { 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ib[ispoken] < -ibias) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, ib[ispoken] + ibias); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = spoken; i < icount; i++) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ib[istart + i] < -ibias) 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, ib[istart + i] + ibias); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (close) { 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ib[iclose] < -ibias) 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_CACHE(vsplit, ib[iclose] + ibias); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit_flush_cache(vsplit, flags); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCONCAT(vsplit_segment_simple_, ELT_TYPE)(struct vsplit_frontend *vsplit, 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags, 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned icount) 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CONCAT(vsplit_segment_cache_, ELT_TYPE)(vsplit, 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags, istart, icount, FALSE, 0, FALSE, 0); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCONCAT(vsplit_segment_loop_, ELT_TYPE)(struct vsplit_frontend *vsplit, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags, 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned icount, 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i0) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const boolean close_loop = ((flags) == DRAW_SPLIT_BEFORE); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CONCAT(vsplit_segment_cache_, ELT_TYPE)(vsplit, 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags, istart, icount, FALSE, 0, close_loop, i0); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCONCAT(vsplit_segment_fan_, ELT_TYPE)(struct vsplit_frontend *vsplit, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned icount, 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i0) 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const boolean use_spoken = (((flags) & DRAW_SPLIT_BEFORE) != 0); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CONCAT(vsplit_segment_cache_, ELT_TYPE)(vsplit, 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags, istart, icount, use_spoken, i0, FALSE, 0); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS \ 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend; \ 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned prim = vsplit->prim; \ 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_count_simple = vsplit->segment_size; \ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_count_loop = vsplit->segment_size - 1; \ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_count_fan = vsplit->segment_size; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRIMITIVE(istart, icount) \ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CONCAT(vsplit_primitive_, ELT_TYPE)(vsplit, istart, icount) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /* ELT_TYPE */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvsplit_segment_simple_linear(struct vsplit_frontend *vsplit, unsigned flags, 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, unsigned icount) 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(icount <= vsplit->max_vertices); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvsplit_segment_loop_linear(struct vsplit_frontend *vsplit, unsigned flags, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, unsigned icount, unsigned i0) 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean close_loop = (flags == DRAW_SPLIT_BEFORE); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(icount + !!close_loop <= vsplit->segment_size); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (close_loop) { 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (nr = 0; nr < icount; nr++) 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->fetch_elts[nr] = istart + nr; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->fetch_elts[nr++] = i0; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->middle->run(vsplit->middle, vsplit->fetch_elts, nr, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->identity_draw_elts, nr, flags); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvsplit_segment_fan_linear(struct vsplit_frontend *vsplit, unsigned flags, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned istart, unsigned icount, unsigned i0) 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean use_spoken = ((flags & DRAW_SPLIT_BEFORE) != 0); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr = 0, i; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(icount <= vsplit->segment_size); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_spoken) { 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* replace istart by i0 */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->fetch_elts[nr++] = i0; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 1 ; i < icount; i++) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->fetch_elts[nr++] = istart + i; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->middle->run(vsplit->middle, vsplit->fetch_elts, nr, 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->identity_draw_elts, nr, flags); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vsplit->middle->run_linear(vsplit->middle, istart, icount, flags); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS \ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend; \ 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned prim = vsplit->prim; \ 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_count_simple = vsplit->max_vertices; \ 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_count_loop = vsplit->segment_size - 1; \ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned max_count_fan = vsplit->segment_size; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRIMITIVE(istart, icount) FALSE 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT_TYPE linear 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* ELT_TYPE */ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FUNC_VARS \ 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_pt_front_end *frontend, \ 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, \ 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SEGMENT_SIMPLE(flags, istart, icount) \ 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CONCAT(vsplit_segment_simple_, ELT_TYPE)(vsplit, flags, istart, icount) 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SEGMENT_LOOP(flags, istart, icount, i0) \ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CONCAT(vsplit_segment_loop_, ELT_TYPE)(vsplit, flags, istart, icount, i0) 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SEGMENT_FAN(flags, istart, icount, i0) \ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CONCAT(vsplit_segment_fan_, ELT_TYPE)(vsplit, flags, istart, icount, i0) 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_split_tmp.h" 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef CONCAT2 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef CONCAT 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ELT_TYPE 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ADD_CACHE 317