vbo: Readd the arrays argument to the legacy draw methods.
authorMathias Fröhlich <mathias.froehlich@web.de>
Sun, 25 Mar 2018 17:16:54 +0000 (19:16 +0200)
committerMathias Fröhlich <Mathias.Froehlich@gmx.net>
Sat, 31 Mar 2018 04:32:14 +0000 (06:32 +0200)
The legacy draw paths from back before 2012 contained a gl_vertex_array
array for the inputs to be used for draw. So all draw methods from legacy
drivers and everything that goes through tnl are originally written
for this calling convention. The same goes for tools like t_rebase or
vbo_split*, that even partly still have the original calling convention
with a currently unused such pointer.
Back in 2012 patch 50f7e75

mesa: move gl_client_array*[] from vbo_draw_func into gl_context

introduced Array._DrawArrays, which was something that was IMO aiming for
a similar direction than Array._DrawVAO introduced recently.
Now several tools like t_rebase and vbo_split*, which are mostly used by
tnl based drivers, would need to be converted to use the internal
Array._DrawVAO instead of Array._DrawArrays. The same goes for the driver
backends that use any of these tools.
Alternatively we can reintroduce the gl_vertex_array array in its call
argument list and put these tools finally into the tnl directory.
So this change reintroduces this gl_vertex_array array for the legacy
draw paths that are still required for the tools t_rebase and vbo_split*.
A followup will move vbo_split also into tnl.

Note that none of the affected drivers use the DriverFlags.NewArray
driver bit. So it should be safe to remove this also for the legacy
draw path.

Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
src/mesa/tnl/t_draw.c
src/mesa/tnl/t_rebase.c
src/mesa/tnl/tnl.h
src/mesa/vbo/vbo.h
src/mesa/vbo/vbo_split_copy.c
src/mesa/vbo/vbo_split_inplace.c

index 10b5c15e41da96c793458da75b0606c0ec92a15b..4533069692c1235a2a10a49523776fed7a808720 100644 (file)
@@ -239,6 +239,7 @@ get_max_client_stride(struct gl_context *ctx, const struct gl_vertex_array *arra
 
 static void
 TAG(vbo_render_prims)(struct gl_context *ctx,
+                     const struct gl_vertex_array *arrays,
                      const struct _mesa_prim *prims, GLuint nr_prims,
                      const struct _mesa_index_buffer *ib,
                      GLboolean index_bounds_valid,
@@ -476,6 +477,7 @@ vbo_draw_imm(struct gl_context *ctx, const struct gl_vertex_array *arrays,
 
 static void
 TAG(vbo_render_prims)(struct gl_context *ctx,
+                     const struct gl_vertex_array *arrays,
                      const struct _mesa_prim *prims, GLuint nr_prims,
                      const struct _mesa_index_buffer *ib,
                      GLboolean index_bounds_valid,
@@ -485,7 +487,6 @@ TAG(vbo_render_prims)(struct gl_context *ctx,
                      struct gl_buffer_object *indirect)
 {
        struct nouveau_render_state *render = to_render_state(ctx);
-       const struct gl_vertex_array *arrays = ctx->Array._DrawArrays;
 
        if (!index_bounds_valid)
                vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index,
@@ -514,6 +515,7 @@ TAG(vbo_render_prims)(struct gl_context *ctx,
 
 static void
 TAG(vbo_check_render_prims)(struct gl_context *ctx,
+                           const struct gl_vertex_array *arrays,
                            const struct _mesa_prim *prims, GLuint nr_prims,
                            const struct _mesa_index_buffer *ib,
                            GLboolean index_bounds_valid,
@@ -527,12 +529,12 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx,
        nouveau_validate_framebuffer(ctx);
 
        if (nctx->fallback == HWTNL)
-               TAG(vbo_render_prims)(ctx, prims, nr_prims, ib,
+               TAG(vbo_render_prims)(ctx, arrays, prims, nr_prims, ib,
                                      index_bounds_valid, min_index, max_index,
                                      tfb_vertcount, stream, indirect);
 
        if (nctx->fallback == SWTNL)
-               _tnl_draw_prims(ctx, prims, nr_prims, ib,
+               _tnl_draw_prims(ctx, arrays, prims, nr_prims, ib,
                                index_bounds_valid, min_index, max_index,
                                tfb_vertcount, stream, indirect);
 }
@@ -550,7 +552,8 @@ TAG(vbo_draw)(struct gl_context *ctx,
        /* Borrow and update the inputs list from the tnl context */
        _tnl_bind_inputs(ctx);
 
-       TAG(vbo_check_render_prims)(ctx, prims, nr_prims, ib,
+       TAG(vbo_check_render_prims)(ctx, ctx->Array._DrawArrays,
+                                   prims, nr_prims, ib,
                                    index_bounds_valid, min_index, max_index,
                                    tfb_vertcount, stream, indirect);
 }
index 96d6b988d3efffbbfd11c8e2c21983c175f749f8..a0fd58432a1db46f14019ddc0ec9fe4443f10d59 100644 (file)
@@ -426,6 +426,7 @@ static void unmap_vbos( struct gl_context *ctx,
 /* This is the main workhorse doing all the rendering work.
  */
 void _tnl_draw_prims(struct gl_context *ctx,
+                     const struct gl_vertex_array *arrays,
                         const struct _mesa_prim *prim,
                         GLuint nr_prims,
                         const struct _mesa_index_buffer *ib,
@@ -437,7 +438,6 @@ void _tnl_draw_prims(struct gl_context *ctx,
                         struct gl_buffer_object *indirect)
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx);
-   const struct gl_vertex_array *arrays = ctx->Array._DrawArrays;
    const GLuint TEST_SPLIT = 0;
    const GLint max = TEST_SPLIT ? 8 : tnl->vb.Size - MAX_CLIPPED_VERTICES;
    GLint max_basevertex = prim->basevertex;
@@ -563,8 +563,9 @@ _tnl_draw(struct gl_context *ctx,
     */
    _tnl_bind_inputs(ctx);
 
-   _tnl_draw_prims(ctx, prim, nr_prims, ib, index_bounds_valid,
-                   min_index, max_index, tfb_vertcount, stream, indirect);
+   _tnl_draw_prims(ctx, ctx->Array._DrawArrays, prim, nr_prims, ib,
+                   index_bounds_valid, min_index, max_index,
+                   tfb_vertcount, stream, indirect);
 }
 
 
index 0fcee03b24bb856996bebc15d245b475cd5c198b..19e759f44be9c946fb78ff19efd78ab3e8295897 100644 (file)
@@ -115,7 +115,6 @@ void t_rebase_prims( struct gl_context *ctx,
 
    struct _mesa_index_buffer tmp_ib;
    struct _mesa_prim *tmp_prims = NULL;
-   const struct gl_vertex_array *saved_arrays = ctx->Array._DrawArrays;
    void *tmp_indices = NULL;
    GLuint i;
 
@@ -233,10 +232,8 @@ void t_rebase_prims( struct gl_context *ctx,
    
    /* Re-issue the draw call.
     */
-   ctx->Array._DrawArrays = tmp_arrays;
-   ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-
-   draw( ctx, 
+   draw( ctx,
+         tmp_arrays,
         prim,
         nr_prims, 
         ib, 
@@ -245,9 +242,6 @@ void t_rebase_prims( struct gl_context *ctx,
         max_index - min_index,
         NULL, 0, NULL );
 
-   ctx->Array._DrawArrays = saved_arrays;
-   ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-   
    free(tmp_indices);
    
    free(tmp_prims);
index 14e590501efe06a6b075a531bd1e3b1615337221..e79c4f620484eb68021aab5ef2eef4008103237e 100644 (file)
@@ -83,6 +83,7 @@ struct _mesa_index_buffer;
 
 void
 _tnl_draw_prims(struct gl_context *ctx,
+                const struct gl_vertex_array *arrays,
                     const struct _mesa_prim *prim,
                     GLuint nr_prims,
                     const struct _mesa_index_buffer *ib,
index 13f77d9db3754d5bc23fdef99d32d845f0d474fb..37aa59d306192827aead4ffdb6c0fb6da8bcd5f7 100644 (file)
@@ -145,6 +145,7 @@ vbo_save_EndCallList(struct gl_context *ctx);
  * Draw a number of primitives.
  * \param prims  array [nr_prims] describing what to draw (prim type,
  *               vertex count, first index, instance count, etc).
+ * \param arrays array of vertex arrays for draw
  * \param ib  index buffer for indexed drawing, NULL for array drawing
  * \param index_bounds_valid  are min_index and max_index valid?
  * \param min_index  lowest vertex index used
@@ -158,6 +159,7 @@ vbo_save_EndCallList(struct gl_context *ctx);
  *                  This may be deprecated in the future
  */
 typedef void (*vbo_draw_func)(struct gl_context *ctx,
+                              const struct gl_vertex_array* arrays,
                               const struct _mesa_prim *prims,
                               GLuint nr_prims,
                               const struct _mesa_index_buffer *ib,
index 96828a073fee7b938c389006fea9895f4d091835..2aab670de1e2fc0b511b68158088c0ec49a7283f 100644 (file)
@@ -179,7 +179,6 @@ static void
 flush(struct copy_context *copy)
 {
    struct gl_context *ctx = copy->ctx;
-   const struct gl_vertex_array *saved_arrays = ctx->Array._DrawArrays;
    GLuint i;
 
    /* Set some counters:
@@ -198,10 +197,8 @@ flush(struct copy_context *copy)
    (void) dump_draw_info;
 #endif
 
-   ctx->Array._DrawArrays = copy->dstarray;
-   ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-
    copy->draw(ctx,
+              copy->dstarray,
               copy->dstprim,
               copy->dstprim_nr,
               &copy->dstib,
@@ -210,9 +207,6 @@ flush(struct copy_context *copy)
               copy->dstbuf_nr - 1,
               NULL, 0, NULL);
 
-   ctx->Array._DrawArrays = saved_arrays;
-   ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-
    /* Reset all pointers:
     */
    copy->dstprim_nr = 0;
index 971c52a078c4fbbd568194fa6925891c9b2b00ff..b63c05c75f06cbd47a777e0e1cd4c3f7b86acfa6 100644 (file)
@@ -63,7 +63,6 @@ static void
 flush_vertex( struct split_context *split)
 {
    struct gl_context *ctx = split->ctx;
-   const struct gl_vertex_array *saved_arrays = ctx->Array._DrawArrays;
    struct _mesa_index_buffer ib;
    GLuint i;
 
@@ -84,10 +83,8 @@ flush_vertex( struct split_context *split)
 
    assert(split->max_index >= split->min_index);
 
-   ctx->Array._DrawArrays = split->array;
-   ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-
    split->draw(ctx,
+               split->array,
                split->dstprim,
                split->dstprim_nr,
                split->ib ? &ib : NULL,
@@ -96,9 +93,6 @@ flush_vertex( struct split_context *split)
                split->max_index,
                NULL, 0, NULL);
 
-   ctx->Array._DrawArrays = saved_arrays;
-   ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-
    split->dstprim_nr = 0;
    split->min_index = ~0;
    split->max_index = 0;