summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2020-03-06 16:47:52 -0500
committerMarek Olšák <marek.olsak@amd.com>2020-04-06 10:29:52 -0400
commitd9cb0ec5e611b5ba469a20e27fcd4001e88e841c (patch)
tree24ccfaed6edc10735b8286c0009bdaa3bb2bb34e /src/mesa
parente69e59778c53c7176519c63fb961952e4596dfa0 (diff)
vbo: expose helper function vbo_get_minmax_index_mapped for glthread
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4466>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/vbo/vbo.h6
-rw-r--r--src/mesa/vbo/vbo_minmax_index.c96
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
@@ -88,6 +88,12 @@ 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,
GLuint *min_index, GLuint *max_index, GLuint nr_prims);
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,