On 02/15/2018 12:55 PM, mathias.froehl...@gmx.net wrote:
From: Mathias Fröhlich <mathias.froehl...@web.de>

Provided the _DrawVAO and the derived state that is
maintained if we have the _DrawVAO set, implement a
method to incrementally update the array of
gl_vertex_array input pointers.

Signed-off-by: Mathias Fröhlich <mathias.froehl...@web.de>
---
  src/mesa/vbo/vbo.h         | 28 +++++++++++++++++
  src/mesa/vbo/vbo_context.c |  1 +
  src/mesa/vbo/vbo_exec.c    | 76 ++++++++++++++++++++++++++++++++++++++++++++++
  src/mesa/vbo/vbo_private.h |  2 ++
  4 files changed, 107 insertions(+)

diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
index d594ba8f6a..bb8ab7a745 100644
--- a/src/mesa/vbo/vbo.h
+++ b/src/mesa/vbo/vbo.h
@@ -254,6 +254,34 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
                           const struct _mesa_index_buffer *ib,
                           struct gl_buffer_object *indirect);
+
+/**
+ * Utility that tracks and updates the current array entries.
+ */
+struct vbo_inputs
+{
+   const struct gl_vertex_array *inputs[VERT_ATTRIB_MAX];
+   GLbitfield current;

/* Can you put a comment on the 'current' field?

+   gl_vertex_processing_mode vertex_processing_mode;
+};
+
+
+/**
+ * Initialize inputs.
+ */
+void
+_vbo_array_init(struct vbo_inputs *inputs);
+
+
+/**
+ * Update the gl_vertex_array array inside the vbo_inputs structure
+ * provided the current _VPMode, the provided vao and
+ * the vao's enabled arrays filtered by the filter bitmask.
+ */
+void
+_vbo_update_inputs(struct gl_context *ctx, struct vbo_inputs *inputs);

If that struct and the two prototypes aren't going to be used outside the VBO module, they should go into vbo_private.h


+
+
  void GLAPIENTRY
  _es_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a);
diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c
index 5bc6bf0acd..cc9cbffc51 100644
--- a/src/mesa/vbo/vbo_context.c
+++ b/src/mesa/vbo/vbo_context.c
@@ -234,6 +234,7 @@ _vbo_CreateContext(struct gl_context *ctx)
     init_legacy_currval(ctx);
     init_generic_currval(ctx);
     init_mat_currval(ctx);
+   _vbo_array_init(&vbo->array);
     vbo_set_indirect_draw_func(ctx, vbo_draw_indirect_prims);
/* make sure all VBO_ATTRIB_ values can fit in an unsigned byte */
diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c
index 372d0237aa..c5f01e3e4d 100644
--- a/src/mesa/vbo/vbo_exec.c
+++ b/src/mesa/vbo/vbo_exec.c
@@ -27,6 +27,7 @@
#include "main/glheader.h"
+#include "main/arrayobj.h"
  #include "main/mtypes.h"
  #include "main/api_arrayelt.h"
  #include "main/vtxfmt.h"
@@ -240,3 +241,78 @@ vbo_merge_prims(struct _mesa_prim *p0, const struct 
_mesa_prim *p1)
     p0->count += p1->count;
     p0->end = p1->end;
  }
+
+
+void
+_vbo_array_init(struct vbo_inputs *inputs)

The function name doesn't seem to really match what it does. Maybe _vbo_init_inputs() ?


+{
+   inputs->current = 0;
+   inputs->vertex_processing_mode = VP_MODE_FF;
+}
+
+
+/**
+ * Update those gl_vertex_array array inside the vbo_inputs structure
+ * from the enable bits pointing into the provided vao.
+ */
+static inline void
+update_vao_inputs(struct gl_context *ctx,
+                  struct vbo_inputs *inputs, GLbitfield enable)
+{
+   const struct gl_vertex_array_object *vao = ctx->Array._DrawVAO;
+
+   /* Make sure we process only arrays enabled in the VAO */
+   assert((enable & ~_mesa_get_vao_vp_inputs(vao)) == 0);
+
+   /* Fill in the client arrays from the VAO */
+   const GLubyte *const map = _mesa_vao_attribute_map[vao->_AttributeMapMode];
+   const struct gl_vertex_array *array = vao->_VertexArray;
+   const struct gl_vertex_array **iarray = &inputs->inputs[0];
+   while (enable) {
+      const int attr = u_bit_scan(&enable);
+      iarray[attr] = &array[map[attr]];
+   }
+}
+
+
+/**
+ * Update those gl_vertex_array array inside the vbo_inputs structure
+ * from the current bits pointing into the current values.

How about:

Update the vbo_inputs's arrays to point to the vbo->currval arrays according to the 'current' bitmask.
\param current  bitfield of VERT_BIT_x flags.

+ */
+static inline void
+update_current_inputs(struct gl_context *ctx,
+                      struct vbo_inputs *inputs, GLbitfield current)
+{
+   gl_vertex_processing_mode mode = ctx->VertexProgram._VPMode;
+
+   /* All previously non current array pointers need update. */
+   GLbitfield mask = current & ~inputs->current;
+   /* On mode change, the slots aliasing with materials need update too */
+   if (mode != inputs->vertex_processing_mode)
+      mask |= current & VERT_BIT_MAT_ALL;
+
+   struct vbo_context *vbo = vbo_context(ctx);
+   const struct gl_vertex_array *const currval = &vbo->currval[0];
+   const struct gl_vertex_array **iarray = &inputs->inputs[0];
+   const GLubyte *const map = _vbo_attribute_alias_map[mode];
+   while (mask) {
+      const int attr = u_bit_scan(&mask);
+      iarray[attr] = &currval[map[attr]];
+   }
+
+   inputs->current = current;
+   inputs->vertex_processing_mode = mode;
+}
+
+
+void
+_vbo_update_inputs(struct gl_context *ctx, struct vbo_inputs *inputs)

Please put a comment on this function too.


+{
+   const GLbitfield enable = ctx->Array._DrawVAOEnabled;
+
+   /* Update array input pointers */
+   update_vao_inputs(ctx, inputs, enable);
+
+   /* The rest must be current inputs. */
+   update_current_inputs(ctx, inputs, ~enable & VERT_BIT_ALL);

The & VERT_BIT_ALL isn't really needed, is it? I guess there's no harm though.


+}
diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h
index 49922892e5..545daa3b87 100644
--- a/src/mesa/vbo/vbo_private.h
+++ b/src/mesa/vbo/vbo_private.h
@@ -44,6 +44,8 @@ struct _mesa_prim;
struct vbo_context {
     struct gl_vertex_array currval[VBO_ATTRIB_MAX];
+   /* The array of inputs used for _DrawVAO draws. */
+   struct vbo_inputs array;

draw_arrays?


struct vbo_exec_context exec;
     struct vbo_save_context save;


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to