prime: Sync shared pixmap from root window instead of screen pixmap
The screen pixmap doesn't receive updates while there's a Present flip window. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
parent
eb04b20160
commit
b5b292896f
16
dix/pixmap.c
16
dix/pixmap.c
@ -233,7 +233,8 @@ PixmapStartDirtyTracking(PixmapPtr src,
|
|||||||
RegionUnion(damageregion, damageregion, &dstregion);
|
RegionUnion(damageregion, damageregion, &dstregion);
|
||||||
RegionUninit(&dstregion);
|
RegionUninit(&dstregion);
|
||||||
|
|
||||||
DamageRegister(&src->drawable, dirty_update->damage);
|
DamageRegister(screen->root ? &screen->root->drawable : &src->drawable,
|
||||||
|
dirty_update->damage);
|
||||||
xorg_list_add(&dirty_update->ent, &screen->pixmap_dirty_list);
|
xorg_list_add(&dirty_update->ent, &screen->pixmap_dirty_list);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -260,6 +261,7 @@ PixmapDirtyCopyArea(PixmapPtr dst,
|
|||||||
RegionPtr dirty_region)
|
RegionPtr dirty_region)
|
||||||
{
|
{
|
||||||
ScreenPtr pScreen = dirty->src->drawable.pScreen;
|
ScreenPtr pScreen = dirty->src->drawable.pScreen;
|
||||||
|
DrawablePtr src = pScreen->root ? &pScreen->root->drawable : &dirty->src->drawable;
|
||||||
int n;
|
int n;
|
||||||
BoxPtr b;
|
BoxPtr b;
|
||||||
GCPtr pGC;
|
GCPtr pGC;
|
||||||
@ -267,7 +269,13 @@ PixmapDirtyCopyArea(PixmapPtr dst,
|
|||||||
n = RegionNumRects(dirty_region);
|
n = RegionNumRects(dirty_region);
|
||||||
b = RegionRects(dirty_region);
|
b = RegionRects(dirty_region);
|
||||||
|
|
||||||
pGC = GetScratchGC(dirty->src->drawable.depth, pScreen);
|
pGC = GetScratchGC(src->depth, pScreen);
|
||||||
|
if (pScreen->root) {
|
||||||
|
ChangeGCVal subWindowMode;
|
||||||
|
|
||||||
|
subWindowMode.val = IncludeInferiors;
|
||||||
|
ChangeGC(NullClient, pGC, GCSubwindowMode, &subWindowMode);
|
||||||
|
}
|
||||||
ValidateGC(&dst->drawable, pGC);
|
ValidateGC(&dst->drawable, pGC);
|
||||||
|
|
||||||
while (n--) {
|
while (n--) {
|
||||||
@ -278,7 +286,7 @@ PixmapDirtyCopyArea(PixmapPtr dst,
|
|||||||
w = dst_box.x2 - dst_box.x1;
|
w = dst_box.x2 - dst_box.x1;
|
||||||
h = dst_box.y2 - dst_box.y1;
|
h = dst_box.y2 - dst_box.y1;
|
||||||
|
|
||||||
pGC->ops->CopyArea(&dirty->src->drawable, &dst->drawable, pGC,
|
pGC->ops->CopyArea(src, &dst->drawable, pGC,
|
||||||
dirty->x + dst_box.x1, dirty->y + dst_box.y1, w, h,
|
dirty->x + dst_box.x1, dirty->y + dst_box.y1, w, h,
|
||||||
dirty->dst_x + dst_box.x1,
|
dirty->dst_x + dst_box.x1,
|
||||||
dirty->dst_y + dst_box.y1);
|
dirty->dst_y + dst_box.y1);
|
||||||
@ -301,7 +309,7 @@ PixmapDirtyCompositeRotate(PixmapPtr dst_pixmap,
|
|||||||
int error;
|
int error;
|
||||||
|
|
||||||
src = CreatePicture(None,
|
src = CreatePicture(None,
|
||||||
&dirty->src->drawable,
|
&pScreen->root->drawable,
|
||||||
format,
|
format,
|
||||||
CPSubwindowMode,
|
CPSubwindowMode,
|
||||||
&include_inferiors, serverClient, &error);
|
&include_inferiors, serverClient, &error);
|
||||||
|
Loading…
Reference in New Issue
Block a user