From d9cb0ec5e611b5ba469a20e27fcd4001e88e841c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 6 Mar 2020 16:47:52 -0500 Subject: [PATCH] vbo: expose helper function vbo_get_minmax_index_mapped for glthread Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/mesa/vbo/vbo.h | 6 +++ src/mesa/vbo/vbo_minmax_index.c | 96 ++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 43 deletions(-) diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h index 688e8fd83eb..c402caa74f1 100644 --- a/src/mesa/vbo/vbo.h +++ b/src/mesa/vbo/vbo.h @@ -87,6 +87,12 @@ vbo_save_EndCallList(struct gl_context *ctx); void vbo_delete_minmax_cache(struct gl_buffer_object *bufferObj); +void +vbo_get_minmax_index_mapped(unsigned count, unsigned index_size, + unsigned restartIndex, bool restart, + const void *indices, + unsigned *min_index, unsigned *max_index); + void vbo_get_minmax_indices(struct gl_context *ctx, const struct _mesa_prim *prim, const struct _mesa_index_buffer *ib, diff --git a/src/mesa/vbo/vbo_minmax_index.c b/src/mesa/vbo/vbo_minmax_index.c index 34766642c6a..ed3d5c607de 100644 --- a/src/mesa/vbo/vbo_minmax_index.c +++ b/src/mesa/vbo/vbo_minmax_index.c @@ -227,47 +227,19 @@ out: } -/** - * Compute min and max elements by scanning the index buffer for - * glDraw[Range]Elements() calls. - * If primitive restart is enabled, we need to ignore restart - * indexes when computing min/max. - */ -static void -vbo_get_minmax_index(struct gl_context *ctx, - const struct _mesa_prim *prim, - const struct _mesa_index_buffer *ib, - GLuint *min_index, GLuint *max_index, - const GLuint count) +void +vbo_get_minmax_index_mapped(unsigned count, unsigned index_size, + unsigned restartIndex, bool restart, + const void *indices, + unsigned *min_index, unsigned *max_index) { - const GLboolean restart = ctx->Array._PrimitiveRestart; - const GLuint restartIndex = - ctx->Array._RestartIndex[(1 << ib->index_size_shift) - 1]; - const char *indices; - GLuint i; - GLintptr offset = 0; - - indices = (char *) ib->ptr + (prim->start << ib->index_size_shift); - if (ib->obj) { - GLsizeiptr size = MIN2(count << ib->index_size_shift, ib->obj->Size); - - if (vbo_get_minmax_cached(ib->obj, 1 << ib->index_size_shift, (GLintptr) indices, - count, min_index, max_index)) - return; - - offset = (GLintptr) indices; - indices = ctx->Driver.MapBufferRange(ctx, offset, size, - GL_MAP_READ_BIT, ib->obj, - MAP_INTERNAL); - } - - switch (ib->index_size_shift) { - case 2: { + switch (index_size) { + case 4: { const GLuint *ui_indices = (const GLuint *)indices; GLuint max_ui = 0; GLuint min_ui = ~0U; if (restart) { - for (i = 0; i < count; i++) { + for (unsigned i = 0; i < count; i++) { if (ui_indices[i] != restartIndex) { if (ui_indices[i] > max_ui) max_ui = ui_indices[i]; if (ui_indices[i] < min_ui) min_ui = ui_indices[i]; @@ -281,7 +253,7 @@ vbo_get_minmax_index(struct gl_context *ctx, } else #endif - for (i = 0; i < count; i++) { + for (unsigned i = 0; i < count; i++) { if (ui_indices[i] > max_ui) max_ui = ui_indices[i]; if (ui_indices[i] < min_ui) min_ui = ui_indices[i]; } @@ -290,12 +262,12 @@ vbo_get_minmax_index(struct gl_context *ctx, *max_index = max_ui; break; } - case 1: { + case 2: { const GLushort *us_indices = (const GLushort *)indices; GLuint max_us = 0; GLuint min_us = ~0U; if (restart) { - for (i = 0; i < count; i++) { + for (unsigned i = 0; i < count; i++) { if (us_indices[i] != restartIndex) { if (us_indices[i] > max_us) max_us = us_indices[i]; if (us_indices[i] < min_us) min_us = us_indices[i]; @@ -303,7 +275,7 @@ vbo_get_minmax_index(struct gl_context *ctx, } } else { - for (i = 0; i < count; i++) { + for (unsigned i = 0; i < count; i++) { if (us_indices[i] > max_us) max_us = us_indices[i]; if (us_indices[i] < min_us) min_us = us_indices[i]; } @@ -312,12 +284,12 @@ vbo_get_minmax_index(struct gl_context *ctx, *max_index = max_us; break; } - case 0: { + case 1: { const GLubyte *ub_indices = (const GLubyte *)indices; GLuint max_ub = 0; GLuint min_ub = ~0U; if (restart) { - for (i = 0; i < count; i++) { + for (unsigned i = 0; i < count; i++) { if (ub_indices[i] != restartIndex) { if (ub_indices[i] > max_ub) max_ub = ub_indices[i]; if (ub_indices[i] < min_ub) min_ub = ub_indices[i]; @@ -325,7 +297,7 @@ vbo_get_minmax_index(struct gl_context *ctx, } } else { - for (i = 0; i < count; i++) { + for (unsigned i = 0; i < count; i++) { if (ub_indices[i] > max_ub) max_ub = ub_indices[i]; if (ub_indices[i] < min_ub) min_ub = ub_indices[i]; } @@ -337,6 +309,44 @@ vbo_get_minmax_index(struct gl_context *ctx, default: unreachable("not reached"); } +} + + +/** + * Compute min and max elements by scanning the index buffer for + * glDraw[Range]Elements() calls. + * If primitive restart is enabled, we need to ignore restart + * indexes when computing min/max. + */ +static void +vbo_get_minmax_index(struct gl_context *ctx, + const struct _mesa_prim *prim, + const struct _mesa_index_buffer *ib, + GLuint *min_index, GLuint *max_index, + const GLuint count) +{ + const GLboolean restart = ctx->Array._PrimitiveRestart; + const GLuint restartIndex = + ctx->Array._RestartIndex[(1 << ib->index_size_shift) - 1]; + const char *indices; + GLintptr offset = 0; + + indices = (char *) ib->ptr + (prim->start << ib->index_size_shift); + if (ib->obj) { + GLsizeiptr size = MIN2(count << ib->index_size_shift, ib->obj->Size); + + if (vbo_get_minmax_cached(ib->obj, 1 << ib->index_size_shift, (GLintptr) indices, + count, min_index, max_index)) + return; + + offset = (GLintptr) indices; + indices = ctx->Driver.MapBufferRange(ctx, offset, size, + GL_MAP_READ_BIT, ib->obj, + MAP_INTERNAL); + } + + vbo_get_minmax_index_mapped(count, 1 << ib->index_size_shift, restartIndex, + restart, indices, min_index, max_index); if (ib->obj) { vbo_minmax_cache_store(ctx, ib->obj, 1 << ib->index_size_shift, offset, -- 2.30.2