mesa: Introduce a yet unused _DrawVAO.
authorMathias Fröhlich <mathias.froehlich@web.de>
Wed, 24 Aug 2016 06:45:05 +0000 (08:45 +0200)
committerMathias Fröhlich <mathias.froehlich@web.de>
Fri, 23 Feb 2018 04:33:43 +0000 (05:33 +0100)
During the patch series this VAO gets populated with either the currently
bound VAO or an internal VAO that will be used for immediate mode and
dlist rendering.

v2: More comments about the _DrawVAO, filter and enabled mask.
    Rename _DrawVAOEnabled to _DrawVAOEnabledAttribs.
v3: Fix and move comment.

Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/main/arrayobj.c
src/mesa/main/attrib.c
src/mesa/main/context.c
src/mesa/main/mtypes.h
src/mesa/main/state.c
src/mesa/main/state.h
src/mesa/main/varray.c

index a6fa33c82c8033d390c52839e0862e07361be911..cf9c5d7ecc7e7e47e41cf76c06df5acf18de8ad0 100644 (file)
@@ -49,6 +49,7 @@
 #include "arrayobj.h"
 #include "macros.h"
 #include "mtypes.h"
+#include "state.h"
 #include "varray.h"
 #include "main/dispatch.h"
 #include "util/bitscan.h"
@@ -578,6 +579,7 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, bool no_error)
     * deleted.
     */
    _mesa_set_drawing_arrays(ctx, NULL);
+   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
 
    ctx->NewState |= _NEW_ARRAY;
    _mesa_reference_vao(ctx, &ctx->Array.VAO, newObj);
@@ -629,6 +631,8 @@ delete_vertex_arrays(struct gl_context *ctx, GLsizei n, const GLuint *ids)
 
          if (ctx->Array.LastLookedUpVAO == obj)
             _mesa_reference_vao(ctx, &ctx->Array.LastLookedUpVAO, NULL);
+         if (ctx->Array._DrawVAO == obj)
+            _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
 
          /* Unreference the array object. 
           * If refcount hits zero, the object will be deleted.
index 398ff653b73e9415a2c8fb37a335304b9ba37974..dd6b98ce043813260c4f17147ef84d55f1e11d79 100644 (file)
@@ -57,6 +57,7 @@
 #include "viewport.h"
 #include "mtypes.h"
 #include "main/dispatch.h"
+#include "state.h"
 #include "hash.h"
 #include <stdbool.h>
 
@@ -1548,6 +1549,7 @@ copy_array_attrib(struct gl_context *ctx,
 
    /* Invalidate array state. It will be updated during the next draw. */
    _mesa_set_drawing_arrays(ctx, NULL);
+   _mesa_set_draw_vao(ctx, ctx->Array._EmptyVAO, 0);
 }
 
 /**
index 0aa2e3639f0846f948eb9ef57939895f9b524f2c..e13343b5e6c471f602473d8a1a0bd3c762de858d 100644 (file)
@@ -1335,6 +1335,8 @@ _mesa_free_context_data( struct gl_context *ctx )
 
    _mesa_reference_vao(ctx, &ctx->Array.VAO, NULL);
    _mesa_reference_vao(ctx, &ctx->Array.DefaultVAO, NULL);
+   _mesa_reference_vao(ctx, &ctx->Array._EmptyVAO, NULL);
+   _mesa_reference_vao(ctx, &ctx->Array._DrawVAO, NULL);
 
    _mesa_free_attrib_data(ctx);
    _mesa_free_buffer_objects(ctx);
index 41df04d38d42075e6f370f238ef241320ff3d7e1..bdecd422a9af888e94f687904f92b3f77a6cbf74 100644 (file)
@@ -1691,6 +1691,28 @@ struct gl_array_attrib
    /* GL_ARB_vertex_buffer_object */
    struct gl_buffer_object *ArrayBufferObj;
 
