diff options
author | Marek Olšák <[email protected]> | 2020-03-22 21:00:18 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2020-04-06 10:30:10 -0400 |
commit | 068a3bf0d7cda0301b3dfc2e258698c6848ca706 (patch) | |
tree | e13384a38786d6f5d6603c87b0961261ad464c7a | |
parent | d9cb0ec5e611b5ba469a20e27fcd4001e88e841c (diff) |
util: move and adjust the vertex upload heuristic equation from u_vbuf
This will also be used by glthread.
The new equation is optimized for glthread.
Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4466>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4466>
-rw-r--r-- | src/gallium/auxiliary/util/u_vbuf.c | 3 | ||||
-rw-r--r-- | src/util/u_math.h | 20 |
2 files changed, 20 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c index f47d93ac3f1..567cb6a75c9 100644 --- a/src/gallium/auxiliary/util/u_vbuf.c +++ b/src/gallium/auxiliary/util/u_vbuf.c @@ -1433,8 +1433,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info) * performance. */ if (!info->indirect && !new_info.primitive_restart && - num_vertices > new_info.count * 4 && - new_info.count > 32 && + util_is_vbo_upload_ratio_too_large(new_info.count, num_vertices) && !u_vbuf_mapping_vertex_buffer_blocks(mgr)) { unroll_indices = TRUE; user_vb_mask &= ~(mgr->nonzero_stride_vb_mask & diff --git a/src/util/u_math.h b/src/util/u_math.h index a672486f02f..6c2cb5437c0 100644 --- a/src/util/u_math.h +++ b/src/util/u_math.h @@ -783,7 +783,25 @@ util_fpstate_set_denorms_to_zero(unsigned current_fpstate); void util_fpstate_set(unsigned fpstate); - +/** + * For indexed draw calls, return true if the vertex count to be drawn is + * much lower than the vertex count that has to be uploaded, meaning + * that the driver should flatten indices instead of trying to upload + * a too big range. + * + * This is used by vertex upload code in u_vbuf and glthread. + */ +static inline bool +util_is_vbo_upload_ratio_too_large(unsigned draw_vertex_count, + unsigned upload_vertex_count) +{ + if (draw_vertex_count > 1024) + return upload_vertex_count > draw_vertex_count * 4; + else if (draw_vertex_count > 32) + return upload_vertex_count > draw_vertex_count * 8; + else + return upload_vertex_count > draw_vertex_count * 16; +} #ifdef __cplusplus } |