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>
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,
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,
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,
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,
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);
}
/* 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);
}
/* 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,
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;
*/
_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);
}
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;
/* 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,
max_index - min_index,
NULL, 0, NULL );
- ctx->Array._DrawArrays = saved_arrays;
- ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-
free(tmp_indices);
free(tmp_prims);
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,
* 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
* 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,
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:
(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,
©->dstib,
copy->dstbuf_nr - 1,
NULL, 0, NULL);
- ctx->Array._DrawArrays = saved_arrays;
- ctx->NewDriverState |= ctx->DriverFlags.NewArray;
-
/* Reset all pointers:
*/
copy->dstprim_nr = 0;
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;
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,
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;