xf86-video-intel: src/sna/sna_accel.c src/sna/sna_display.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Feb 27 05:54:20 PST 2013
src/sna/sna_accel.c | 3 +++
src/sna/sna_display.c | 33 +++++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
New commits:
commit b8a0acd615042bee7bdf49c364a4815ade6b9a61
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Feb 27 13:26:18 2013 +0000
sna: Migrate dirty tracking across ScreenPixmap updates
Otherwise chaos ensues:
Invalid read of size 8
==8647== at 0x8477BC1: has_offload_slaves.isra.38 (sna_accel.c:14402)
==8647== by 0x84958E7: sna_accel_block_handler (sna_accel.c:13729)
==8647== by 0x164B13: BlockHandler (dixutils.c:387)
==8647== by 0x2B5273: WaitForSomething (WaitFor.c:210)
==8647== by 0x160790: Dispatch (dispatch.c:357)
==8647== by 0x14F549: main (main.c:298)
==8647== Address 0xf3383e8 is 24 bytes inside a block of size 152 free'd
==8647== at 0x4C2BA6C: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8647== by 0x2403DF: damageDestroyPixmap (damage.c:1549)
==8647== by 0x1FFD88: XvDestroyPixmap (xvmain.c:372)
==8647== by 0x1FE789: ShmDestroyPixmap (shm.c:273)
==8647== by 0x8507C24: _sna_dri_destroy_buffer (sna_dri.c:448)
==8647== by 0x289986: do_get_buffers (dri2.c:521)
==8647== by 0x289C0F: DRI2GetBuffersWithFormat (dri2.c:690)
==8647== by 0x28B68F: ProcDRI2Dispatch (dri2ext.c:306)
==8647== by 0x160A40: Dispatch (dispatch.c:428)
==8647== by 0x14F549: main (main.c:298)
==8647==
==8647== Invalid read of size 8
==8647== at 0x8477BCA: has_offload_slaves.isra.38 (regionstr.h:74)
==8647== by 0x84958E7: sna_accel_block_handler (sna_accel.c:13729)
==8647== by 0x164B13: BlockHandler (dixutils.c:387)
==8647== by 0x2B5273: WaitForSomething (WaitFor.c:210)
==8647== by 0x160790: Dispatch (dispatch.c:357)
==8647== by 0x14F549: main (main.c:298)
==8647== Address 0xdfdfdfdfdfdfdfe7 is not stack'd, malloc'd or (recently) free'd
Reported-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index f991ebb..bacd431 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -13701,6 +13701,7 @@ static bool has_offload_slaves(struct sna *sna)
PixmapDirtyUpdatePtr dirty;
xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) {
+ assert(dirty->src == sna->front);
if (RegionNotEmpty(DamageRegion(dirty->damage)))
return true;
}
@@ -13853,6 +13854,8 @@ static void sna_accel_post_damage(struct sna *sna)
BoxPtr box;
int n;
+ assert(dirty->src == sna->front);
+
damage = DamageRegion(dirty->damage);
if (RegionNil(damage))
continue;
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index fb282fd..45ae462 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2427,6 +2427,36 @@ static void copy_front(struct sna *sna, PixmapPtr old, PixmapPtr new)
new->drawable.height);
}
+static void
+migrate_dirty_tracking(struct sna *sna, PixmapPtr old_front)
+{
+#if HAS_PIXMAP_SHARING
+ ScreenPtr screen = sna->scrn->pScreen;
+ PixmapDirtyUpdatePtr dirty, safe;
+
+ xorg_list_for_each_entry_safe(dirty, safe, &screen->pixmap_dirty_list, ent) {
+ assert(dirty->src == old_front);
+ if (dirty->src != old_front)
+ continue;
+
+ DamageUnregister(&dirty->src->drawable, dirty->damage);
+ DamageDestroy(dirty->damage);
+
+ dirty->damage = DamageCreate(NULL, NULL,
+ DamageReportNone,
+ TRUE, screen, screen);,
+ if (!dirty->damage) {
+ xorg_list_del(&dirty->ent);
+ free(dirty);
+ continue;
+ }
+
+ DamageRegister(&sna->front->drawable, dirty->damage);
+ dirty->src = sna->front;
+ }
+#endif
+}
+
static Bool
sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
{
@@ -2481,6 +2511,9 @@ sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
sna_crtc_disable(crtc);
}
+ /* Open-coded screen->SetScreenPixmap */
+ migrate_dirty_tracking(sna, old_front);
+
if (root(screen)) {
struct sna_visit_set_pixmap_window visit;
More information about the xorg-commit
mailing list