[PATCH] composite: Optimize resizes of ForgetGravity windows

Adam Jackson ajax at redhat.com
Fri Jul 25 08:07:26 PDT 2014

Per the spec:

    A bit-gravity of Forget indicates that the window contents are
    always discarded after a size change, even if backing-store or
    save-under has been requested. The window is tiled with its
    background (except, if no background is defined, the existing
    screen contents are not altered) and zero or more exposure events
    are generated.

For redirected windows, size changes hit compReallocPixmap, which
normally attempts to preserve the previous pixmap in cw->pOldPixmap.
For ForgetGravity windows we now destroy the old pixmap before
allocating the new one.  This reduces pressure on the allocator, and
also eliminates some overdraw (compCopyWindow would copy in the bits
from the old pixmap regardless of gravity, even though they're about to
be blown away by the background tile described above).

Signed-off-by: Adam Jackson <ajax at redhat.com>
 composite/compalloc.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/composite/compalloc.c b/composite/compalloc.c
index dfbff06..38ebc7e 100644
--- a/composite/compalloc.c
+++ b/composite/compalloc.c
@@ -678,6 +678,10 @@ compReallocPixmap(WindowPtr pWin, int draw_x, int draw_y,
     pix_w = w + (bw << 1);
     pix_h = h + (bw << 1);
     if (pix_w != pOld->drawable.width || pix_h != pOld->drawable.height) {
+        if (pWin->bitGravity == ForgetGravity) {
+            pScreen->DestroyPixmap(pOld);
+            pOld = NULL;
+        }
         pNew = compNewPixmap(pWin, pix_x, pix_y, pix_w, pix_h);
         if (!pNew)
             return FALSE;

More information about the xorg-devel mailing list