@@ -181,12 +181,12 @@ PixmapDirtyDamageDestroy(DamagePtr damage, void *closure)
}
Bool
-PixmapStartDirtyTracking(PixmapPtr src,
+PixmapStartDirtyTracking(DrawablePtr src,
PixmapPtr slave_dst,
int x, int y, int dst_x, int dst_y,
Rotation rotation)
{
- ScreenPtr screen = src->drawable.pScreen;
+ ScreenPtr screen = src->pScreen;
PixmapDirtyUpdatePtr dirty_update;
RegionPtr damageregion;
RegionRec dstregion;
@@ -204,8 +204,7 @@ PixmapStartDirtyTracking(PixmapPtr src,
dirty_update->dst_y = dst_y;
dirty_update->rotation = rotation;
dirty_update->damage = DamageCreate(NULL, PixmapDirtyDamageDestroy,
- DamageReportNone,
- TRUE, src->drawable.pScreen,
+ DamageReportNone, TRUE, screen,
dirty_update);
if (rotation != RR_Rotate_0) {
@@ -241,16 +240,15 @@ PixmapStartDirtyTracking(PixmapPtr src,
RegionUnion(damageregion, damageregion, &dstregion);
RegionUninit(&dstregion);
- DamageRegister(screen->root ? &screen->root->drawable : &src->drawable,
- dirty_update->damage);
+ DamageRegister(src, dirty_update->damage);
xorg_list_add(&dirty_update->ent, &screen->pixmap_dirty_list);
return TRUE;
}
Bool
-PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst)
+PixmapStopDirtyTracking(DrawablePtr src, PixmapPtr slave_dst)
{
- ScreenPtr screen = src->drawable.pScreen;
+ ScreenPtr screen = src->pScreen;
PixmapDirtyUpdatePtr ent, safe;
xorg_list_for_each_entry_safe(ent, safe, &screen->pixmap_dirty_list, ent) {
@@ -269,8 +267,8 @@ PixmapDirtyCopyArea(PixmapPtr dst,
PixmapDirtyUpdatePtr dirty,
RegionPtr dirty_region)
{
- ScreenPtr pScreen = dirty->src->drawable.pScreen;
- DrawablePtr src = pScreen->root ? &pScreen->root->drawable : &dirty->src->drawable;
+ DrawablePtr src = dirty->src;
+ ScreenPtr pScreen = src->pScreen;
int n;
BoxPtr b;
GCPtr pGC;
@@ -309,7 +307,7 @@ PixmapDirtyCompositeRotate(PixmapPtr dst_pixmap,
PixmapDirtyUpdatePtr dirty,
RegionPtr dirty_region)
{
- ScreenPtr pScreen = dirty->src->drawable.pScreen;
+ ScreenPtr pScreen = dirty->src->pScreen;
PictFormatPtr format = PictureWindowFormat(pScreen->root);
PicturePtr src, dst;
XID include_inferiors = IncludeInferiors;
@@ -318,7 +316,7 @@ PixmapDirtyCompositeRotate(PixmapPtr dst_pixmap,
int error;
src = CreatePicture(None,
- &pScreen->root->drawable,
+ dirty->src,
format,
CPSubwindowMode,
&include_inferiors, serverClient, &error);
@@ -367,7 +365,7 @@ PixmapDirtyCompositeRotate(PixmapPtr dst_pixmap,
*/
Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty)
{
- ScreenPtr pScreen = dirty->src->drawable.pScreen;
+ ScreenPtr pScreen = dirty->src->pScreen;
RegionPtr region = DamageRegion(dirty->damage);
PixmapPtr dst;
SourceValidateProcPtr SourceValidate;
@@ -1219,12 +1219,12 @@ msDisableSharedPixmapFlipping(RRCrtcPtr crtc)
}
static Bool
-msStartFlippingPixmapTracking(RRCrtcPtr crtc, PixmapPtr src,
+msStartFlippingPixmapTracking(RRCrtcPtr crtc, DrawablePtr src,
PixmapPtr slave_dst1, PixmapPtr slave_dst2,
int x, int y, int dst_x, int dst_y,
Rotation rotation)
{
- ScreenPtr pScreen = src->drawable.pScreen;
+ ScreenPtr pScreen = src->pScreen;
modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1),
@@ -1264,7 +1264,7 @@ msPresentSharedPixmap(PixmapPtr slave_dst)
RegionPtr region = DamageRegion(ppriv->dirty->damage);
if (RegionNotEmpty(region)) {
- redisplay_dirty(ppriv->slave_src->drawable.pScreen, ppriv->dirty, NULL);
+ redisplay_dirty(ppriv->slave_src->pScreen, ppriv->dirty, NULL);
DamageEmpty(ppriv->dirty->damage);
return TRUE;
@@ -1274,10 +1274,10 @@ msPresentSharedPixmap(PixmapPtr slave_dst)
}
static Bool
-msStopFlippingPixmapTracking(PixmapPtr src,
+msStopFlippingPixmapTracking(DrawablePtr src,
PixmapPtr slave_dst1, PixmapPtr slave_dst2)
{
- ScreenPtr pScreen = src->drawable.pScreen;
+ ScreenPtr pScreen = src->pScreen;
modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(pScreen));
msPixmapPrivPtr ppriv1 = msGetPixmapPriv(&ms->drmmode, slave_dst1),
@@ -857,7 +857,7 @@ drmmode_set_target_scanout_pixmap_gpu(xf86CrtcPtr crtc, PixmapPtr ppix,
int c, total_width = 0, max_height = 0, this_x = 0;
if (*target) {
- PixmapStopDirtyTracking(*target, screenpix);
+ PixmapStopDirtyTracking(&(*target)->drawable, screenpix);
if (drmmode->fb_id) {
drmModeRmFB(drmmode->fd, drmmode->fb_id);
drmmode->fb_id = 0;
@@ -897,7 +897,8 @@ drmmode_set_target_scanout_pixmap_gpu(xf86CrtcPtr crtc, PixmapPtr ppix,
screen->height = screenpix->drawable.height = max_height;
}
drmmode_crtc->prime_pixmap_x = this_x;
- PixmapStartDirtyTracking(ppix, screenpix, 0, 0, this_x, 0, RR_Rotate_0);
+ PixmapStartDirtyTracking(&ppix->drawable, screenpix, 0, 0, this_x, 0,
+ RR_Rotate_0);
*target = ppix;
return TRUE;
}
@@ -153,7 +153,7 @@ typedef struct _msPixmapPriv {
/** Source fields for flipping shared pixmaps */
Bool defer_dirty_update; /* if we want to manually update */
PixmapDirtyUpdatePtr dirty; /* cached dirty ent to avoid searching list */
- PixmapPtr slave_src; /* if we exported shared pixmap, dirty tracking src */
+ DrawablePtr slave_src; /* if we exported shared pixmap, dirty tracking src */
Bool notify_on_damage; /* if sink has requested damage notification */
} msPixmapPrivRec, *msPixmapPrivPtr;
@@ -119,14 +119,15 @@ extern _X_EXPORT void
PixmapUnshareSlavePixmap(PixmapPtr slave_pixmap);
#define HAS_DIRTYTRACKING_ROTATION 1
+#define HAS_DIRTYTRACKING_DRAWABLE_SRC 1
extern _X_EXPORT Bool
-PixmapStartDirtyTracking(PixmapPtr src,
+PixmapStartDirtyTracking(DrawablePtr src,
PixmapPtr slave_dst,
int x, int y, int dst_x, int dst_y,
Rotation rotation);
extern _X_EXPORT Bool
-PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst);
+PixmapStopDirtyTracking(DrawablePtr src, PixmapPtr slave_dst);
/* helper function, drivers can do this themselves if they can do it more
efficently */
@@ -88,7 +88,8 @@ typedef struct _Pixmap {
} PixmapRec;
typedef struct _PixmapDirtyUpdate {
- PixmapPtr src, slave_dst;
+ DrawablePtr src; /* Root window / shared pixmap */
+ PixmapPtr slave_dst; /* Shared / scanout pixmap */
int x, y;
DamagePtr damage;
struct xorg_list ent;
@@ -377,7 +377,7 @@ typedef Bool (*SetSharedPixmapBackingProcPtr)(PixmapPtr, void *);
*/
typedef void (*SyncSharedPixmapProcPtr)(PixmapDirtyUpdatePtr);
-typedef Bool (*StartPixmapTrackingProcPtr)(PixmapPtr, PixmapPtr,
+typedef Bool (*StartPixmapTrackingProcPtr)(DrawablePtr, PixmapPtr,
int x, int y,
int dst_x, int dst_y,
Rotation rotation);
@@ -386,9 +386,9 @@ typedef Bool (*PresentSharedPixmapProcPtr)(PixmapPtr);
typedef Bool (*RequestSharedPixmapNotifyDamageProcPtr)(PixmapPtr);
-typedef Bool (*StopPixmapTrackingProcPtr)(PixmapPtr, PixmapPtr);
+typedef Bool (*StopPixmapTrackingProcPtr)(DrawablePtr, PixmapPtr);
-typedef Bool (*StopFlippingPixmapTrackingProcPtr)(PixmapPtr,
+typedef Bool (*StopFlippingPixmapTrackingProcPtr)(DrawablePtr,
PixmapPtr, PixmapPtr);
typedef Bool (*SharedPixmapNotifyDamageProcPtr)(PixmapPtr);
@@ -279,7 +279,7 @@ typedef Bool (*RRSetConfigProcPtr) (ScreenPtr pScreen,
typedef Bool (*RRCrtcSetScanoutPixmapProcPtr)(RRCrtcPtr crtc, PixmapPtr pixmap);
-typedef Bool (*RRStartFlippingPixmapTrackingProcPtr)(RRCrtcPtr, PixmapPtr,
+typedef Bool (*RRStartFlippingPixmapTrackingProcPtr)(RRCrtcPtr, DrawablePtr,
PixmapPtr, PixmapPtr,
int x, int y,
int dst_x, int dst_y,
@@ -388,12 +388,12 @@ RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc)
if (crtc->scanout_pixmap) {
ScreenPtr master = crtc->pScreen->current_master;
- PixmapPtr mscreenpix = master->GetScreenPixmap(master);
+ DrawablePtr mrootdraw = &master->root->drawable;
if (crtc->scanout_pixmap_back) {
pScrPriv->rrDisableSharedPixmapFlipping(crtc);
- master->StopFlippingPixmapTracking(mscreenpix,
+ master->StopFlippingPixmapTracking(mrootdraw,
crtc->scanout_pixmap,
crtc->scanout_pixmap_back);
@@ -402,7 +402,8 @@ RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc)
}
else {
pScrPriv->rrCrtcSetScanoutPixmap(crtc, NULL);
- master->StopPixmapTracking(mscreenpix, crtc->scanout_pixmap);
+ master->StopPixmapTracking(mrootdraw,
+ crtc->scanout_pixmap);
}
rrDestroySharedPixmap(crtc, crtc->scanout_pixmap);
@@ -491,9 +492,8 @@ rrSetupPixmapSharing(RRCrtcPtr crtc, int width, int height,
ScreenPtr master = crtc->pScreen->current_master;
rrScrPrivPtr pMasterScrPriv = rrGetScrPriv(master);
rrScrPrivPtr pSlaveScrPriv = rrGetScrPriv(crtc->pScreen);
-
- int depth;
- PixmapPtr mscreenpix;
+ DrawablePtr mrootdraw = &master->root->drawable;
+ int depth = mrootdraw->depth;
PixmapPtr spix_front;
/* Create a pixmap on the master screen, then get a shared handle for it.
@@ -515,9 +515,6 @@ rrSetupPixmapSharing(RRCrtcPtr crtc, int width, int height,
defer to the slave.
*/
- mscreenpix = master->GetScreenPixmap(master);
- depth = mscreenpix->drawable.depth;
-
if (crtc->scanout_pixmap)
RRCrtcDetachScanoutPixmap(crtc);
@@ -553,7 +550,8 @@ rrSetupPixmapSharing(RRCrtcPtr crtc, int width, int height,
crtc->scanout_pixmap = spix_front;
crtc->scanout_pixmap_back = spix_back;
- if (!pMasterScrPriv->rrStartFlippingPixmapTracking(crtc, mscreenpix,
+ if (!pMasterScrPriv->rrStartFlippingPixmapTracking(crtc,
+ mrootdraw,
spix_front,
spix_back,
x, y, 0, 0,
@@ -588,7 +586,7 @@ fail: /* If flipping funcs fail, just fall back to unsynchronized */
}
crtc->scanout_pixmap = spix_front;
- master->StartPixmapTracking(mscreenpix, spix_front, x, y, 0, 0, rotation);
+ master->StartPixmapTracking(mrootdraw, spix_front, x, y, 0, 0, rotation);
return TRUE;
}