On 09/10/2014 03:41 PM, Kenneth Graunke wrote: > In the non-indirect draw case, we call intel_upload_data to upload > gl_BaseVertex. It makes brw->draw.draw_params_bo point to the upload > buffer, and increments the upload BO reference count. > > So, we need to unreference it when making brw->draw.draw_params_bo point > at something else, or else we'll retain a reference to stale upload > buffers and hold on to them forever. > > This also means that the indirect case should increment the reference > count on the indirect draw buffer when making brw->draw.draw_params_bo > point at it. That way, both paths increment the reference count, so > we can safely unreference it every time. > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > Cc: "10.3" <mesa-sta...@lists.freedesktop.org> > --- > src/mesa/drivers/dri/i965/brw_draw.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/src/mesa/drivers/dri/i965/brw_draw.c > b/src/mesa/drivers/dri/i965/brw_draw.c > index efa85de..b28eaf2 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw.c > +++ b/src/mesa/drivers/dri/i965/brw_draw.c > @@ -434,10 +434,13 @@ static bool brw_try_draw_prims( struct gl_context *ctx, > brw->draw.start_vertex_location = prims[i].start; > brw->draw.base_vertex_location = prims[i].basevertex; > > + drm_intel_bo_unreference(brw->draw.draw_params_bo); > + > if (prims[i].is_indirect) { > /* Point draw_params_bo at the indirect buffer. */ > brw->draw.draw_params_bo = > intel_buffer_object(ctx->DrawIndirectBuffer)->buffer; > + drm_intel_bo_reference(brw->draw.draw_params_bo);
Is there are a race here, or do we know that the reference count is at least two when we unreference above? > brw->draw.draw_params_offset = > prims[i].indirect_offset + (prims[i].indexed ? 12 : 8); > } else { > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev