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