From: Mathias Fröhlich <mathias.froehl...@web.de> The merge_inputs function handles that part that changes when the inputs change. The clear_buffers function triggers when we may need a new upload. Thus the merge_inputs can be limited to be once per brw_draw_prims.
Signed-off-by: Mathias Fröhlich <mathias.froehl...@web.de> --- src/mesa/drivers/dri/i965/brw_draw.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index ae3b7be2dd..2a7562a684 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -278,21 +278,34 @@ brw_emit_prim(struct brw_context *brw, static void -brw_merge_inputs(struct brw_context *brw) +brw_clear_buffers(struct brw_context *brw) { - const struct gen_device_info *devinfo = &brw->screen->devinfo; - const struct gl_context *ctx = &brw->ctx; - GLuint i; - - for (i = 0; i < brw->vb.nr_buffers; i++) { + for (unsigned i = 0; i < brw->vb.nr_buffers; ++i) { brw_bo_unreference(brw->vb.buffers[i].bo); brw->vb.buffers[i].bo = NULL; } brw->vb.nr_buffers = 0; + for (unsigned i = 0; i < brw->vb.nr_enabled; ++i) { + brw->vb.enabled[i]->buffer = -1; + } +#ifndef NDEBUG + for (unsigned i = 0; i < VERT_ATTRIB_MAX; i++) { + assert(brw->vb.inputs[i].buffer == -1); + } +#endif +} + + +static void +brw_merge_inputs(struct brw_context *brw) +{ + const struct gen_device_info *devinfo = &brw->screen->devinfo; + const struct gl_context *ctx = &brw->ctx; + GLuint i; + for (i = 0; i < VERT_ATTRIB_MAX; i++) { struct brw_vertex_element *input = &brw->vb.inputs[i]; - input->buffer = -1; _mesa_draw_attrib_and_binding(ctx, i, &input->glattrib, &input->glbinding); } @@ -746,6 +759,7 @@ brw_prepare_drawing(struct gl_context *ctx, /* Bind all inputs, derive varying and size information: */ + brw_clear_buffers(brw); brw_merge_inputs(brw); brw->ib.ib = ib; @@ -810,7 +824,7 @@ brw_draw_single_prim(struct gl_context *ctx, brw->baseinstance = prim->base_instance; if (prim_id > 0) { /* For i == 0 we just did this before the loop */ brw->ctx.NewDriverState |= BRW_NEW_VERTICES; - brw_merge_inputs(brw); + brw_clear_buffers(brw); } } -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev