[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