From 0d044f7d619c56c67d8235312363d93e2362248f Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 24 Jan 2018 09:14:35 -0700 Subject: [PATCH] mesa/vbo: replace vbo_draw_method() with _mesa_set_drawing_arrays() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The arrays specified by ctx->Array._DrawArrays are used for all vertex drawing via vbo_context::draw_prims(). Different arrays are used for immediate mode, vertex arrays, display lists, etc. Changing from one to another requires updating derived/driver array state. Before, we indirectly specifid the arrays with the gl_draw_method values. Now we just directly specify the arrays instead. This is simpler and will allow a subsequent display list optimization. In the future, it might make sense to get rid of ctx->Array._DrawArrays entirely and just pass the arrays as another parameter to vbo_context::draw_prims(). Reviewed-by: Mathias Fröhlich --- src/mesa/main/arrayobj.c | 25 +++++++++++------------ src/mesa/main/attrib.c | 5 ++--- src/mesa/main/mtypes.h | 16 --------------- src/mesa/main/varray.h | 15 ++++++++++++++ src/mesa/vbo/vbo_exec_api.c | 2 +- src/mesa/vbo/vbo_exec_array.c | 2 +- src/mesa/vbo/vbo_private.h | 37 ----------------------------------- src/mesa/vbo/vbo_save_draw.c | 6 ++++-- 8 files changed, 34 insertions(+), 74 deletions(-) diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index 0f474243a78..2810647c7e7 100644 --- a/src/mesa/main/arrayobj.c +++ b/src/mesa/main/arrayobj.c @@ -433,20 +433,17 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, bool no_error) newObj->EverBound = GL_TRUE; } - if (ctx->Array.DrawMethod == DRAW_ARRAYS) { - /* The _DrawArrays pointer is pointing at the VAO being unbound and - * that VAO may be in the process of being deleted. If it's not going - * to be deleted, this will have no effect, because the pointer needs - * to be updated by the VBO module anyway. - * - * Before the VBO module can update the pointer, we have to set it - * to NULL for drivers not to set up arrays which are not bound, - * or to prevent a crash if the VAO being unbound is going to be - * deleted. - */ - ctx->Array._DrawArrays = NULL; - ctx->Array.DrawMethod = DRAW_NONE; - } + /* The _DrawArrays pointer is pointing at the VAO being unbound and + * that VAO may be in the process of being deleted. If it's not going + * to be deleted, this will have no effect, because the pointer needs + * to be updated by the VBO module anyway. + * + * Before the VBO module can update the pointer, we have to set it + * to NULL for drivers not to set up arrays which are not bound, + * or to prevent a crash if the VAO being unbound is going to be + * deleted. + */ + _mesa_set_drawing_arrays(ctx, NULL); ctx->NewState |= _NEW_ARRAY; _mesa_reference_vao(ctx, &ctx->Array.VAO, newObj); diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 0fdadaf0aaa..50b65c413e5 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -1538,9 +1538,8 @@ copy_array_attrib(struct gl_context *ctx, /* skip ArrayBufferObj */ /* skip IndexBufferObj */ - /* Invalidate draw state. It will be updated during the next draw. */ - dest->DrawMethod = DRAW_NONE; - dest->_DrawArrays = NULL; + /* Invalidate array state. It will be updated during the next draw. */ + _mesa_set_drawing_arrays(ctx, NULL); } /** diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 361b63c1c40..9cd32c3aaa5 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1603,19 +1603,6 @@ struct gl_vertex_array_object }; -/** - * Used to signal when transitioning from one kind of drawing method - * to another. - */ -typedef enum -{ - DRAW_NONE, /**< Initial value only */ - DRAW_BEGIN_END, - DRAW_DISPLAY_LIST, - DRAW_ARRAYS -} gl_draw_method; - - /** * Enum for the OpenGL APIs we know about and may support. * @@ -1666,9 +1653,6 @@ struct gl_array_attrib GLuint RestartIndex; /*@}*/ - /** One of the DRAW_xxx flags, not consumed by drivers */ - gl_draw_method DrawMethod; - /* GL_ARB_vertex_buffer_object */ struct gl_buffer_object *ArrayBufferObj; diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h index 65e0f7b56c6..93f2f477faf 100644 --- a/src/mesa/main/varray.h +++ b/src/mesa/main/varray.h @@ -78,6 +78,21 @@ _mesa_attr_zero_aliases_vertex(const struct gl_context *ctx) return ctx->_AttribZeroAliasesVertex; } + +/** + * This specifies the set of vertex arrays used by the driver for drawing. + */ +static inline void +_mesa_set_drawing_arrays(struct gl_context *ctx, + const struct gl_vertex_array **arrays) +{ + if (ctx->Array._DrawArrays != arrays) { + ctx->Array._DrawArrays = arrays; + ctx->NewDriverState |= ctx->DriverFlags.NewArray; + } +} + + extern void _mesa_update_array_format(struct gl_context *ctx, struct gl_vertex_array_object *vao, diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index 881255ceb72..64e792bfa2c 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -770,7 +770,7 @@ vbo_exec_Begin(GLenum mode) return; } - vbo_draw_method(vbo_context(ctx), DRAW_BEGIN_END); + _mesa_set_drawing_arrays(ctx, exec->vtx.inputs); if (ctx->NewState) { _mesa_update_state(ctx); diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index 43362db2c7c..1d2f806cd5b 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -444,7 +444,7 @@ vbo_bind_arrays(struct gl_context *ctx) struct vbo_context *vbo = vbo_context(ctx); struct vbo_exec_context *exec = &vbo->exec; - vbo_draw_method(vbo, DRAW_ARRAYS); + _mesa_set_drawing_arrays(ctx, vbo->exec.array.inputs); if (exec->array.recalculate_inputs) { recalculate_input_bindings(ctx); diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h index d78593c7fa2..7c1e3c481f1 100644 --- a/src/mesa/vbo/vbo_private.h +++ b/src/mesa/vbo/vbo_private.h @@ -98,43 +98,6 @@ get_vp_mode( struct gl_context *ctx ) } -/** - * This is called by glBegin, glDrawArrays and glDrawElements (and - * variations of those calls). When we transition from immediate mode - * drawing to array drawing we need to invalidate the array state. - * - * glBegin/End builds vertex arrays. Those arrays may look identical - * to glDrawArrays arrays except that the position of the elements may - * be different. For example, arrays of (position3v, normal3f) vs. arrays - * of (normal3f, position3f). So we need to make sure we notify drivers - * that arrays may be changing. - */ -static inline void -vbo_draw_method(struct vbo_context *vbo, gl_draw_method method) -{ - struct gl_context *ctx = vbo->exec.ctx; - - if (ctx->Array.DrawMethod != method) { - switch (method) { - case DRAW_ARRAYS: - ctx->Array._DrawArrays = vbo->exec.array.inputs; - break; - case DRAW_BEGIN_END: - ctx->Array._DrawArrays = vbo->exec.vtx.inputs; - break; - case DRAW_DISPLAY_LIST: - ctx->Array._DrawArrays = vbo->save.inputs; - break; - default: - unreachable("Bad VBO drawing method"); - } - - ctx->NewDriverState |= ctx->DriverFlags.NewArray; - ctx->Array.DrawMethod = method; - } -} - - /** * Return if format is integer. The immediate mode commands only emit floats * for non-integer types, thus everything else is integer. diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index 60405d54ead..c86efcb05ee 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -34,6 +34,7 @@ #include "main/macros.h" #include "main/light.h" #include "main/state.h" +#include "main/varray.h" #include "util/bitscan.h" #include "vbo_private.h" @@ -267,7 +268,8 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data) { const struct vbo_save_vertex_list *node = (const struct vbo_save_vertex_list *) data; - struct vbo_save_context *save = &vbo_context(ctx)->save; + struct vbo_context *vbo = vbo_context(ctx); + struct vbo_save_context *save = &vbo->save; GLboolean remap_vertex_store = GL_FALSE; if (save->vertex_store && save->vertex_store->buffer_map) { @@ -318,7 +320,7 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data) bind_vertex_list(ctx, node); - vbo_draw_method(vbo_context(ctx), DRAW_DISPLAY_LIST); + _mesa_set_drawing_arrays(ctx, vbo->save.inputs); /* Again... */ -- 2.30.2