From: Mathias Fröhlich Date: Tue, 11 Dec 2018 17:45:43 +0000 (+0100) Subject: i965: Split merge_inputs and clear_buffers. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e53fd073beabfa36338fa349dedfa83e0d0a4d92;p=mesa.git i965: Split merge_inputs and clear_buffers. 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. v2: Move declaration of attribute index into the for scope. Reviewed-by: Matt Turner Reviewed-by: Ian Romanick Signed-off-by: Mathias Fröhlich Part-of: --- diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index 2b702297a68..0952687fd06 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -282,21 +282,33 @@ 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 (i = 0; i < VERT_ATTRIB_MAX; i++) { + 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; + + for (unsigned 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); } @@ -309,8 +321,8 @@ brw_merge_inputs(struct brw_context *brw) while (mask) { const struct gl_vertex_format *glformat; uint8_t wa_flags = 0; + const gl_vert_attrib i = u_bit_scan64(&mask); - i = u_bit_scan64(&mask); glformat = &brw->vb.inputs[i].glattrib->Format; switch (glformat->Type) { @@ -852,6 +864,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; @@ -990,7 +1003,7 @@ brw_draw_single_prim(struct gl_context *ctx, brw->baseinstance = 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); } }