+   /**
+    * Vertex array object that is used with the currently active draw command.
+    * The _DrawVAO is either set to the currently bound VAO for array type
+    * draws or to internal VAO's set up by the vbo module to execute immediate
+    * mode or display list draws.
+    */
+   struct gl_vertex_array_object *_DrawVAO;
+   /**
+    * The VERT_BIT_* bits effectively enabled from the current _DrawVAO.
+    * This is always a subset of _mesa_get_vao_vp_inputs(_DrawVAO)
+    * but may omit those arrays that shall not be referenced by the current
+    * gl_vertex_program_state::_VPMode. For example the generic attributes are
+    * maked out form the _DrawVAO's enabled arrays when a fixed function
+    * array draw is executed.
+    */
+   GLbitfield _DrawVAOEnabledAttribs;
+   /**
+    * Initially or if the VAO referenced by _DrawVAO is deleted the _DrawVAO
+    * pointer is set to the _EmptyVAO which is just an empty VAO all the time.
+    */
+   struct gl_vertex_array_object *_EmptyVAO;
+
    /**
     * Vertex arrays as consumed by a driver.
     * The array pointer is set up only by the VBO module.
index 2fd4fb9d3238d999547b10277a5a267e0869962c..6dd7a7ec07516b43f0353e7d9226f12155f95609 100644 (file)
@@ -479,3 +479,32 @@ _mesa_update_vertex_processing_mode(struct gl_context *ctx)
    else
       ctx->VertexProgram._VPMode = VP_MODE_FF;
 }
+
+
+/**
+ * Set the _DrawVAO and the net enabled arrays.
+ * The vao->_Enabled bitmask is transformed due to position/generic0
+ * as stored in vao->_AttributeMapMode. Then the filter bitmask is applied
+ * to filter out arrays unwanted for the currently executed draw operation.
+ * For example, the generic attributes are masked out form the _DrawVAO's
+ * enabled arrays when a fixed function array draw is executed.
+ */
+void
+_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
+                   GLbitfield filter)
+{
+   struct gl_vertex_array_object **ptr = &ctx->Array._DrawVAO;
+   if (*ptr != vao) {
+      _mesa_reference_vao_(ctx, ptr, vao);
+      ctx->NewDriverState |= ctx->DriverFlags.NewArray;
+   } else if (vao->NewArrays) {
+      ctx->NewDriverState |= ctx->DriverFlags.NewArray;
+   }
+
+   /* May shuffle the position and generic0 bits around, filter out unwanted */
+   const GLbitfield enabled = filter & _mesa_get_vao_vp_inputs(vao);
+   if (ctx->Array._DrawVAOEnabledAttribs != enabled)
+      ctx->NewDriverState |= ctx->DriverFlags.NewArray;
+   ctx->Array._DrawVAOEnabledAttribs = enabled;
+   _mesa_set_varying_vp_inputs(ctx, enabled);
+}
index 049166578c2be549c0cbe863730026c29c8e845f..589c6650add7734a37e6ee1c283f30a89073af30 100644 (file)
@@ -53,6 +53,14 @@ extern void
 _mesa_update_vertex_processing_mode(struct gl_context *ctx);
 
 
+/**
+ * Set the _DrawVAO and the net enabled arrays.
+ */
+void
+_mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
+                   GLbitfield filter);
+
+
 static inline bool
 _mesa_ati_fragment_shader_enabled(const struct gl_context *ctx)
 {
index d55f74e968fa050c6dfc54a367084d38e3045ffe..fc9e6fb6ba5b92480557342e430c1b1f4283160f 100644 (file)
@@ -2925,6 +2925,8 @@ _mesa_init_varray(struct gl_context *ctx)
 {
    ctx->Array.DefaultVAO = _mesa_new_vao(ctx, 0);
    _mesa_reference_vao(ctx, &ctx->Array.VAO, ctx->Array.DefaultVAO);
+   ctx->Array._EmptyVAO = _mesa_new_vao(ctx, ~0u);
+   _mesa_reference_vao(ctx, &ctx->Array._DrawVAO, ctx->Array._EmptyVAO);
    ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
 
    ctx->Array.Objects = _mesa_NewHashTable();