[PATCH 1/5] dix: split pixmap sharing out to common function
Dave Airlie
airlied at gmail.com
Tue Jun 26 02:26:11 PDT 2012
From: Dave Airlie <airlied at redhat.com>
We need this same code for dri2, so split it out to dix.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
dix/pixmap.c | 28 ++++++++++++++++++++++++++++
include/pixmap.h | 2 ++
randr/rrcrtc.c | 19 ++-----------------
3 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/dix/pixmap.c b/dix/pixmap.c
index c5c2774..804038f 100644
--- a/dix/pixmap.c
+++ b/dix/pixmap.c
@@ -220,3 +220,31 @@ Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty, RegionPtr dirty_region)
pScreen->SourceValidate = SourceValidate;
return TRUE;
}
+
+PixmapPtr PixmapShareToSlave(PixmapPtr pixmap, ScreenPtr slave)
+{
+ PixmapPtr spix;
+ int ret;
+ int fd_handle;
+ ScreenPtr master = pixmap->drawable.pScreen;
+ int depth = pixmap->drawable.depth;
+
+ ret = master->SharePixmapBacking(pixmap, &fd_handle);
+ if (ret == FALSE)
+ return NULL;
+
+ spix = slave->CreatePixmap(slave, 0, 0, depth,
+ CREATE_PIXMAP_USAGE_SHARED);
+ slave->ModifyPixmapHeader(spix, pixmap->drawable.width,
+ pixmap->drawable.height, depth, 0,
+ pixmap->devKind, NULL);
+
+ ret = slave->SetSharedPixmapBacking(spix, fd_handle);
+ if (ret == FALSE) {
+ slave->DestroyPixmap(spix);
+ return NULL;
+ }
+
+ spix->master_pixmap = pixmap;
+ return spix;
+}
diff --git a/include/pixmap.h b/include/pixmap.h
index 6c85a2e..413c51c 100644
--- a/include/pixmap.h
+++ b/include/pixmap.h
@@ -125,4 +125,6 @@ PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst);
extern _X_EXPORT Bool
PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty, RegionPtr dirty_region);
+extern _X_EXPORT PixmapPtr
+PixmapShareToSlave(PixmapPtr pixmap, ScreenPtr slave);
#endif /* PIXMAP_H */
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 1ca33a4..3a415a0 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -393,7 +393,6 @@ rrCreateSharedPixmap(RRCrtcPtr crtc, int width, int height,
{
PixmapPtr mpix, spix;
ScreenPtr master = crtc->pScreen->current_master;
- int fd_handle = -1;
Bool ret;
int depth;
PixmapPtr mscreenpix;
@@ -423,26 +422,12 @@ rrCreateSharedPixmap(RRCrtcPtr crtc, int width, int height,
if (!mpix)
return FALSE;
- ret = master->SharePixmapBacking(mpix, &fd_handle);
- if (ret == FALSE) {
- master->DestroyPixmap(mpix);
- return FALSE;
- }
-
- spix = crtc->pScreen->CreatePixmap(crtc->pScreen, 0, 0, depth,
- CREATE_PIXMAP_USAGE_SHARED);
- crtc->pScreen->ModifyPixmapHeader(spix, width, height, depth, 0,
- mpix->devKind, NULL);
-
- ret = crtc->pScreen->SetSharedPixmapBacking(spix, fd_handle);
- if (ret == FALSE) {
- ErrorF("failed to slave pixmap\n");
- crtc->pScreen->DestroyPixmap(spix);
+ spix = PixmapShareToSlave(mpix, crtc->pScreen);
+ if (spix == NULL) {
master->DestroyPixmap(mpix);
return FALSE;
}
- spix->master_pixmap = mpix;
ret = pScrPriv->rrCrtcSetScanoutPixmap(crtc, spix);
if (ret == FALSE) {
ErrorF("failed to set shadow slave pixmap\n");
--
1.7.10.2
More information about the xorg-devel
mailing list