[PATCH] dri2: Only invalidate our tree upon Pixmap changes

Chris Wilson chris at chris-wilson.co.uk
Mon Oct 27 01:33:59 PDT 2014


On Sun, Oct 26, 2014 at 05:23:42PM -0700, Keith Packard wrote:
> Chris Wilson <chris at chris-wilson.co.uk> writes:
> 
> > x11perf -ucreate highlights an instance where compCreateWindow reassigns
> > the same Pixmap to the Window. Currently this triggers an expensive
> > invalidation of the entire window hierachy, making sure that DRI2
> > clients are kept informed of the handle changes. However, as the backing
> > Pixmap for the Window is actually unchanged, there is no need to
> > invalidate at all.
> 
> Might be better to just catch this in DIX and not call the
> SetWindowPixmap chain at all?

Possibly. I wasn't sure if anything on the callchain was interested in
knowing about calls to SetWindowPixmap() with the same pixmap. It seems
dubious but it might have been used as a notification hook somewhere. I
also wasn't sure if another path would also reset the old Pixmap -
though that possibility seems limited to miext/rootless. As I was
uncertain, I patched hw/xfree86/dri2.
 
> diff --git a/composite/compwindow.c b/composite/compwindow.c
> index 9a6b2da..77bdfa2 100644
> --- a/composite/compwindow.c
> +++ b/composite/compwindow.c
> @@ -567,10 +567,11 @@ compCreateWindow(WindowPtr pWin)
>      if (pWin->parent && ret) {
>          CompSubwindowsPtr csw = GetCompSubwindows(pWin->parent);
>          CompClientWindowPtr ccw;
> +        PixmapPtr parent_pixmap = (*pScreen->GetWindowPixmap)(pWin->parent);
> +        PixmapPtr window_pixmap = (*pScreen->GetWindowPixmap)(pWin);
>  
> -        (*pScreen->SetWindowPixmap) (pWin,
> -                                     (*pScreen->GetWindowPixmap) (pWin->
> -                                                                  parent));
> +        if (window_pixmap != parent_pixmap)
> +            (*pScreen->SetWindowPixmap) (pWin, parent_pixmap);
>          if (csw)
>              for (ccw = csw->clients; ccw; ccw = ccw->next)
>                  compRedirectWindow(clients[CLIENT_ID(ccw->id)],
> 

This patch also fixes the regression, so if you are happier with
applying the fix here,

Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
Tested-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the xorg-devel mailing list