48
48
* Decompose a primitive that is a loop, a strip, or a fan. Return the
49
49
* original primitive if it is already decomposed.
51
static inline enum pipe_prim_type
52
u_decomposed_prim(enum pipe_prim_type prim)
51
static inline enum mesa_prim
52
u_decomposed_prim(enum mesa_prim prim)
55
case PIPE_PRIM_LINE_LOOP:
56
case PIPE_PRIM_LINE_STRIP:
57
return PIPE_PRIM_LINES;
58
case PIPE_PRIM_TRIANGLE_STRIP:
59
case PIPE_PRIM_TRIANGLE_FAN:
60
return PIPE_PRIM_TRIANGLES;
61
case PIPE_PRIM_QUAD_STRIP:
62
return PIPE_PRIM_QUADS;
63
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
64
return PIPE_PRIM_LINES_ADJACENCY;
65
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
66
return PIPE_PRIM_TRIANGLES_ADJACENCY;
55
case MESA_PRIM_LINE_LOOP:
56
case MESA_PRIM_LINE_STRIP:
57
return MESA_PRIM_LINES;
58
case MESA_PRIM_TRIANGLE_STRIP:
59
case MESA_PRIM_TRIANGLE_FAN:
60
return MESA_PRIM_TRIANGLES;
61
case MESA_PRIM_QUAD_STRIP:
62
return MESA_PRIM_QUADS;
63
case MESA_PRIM_LINE_STRIP_ADJACENCY:
64
return MESA_PRIM_LINES_ADJACENCY;
65
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
66
return MESA_PRIM_TRIANGLES_ADJACENCY;
73
* Reduce a primitive to one of PIPE_PRIM_POINTS, PIPE_PRIM_LINES, and
74
* PIPE_PRIM_TRIANGLES.
73
* Reduce a primitive to one of MESA_PRIM_POINTS, MESA_PRIM_LINES, and
74
* MESA_PRIM_TRIANGLES.
76
static inline enum pipe_prim_type
77
u_reduced_prim(enum pipe_prim_type prim)
76
static inline enum mesa_prim
77
u_reduced_prim(enum mesa_prim prim)
80
case PIPE_PRIM_POINTS:
81
return PIPE_PRIM_POINTS;
83
case PIPE_PRIM_LINE_LOOP:
84
case PIPE_PRIM_LINE_STRIP:
85
case PIPE_PRIM_LINES_ADJACENCY:
86
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
87
return PIPE_PRIM_LINES;
80
case MESA_PRIM_POINTS:
81
return MESA_PRIM_POINTS;
83
case MESA_PRIM_LINE_LOOP:
84
case MESA_PRIM_LINE_STRIP:
85
case MESA_PRIM_LINES_ADJACENCY:
86
case MESA_PRIM_LINE_STRIP_ADJACENCY:
87
return MESA_PRIM_LINES;
89
return PIPE_PRIM_TRIANGLES;
89
return MESA_PRIM_TRIANGLES;
94
94
* Re-assemble a primitive to remove its adjacency.
96
static inline enum pipe_prim_type
97
u_assembled_prim(enum pipe_prim_type prim)
96
static inline enum mesa_prim
97
u_assembled_prim(enum mesa_prim prim)
100
case PIPE_PRIM_LINES_ADJACENCY:
101
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
102
return PIPE_PRIM_LINES;
103
case PIPE_PRIM_TRIANGLES_ADJACENCY:
104
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
105
return PIPE_PRIM_TRIANGLES;
100
case MESA_PRIM_LINES_ADJACENCY:
101
case MESA_PRIM_LINE_STRIP_ADJACENCY:
102
return MESA_PRIM_LINES;
103
case MESA_PRIM_TRIANGLES_ADJACENCY:
104
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
105
return MESA_PRIM_TRIANGLES;
116
116
* expected because of the use of a table.
118
118
static inline const struct u_prim_vertex_count *
119
u_prim_vertex_count(enum pipe_prim_type prim)
119
u_prim_vertex_count(enum mesa_prim prim)
121
static const struct u_prim_vertex_count prim_table[PIPE_PRIM_MAX] = {
122
{ 1, 1 }, /* PIPE_PRIM_POINTS */
123
{ 2, 2 }, /* PIPE_PRIM_LINES */
124
{ 2, 1 }, /* PIPE_PRIM_LINE_LOOP */
125
{ 2, 1 }, /* PIPE_PRIM_LINE_STRIP */
126
{ 3, 3 }, /* PIPE_PRIM_TRIANGLES */
127
{ 3, 1 }, /* PIPE_PRIM_TRIANGLE_STRIP */
128
{ 3, 1 }, /* PIPE_PRIM_TRIANGLE_FAN */
129
{ 4, 4 }, /* PIPE_PRIM_QUADS */
130
{ 4, 2 }, /* PIPE_PRIM_QUAD_STRIP */
131
{ 3, 1 }, /* PIPE_PRIM_POLYGON */
132
{ 4, 4 }, /* PIPE_PRIM_LINES_ADJACENCY */
133
{ 4, 1 }, /* PIPE_PRIM_LINE_STRIP_ADJACENCY */
134
{ 6, 6 }, /* PIPE_PRIM_TRIANGLES_ADJACENCY */
135
{ 6, 2 }, /* PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY */
121
static const struct u_prim_vertex_count prim_table[MESA_PRIM_COUNT] = {
122
{ 1, 1 }, /* MESA_PRIM_POINTS */
123
{ 2, 2 }, /* MESA_PRIM_LINES */
124
{ 2, 1 }, /* MESA_PRIM_LINE_LOOP */
125
{ 2, 1 }, /* MESA_PRIM_LINE_STRIP */
126
{ 3, 3 }, /* MESA_PRIM_TRIANGLES */
127
{ 3, 1 }, /* MESA_PRIM_TRIANGLE_STRIP */
128
{ 3, 1 }, /* MESA_PRIM_TRIANGLE_FAN */
129
{ 4, 4 }, /* MESA_PRIM_QUADS */
130
{ 4, 2 }, /* MESA_PRIM_QUAD_STRIP */
131
{ 3, 1 }, /* MESA_PRIM_POLYGON */
132
{ 4, 4 }, /* MESA_PRIM_LINES_ADJACENCY */
133
{ 4, 1 }, /* MESA_PRIM_LINE_STRIP_ADJACENCY */
134
{ 6, 6 }, /* MESA_PRIM_TRIANGLES_ADJACENCY */
135
{ 6, 2 }, /* MESA_PRIM_TRIANGLE_STRIP_ADJACENCY */
138
return (likely(prim < PIPE_PRIM_MAX)) ? &prim_table[prim] : NULL;
138
return (likely(prim < MESA_PRIM_COUNT)) ? &prim_table[prim] : NULL;
168
static inline boolean
169
u_trim_pipe_prim(enum pipe_prim_type pipe_prim, unsigned *nr)
169
u_trim_pipe_prim(enum mesa_prim pipe_prim, unsigned *nr)
171
171
const struct u_prim_vertex_count *count = u_prim_vertex_count(pipe_prim);
173
173
if (count && *nr >= count->min) {
174
174
if (count->incr > 1)
175
175
*nr -= (*nr % count->incr);
184
184
static inline unsigned
185
u_vertices_per_prim(enum pipe_prim_type primitive)
185
u_vertices_per_prim(enum mesa_prim primitive)
187
187
switch(primitive) {
188
case PIPE_PRIM_POINTS:
188
case MESA_PRIM_POINTS:
190
case PIPE_PRIM_LINES:
191
case PIPE_PRIM_LINE_LOOP:
192
case PIPE_PRIM_LINE_STRIP:
190
case MESA_PRIM_LINES:
191
case MESA_PRIM_LINE_LOOP:
192
case MESA_PRIM_LINE_STRIP:
194
case PIPE_PRIM_TRIANGLES:
195
case PIPE_PRIM_TRIANGLE_STRIP:
196
case PIPE_PRIM_TRIANGLE_FAN:
194
case MESA_PRIM_TRIANGLES:
195
case MESA_PRIM_TRIANGLE_STRIP:
196
case MESA_PRIM_TRIANGLE_FAN:
198
case PIPE_PRIM_LINES_ADJACENCY:
199
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
198
case MESA_PRIM_LINES_ADJACENCY:
199
case MESA_PRIM_LINE_STRIP_ADJACENCY:
201
case PIPE_PRIM_TRIANGLES_ADJACENCY:
202
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
201
case MESA_PRIM_TRIANGLES_ADJACENCY:
202
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
205
case PIPE_PRIM_QUADS:
206
case PIPE_PRIM_QUAD_STRIP:
205
case MESA_PRIM_QUADS:
206
case MESA_PRIM_QUAD_STRIP:
207
207
/* these won't be seen from geometry shaders
208
208
but prim assembly might for prim id. */
228
228
* primitives for a set of vertices.
230
230
static inline unsigned
231
u_decomposed_prims_for_vertices(enum pipe_prim_type primitive, int vertices)
231
u_decomposed_prims_for_vertices(enum mesa_prim primitive, int vertices)
233
233
switch (primitive) {
234
case PIPE_PRIM_POINTS:
234
case MESA_PRIM_POINTS:
236
case PIPE_PRIM_LINES:
236
case MESA_PRIM_LINES:
237
237
return vertices / 2;
238
case PIPE_PRIM_LINE_LOOP:
238
case MESA_PRIM_LINE_LOOP:
239
239
return (vertices >= 2) ? vertices : 0;
240
case PIPE_PRIM_LINE_STRIP:
240
case MESA_PRIM_LINE_STRIP:
241
241
return (vertices >= 2) ? vertices - 1 : 0;
242
case PIPE_PRIM_TRIANGLES:
242
case MESA_PRIM_TRIANGLES:
243
243
return vertices / 3;
244
case PIPE_PRIM_TRIANGLE_STRIP:
245
return (vertices >= 3) ? vertices - 2 : 0;
246
case PIPE_PRIM_TRIANGLE_FAN:
247
return (vertices >= 3) ? vertices - 2 : 0;
248
case PIPE_PRIM_LINES_ADJACENCY:
244
case MESA_PRIM_TRIANGLE_STRIP:
245
return (vertices >= 3) ? vertices - 2 : 0;
246
case MESA_PRIM_TRIANGLE_FAN:
247
return (vertices >= 3) ? vertices - 2 : 0;
248
case MESA_PRIM_LINES_ADJACENCY:
249
249
return vertices / 4;
250
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
250
case MESA_PRIM_LINE_STRIP_ADJACENCY:
251
251
return (vertices >= 4) ? vertices - 3 : 0;
252
case PIPE_PRIM_TRIANGLES_ADJACENCY:
252
case MESA_PRIM_TRIANGLES_ADJACENCY:
253
253
return vertices / 6;
254
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
254
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
255
255
return (vertices >= 6) ? 1 + (vertices - 6) / 2 : 0;
256
case PIPE_PRIM_QUADS:
256
case MESA_PRIM_QUADS:
257
257
return vertices / 4;
258
case PIPE_PRIM_QUAD_STRIP:
258
case MESA_PRIM_QUAD_STRIP:
259
259
return (vertices >= 4) ? (vertices - 2) / 2 : 0;
260
260
/* Polygons can't be decomposed
261
261
* because the number of their vertices isn't known so
262
262
* for them and whatever else we don't recognize just
263
263
* return 1 if the number of vertices is greater than
264
264
* or equal to 3 and zero otherwise */
265
case PIPE_PRIM_POLYGON:
265
case MESA_PRIM_POLYGON:
267
267
debug_printf("Invalid decomposition primitive!\n");
268
268
return (vertices >= 3) ? 1 : 0;
277
277
static inline unsigned
278
u_reduced_prims_for_vertices(enum pipe_prim_type primitive, int vertices)
278
u_reduced_prims_for_vertices(enum mesa_prim primitive, int vertices)
280
280
switch (primitive) {
281
case PIPE_PRIM_QUADS:
282
case PIPE_PRIM_QUAD_STRIP:
281
case MESA_PRIM_QUADS:
282
case MESA_PRIM_QUAD_STRIP:
283
283
return u_decomposed_prims_for_vertices(primitive, vertices) * 2;
284
case PIPE_PRIM_POLYGON:
285
primitive = PIPE_PRIM_TRIANGLE_FAN;
284
case MESA_PRIM_POLYGON:
285
primitive = MESA_PRIM_TRIANGLE_FAN;
288
288
return u_decomposed_prims_for_vertices(primitive, vertices);
292
static inline enum pipe_prim_type
293
u_base_prim_type(enum pipe_prim_type prim_type)
292
static inline enum mesa_prim
293
u_base_prim_type(enum mesa_prim prim_type)
295
295
switch(prim_type) {
296
case PIPE_PRIM_POINTS:
297
return PIPE_PRIM_POINTS;
298
case PIPE_PRIM_LINES:
299
case PIPE_PRIM_LINE_LOOP:
300
case PIPE_PRIM_LINE_STRIP:
301
case PIPE_PRIM_LINES_ADJACENCY:
302
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
303
return PIPE_PRIM_LINES;
304
case PIPE_PRIM_TRIANGLES:
305
case PIPE_PRIM_TRIANGLE_STRIP:
306
case PIPE_PRIM_TRIANGLE_FAN:
307
case PIPE_PRIM_TRIANGLES_ADJACENCY:
308
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
309
return PIPE_PRIM_TRIANGLES;
310
case PIPE_PRIM_QUADS:
311
case PIPE_PRIM_QUAD_STRIP:
312
return PIPE_PRIM_QUADS;
296
case MESA_PRIM_POINTS:
297
return MESA_PRIM_POINTS;
298
case MESA_PRIM_LINES:
299
case MESA_PRIM_LINE_LOOP:
300
case MESA_PRIM_LINE_STRIP:
301
case MESA_PRIM_LINES_ADJACENCY:
302
case MESA_PRIM_LINE_STRIP_ADJACENCY:
303
return MESA_PRIM_LINES;
304
case MESA_PRIM_TRIANGLES:
305
case MESA_PRIM_TRIANGLE_STRIP:
306
case MESA_PRIM_TRIANGLE_FAN:
307
case MESA_PRIM_TRIANGLES_ADJACENCY:
308
case MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:
309
return MESA_PRIM_TRIANGLES;
310
case MESA_PRIM_QUADS:
311
case MESA_PRIM_QUAD_STRIP:
312
return MESA_PRIM_QUADS;
314
314
return prim_type;
318
static inline enum pipe_prim_type
318
static inline enum mesa_prim
319
319
u_tess_prim_from_shader(enum tess_primitive_mode shader_mode)
321
321
switch (shader_mode) {
322
322
case TESS_PRIMITIVE_TRIANGLES:
323
return PIPE_PRIM_TRIANGLES;
323
return MESA_PRIM_TRIANGLES;
324
324
case TESS_PRIMITIVE_QUADS:
325
return PIPE_PRIM_QUADS;
325
return MESA_PRIM_QUADS;
326
326
case TESS_PRIMITIVE_ISOLINES:
327
return PIPE_PRIM_LINES;
327
return MESA_PRIM_LINES;
329
return PIPE_PRIM_POINTS;
329
return MESA_PRIM_POINTS;
333
333
static inline unsigned
334
u_vertices_for_prims(enum pipe_prim_type prim_type, int count)
334
u_vertices_for_prims(enum mesa_prim prim_type, int count)
363
363
* vertices. In this case, we just have an output for each vertex (after
366
if (primitive == PIPE_PRIM_POLYGON)
366
if (primitive == MESA_PRIM_POLYGON)
369
369
/* Normally, consider how many primitives are actually generated */
370
370
unsigned prims = u_decomposed_prims_for_vertices(primitive, nr);
372
372
/* One output per vertex after decomposition */
373
enum pipe_prim_type base = u_base_prim_type(primitive);
373
enum mesa_prim base = u_base_prim_type(primitive);
375
375
/* The GL 4.6 compatibility spec says
381
381
* Further, quads and polygons are always provided as TRIANGLES. So
382
382
* tessellate quads into triangles.
384
if (base == PIPE_PRIM_QUADS) {
385
base = PIPE_PRIM_TRIANGLES;
384
if (base == MESA_PRIM_QUADS) {
385
base = MESA_PRIM_TRIANGLES;
389
389
return u_vertices_for_prims(base, prims);
392
const char *u_prim_name(enum pipe_prim_type pipe_prim);
392
const char *u_prim_name(enum mesa_prim pipe_prim);
395
395
#ifdef __cplusplus