vbo/dlist: convert LINE_STRIPS to LINES

Less primitive modes allows for better primitive merging.

Lines are always used (instead of picking dynamically lines or line
strips for instance) because:
- they don't need primitive restarts to be merged
- they perform better (at least on radeonsi) - SPECviewperf13 snx subtests
  with lines (like 4 or 10) are 1.5x-2x faster.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7078>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2020-10-08 14:48:25 +02:00
parent dc995adec5
commit ac3d4c7635

View file

@ -605,7 +605,7 @@ compile_vertex_list(struct gl_context *ctx)
int end = node->prims[node->prim_count - 1].start +
node->prims[node->prim_count - 1].count;
int total_vert_count = end - node->prims[0].start;
int max_indices_count = total_vert_count;
int max_indices_count = total_vert_count * 2;
int size = max_indices_count * sizeof(uint32_t);
uint32_t* indices = (uint32_t*) malloc(size);
uint32_t max_index = 0, min_index = 0xFFFFFFFF;
@ -618,8 +618,28 @@ compile_vertex_list(struct gl_context *ctx)
int vertex_count = node->prims[i].count;
int start = idx;
/* Convert line strips to lines if it'll allow if the previous
* prim mode is GL_LINES or if the next primitive mode is
* GL_LINES or GL_LINE_LOOP.
*/
if (node->prims[i].mode == GL_LINE_STRIP &&
((i > 0 && node->prims[i - 1].mode == GL_LINES) ||
(i < node->prim_count - 1 &&
(node->prims[i + 1].mode == GL_LINE_STRIP ||
node->prims[i + 1].mode == GL_LINES)))) {
for (unsigned j = 0; j < vertex_count; j++) {
indices[idx++] = node->prims[i].start + j;
/* Repeat all but the first/last indices. */
if (j && j != vertex_count - 1) {
indices[idx++] = node->prims[i].start + j;
node->prims[i].count++;
}
}
node->prims[i].mode = GL_LINES;
} else {
for (unsigned j = 0; j < vertex_count; j++) {
indices[idx++] = node->prims[i].start + j;
}
}
min_index = MIN2(min_index, indices[start]);