mesa: move gl_client_array*[] from vbo_draw_func into gl_context
In the future we'd like to treat vertex arrays as a state and not as a parameter to the draw function. This is the first step towards that goal. Part of the goal is to avoid array re-validation for every draw call. This commit adds: const struct gl_client_array **gl_context::Array::_DrawArrays. The pointer is changed in: * vbo_draw_method * vbo_rebase_prims - unused by gallium * vbo_split_prims - unused by gallium * st_RasterPos Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
a7ac9c9c7d
commit
50f7e75f9e
|
@ -531,7 +531,6 @@ retry:
|
|||
}
|
||||
|
||||
void brw_draw_prims( struct gl_context *ctx,
|
||||
const struct gl_client_array *arrays[],
|
||||
const struct _mesa_prim *prim,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
@ -540,6 +539,7 @@ void brw_draw_prims( struct gl_context *ctx,
|
|||
GLuint max_index,
|
||||
struct gl_transform_feedback_object *tfb_vertcount )
|
||||
{
|
||||
const struct gl_client_array **arrays = ctx->Array._DrawArrays;
|
||||
bool retval;
|
||||
|
||||
if (!_mesa_check_conditional_render(ctx))
|
||||
|
|
|
@ -35,7 +35,6 @@ struct brw_context;
|
|||
|
||||
|
||||
void brw_draw_prims( struct gl_context *ctx,
|
||||
const struct gl_client_array *arrays[],
|
||||
const struct _mesa_prim *prims,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
|
|
@ -216,7 +216,7 @@ get_max_client_stride(struct gl_context *ctx, const struct gl_client_array **arr
|
|||
}
|
||||
|
||||
static void
|
||||
TAG(vbo_render_prims)(struct gl_context *ctx, const struct gl_client_array **arrays,
|
||||
TAG(vbo_render_prims)(struct gl_context *ctx,
|
||||
const struct _mesa_prim *prims, GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
GLboolean index_bounds_valid,
|
||||
|
@ -448,7 +448,6 @@ vbo_draw_imm(struct gl_context *ctx, const struct gl_client_array **arrays,
|
|||
|
||||
static void
|
||||
TAG(vbo_render_prims)(struct gl_context *ctx,
|
||||
const struct gl_client_array **arrays,
|
||||
const struct _mesa_prim *prims, GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
GLboolean index_bounds_valid,
|
||||
|
@ -456,6 +455,7 @@ TAG(vbo_render_prims)(struct gl_context *ctx,
|
|||
struct gl_transform_feedback_object *tfb_vertcount)
|
||||
{
|
||||
struct nouveau_render_state *render = to_render_state(ctx);
|
||||
const struct gl_client_array **arrays = ctx->Array._DrawArrays;
|
||||
|
||||
if (!index_bounds_valid)
|
||||
vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index,
|
||||
|
@ -484,7 +484,6 @@ TAG(vbo_render_prims)(struct gl_context *ctx,
|
|||
|
||||
static void
|
||||
TAG(vbo_check_render_prims)(struct gl_context *ctx,
|
||||
const struct gl_client_array **arrays,
|
||||
const struct _mesa_prim *prims, GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
GLboolean index_bounds_valid,
|
||||
|
@ -496,12 +495,12 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx,
|
|||
nouveau_validate_framebuffer(ctx);
|
||||
|
||||
if (nctx->fallback == HWTNL)
|
||||
TAG(vbo_render_prims)(ctx, arrays, prims, nr_prims, ib,
|
||||
TAG(vbo_render_prims)(ctx, prims, nr_prims, ib,
|
||||
index_bounds_valid, min_index, max_index,
|
||||
tfb_vertcount);
|
||||
|
||||
if (nctx->fallback == SWTNL)
|
||||
_tnl_vbo_draw_prims(ctx, arrays, prims, nr_prims, ib,
|
||||
_tnl_vbo_draw_prims(ctx, prims, nr_prims, ib,
|
||||
index_bounds_valid, min_index, max_index,
|
||||
tfb_vertcount);
|
||||
}
|
||||
|
|
|
@ -1636,6 +1636,11 @@ struct gl_array_attrib
|
|||
|
||||
/* GL_ARB_vertex_buffer_object */
|
||||
struct gl_buffer_object *ArrayBufferObj;
|
||||
|
||||
/**
|
||||
* Vertex arrays as consumed by a driver.
|
||||
* The array pointer is set up only by the VBO module. */
|
||||
const struct gl_client_array **_DrawArrays; /**< 0..VERT_ATTRIB_MAX-1 */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -225,6 +225,7 @@ st_RasterPos(struct gl_context *ctx, const GLfloat v[4])
|
|||
struct st_context *st = st_context(ctx);
|
||||
struct draw_context *draw = st->draw;
|
||||
struct rastpos_stage *rs;
|
||||
const struct gl_client_array **saved_arrays = ctx->Array._DrawArrays;
|
||||
|
||||
if (st->rastpos_stage) {
|
||||
/* get rastpos stage info */
|
||||
|
@ -251,8 +252,10 @@ st_RasterPos(struct gl_context *ctx, const GLfloat v[4])
|
|||
rs->array[0].Ptr = (GLubyte *) v;
|
||||
|
||||
/* draw the point */
|
||||
st_feedback_draw_vbo(ctx, rs->arrays, &rs->prim, 1, NULL, GL_TRUE, 0, 1,
|
||||
ctx->Array._DrawArrays = rs->arrays;
|
||||
st_feedback_draw_vbo(ctx, &rs->prim, 1, NULL, GL_TRUE, 0, 1,
|
||||
NULL);
|
||||
ctx->Array._DrawArrays = saved_arrays;
|
||||
|
||||
/* restore draw's rasterization stage depending on rendermode */
|
||||
if (ctx->RenderMode == GL_FEEDBACK) {
|
||||
|
|
|
@ -966,7 +966,6 @@ st_validate_varrays(struct gl_context *ctx,
|
|||
*/
|
||||
void
|
||||
st_draw_vbo(struct gl_context *ctx,
|
||||
const struct gl_client_array **arrays,
|
||||
const struct _mesa_prim *prims,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
@ -979,6 +978,7 @@ st_draw_vbo(struct gl_context *ctx,
|
|||
struct pipe_context *pipe = st->pipe;
|
||||
struct pipe_index_buffer ibuffer;
|
||||
struct pipe_draw_info info;
|
||||
const struct gl_client_array **arrays = ctx->Array._DrawArrays;
|
||||
unsigned i, num_instances = 1;
|
||||
unsigned max_index_plus_base;
|
||||
GLboolean new_array =
|
||||
|
|
|
@ -49,7 +49,6 @@ void st_destroy_draw( struct st_context *st );
|
|||
|
||||
extern void
|
||||
st_draw_vbo(struct gl_context *ctx,
|
||||
const struct gl_client_array **arrays,
|
||||
const struct _mesa_prim *prims,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
@ -60,7 +59,6 @@ st_draw_vbo(struct gl_context *ctx,
|
|||
|
||||
extern void
|
||||
st_feedback_draw_vbo(struct gl_context *ctx,
|
||||
const struct gl_client_array **arrays,
|
||||
const struct _mesa_prim *prims,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
|
|
@ -91,7 +91,6 @@ set_feedback_vertex_format(struct gl_context *ctx)
|
|||
*/
|
||||
void
|
||||
st_feedback_draw_vbo(struct gl_context *ctx,
|
||||
const struct gl_client_array **arrays,
|
||||
const struct _mesa_prim *prims,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
@ -110,6 +109,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
|
|||
struct pipe_index_buffer ibuffer;
|
||||
struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS];
|
||||
struct pipe_transfer *ib_transfer = NULL;
|
||||
const struct gl_client_array **arrays = ctx->Array._DrawArrays;
|
||||
GLuint attr, i;
|
||||
const GLubyte *low_addr = NULL;
|
||||
const void *mapped_indices = NULL;
|
||||
|
|
|
@ -408,7 +408,6 @@ static void unmap_vbos( struct gl_context *ctx,
|
|||
|
||||
|
||||
void _tnl_vbo_draw_prims(struct gl_context *ctx,
|
||||
const struct gl_client_array *arrays[],
|
||||
const struct _mesa_prim *prim,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
@ -417,6 +416,8 @@ void _tnl_vbo_draw_prims(struct gl_context *ctx,
|
|||
GLuint max_index,
|
||||
struct gl_transform_feedback_object *tfb_vertcount)
|
||||
{
|
||||
const struct gl_client_array **arrays = ctx->Array._DrawArrays;
|
||||
|
||||
if (!index_bounds_valid)
|
||||
vbo_get_minmax_indices(ctx, prim, ib, &min_index, &max_index, nr_prims);
|
||||
|
||||
|
|
|
@ -86,7 +86,6 @@ _tnl_draw_prims( struct gl_context *ctx,
|
|||
|
||||
void
|
||||
_tnl_vbo_draw_prims( struct gl_context *ctx,
|
||||
const struct gl_client_array *arrays[],
|
||||
const struct _mesa_prim *prim,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
|
|
@ -72,7 +72,6 @@ void _vbo_InvalidateState( struct gl_context *ctx, GLuint new_state );
|
|||
|
||||
|
||||
typedef void (*vbo_draw_func)( struct gl_context *ctx,
|
||||
const struct gl_client_array **arrays,
|
||||
const struct _mesa_prim *prims,
|
||||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib,
|
||||
|
|
|
@ -131,6 +131,21 @@ vbo_draw_method(struct vbo_context *vbo, enum draw_method method)
|
|||
{
|
||||
if (vbo->last_draw_method != method) {
|
||||
struct gl_context *ctx = vbo->exec.ctx;
|
||||
|
||||
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:
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
ctx->Driver.UpdateState(ctx, _NEW_ARRAY);
|
||||
vbo->last_draw_method = method;
|
||||
}
|
||||
|
|
|
@ -600,7 +600,7 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
|
|||
if (primCount > 0) {
|
||||
/* draw one or two prims */
|
||||
check_buffers_are_unmapped(exec->array.inputs);
|
||||
vbo->draw_prims(ctx, exec->array.inputs, prim, primCount, NULL,
|
||||
vbo->draw_prims(ctx, prim, primCount, NULL,
|
||||
GL_TRUE, start, start + count - 1, NULL);
|
||||
}
|
||||
}
|
||||
|
@ -610,7 +610,7 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start,
|
|||
prim[0].count = count;
|
||||
|
||||
check_buffers_are_unmapped(exec->array.inputs);
|
||||
vbo->draw_prims(ctx, exec->array.inputs, prim, 1, NULL,
|
||||
vbo->draw_prims(ctx, prim, 1, NULL,
|
||||
GL_TRUE, start, start + count - 1,
|
||||
NULL);
|
||||
}
|
||||
|
@ -801,7 +801,7 @@ vbo_validated_drawrangeelements(struct gl_context *ctx, GLenum mode,
|
|||
*/
|
||||
|
||||
check_buffers_are_unmapped(exec->array.inputs);
|
||||
vbo->draw_prims( ctx, exec->array.inputs, prim, 1, &ib,
|
||||
vbo->draw_prims( ctx, prim, 1, &ib,
|
||||
index_bounds_valid, start, end, NULL );
|
||||
}
|
||||
|
||||
|
@ -1096,7 +1096,7 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
|
|||
}
|
||||
|
||||
check_buffers_are_unmapped(exec->array.inputs);
|
||||
vbo->draw_prims(ctx, exec->array.inputs, prim, primcount, &ib,
|
||||
vbo->draw_prims(ctx, prim, primcount, &ib,
|
||||
GL_FALSE, ~0, ~0, NULL);
|
||||
} else {
|
||||
/* render one prim at a time */
|
||||
|
@ -1121,7 +1121,7 @@ vbo_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
|
|||
prim[0].basevertex = 0;
|
||||
|
||||
check_buffers_are_unmapped(exec->array.inputs);
|
||||
vbo->draw_prims(ctx, exec->array.inputs, prim, 1, &ib,
|
||||
vbo->draw_prims(ctx, prim, 1, &ib,
|
||||
GL_FALSE, ~0, ~0, NULL);
|
||||
}
|
||||
}
|
||||
|
@ -1199,7 +1199,7 @@ vbo_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
|
|||
* will be rendered. */
|
||||
|
||||
check_buffers_are_unmapped(exec->array.inputs);
|
||||
vbo->draw_prims(ctx, exec->array.inputs, prim, 1, NULL,
|
||||
vbo->draw_prims(ctx, prim, 1, NULL,
|
||||
GL_TRUE, 0, 0, obj);
|
||||
}
|
||||
|
||||
|
|
|
@ -407,8 +407,7 @@ vbo_exec_vtx_flush(struct vbo_exec_context *exec, GLboolean keepUnmapped)
|
|||
exec->vtx.vert_count);
|
||||
|
||||
vbo_context(ctx)->draw_prims( ctx,
|
||||
exec->vtx.inputs,
|
||||
exec->vtx.prim,
|
||||
exec->vtx.prim,
|
||||
exec->vtx.prim_count,
|
||||
NULL,
|
||||
GL_TRUE,
|
||||
|
|
|
@ -129,6 +129,7 @@ void vbo_rebase_prims( struct gl_context *ctx,
|
|||
|
||||
struct _mesa_index_buffer tmp_ib;
|
||||
struct _mesa_prim *tmp_prims = NULL;
|
||||
const struct gl_client_array **saved_arrays = ctx->Array._DrawArrays;
|
||||
void *tmp_indices = NULL;
|
||||
GLuint i;
|
||||
|
||||
|
@ -226,15 +227,18 @@ void vbo_rebase_prims( struct gl_context *ctx,
|
|||
|
||||
/* Re-issue the draw call.
|
||||
*/
|
||||
ctx->Array._DrawArrays = tmp_array_pointers;
|
||||
|
||||
draw( ctx,
|
||||
tmp_array_pointers,
|
||||
prim,
|
||||
prim,
|
||||
nr_prims,
|
||||
ib,
|
||||
GL_TRUE,
|
||||
0,
|
||||
max_index - min_index,
|
||||
NULL );
|
||||
|
||||
ctx->Array._DrawArrays = saved_arrays;
|
||||
|
||||
if (tmp_indices)
|
||||
free(tmp_indices);
|
||||
|
|
|
@ -312,8 +312,7 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
|
|||
|
||||
if (node->count > 0) {
|
||||
vbo_context(ctx)->draw_prims(ctx,
|
||||
save->inputs,
|
||||
node->prim,
|
||||
node->prim,
|
||||
node->prim_count,
|
||||
NULL,
|
||||
GL_TRUE,
|
||||
|
|
|
@ -171,6 +171,8 @@ dump_draw_info(struct gl_context *ctx,
|
|||
static void
|
||||
flush( struct copy_context *copy )
|
||||
{
|
||||
struct gl_context *ctx = copy->ctx;
|
||||
const struct gl_client_array **saved_arrays = ctx->Array._DrawArrays;
|
||||
GLuint i;
|
||||
|
||||
/* Set some counters:
|
||||
|
@ -189,8 +191,9 @@ flush( struct copy_context *copy )
|
|||
(void) dump_draw_info;
|
||||
#endif
|
||||
|
||||
copy->draw( copy->ctx,
|
||||
copy->dstarray_ptr,
|
||||
ctx->Array._DrawArrays = copy->dstarray_ptr;
|
||||
|
||||
copy->draw( ctx,
|
||||
copy->dstprim,
|
||||
copy->dstprim_nr,
|
||||
©->dstib,
|
||||
|
@ -199,6 +202,8 @@ flush( struct copy_context *copy )
|
|||
copy->dstbuf_nr - 1,
|
||||
NULL );
|
||||
|
||||
ctx->Array._DrawArrays = saved_arrays;
|
||||
|
||||
/* Reset all pointers:
|
||||
*/
|
||||
copy->dstprim_nr = 0;
|
||||
|
|
|
@ -62,6 +62,8 @@ struct split_context {
|
|||
|
||||
static void flush_vertex( struct split_context *split )
|
||||
{
|
||||
struct gl_context *ctx = split->ctx;
|
||||
const struct gl_client_array **saved_arrays = ctx->Array._DrawArrays;
|
||||
struct _mesa_index_buffer ib;
|
||||
GLuint i;
|
||||
|
||||
|
@ -82,8 +84,9 @@ static void flush_vertex( struct split_context *split )
|
|||
|
||||
assert(split->max_index >= split->min_index);
|
||||
|
||||
split->draw(split->ctx,
|
||||
split->array,
|
||||
ctx->Array._DrawArrays = split->array;
|
||||
|
||||
split->draw(ctx,
|
||||
split->dstprim,
|
||||
split->dstprim_nr,
|
||||
split->ib ? &ib : NULL,
|
||||
|
@ -92,6 +95,8 @@ static void flush_vertex( struct split_context *split )
|
|||
split->max_index,
|
||||
NULL);
|
||||
|
||||
ctx->Array._DrawArrays = saved_arrays;
|
||||
|
||||
split->dstprim_nr = 0;
|
||||
split->min_index = ~0;
|
||||
split->max_index = 0;
|
||||
|
|
Loading…
Reference in New Issue