uxa: Clip dirty region to slave pixmap before appending damage

Fixes regression from

commit c789d06cf8
Author: Dave Airlie <airlied@redhat.com>
Date:   Mon Jan 7 13:57:21 2013 +1000

    intel: fixup damage posting to be done correctly around slave pixmap

which causes the entire slave scanout to be readback from uncached
memory every time a pixel is modified.

Reported-by: Stephen Liang <inteldriver@angrywalls.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59539
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-01-18 13:16:23 +00:00
parent e17eaf540b
commit 828a3a80aa
1 changed files with 14 additions and 5 deletions

View File

@ -686,7 +686,7 @@ void IntelEmitInvarientState(ScrnInfoPtr scrn)
}
#ifdef INTEL_PIXMAP_SHARING
static Bool
static void
redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
@ -695,9 +695,19 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
int was_blocked;
PixmapRegionInit(&pixregion, dirty->slave_dst->master_pixmap);
RegionTranslate(&pixregion, dirty->x, dirty->y);
RegionIntersect(&pixregion, &pixregion, DamageRegion(dirty->damage));
RegionTranslate(&pixregion, -dirty->x, -dirty->y);
was_blocked = RegionNil(&pixregion);
DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion);
RegionUninit(&pixregion);
if (was_blocked)
return;
PixmapRegionInit(&pixregion, dirty->slave_dst->master_pixmap);
PixmapSyncDirtyHelper(dirty, &pixregion);
RegionUninit(&pixregion);
intel_batch_submit(scrn);
if (!intel->has_prime_vmap_flush) {
drm_intel_bo *bo = intel_get_pixmap_bo(dirty->slave_dst->master_pixmap);
@ -706,10 +716,9 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
drm_intel_bo_unmap(bo);
xf86UnblockSIGIO(was_blocked);
}
DamageRegionProcessPending(&dirty->slave_dst->drawable);
RegionUninit(&pixregion);
return 0;
DamageRegionProcessPending(&dirty->slave_dst->drawable);
return;
}
static void