Home | History | Annotate | Download | only in vbo

Lines Matching refs:split

63 static void flush_vertex( struct split_context *split )
65 struct gl_context *ctx = split->ctx;
70 if (!split->dstprim_nr)
73 if (split->ib) {
74 ib = *split->ib;
76 ib.count = split->max_index - split->min_index + 1;
78 split->min_index * _mesa_sizeof_type(ib.type));
81 for (i = 0; i < split->dstprim_nr; i++)
82 split->dstprim[i].start -= split->min_index;
85 assert(split->max_index >= split->min_index);
87 ctx->Array._DrawArrays = split->array;
90 split->draw(ctx,
91 split->dstprim,
92 split->dstprim_nr,
93 split->ib ? &ib : NULL,
94 !split->ib,
95 split->min_index,
96 split->max_index,
102 split->dstprim_nr = 0;
103 split->min_index = ~0;
104 split->max_index = 0;
108 static struct _mesa_prim *next_outprim( struct split_context *split )
110 if (split->dstprim_nr == MAX_PRIM-1) {
111 flush_vertex(split);
115 struct _mesa_prim *prim = &split->dstprim[split->dstprim_nr++];
121 static void update_index_bounds(struct split_context *split,
124 split->min_index = MIN2(split->min_index, prim->start);
125 split->max_index = MAX2(split->max_index, prim->start + prim->count - 1);
132 static GLuint get_max_vertices(struct split_context *split,
135 if ((prim->start > split->min_index &&
136 prim->start - split->min_index >= split->limit) ||
137 (prim->start < split->max_index &&
138 split->max_index - prim->start >= split->limit))
142 return MIN2(split->min_index, prim->start) + split->limit - prim->start;
148 static void split_prims( struct split_context *split)
152 for (i = 0; i < split->nr_prims; i++) {
153 const struct _mesa_prim *prim = &split->prim[i];
156 GLuint available = get_max_vertices(split, prim);
164 flush_vertex(split);
165 available = get_max_vertices(split, prim);
169 struct _mesa_prim *outprim = next_outprim(split);
172 update_index_bounds(split, outprim);
179 struct _mesa_prim *outprim = next_outprim(split);
192 update_index_bounds(split, outprim);
203 flush_vertex(split);
204 available = get_max_vertices(split, prim);
208 else if (split->ib == NULL) {
227 ib.obj = split->ctx->Shared->NullBufferObj;
237 flush_vertex(split);
239 vbo_split_copy(split->ctx,
240 split->array,
243 split->draw,
244 split->limits);
249 flush_vertex(split);
251 vbo_split_copy(split->ctx,
252 split->array,
254 split->ib,
255 split->draw,
256 split->limits);
260 flush_vertex(split);
274 struct split_context split;
276 memset(&split, 0, sizeof(split));
278 split.ctx = ctx;
279 split.array = arrays;
280 split.prim = prim;
281 split.nr_prims = nr_prims;
282 split.ib = ib;
285 split.min_index = ~0;
286 split.max_index = 0;
288 split.draw = draw;
289 split.limits = limits;
290 split.limit = ib ? limits->max_indices : limits->max_verts;
292 split_prims( &split );