[Mesa-dev] [PATCH 03/18] i965: Share the workaround bo between all contexts
Chris Wilson
chris at chris-wilson.co.uk
Mon Jul 6 07:47:36 PDT 2015
On Mon, Jul 06, 2015 at 04:29:49PM +0300, Martin Peres wrote:
>
>
> On 06/07/15 13:33, Chris Wilson wrote:
> >Since the workaround bo is used strictly as a write-only buffer, we need
> >only allocate one per screen and use the same one from all contexts.
> >
> >(The caveat here is during extension initialisation, where we write into
> >and read back register values from the buffer, but that is performed only
> >once for the first context - and baring synchronisation issues should not
> >be a problem. Safer would be to move that also to the screen.)
> >
> >Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> >---
> > src/mesa/drivers/dri/i965/brw_pipe_control.c | 6 +++---
> > src/mesa/drivers/dri/i965/intel_screen.c | 4 ++++
> > src/mesa/drivers/dri/i965/intel_screen.h | 1 +
> > 3 files changed, 8 insertions(+), 3 deletions(-)
> >
> >diff --git a/src/mesa/drivers/dri/i965/brw_pipe_control.c b/src/mesa/drivers/dri/i965/brw_pipe_control.c
> >index 7ee3cb6..05e14cd 100644
> >--- a/src/mesa/drivers/dri/i965/brw_pipe_control.c
> >+++ b/src/mesa/drivers/dri/i965/brw_pipe_control.c
> >@@ -341,12 +341,12 @@ brw_init_pipe_control(struct brw_context *brw,
> > * the gen6 workaround because it involves actually writing to
> > * the buffer, and the kernel doesn't let us write to the batch.
> > */
> >- brw->workaround_bo = drm_intel_bo_alloc(brw->bufmgr,
> >- "pipe_control workaround",
> >- 4096, 4096);
> >+ brw->workaround_bo = brw->intelScreen->workaround_bo;
> > if (brw->workaround_bo == NULL)
> > return -ENOMEM;
> >+ drm_intel_bo_reference(brw->workaround_bo);
> >+
> > brw->pipe_controls_since_last_cs_stall = 0;
> > return 0;
> >diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> >index 839a984..cd8e6eb 100644
> >--- a/src/mesa/drivers/dri/i965/intel_screen.c
> >+++ b/src/mesa/drivers/dri/i965/intel_screen.c
> >@@ -961,6 +961,7 @@ intelDestroyScreen(__DRIscreen * sPriv)
> > {
> > struct intel_screen *intelScreen = sPriv->driverPrivate;
> >+ drm_intel_bo_unreference(intelScreen->workaround_bo);
>
> I guess this is OK because after the last context got destroyed the
> screen would get destroyed?
Sure, but not taking a reference for each would get a little strange and
you would still need a comment to explain why not following the standard
idiom is safe. Then when we introduce context local brw_bo, the
conversion from reference to local is much cleaner with the existing
ref.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the mesa-dev
mailing list