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>
This commit is contained in:
parent
df6a3a07f6
commit
5574a0a07e
|
@ -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)],
|
||||
|
|
Loading…
Reference in New Issue