On 01/02/17 06:35 PM, Michel Dänzer wrote: > From: Michel Dänzer <[email protected]> > > The screen pixmap doesn't receive updates while there's a Present flip > window. > > Signed-off-by: Michel Dänzer <[email protected]> > --- > dix/pixmap.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/dix/pixmap.c b/dix/pixmap.c > index 49267a19b..ef0083083 100644 > --- a/dix/pixmap.c > +++ b/dix/pixmap.c > @@ -233,7 +233,8 @@ PixmapStartDirtyTracking(PixmapPtr src, > RegionUnion(damageregion, damageregion, &dstregion); > RegionUninit(&dstregion); > > - DamageRegister(&src->drawable, dirty_update->damage); > + DamageRegister(screen->root ? &screen->root->drawable : &src->drawable, > + dirty_update->damage);
I discovered a problem with this. Looks like on server shutdown the root window can be destroyed before the scanout pixmap is detached, see valgrind output below. Is there any solution for this other than wrapping DestroyWindow and calling PixmapStopDirtyTracking when a root window is destroyed? ==32070== Invalid read of size 8 ==32070== at 0x23E20A: DamageDestroy (damage.c:1812) ==32070== by 0x176560: PixmapStopDirtyTracking (pixmap.c:250) ==32070== by 0x2190A6: RRCrtcDetachScanoutPixmap (rrcrtc.c:405) ==32070== by 0x219147: RRCrtcDestroyResource (rrcrtc.c:883) ==32070== by 0x17D296: doFreeResource (resource.c:880) ==32070== by 0x17E49D: FreeClientResources (resource.c:1146) ==32070== by 0x17E56B: FreeAllResources (resource.c:1161) ==32070== by 0x15CA97: dix_main (main.c:303) ==32070== by 0x6B5B2B0: (below main) (libc-start.c:291) ==32070== Address 0x13f12f68 is 104 bytes inside a block of size 120 free'd ==32070== at 0x4C2CDDB: free (vg_replace_malloc.c:530) ==32070== by 0x23E357: damageDestroyWindow (damage.c:1567) ==32070== by 0x1FD056: XvDestroyWindow (xvmain.c:385) ==32070== by 0x1B293E: xf86XVDestroyWindow (xf86xv.c:1020) ==32070== by 0x1EBDFB: compDestroyWindow (compwindow.c:607) ==32070== by 0x18A2F4: FreeWindowResources (window.c:1031) ==32070== by 0x18D577: DeleteWindow (window.c:1099) ==32070== by 0x17D296: doFreeResource (resource.c:880) ==32070== by 0x17E49D: FreeClientResources (resource.c:1146) ==32070== by 0x17E56B: FreeAllResources (resource.c:1161) ==32070== by 0x15CA97: dix_main (main.c:303) ==32070== by 0x6B5B2B0: (below main) (libc-start.c:291) ==32070== Block was alloc'd at ==32070== at 0x4C2BBAF: malloc (vg_replace_malloc.c:299) ==32070== by 0x1773C5: _dixAllocateObjectWithPrivates (privates.c:486) ==32070== by 0x23DEE7: DamageCreate (damage.c:1699) ==32070== by 0x17638A: PixmapStartDirtyTracking (pixmap.c:198) ==32070== by 0x219D6D: rrSetupPixmapSharing (rrcrtc.c:591) ==32070== by 0x219D6D: RRCrtcSet (rrcrtc.c:761) ==32070== by 0x21AC53: ProcRRSetCrtcConfig (rrcrtc.c:1367) ==32070== by 0x1588C8: Dispatch (dispatch.c:479) ==32070== by 0x15CA64: dix_main (main.c:287) ==32070== by 0x6B5B2B0: (below main) (libc-start.c:291) -- Earthling Michel Dänzer | http://www.amd.com Libre software enthusiast | Mesa and X developer _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
