mesa/vbo: replace vbo_draw_method() with _mesa_set_drawing_arrays()
authorBrian Paul <brianp@vmware.com>
Wed, 24 Jan 2018 16:14:35 +0000 (09:14 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 29 Jan 2018 15:35:14 +0000 (08:35 -0700)
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@web.de>
src/mesa/main/arrayobj.c
src/mesa/main/attrib.c
src/mesa/main/mtypes.h
src/mesa/main/varray.h
src/mesa/vbo/vbo_exec_api.c
src/mesa/vbo/vbo_exec_array.c
src/mesa/vbo/vbo_private.h
src/mesa/vbo/vbo_save_draw.c

index 0f474243a78f76e93cbebce779628a6617a49cb9..2810647c7e78834d5c05b70743fee0bfb4097518 100644 (file)
@@ -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);
index 0fdadaf0aaa63fb8125c96c8340d8d8229fd11ce..50b65c413e577ce94659c79af64f6a0abf23236c 100644 (file)
@@ -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);
 }
 
 /**
index 361b63c1c40c4f2eed400fe693524a6011f82012..9cd32c3aaa5f0a4becab4ba886ba38e7b0ab2037 100644 (file)
@@ -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;
 
index 65e0f7b56c6498c0769771f7b52633ea3a2fad35..93f2f477fafe7d9757909ff44a72c695eae9d0f5 100644 (file)
@@ -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,
index 881255ceb729a898c784bea73b9cd632f951341f..64e792bfa2c67fd27397f3dea92b3431a45c2ac6 100644 (file)
@@ -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);
index 43362db2c7c0bb62b9d100d12e85b909d14e042b..1d2f806cd5b9fd81efa2e9b000df13c058eb1699 100644 (file)
@@ -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);
index d78593c7fa21ed7e6c390ff8c3e5d6c5a0acd9e4..7c1e3c481f1858d6d731096a7f35e59404cbe8d5 100644 (file)
@@ -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.
index 60405d54eadc6ae39ba06058bf9a31ba0f065816..c86efcb05eebbded07452b061194e4416ed07ff9 100644 (file)
@@ -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...
        */