diff options
author | Keith Packard <keithp@keithp.com> | 2014-10-27 13:38:21 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-10-27 13:38:21 -0700 |
commit | 5574a0a07e83ff989c074c44d3ea9db0a819f472 (patch) | |
tree | bf34f5408a3a6765a87d8a2348d6a4d4905c0104 | |
parent | df6a3a07f60c40bab2b59b9b3ba0c20c8fb7e95d (diff) |
composite: Skip SetWindowPixmap when pixmap isn't changing
Check the current window pixmap to see if it matches the new pixmap
and avoid calling SetWindowPixmap in that case.
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
do anything in this case.
Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Tested-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | composite/compwindow.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/composite/compwindow.c b/composite/compwindow.c index 9a6b2dae8..77bdfa23c 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)], |