randr: Factor out shared pixmap destruction

Shared pixmap destruction is done by unrefing the master pixmap twice: once
for the original reference, and once for the reference implicitly added by
PixmapShareToSlave. Then, unrefing the slave pixmap once.

When I add PRIME double buffering and synchronization, I will need to do
this in multiple places. To avoid duplication of code and comments
explaining it everywhere, factor it out into its own function and use that
in place of where it was before.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Alex Goins <agoins@nvidia.com>
This commit is contained in:
agoins 2015-11-25 18:39:25 -08:00 committed by Adam Jackson
parent ab9837cc6a
commit cf5d6414e0

View File

@ -361,6 +361,20 @@ RRComputeContiguity(ScreenPtr pScreen)
pScrPriv->discontiguous = discontiguous;
}
static void
rrDestroySharedPixmap(RRCrtcPtr crtc, PixmapPtr pPixmap) {
if (crtc->pScreen->current_master && pPixmap->master_pixmap) {
/*
* Unref the pixmap twice: once for the original reference, and once
* for the reference implicitly added by PixmapShareToSlave.
*/
crtc->pScreen->current_master->DestroyPixmap(pPixmap->master_pixmap);
crtc->pScreen->current_master->DestroyPixmap(pPixmap->master_pixmap);
}
crtc->pScreen->DestroyPixmap(pPixmap);
}
void
RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc)
{
@ -372,14 +386,7 @@ RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc)
pScrPriv->rrCrtcSetScanoutPixmap(crtc, NULL);
if (crtc->scanout_pixmap) {
master->StopPixmapTracking(mscreenpix, crtc->scanout_pixmap);
/*
* Unref the pixmap twice: once for the original reference, and once
* for the reference implicitly added by PixmapShareToSlave.
*/
master->DestroyPixmap(crtc->scanout_pixmap->master_pixmap);
master->DestroyPixmap(crtc->scanout_pixmap->master_pixmap);
crtc->pScreen->DestroyPixmap(crtc->scanout_pixmap);
rrDestroySharedPixmap(crtc, crtc->scanout_pixmap);
}
crtc->scanout_pixmap = NULL;
RRCrtcChanged(crtc, TRUE);