Mesa (master): mesa/vbo: replace vbo_draw_method() with _mesa_set_drawing_arrays()

Brian Paul brianp at kemper.freedesktop.org
Mon Jan 29 16:06:24 UTC 2018


Module: Mesa
Branch: master
Commit: 0d044f7d619c56c67d8235312363d93e2362248f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0d044f7d619c56c67d8235312363d93e2362248f

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Jan 24 09:14:35 2018 -0700

mesa/vbo: replace vbo_draw_method() with _mesa_set_drawing_arrays()

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 <mathias.froehlich at web.de>

---

 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 0f474243a7..2810647c7e 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 0fdadaf0aa..50b65c413e 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 361b63c1c4..9cd32c3aaa 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1604,19 +1604,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.
  *
  * NOTE: This must match the api_enum table in
@@ -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 65e0f7b56c..93f2f477fa 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 881255ceb7..64e792bfa2 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 43362db2c7..1d2f806cd5 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 d78593c7fa..7c1e3c481f 100644
--- a/src/mesa/vbo/vbo_private.h
+++ b/src/mesa/vbo/vbo_private.h
@@ -99,43 +99,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 60405d54ea..c86efcb05e 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...
        */




More information about the mesa-commit mailing list