From 17b72129305545164120c93e2526eeae2ec0d5d8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 14 Aug 2022 00:57:11 -0400 Subject: [PATCH] mesa: clean up st_indirect_draw_vbo interface and callers Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/mesa/main/dd.h | 1 - src/mesa/main/draw.c | 74 +++++----------------------------------- src/mesa/state_tracker/st_draw.c | 49 +++++++++++++++++--------- src/mesa/state_tracker/st_draw.h | 15 +++----- 4 files changed, 44 insertions(+), 95 deletions(-) diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 37e37b7..8806e1a 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -65,7 +65,6 @@ struct gl_transform_feedback_object; struct gl_vertex_array_object; struct ati_fragment_shader; struct util_queue_monitoring; -struct _mesa_index_buffer; struct pipe_draw_info; struct pipe_draw_start_count_bias; struct pipe_vertex_state; diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c index 62646fc..3f86e65 100644 --- a/src/mesa/main/draw.c +++ b/src/mesa/main/draw.c @@ -2217,56 +2217,6 @@ _mesa_DrawTransformFeedbackStreamInstanced(GLenum mode, GLuint name, } -static void -_mesa_validated_multidrawarraysindirect(struct gl_context *ctx, GLenum mode, - GLintptr indirect, - GLintptr drawcount_offset, - GLsizei drawcount, GLsizei stride, - struct gl_buffer_object *drawcount_buffer) -{ - /* If drawcount_buffer is set, drawcount is the maximum draw count.*/ - if (drawcount == 0) - return; - - st_indirect_draw_vbo(ctx, mode, ctx->DrawIndirectBuffer, indirect, - drawcount, stride, drawcount_buffer, - drawcount_offset, NULL, false, 0); - - if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) - _mesa_flush(ctx); -} - - -static void -_mesa_validated_multidrawelementsindirect(struct gl_context *ctx, - GLenum mode, GLenum type, - GLintptr indirect, - GLintptr drawcount_offset, - GLsizei drawcount, GLsizei stride, - struct gl_buffer_object *drawcount_buffer) -{ - /* If drawcount_buffer is set, drawcount is the maximum draw count.*/ - if (drawcount == 0) - return; - - /* NOTE: IndexBufferObj is guaranteed to be a VBO. */ - struct _mesa_index_buffer ib; - ib.count = 0; /* unknown */ - ib.obj = ctx->Array.VAO->IndexBufferObj; - ib.ptr = NULL; - ib.index_size_shift = get_index_size_shift(type); - - st_indirect_draw_vbo(ctx, mode, ctx->DrawIndirectBuffer, indirect, - drawcount, stride, drawcount_buffer, - drawcount_offset, &ib, - ctx->Array._PrimitiveRestart[ib.index_size_shift], - ctx->Array._RestartIndex[ib.index_size_shift]); - - if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) - _mesa_flush(ctx); -} - - /** * Like [Multi]DrawArrays/Elements, but they take most arguments from * a buffer object. @@ -2305,8 +2255,7 @@ _mesa_DrawArraysIndirect(GLenum mode, const GLvoid *indirect) !_mesa_validate_DrawArraysIndirect(ctx, mode, indirect)) return; - _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect, - 0, 1, 16, NULL); + st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, 0, 1, 16); } @@ -2364,9 +2313,7 @@ _mesa_DrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect) !_mesa_validate_DrawElementsIndirect(ctx, mode, type, indirect)) return; - _mesa_validated_multidrawelementsindirect(ctx, mode, type, - (GLintptr)indirect, 0, - 1, 20, NULL); + st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, 0, 1, 20); } @@ -2441,8 +2388,7 @@ _mesa_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect, primcount, stride)) return; - _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect, 0, - primcount, stride, NULL); + st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, 0, primcount, stride); } @@ -2536,9 +2482,7 @@ _mesa_MultiDrawElementsIndirect(GLenum mode, GLenum type, primcount, stride)) return; - _mesa_validated_multidrawelementsindirect(ctx, mode, type, - (GLintptr)indirect, 0, primcount, - stride, NULL); + st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, 0, primcount, stride); } @@ -2566,9 +2510,8 @@ _mesa_MultiDrawArraysIndirectCountARB(GLenum mode, GLintptr indirect, maxdrawcount, stride)) return; - _mesa_validated_multidrawarraysindirect(ctx, mode, indirect, - drawcount_offset, maxdrawcount, - stride, ctx->ParameterBuffer); + st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, drawcount_offset, + maxdrawcount, stride); } @@ -2598,9 +2541,8 @@ _mesa_MultiDrawElementsIndirectCountARB(GLenum mode, GLenum type, maxdrawcount, stride)) return; - _mesa_validated_multidrawelementsindirect(ctx, mode, type, indirect, - drawcount_offset, maxdrawcount, - stride, ctx->ParameterBuffer); + st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, drawcount_offset, + maxdrawcount, stride); } diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 1fbfc5c..848f04b 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -35,7 +35,7 @@ * Keith Whitwell */ - +#include "main/context.h" #include "main/errors.h" #include "main/image.h" @@ -234,22 +234,22 @@ rewrite_partial_stride_indirect(struct st_context *st, void st_indirect_draw_vbo(struct gl_context *ctx, - GLuint mode, - struct gl_buffer_object *indirect_data, - GLsizeiptr indirect_offset, - unsigned draw_count, - unsigned stride, - struct gl_buffer_object *indirect_draw_count, - GLsizeiptr indirect_draw_count_offset, - const struct _mesa_index_buffer *ib, - bool primitive_restart, - unsigned restart_index) + GLenum mode, GLenum index_type, + GLintptr indirect_offset, + GLintptr indirect_draw_count_offset, + GLsizei draw_count, GLsizei stride) { + struct gl_buffer_object *indirect_data = ctx->DrawIndirectBuffer; + struct gl_buffer_object *indirect_draw_count = ctx->ParameterBuffer; struct st_context *st = st_context(ctx); struct pipe_draw_info info; struct pipe_draw_indirect_info indirect; struct pipe_draw_start_count_bias draw = {0}; + /* If indirect_draw_count is set, drawcount is the maximum draw count.*/ + if (!draw_count) + return; + assert(stride); prepare_draw(st, ctx, ST_PIPELINE_RENDER_STATE_MASK, ST_PIPELINE_RENDER); @@ -257,18 +257,30 @@ st_indirect_draw_vbo(struct gl_context *ctx, util_draw_init_info(&info); info.max_index = ~0u; /* so that u_vbuf can tell that it's unknown */ - if (ib) { - struct gl_buffer_object *bufobj = ib->obj; + switch (index_type) { + case GL_UNSIGNED_BYTE: + info.index_size = 1; + break; + case GL_UNSIGNED_SHORT: + info.index_size = 2; + break; + case GL_UNSIGNED_INT: + info.index_size = 4; + break; + } + + if (info.index_size) { + struct gl_buffer_object *bufobj = ctx->Array.VAO->IndexBufferObj; /* indices are always in a real VBO */ assert(bufobj); - info.index_size = 1 << ib->index_size_shift; info.index.resource = bufobj->buffer; - draw.start = pointer_to_offset(ib->ptr) >> ib->index_size_shift; + draw.start = 0; - info.restart_index = restart_index; - info.primitive_restart = primitive_restart; + unsigned index_size_shift = util_logbase2(info.index_size); + info.restart_index = ctx->Array._RestartIndex[index_size_shift]; + info.primitive_restart = ctx->Array._PrimitiveRestart[index_size_shift]; } info.mode = translate_prim(ctx, mode); @@ -307,6 +319,9 @@ st_indirect_draw_vbo(struct gl_context *ctx, } cso_draw_vbo(st->cso_context, &info, 0, &indirect, draw); } + + if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH) + _mesa_flush(ctx); } void diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h index 684d267..f7c279f 100644 --- a/src/mesa/state_tracker/st_draw.h +++ b/src/mesa/state_tracker/st_draw.h @@ -36,7 +36,6 @@ #include "main/glheader.h" -struct _mesa_index_buffer; struct gl_context; struct st_context; @@ -89,16 +88,10 @@ st_draw_transform_feedback(struct gl_context *ctx, GLenum mode, void st_indirect_draw_vbo(struct gl_context *ctx, - GLuint mode, - struct gl_buffer_object *indirect_data, - GLsizeiptr indirect_offset, - unsigned draw_count, - unsigned stride, - struct gl_buffer_object *indirect_draw_count, - GLsizeiptr indirect_draw_count_offset, - const struct _mesa_index_buffer *ib, - bool primitive_restart, - unsigned restart_index); + GLenum mode, GLenum index_type, + GLintptr indirect_offset, + GLintptr indirect_draw_count_offset, + GLsizei draw_count, GLsizei stride); bool st_draw_hw_select_prepare_common(struct gl_context *ctx); -- 2.7.4