Make PixmapDirtyUpdateRec::src a DrawablePtr
This allows making the master screen's pixmap_dirty_list entries explicitly reflect that we're now tracking the root window instead of the screen pixmap, in order to allow Present page flipping on master outputs while there are active slave outputs. Define HAS_DIRTYTRACKING_DRAWABLE_SRC for drivers to check, but leave HAS_DIRTYTRACKING_ROTATION defined as well to make things slightly easier for drivers. Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
c52f77e4ca
commit
8e3b26ceaa
24
dix/pixmap.c
24
dix/pixmap.c
|
@ -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;
|
||||
|
|
|
@ -1217,12 +1217,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),
|
||||
|
@ -1262,7 +1262,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;
|
||||
|
@ -1272,10 +1272,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),
|
||||
|
|
|
@ -860,7 +860,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;
|
||||
|
@ -900,7 +900,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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue