127
133
* draw elements / indexed primitives
130
lp_setup_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)
136
lp_setup_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr)
132
struct setup_context *setup = setup_context(vbr);
138
struct lp_setup_context *setup = lp_setup_context(vbr);
133
139
const unsigned stride = setup->vertex_info->size * sizeof(float);
134
140
const void *vertex_buffer = setup->vertex_buffer;
141
const boolean flatshade_first = setup->flatshade_first;
137
lp_setup_update_state(setup);
144
lp_setup_update_state(setup, TRUE);
139
146
switch (setup->prim) {
140
147
case PIPE_PRIM_POINTS:
176
183
case PIPE_PRIM_TRIANGLES:
177
if (setup->flatshade_first) {
178
for (i = 2; i < nr; i += 3) {
179
setup->triangle( setup,
180
get_vert(vertex_buffer, indices[i-1], stride),
181
get_vert(vertex_buffer, indices[i-0], stride),
182
get_vert(vertex_buffer, indices[i-2], stride) );
186
for (i = 2; i < nr; i += 3) {
187
setup->triangle( setup,
188
get_vert(vertex_buffer, indices[i-2], stride),
189
get_vert(vertex_buffer, indices[i-1], stride),
190
get_vert(vertex_buffer, indices[i-0], stride) );
184
for (i = 2; i < nr; i += 3) {
185
setup->triangle( setup,
186
get_vert(vertex_buffer, indices[i-2], stride),
187
get_vert(vertex_buffer, indices[i-1], stride),
188
get_vert(vertex_buffer, indices[i-0], stride) );
195
192
case PIPE_PRIM_TRIANGLE_STRIP:
196
if (setup->flatshade_first) {
193
if (flatshade_first) {
197
194
for (i = 2; i < nr; i += 1) {
195
/* emit first triangle vertex as first triangle vertex */
198
196
setup->triangle( setup,
197
get_vert(vertex_buffer, indices[i-2], stride),
199
198
get_vert(vertex_buffer, indices[i+(i&1)-1], stride),
200
get_vert(vertex_buffer, indices[i-(i&1)], stride),
201
get_vert(vertex_buffer, indices[i-2], stride) );
199
get_vert(vertex_buffer, indices[i-(i&1)], stride) );
205
204
for (i = 2; i < nr; i += 1) {
205
/* emit last triangle vertex as last triangle vertex */
206
206
setup->triangle( setup,
207
207
get_vert(vertex_buffer, indices[i+(i&1)-2], stride),
208
208
get_vert(vertex_buffer, indices[i-(i&1)-1], stride),
214
214
case PIPE_PRIM_TRIANGLE_FAN:
215
if (setup->flatshade_first) {
215
if (flatshade_first) {
216
216
for (i = 2; i < nr; i += 1) {
217
/* emit first non-spoke vertex as first vertex */
217
218
setup->triangle( setup,
219
get_vert(vertex_buffer, indices[i-1], stride),
218
220
get_vert(vertex_buffer, indices[i-0], stride),
221
get_vert(vertex_buffer, indices[0], stride) );
225
for (i = 2; i < nr; i += 1) {
226
/* emit last non-spoke vertex as last vertex */
227
setup->triangle( setup,
219
228
get_vert(vertex_buffer, indices[0], stride),
229
get_vert(vertex_buffer, indices[i-1], stride),
230
get_vert(vertex_buffer, indices[i-0], stride) );
235
case PIPE_PRIM_QUADS:
236
/* GL quads don't follow provoking vertex convention */
237
if (flatshade_first) {
238
/* emit last quad vertex as first triangle vertex */
239
for (i = 3; i < nr; i += 4) {
240
setup->triangle( setup,
241
get_vert(vertex_buffer, indices[i-0], stride),
242
get_vert(vertex_buffer, indices[i-3], stride),
243
get_vert(vertex_buffer, indices[i-2], stride) );
245
setup->triangle( setup,
246
get_vert(vertex_buffer, indices[i-0], stride),
247
get_vert(vertex_buffer, indices[i-2], stride),
220
248
get_vert(vertex_buffer, indices[i-1], stride) );
224
for (i = 2; i < nr; i += 1) {
225
setup->triangle( setup,
226
get_vert(vertex_buffer, indices[0], stride),
227
get_vert(vertex_buffer, indices[i-1], stride),
228
get_vert(vertex_buffer, indices[i-0], stride) );
233
case PIPE_PRIM_QUADS:
234
if (setup->flatshade_first) {
235
for (i = 3; i < nr; i += 4) {
236
setup->triangle( setup,
237
get_vert(vertex_buffer, indices[i-2], stride),
238
get_vert(vertex_buffer, indices[i-1], stride),
239
get_vert(vertex_buffer, indices[i-3], stride) );
240
setup->triangle( setup,
241
get_vert(vertex_buffer, indices[i-1], stride),
242
get_vert(vertex_buffer, indices[i-0], stride),
243
get_vert(vertex_buffer, indices[i-3], stride) );
247
for (i = 3; i < nr; i += 4) {
248
setup->triangle( setup,
249
get_vert(vertex_buffer, indices[i-3], stride),
250
get_vert(vertex_buffer, indices[i-2], stride),
251
get_vert(vertex_buffer, indices[i-0], stride) );
252
/* emit last quad vertex as last triangle vertex */
253
for (i = 3; i < nr; i += 4) {
254
setup->triangle( setup,
255
get_vert(vertex_buffer, indices[i-3], stride),
256
get_vert(vertex_buffer, indices[i-2], stride),
257
get_vert(vertex_buffer, indices[i-0], stride) );
253
259
setup->triangle( setup,
254
260
get_vert(vertex_buffer, indices[i-2], stride),
261
267
case PIPE_PRIM_QUAD_STRIP:
262
if (setup->flatshade_first) {
268
/* GL quad strips don't follow provoking vertex convention */
269
if (flatshade_first) {
270
/* emit last quad vertex as first triangle vertex */
263
271
for (i = 3; i < nr; i += 2) {
264
272
setup->triangle( setup,
265
273
get_vert(vertex_buffer, indices[i-0], stride),
274
get_vert(vertex_buffer, indices[i-3], stride),
275
get_vert(vertex_buffer, indices[i-2], stride) );
276
setup->triangle( setup,
277
get_vert(vertex_buffer, indices[i-0], stride),
266
278
get_vert(vertex_buffer, indices[i-1], stride),
267
get_vert(vertex_buffer, indices[i-3], stride));
268
setup->triangle( setup,
269
get_vert(vertex_buffer, indices[i-2], stride),
270
get_vert(vertex_buffer, indices[i-0], stride),
271
279
get_vert(vertex_buffer, indices[i-3], stride) );
283
/* emit last quad vertex as last triangle vertex */
275
284
for (i = 3; i < nr; i += 2) {
276
285
setup->triangle( setup,
277
286
get_vert(vertex_buffer, indices[i-3], stride),
288
297
case PIPE_PRIM_POLYGON:
289
298
/* Almost same as tri fan but the _first_ vertex specifies the flat
290
* shading color. Note that the first polygon vertex is passed as
291
* the last triangle vertex here.
292
* flatshade_first state makes no difference.
294
for (i = 2; i < nr; i += 1) {
295
setup->triangle( setup,
296
get_vert(vertex_buffer, indices[i-0], stride),
297
get_vert(vertex_buffer, indices[i-1], stride),
298
get_vert(vertex_buffer, indices[0], stride) );
301
if (flatshade_first) {
302
/* emit first polygon vertex as first triangle vertex */
303
for (i = 2; i < nr; i += 1) {
304
setup->triangle( setup,
305
get_vert(vertex_buffer, indices[0], stride),
306
get_vert(vertex_buffer, indices[i-1], stride),
307
get_vert(vertex_buffer, indices[i-0], stride) );
311
/* emit first polygon vertex as last triangle vertex */
312
for (i = 2; i < nr; i += 1) {
313
setup->triangle( setup,
314
get_vert(vertex_buffer, indices[i-1], stride),
315
get_vert(vertex_buffer, indices[i-0], stride),
316
get_vert(vertex_buffer, indices[0], stride) );
360
380
case PIPE_PRIM_TRIANGLES:
361
if (setup->flatshade_first) {
362
for (i = 2; i < nr; i += 3) {
363
setup->triangle( setup,
364
get_vert(vertex_buffer, i-1, stride),
365
get_vert(vertex_buffer, i-0, stride),
366
get_vert(vertex_buffer, i-2, stride) );
370
for (i = 2; i < nr; i += 3) {
371
setup->triangle( setup,
372
get_vert(vertex_buffer, i-2, stride),
373
get_vert(vertex_buffer, i-1, stride),
374
get_vert(vertex_buffer, i-0, stride) );
381
for (i = 2; i < nr; i += 3) {
382
setup->triangle( setup,
383
get_vert(vertex_buffer, i-2, stride),
384
get_vert(vertex_buffer, i-1, stride),
385
get_vert(vertex_buffer, i-0, stride) );
379
389
case PIPE_PRIM_TRIANGLE_STRIP:
380
if (setup->flatshade_first) {
390
if (flatshade_first) {
381
391
for (i = 2; i < nr; i++) {
392
/* emit first triangle vertex as first triangle vertex */
382
393
setup->triangle( setup,
394
get_vert(vertex_buffer, i-2, stride),
383
395
get_vert(vertex_buffer, i+(i&1)-1, stride),
384
get_vert(vertex_buffer, i-(i&1), stride),
385
get_vert(vertex_buffer, i-2, stride) );
396
get_vert(vertex_buffer, i-(i&1), stride) );
389
400
for (i = 2; i < nr; i++) {
401
/* emit last triangle vertex as last triangle vertex */
390
402
setup->triangle( setup,
391
403
get_vert(vertex_buffer, i+(i&1)-2, stride),
392
404
get_vert(vertex_buffer, i-(i&1)-1, stride),
398
410
case PIPE_PRIM_TRIANGLE_FAN:
399
if (setup->flatshade_first) {
411
if (flatshade_first) {
400
412
for (i = 2; i < nr; i += 1) {
413
/* emit first non-spoke vertex as first vertex */
401
414
setup->triangle( setup,
415
get_vert(vertex_buffer, i-1, stride),
402
416
get_vert(vertex_buffer, i-0, stride),
417
get_vert(vertex_buffer, 0, stride) );
421
for (i = 2; i < nr; i += 1) {
422
/* emit last non-spoke vertex as last vertex */
423
setup->triangle( setup,
403
424
get_vert(vertex_buffer, 0, stride),
425
get_vert(vertex_buffer, i-1, stride),
426
get_vert(vertex_buffer, i-0, stride) );
431
case PIPE_PRIM_QUADS:
432
/* GL quads don't follow provoking vertex convention */
433
if (flatshade_first) {
434
/* emit last quad vertex as first triangle vertex */
435
for (i = 3; i < nr; i += 4) {
436
setup->triangle( setup,
437
get_vert(vertex_buffer, i-0, stride),
438
get_vert(vertex_buffer, i-3, stride),
439
get_vert(vertex_buffer, i-2, stride) );
440
setup->triangle( setup,
441
get_vert(vertex_buffer, i-0, stride),
442
get_vert(vertex_buffer, i-2, stride),
404
443
get_vert(vertex_buffer, i-1, stride) );
408
for (i = 2; i < nr; i += 1) {
409
setup->triangle( setup,
410
get_vert(vertex_buffer, 0, stride),
411
get_vert(vertex_buffer, i-1, stride),
412
get_vert(vertex_buffer, i-0, stride) );
417
case PIPE_PRIM_QUADS:
418
if (setup->flatshade_first) {
419
for (i = 3; i < nr; i += 4) {
420
setup->triangle( setup,
421
get_vert(vertex_buffer, i-2, stride),
422
get_vert(vertex_buffer, i-1, stride),
423
get_vert(vertex_buffer, i-3, stride) );
424
setup->triangle( setup,
425
get_vert(vertex_buffer, i-1, stride),
426
get_vert(vertex_buffer, i-0, stride),
427
get_vert(vertex_buffer, i-3, stride) );
447
/* emit last quad vertex as last triangle vertex */
431
448
for (i = 3; i < nr; i += 4) {
432
449
setup->triangle( setup,
433
450
get_vert(vertex_buffer, i-3, stride),
444
461
case PIPE_PRIM_QUAD_STRIP:
445
if (setup->flatshade_first) {
462
/* GL quad strips don't follow provoking vertex convention */
463
if (flatshade_first) {
464
/* emit last quad vertex as first triangle vertex */
446
465
for (i = 3; i < nr; i += 2) {
447
466
setup->triangle( setup,
448
467
get_vert(vertex_buffer, i-0, stride),
468
get_vert(vertex_buffer, i-3, stride),
469
get_vert(vertex_buffer, i-2, stride) );
470
setup->triangle( setup,
471
get_vert(vertex_buffer, i-0, stride),
449
472
get_vert(vertex_buffer, i-1, stride),
450
473
get_vert(vertex_buffer, i-3, stride) );
451
setup->triangle( setup,
453
get_vert(vertex_buffer, i-2, stride),
454
get_vert(vertex_buffer, i-0, stride),
455
get_vert(vertex_buffer, i-3, stride) );
477
/* emit last quad vertex as last triangle vertex */
459
478
for (i = 3; i < nr; i += 2) {
460
479
setup->triangle( setup,
461
480
get_vert(vertex_buffer, i-3, stride),
472
491
case PIPE_PRIM_POLYGON:
473
492
/* Almost same as tri fan but the _first_ vertex specifies the flat
474
* shading color. Note that the first polygon vertex is passed as
475
* the last triangle vertex here.
476
* flatshade_first state makes no difference.
478
for (i = 2; i < nr; i += 1) {
479
setup->triangle( setup,
480
get_vert(vertex_buffer, i-1, stride),
481
get_vert(vertex_buffer, i-0, stride),
482
get_vert(vertex_buffer, 0, stride) );
495
if (flatshade_first) {
496
/* emit first polygon vertex as first triangle vertex */
497
for (i = 2; i < nr; i += 1) {
498
setup->triangle( setup,
499
get_vert(vertex_buffer, 0, stride),
500
get_vert(vertex_buffer, i-1, stride),
501
get_vert(vertex_buffer, i-0, stride) );
505
/* emit first polygon vertex as last triangle vertex */
506
for (i = 2; i < nr; i += 1) {
507
setup->triangle( setup,
508
get_vert(vertex_buffer, i-1, stride),
509
get_vert(vertex_buffer, i-0, stride),
510
get_vert(vertex_buffer, 0, stride) );