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