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#include "util/u_math.h"
2804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "util/u_memory.h"
2904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
3004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw/draw_context.h"
3104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw/draw_private.h"
3204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw/draw_pt.h"
3304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
3404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define SEGMENT_SIZE 1024
3504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define MAP_SIZE     256
3604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
3704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustruct vsplit_frontend {
3804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   struct draw_pt_front_end base;
3904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   struct draw_context *draw;
4004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
4104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   unsigned prim;
4204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
4304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   struct draw_pt_middle_end *middle;
4404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
4504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   unsigned max_vertices;
4604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   ushort segment_size;
4704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
4804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   /* buffers for splitting */
4904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   unsigned fetch_elts[SEGMENT_SIZE];
5004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   ushort draw_elts[SEGMENT_SIZE];
5104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   ushort identity_draw_elts[SEGMENT_SIZE];
5204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
5304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   struct {
5404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      /* map a fetch element to a draw element */
5504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      unsigned fetches[MAP_SIZE];
5604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      ushort draws[MAP_SIZE];
5704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      boolean has_max_fetch;
5804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
5904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      ushort num_fetch_elts;
6004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      ushort num_draw_elts;
6104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   } cache;
6204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu};
6304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
6404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
6504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void
6604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_clear_cache(struct vsplit_frontend *vsplit)
6704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
6804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   memset(vsplit->cache.fetches, 0xff, sizeof(vsplit->cache.fetches));
6904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->cache.has_max_fetch = FALSE;
7004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->cache.num_fetch_elts = 0;
7104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->cache.num_draw_elts = 0;
7204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
7304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
7404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void
7504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_flush_cache(struct vsplit_frontend *vsplit, unsigned flags)
7604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
7704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->middle->run(vsplit->middle,
7804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu         vsplit->fetch_elts, vsplit->cache.num_fetch_elts,
7904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu         vsplit->draw_elts, vsplit->cache.num_draw_elts, flags);
8004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
8104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
8204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/**
8304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Add a fetch element and add it to the draw elements.
8404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */
8504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic INLINE void
8604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_add_cache(struct vsplit_frontend *vsplit, unsigned fetch)
8704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
883733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca   struct draw_context *draw = vsplit->draw;
893733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca   unsigned hash;
903733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca
913733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca   fetch = MIN2(fetch, draw->pt.max_index);
923733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca
933733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca   hash = fetch % MAP_SIZE;
9404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
9504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   if (vsplit->cache.fetches[hash] != fetch) {
9604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      /* update cache */
9704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->cache.fetches[hash] = fetch;
9804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->cache.draws[hash] = vsplit->cache.num_fetch_elts;
9904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
10004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      /* add fetch */
10104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      assert(vsplit->cache.num_fetch_elts < vsplit->segment_size);
10204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->fetch_elts[vsplit->cache.num_fetch_elts++] = fetch;
10304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   }
10404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
10504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->draw_elts[vsplit->cache.num_draw_elts++] = vsplit->cache.draws[hash];
10604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
10704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
10804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
10904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu/**
11004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * Add a fetch element and add it to the draw elements.  The fetch element is
11104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu * in full range (uint).
11204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu */
11304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic INLINE void
11404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wuvsplit_add_cache_uint(struct vsplit_frontend *vsplit, unsigned fetch)
11504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
11604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   /* special care for 0xffffffff */
11704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   if (fetch == 0xffffffff && !vsplit->cache.has_max_fetch) {
11804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      unsigned hash = fetch % MAP_SIZE;
11904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->cache.fetches[hash] = fetch - 1; /* force update */
12004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->cache.has_max_fetch = TRUE;
12104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   }
12204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
12304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit_add_cache(vsplit, fetch);
12404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
12504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
12604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
12704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_linear
12804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h"
12904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
13004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_ubyte
13104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ELT_TYPE ubyte
13204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ADD_CACHE(vsplit, fetch) vsplit_add_cache(vsplit, fetch)
13304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h"
13404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
13504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_ushort
13604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ELT_TYPE ushort
13704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ADD_CACHE(vsplit, fetch) vsplit_add_cache(vsplit, fetch)
13804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h"
13904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
14004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define FUNC vsplit_run_uint
14104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ELT_TYPE uint
14204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#define ADD_CACHE(vsplit, fetch) vsplit_add_cache_uint(vsplit, fetch)
14304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu#include "draw_pt_vsplit_tmp.h"
14404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
14504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
14604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void vsplit_prepare(struct draw_pt_front_end *frontend,
14704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu                           unsigned in_prim,
14804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu                           struct draw_pt_middle_end *middle,
14904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu                           unsigned opt)
15004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
15104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend;
15204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
15304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   switch (vsplit->draw->pt.user.eltSize) {
15404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   case 0:
15504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->base.run = vsplit_run_linear;
15604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      break;
15704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   case 1:
15804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->base.run = vsplit_run_ubyte;
15904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      break;
16004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   case 2:
16104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->base.run = vsplit_run_ushort;
16204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      break;
16304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   case 4:
16404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->base.run = vsplit_run_uint;
16504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      break;
16604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   default:
16704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      assert(0);
16804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      break;
16904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   }
17004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
17104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   /* split only */
17204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->prim = in_prim;
17304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
17404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->middle = middle;
17504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   middle->prepare(middle, vsplit->prim, opt, &vsplit->max_vertices);
17604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
17704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->segment_size = MIN2(SEGMENT_SIZE, vsplit->max_vertices);
17804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
17904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
18004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
181b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantzstatic void vsplit_flush(struct draw_pt_front_end *frontend, unsigned flags)
18204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
18304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   struct vsplit_frontend *vsplit = (struct vsplit_frontend *) frontend;
184b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz
185b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz   if (!(flags & DRAW_FLUSH_BACKEND)) {
186b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz      vsplit->middle->finish(vsplit->middle);
187b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz      vsplit->middle = NULL;
188b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz   }
18904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
19004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
19104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
19204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustatic void vsplit_destroy(struct draw_pt_front_end *frontend)
19304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
19404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   FREE(frontend);
19504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
19604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
19704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
19804bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wustruct draw_pt_front_end *draw_pt_vsplit(struct draw_context *draw)
19904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu{
20004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   struct vsplit_frontend *vsplit = CALLOC_STRUCT(vsplit_frontend);
20104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   ushort i;
20204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
20304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   if (!vsplit)
20404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      return NULL;
20504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
20604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->base.prepare = vsplit_prepare;
20704bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->base.run     = NULL;
208b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz   vsplit->base.flush   = vsplit_flush;
20904bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->base.destroy = vsplit_destroy;
21004bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   vsplit->draw = draw;
21104bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
21204bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   for (i = 0; i < SEGMENT_SIZE; i++)
21304bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu      vsplit->identity_draw_elts[i] = i;
21404bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu
21504bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu   return &vsplit->base;
21604bc530dbdbe5d004219c9100e35f5d56cfedd80Chia-I Wu}
217