debian/changelog | 41 +++ debian/control | 5 debian/patches/series | 8 debian/patches/sna-let-modesetting-handle-gen9+.diff | 40 +++ debian/rules | 5 debian/xserver-xorg-video-intel.install | 4 debian/xserver-xorg-video-intel.install.kfreebsd-amd64 | 4 debian/xserver-xorg-video-intel.install.kfreebsd-i386 | 4 src/sna/kgem.h | 1 src/sna/sna_display.c | 22 + src/sna/sna_dri2.c | 212 ++++++++++------- 11 files changed, 256 insertions(+), 90 deletions(-)
New commits: commit f11e4a0a3fd8192b234872f067e06e545e4218ac Author: Timo Aaltonen <tjaal...@debian.org> Date: Sat Mar 12 12:04:46 2016 +0200 update changelog diff --git a/debian/changelog b/debian/changelog index ccf6de6..895ff6e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +xserver-xorg-video-intel (2:2.99.917+git20160307-2ubuntu1) UNRELEASED; urgency=medium + + * Merge from Debian. + + -- Timo Aaltonen <tjaal...@debian.org> Sat, 12 Mar 2016 12:04:17 +0200 + xserver-xorg-video-intel (2:2.99.917+git20160307-2) unstable; urgency=medium * Disable the patch to use modesetting on skylake for now, since it reveals commit a9e817500aafb7829bf154d7754de9b8d0b8e452 Author: Timo Aaltonen <tjaal...@debian.org> Date: Thu Mar 10 22:55:33 2016 +0200 disable patch, upload to unstable diff --git a/debian/changelog b/debian/changelog index 0f715a8..f620743 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +xserver-xorg-video-intel (2:2.99.917+git20160307-2) unstable; urgency=medium + + * Disable the patch to use modesetting on skylake for now, since it reveals + modeset/server bugs. (Closes: #817784) + + -- Timo Aaltonen <tjaal...@debian.org> Thu, 10 Mar 2016 22:16:19 +0200 + xserver-xorg-video-intel (2:2.99.917+git20160307-1) unstable; urgency=medium [ Timo Aaltonen ] diff --git a/debian/patches/series b/debian/patches/series index aa08141..7658835 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1 @@ -sna-let-modesetting-handle-gen9+.diff +#sna-let-modesetting-handle-gen9+.diff commit e415f62c90247e917ab91cde9f6138993031abcd Author: Timo Aaltonen <tjaal...@debian.org> Date: Wed Mar 9 21:26:39 2016 +0200 upload to unstable diff --git a/debian/changelog b/debian/changelog index de35387..0f715a8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium +xserver-xorg-video-intel (2:2.99.917+git20160307-1) unstable; urgency=medium [ Timo Aaltonen ] * New upstream snapshot. @@ -11,7 +11,7 @@ xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium * Move the shared libraries into multiarch libdir. * rules: Enable parallel builds. - -- Timo Aaltonen <tjaal...@debian.org> Mon, 07 Mar 2016 15:20:56 +0200 + -- Timo Aaltonen <tjaal...@debian.org> Wed, 09 Mar 2016 21:26:17 +0200 xserver-xorg-video-intel (2:2.99.917+git20160218-1) unstable; urgency=medium commit 86ccd6b3b1759c62cb0299a1177ce4f785a928bc Author: Timo Aaltonen <tjaal...@debian.org> Date: Tue Mar 8 15:27:00 2016 +0200 release to unstable diff --git a/debian/changelog b/debian/changelog index de35387..0fc87e2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium +xserver-xorg-video-intel (2:2.99.917+git20160307-1) unstable; urgency=medium [ Timo Aaltonen ] * New upstream snapshot. @@ -11,7 +11,7 @@ xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium * Move the shared libraries into multiarch libdir. * rules: Enable parallel builds. - -- Timo Aaltonen <tjaal...@debian.org> Mon, 07 Mar 2016 15:20:56 +0200 + -- Timo Aaltonen <tjaal...@debian.org> Tue, 08 Mar 2016 15:26:40 +0200 xserver-xorg-video-intel (2:2.99.917+git20160218-1) unstable; urgency=medium commit 41b55d35b89467827fa00498726a69cf62de2d09 Author: Timo Aaltonen <tjaal...@debian.org> Date: Tue Mar 8 15:26:32 2016 +0200 rules: Enable parallel builds. diff --git a/debian/changelog b/debian/changelog index 238588b..de35387 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,6 +9,7 @@ xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium [ Matthias Klose ] * Move the shared libraries into multiarch libdir. + * rules: Enable parallel builds. -- Timo Aaltonen <tjaal...@debian.org> Mon, 07 Mar 2016 15:20:56 +0200 diff --git a/debian/rules b/debian/rules index 8e907f5..3020c64 100755 --- a/debian/rules +++ b/debian/rules @@ -51,7 +51,7 @@ override_dh_installchangelogs: dh_installchangelogs debian/upstream.changelog %: - dh $@ --with quilt,autoreconf,xsf --builddirectory=build/ + dh $@ --parallel --with quilt,autoreconf,xsf --builddirectory=build/ # Snapshots should only target experimental: generate-snapshot: UPSTREAM_VERSION = $(shell echo $(SOURCE_VERSION) | sed 's/^[0-9]*://;s/-.*$$//') commit 951719b29a5a849358b39c505d2f8b8af8cc73f3 Author: Timo Aaltonen <tjaal...@debian.org> Date: Tue Mar 8 15:18:47 2016 +0200 Move the shared libraries into multiarch libdir. diff --git a/debian/changelog b/debian/changelog index 91d3321..238588b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,11 +1,15 @@ xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium + [ Timo Aaltonen ] * New upstream snapshot. * control: Update the description, older hw likely still wants this driver. * sna-let-modesetting-handle-gen9+.diff: Use modesetting+glamor on Skylake and up. + [ Matthias Klose ] + * Move the shared libraries into multiarch libdir. + -- Timo Aaltonen <tjaal...@debian.org> Mon, 07 Mar 2016 15:20:56 +0200 xserver-xorg-video-intel (2:2.99.917+git20160218-1) unstable; urgency=medium diff --git a/debian/rules b/debian/rules index 9b5efd9..8e907f5 100755 --- a/debian/rules +++ b/debian/rules @@ -34,6 +34,9 @@ override_dh_install: find debian/tmp -name '*.la' -delete rm -f debian/tmp/usr/lib/libI810XvMC.so rm -f debian/tmp/usr/lib/libIntelXvMC.so + mkdir -p debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH) + mv debian/tmp/usr/lib/libI810XvMC.so.* debian/tmp/usr/lib/libIntelXvMC.so.* \ + debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/. dh_install --fail-missing # Debug package: diff --git a/debian/xserver-xorg-video-intel.install b/debian/xserver-xorg-video-intel.install index b603516..9508a54 100644 --- a/debian/xserver-xorg-video-intel.install +++ b/debian/xserver-xorg-video-intel.install @@ -1,7 +1,7 @@ usr/bin/intel-virtual-output usr/lib/xorg/modules/drivers/*.so -usr/lib/libI810XvMC.so* -usr/lib/libIntelXvMC.so* +usr/lib/*/libI810XvMC.so* +usr/lib/*/libIntelXvMC.so* usr/lib/xserver-xorg-video-intel/xf86-video-intel-backlight-helper usr/share/polkit-1/actions/org.x.xf86-video-intel.backlight-helper.policy usr/share/man diff --git a/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 b/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 index 48c5ed0..800b416 100644 --- a/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 +++ b/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 @@ -1,4 +1,4 @@ usr/lib/xorg/modules/drivers/*.so -usr/lib/libI810XvMC.so* -usr/lib/libIntelXvMC.so* +usr/lib/*/libI810XvMC.so* +usr/lib/*/libIntelXvMC.so* usr/share/man diff --git a/debian/xserver-xorg-video-intel.install.kfreebsd-i386 b/debian/xserver-xorg-video-intel.install.kfreebsd-i386 index 48c5ed0..800b416 100644 --- a/debian/xserver-xorg-video-intel.install.kfreebsd-i386 +++ b/debian/xserver-xorg-video-intel.install.kfreebsd-i386 @@ -1,4 +1,4 @@ usr/lib/xorg/modules/drivers/*.so -usr/lib/libI810XvMC.so* -usr/lib/libIntelXvMC.so* +usr/lib/*/libI810XvMC.so* +usr/lib/*/libIntelXvMC.so* usr/share/man commit e43d5b2191c5d9695e29ad2f5ac16c15dc1d9543 Author: Timo Aaltonen <tjaal...@debian.org> Date: Mon Mar 7 17:44:23 2016 +0200 sna-let-modesetting-handle-gen9+.diff: Use modesetting+glamor on Skylake and up. diff --git a/debian/changelog b/debian/changelog index cf9a229..91d3321 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,8 @@ xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium * New upstream snapshot. * control: Update the description, older hw likely still wants this driver. + * sna-let-modesetting-handle-gen9+.diff: Use modesetting+glamor on + Skylake and up. -- Timo Aaltonen <tjaal...@debian.org> Mon, 07 Mar 2016 15:20:56 +0200 diff --git a/debian/patches/series b/debian/patches/series index a82d1b4..aa08141 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1 @@ -#placeholder +sna-let-modesetting-handle-gen9+.diff diff --git a/debian/patches/sna-let-modesetting-handle-gen9+.diff b/debian/patches/sna-let-modesetting-handle-gen9+.diff new file mode 100644 index 0000000..00b6cdb --- /dev/null +++ b/debian/patches/sna-let-modesetting-handle-gen9+.diff @@ -0,0 +1,40 @@ +Aihe: [Intel-gfx] [RFC/PATCH xf86-video-intel] sna: Let modestting + glamor handle gen9+ +Lähettäjä: Hans de Goede <hdego...@redhat.com> +Päiväys: 29.02.2016 16:47 +Vastaanottaja: intel-...@lists.freedesktop.org +CC: Hans de Goede <hdego...@redhat.com>, Rob Clark <rcl...@redhat.com>, Adam Jackson <a...@redhat.com> + +sna has no meaningfull accel for gen9+, this causes problems with i.e. +apps using XVideo since the sprite XVideo support does not work well +for many apps. + +Therefor it is better to just let the xserver fall back to modesetting + +glamor. This is implemented by returning FALSE from the probe methods, +just like how nouveau handles falling back to modesetting for newer cards. + +BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1305369 +Signed-off-by: Hans de Goede <hdego...@redhat.com> +--- + src/intel_module.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/intel_module.c b/src/intel_module.c +index 60835b9..5979cb9 100644 +--- a/src/intel_module.c ++++ b/src/intel_module.c +@@ -571,6 +571,13 @@ intel_scrn_create(DriverPtr driver, + return FALSE; + } + ++ /* ++ * We've no accel support for these, so let modesetting + glamor ++ * handle them. ++ */ ++ if ((unsigned)((struct intel_device_info *)match_data)->gen >= 0110) ++ return FALSE; ++ + scrn = xf86AllocateScreen(driver, flags); + if (scrn == NULL) + return FALSE; +-- 2.7.2 _______________________________________________ Intel-gfx mailing list intel-...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx + commit 38022bf64b442279cd271c5c9abf7dcb5ebe57ca Author: Timo Aaltonen <tjaal...@debian.org> Date: Mon Mar 7 17:40:23 2016 +0200 control: Update the description, older hw likely still wants this driver. diff --git a/debian/changelog b/debian/changelog index 7f3362b..cf9a229 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +xserver-xorg-video-intel (2:2.99.917+git20160307-1) UNRELEASED; urgency=medium + + * New upstream snapshot. + * control: Update the description, older hw likely still wants this + driver. + + -- Timo Aaltonen <tjaal...@debian.org> Mon, 07 Mar 2016 15:20:56 +0200 + xserver-xorg-video-intel (2:2.99.917+git20160218-1) unstable; urgency=medium * New upstream snapshot. diff --git a/debian/control b/debian/control index 5506f73..4fa3c27 100644 --- a/debian/control +++ b/debian/control @@ -75,8 +75,9 @@ Description: X.Org X server -- Intel i8xx, i9xx display driver . This package is built from the X.org xf86-video-intel driver module. . - This driver is deprecated in favor of the server builtin modesetting - driver. + The use of this driver is discouraged if your hw is new enough (ca. + 2007 and newer). You can try uninstalling this driver and let the + server use it's builtin modesetting driver instead. Package: xserver-xorg-video-intel-dbg Architecture: amd64 i386 kfreebsd-amd64 kfreebsd-i386 x32 commit 0204e55b618af285eb31c6eecc3c57b54319a0f4 Author: Ville Syrjälä <ville.syrj...@linux.intel.com> Date: Mon Mar 7 09:27:50 2016 +0000 sna: Restrict reflected rotations to be rotations After rolling the bits to the left and the right, ensure that only rotations remain in the reflection. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 78338e6..9821c59 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -1166,6 +1166,8 @@ rotation_reflect(unsigned rotation) assert(rotation); rotation <<= 2; /* RR_Rotate_0 -> RR_Rotate_180 etc */ rotation |= rotation >> 4; /* RR_Rotate_270' to RR_Rotate_90 */ + rotation &= RR_Rotate_All; + assert(rotation); return rotation | other_bits; } commit e1cff9909f4164551d5251e6a1d2eae0d5c89e44 Author: Timo Aaltonen <tjaal...@debian.org> Date: Thu Mar 3 16:22:39 2016 +0200 rebuild against new xserver, import 2:2.99.917+git20160218-1ubuntu2 diff --git a/debian/changelog b/debian/changelog index 390d028..12ea1ec 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,15 @@ -xserver-xorg-video-intel (2:2.99.917+git20160218-1ubuntu2) xenial; urgency=medium +xserver-xorg-video-intel (2:2.99.917+git20160218-1ubuntu3) xenial; urgency=medium * Rebuild against new xserver. - -- Timo Aaltonen <tjaal...@debian.org> Fri, 19 Feb 2016 00:28:08 +0200 + -- Timo Aaltonen <tjaal...@debian.org> Thu, 03 Mar 2016 16:21:42 +0200 + +xserver-xorg-video-intel (2:2.99.917+git20160218-1ubuntu2) xenial; urgency=medium + + * Move the shared libraries into the multiarch libdir. + * Enable parallel builds. + + -- Matthias Klose <d...@ubuntu.com> Fri, 26 Feb 2016 16:24:05 +0100 xserver-xorg-video-intel (2:2.99.917+git20160218-1ubuntu1) xenial; urgency=medium @@ -104,13 +111,6 @@ xserver-xorg-video-intel (2:2.99.917+git20150808-0ubuntu1) wily; urgency=medium -- Timo Aaltonen <tjaal...@debian.org> Thu, 20 Aug 2015 14:14:34 +0300 -xserver-xorg-video-intel (2:2.99.917+git20150618-1~exp1ubuntu1) UNRELEASED; urgency=medium - - * Merge from debian-experimental git. - * Drop patches, all upstream. - - -- Timo Aaltonen <tjaal...@debian.org> Thu, 18 Jun 2015 15:49:36 +0300 - xserver-xorg-video-intel (2:2.99.917-2) unstable; urgency=medium [ Robert Ancell ] diff --git a/debian/rules b/debian/rules index 26ea711..b6df46e 100755 --- a/debian/rules +++ b/debian/rules @@ -35,6 +35,9 @@ override_dh_install: find debian/tmp -name '*.la' -delete rm -f debian/tmp/usr/lib/libI810XvMC.so rm -f debian/tmp/usr/lib/libIntelXvMC.so + mkdir -p debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH) + mv debian/tmp/usr/lib/libI810XvMC.so.* debian/tmp/usr/lib/libIntelXvMC.so.* \ + debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/. dh_install --fail-missing # Debug package: @@ -49,7 +52,7 @@ override_dh_installchangelogs: dh_installchangelogs debian/upstream.changelog %: - dh $@ --with quilt,autoreconf,xsf --builddirectory=build/ + dh $@ --parallel --with quilt,autoreconf,xsf --builddirectory=build/ # Snapshots should only target experimental: generate-snapshot: UPSTREAM_VERSION = $(shell echo $(SOURCE_VERSION) | sed 's/^[0-9]*://;s/-.*$$//') diff --git a/debian/xserver-xorg-video-intel.install b/debian/xserver-xorg-video-intel.install index b603516..9508a54 100644 --- a/debian/xserver-xorg-video-intel.install +++ b/debian/xserver-xorg-video-intel.install @@ -1,7 +1,7 @@ usr/bin/intel-virtual-output usr/lib/xorg/modules/drivers/*.so -usr/lib/libI810XvMC.so* -usr/lib/libIntelXvMC.so* +usr/lib/*/libI810XvMC.so* +usr/lib/*/libIntelXvMC.so* usr/lib/xserver-xorg-video-intel/xf86-video-intel-backlight-helper usr/share/polkit-1/actions/org.x.xf86-video-intel.backlight-helper.policy usr/share/man diff --git a/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 b/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 index 48c5ed0..800b416 100644 --- a/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 +++ b/debian/xserver-xorg-video-intel.install.kfreebsd-amd64 @@ -1,4 +1,4 @@ usr/lib/xorg/modules/drivers/*.so -usr/lib/libI810XvMC.so* -usr/lib/libIntelXvMC.so* +usr/lib/*/libI810XvMC.so* +usr/lib/*/libIntelXvMC.so* usr/share/man diff --git a/debian/xserver-xorg-video-intel.install.kfreebsd-i386 b/debian/xserver-xorg-video-intel.install.kfreebsd-i386 index 48c5ed0..800b416 100644 --- a/debian/xserver-xorg-video-intel.install.kfreebsd-i386 +++ b/debian/xserver-xorg-video-intel.install.kfreebsd-i386 @@ -1,4 +1,4 @@ usr/lib/xorg/modules/drivers/*.so -usr/lib/libI810XvMC.so* -usr/lib/libIntelXvMC.so* +usr/lib/*/libI810XvMC.so* +usr/lib/*/libIntelXvMC.so* usr/share/man commit d1672806a5222f00dcc2eb24ccddd03f727f71bc Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Wed Feb 24 10:33:22 2016 +0000 sna/dri2: Add active-scanout tracking to single CRTC flips When we do a partial flip (one CRTC of many) we install a fake frontbuffer for the window. This needs to be included in the active-scanout tracking like a normal frontbuffer to avoid being recycled too early. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/kgem.h b/src/sna/kgem.h index 8bea755..0a941e0 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -404,6 +404,7 @@ void _kgem_bo_destroy(struct kgem *kgem, struct kgem_bo *bo); static inline void kgem_bo_destroy(struct kgem *kgem, struct kgem_bo *bo) { assert(bo->refcnt); + assert(bo->refcnt > bo->active_scanout); if (--bo->refcnt == 0) _kgem_bo_destroy(kgem, bo); } diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 98fb8af..78338e6 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -1640,6 +1640,7 @@ static bool wait_for_shadow(struct sna *sna, RegionSubtract(&sna->mode.shadow_region, &sna->mode.shadow_region, ®ion); } + crtc->client_bo->active_scanout--; kgem_bo_destroy(&sna->kgem, crtc->client_bo); crtc->client_bo = NULL; list_del(&crtc->shadow_link); @@ -1865,7 +1866,8 @@ static void sna_crtc_disable_override(struct sna *sna, struct sna_crtc *crtc) if (crtc->client_bo == NULL) return; - assert(crtc->client_bo->refcnt > crtc->client_bo->active_scanout); + assert(crtc->client_bo->refcnt >= crtc->client_bo->active_scanout); + crtc->client_bo->active_scanout--; if (!crtc->transform) { DrawableRec tmp; @@ -4366,6 +4368,7 @@ gather_encoders(struct sna *sna, uint32_t id, int count, DBG(("%s(%d): expected count=%d\n", __FUNCTION__, id, count)); VG_CLEAR(compat_conn); + VG_CLEAR(enc); memset(out, 0, sizeof(*out)); do { @@ -4390,6 +4393,7 @@ gather_encoders(struct sna *sna, uint32_t id, int count, compat_conn.conn.count_encoders = count = 0; } + VG(VALGRIND_MAKE_MEM_DEFINED(ids, sizeof(uint32_t)*compat_conn.conn.count_encoders)); if (count == compat_conn.conn.count_encoders) break; @@ -8391,12 +8395,14 @@ void sna_shadow_set_crtc(struct sna *sna, if (sna_crtc->client_bo != bo) { if (sna_crtc->client_bo) { - assert(sna_crtc->client_bo->refcnt > sna_crtc->client_bo->active_scanout); + assert(sna_crtc->client_bo->refcnt >= sna_crtc->client_bo->active_scanout); + sna_crtc->client_bo->active_scanout--; kgem_bo_destroy(&sna->kgem, sna_crtc->client_bo); } sna_crtc->client_bo = kgem_bo_reference(bo); - assert(sna_crtc->client_bo->refcnt > sna_crtc->client_bo->active_scanout); + sna_crtc->client_bo->active_scanout++; + assert(sna_crtc->client_bo->refcnt >= sna_crtc->client_bo->active_scanout); sna_crtc_damage(crtc); } @@ -8451,7 +8457,8 @@ void sna_shadow_unset_crtc(struct sna *sna, if (sna_crtc->client_bo == NULL) return; - assert(sna_crtc->client_bo->refcnt > sna_crtc->client_bo->active_scanout); + assert(sna_crtc->client_bo->refcnt >= sna_crtc->client_bo->active_scanout); + sna_crtc->client_bo->active_scanout--; kgem_bo_destroy(&sna->kgem, sna_crtc->client_bo); sna_crtc->client_bo = NULL; list_del(&sna_crtc->shadow_link); diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c index 2fcda87..2ed698d 100644 --- a/src/sna/sna_dri2.c +++ b/src/sna/sna_dri2.c @@ -171,6 +171,7 @@ inline static void __sna_dri2_copy_event(struct sna_dri2_event *info, unsigned flags) { DBG(("%s: flags = %x\n", __FUNCTION__, flags)); + assert(info->front != info->back); info->bo = __sna_dri2_copy_region(info->sna, info->draw, NULL, info->back, info->front, flags); @@ -282,12 +283,16 @@ sna_dri2_get_back(struct sna *sna, __FUNCTION__, c->bo ? c->bo->handle : 0, c->bo ? c->bo->active_scanout : -1)); assert(c->bo); if (c->bo->active_scanout == 0) { + _list_del(&c->link); + if (c->bo == NULL) { + free(c); + goto out; + } bo = c->bo; name = c->name; flags = c->flags; DBG(("%s: reuse cache handle=%d, name=%d, flags=%d\n", __FUNCTION__, bo->handle, name, flags)); c->bo = NULL; - _list_del(&c->link); break; } } @@ -360,6 +365,7 @@ sna_dri2_get_back(struct sna *sna, assert(back->pitch); assert(back->name); +out: get_private(back)->stale = false; } @@ -368,11 +374,13 @@ dri2_chain(DrawablePtr d) { struct dri2_window *priv = dri2_window((WindowPtr)d); assert(priv != NULL); + assert(priv->chain == NULL || priv->chain->chained); return priv->chain; } inline static DRI2BufferPtr dri2_window_get_front(WindowPtr win) { struct dri2_window *priv = dri2_window(win); + assert(priv->front == NULL || get_private(priv->front)->bo->active_scanout); return priv ? priv->front : NULL; } #else @@ -627,11 +635,13 @@ sna_dri2_create_buffer(DrawablePtr draw, private->bo->handle, buffer->name, private->bo->active_scanout)); + assert(buffer->attachment == DRI2BufferFrontLeft); assert(private->pixmap == pixmap); assert(sna_pixmap(pixmap)->flush); assert(sna_pixmap(pixmap)->pinned & PIN_DRI2); assert(kgem_bo_flink(&sna->kgem, private->bo) == buffer->name); assert(private->bo->pitch == buffer->pitch); + assert(private->bo->active_scanout); private->refcnt++; return buffer; @@ -864,9 +874,10 @@ static void _sna_dri2_destroy_buffer(struct sna *sna, if (buffer == NULL) return; - DBG(("%s: %p [handle=%d] -- refcnt=%d, pixmap=%ld\n", + DBG(("%s: %p [handle=%d] -- refcnt=%d, pixmap=%ld, proxy?=%d\n", __FUNCTION__, buffer, private->bo->handle, private->refcnt, - private->pixmap ? private->pixmap->drawable.serialNumber : 0)); + private->pixmap ? private->pixmap->drawable.serialNumber : 0, + private->proxy != NULL)); assert(private->refcnt > 0); if (--private->refcnt) return; @@ -875,6 +886,9 @@ static void _sna_dri2_destroy_buffer(struct sna *sna, if (private->proxy) { DBG(("%s: destroying proxy\n", __FUNCTION__)); + assert(private->bo->active_scanout > 0); + private->bo->active_scanout--; + _sna_dri2_destroy_buffer(sna, draw, private->proxy); private->pixmap = NULL; } @@ -889,6 +903,8 @@ static void _sna_dri2_destroy_buffer(struct sna *sna, assert(priv->pinned & PIN_DRI2); assert(priv->flush); + DBG(("%s: removing active_scanout=%d from pixmap handle=%d\n", + __FUNCTION__, priv->gpu_bo->active_scanout, priv->gpu_bo->handle)); assert(priv->gpu_bo->active_scanout > 0); priv->gpu_bo->active_scanout--; @@ -928,6 +944,7 @@ static void sna_dri2_destroy_buffer(DrawablePtr draw, DRI2Buffer2Ptr buffer) static DRI2BufferPtr sna_dri2_reference_buffer(DRI2BufferPtr buffer) { + assert(get_private(buffer)->refcnt > 0); get_private(buffer)->refcnt++; return buffer; } @@ -1616,7 +1633,6 @@ sna_dri2_remove_event(struct sna_dri2_event *info) { WindowPtr win = (WindowPtr)info->draw; struct dri2_window *priv; - struct sna_dri2_event *chain; assert(win->drawable.type == DRAWABLE_WINDOW); DBG(("%s: remove[%p] from window %ld, active? %d\n", @@ -1630,9 +1646,11 @@ sna_dri2_remove_event(struct sna_dri2_event *info) info->chained = false; if (priv->chain != info) { - chain = priv->chain; - while (chain->chain != info) + struct sna_dri2_event *chain = priv->chain; + while (chain->chain != info) { + assert(chain->chained); chain = chain->chain; + } assert(chain != info); assert(info->chain != chain); chain->chain = info->chain; @@ -1669,6 +1687,7 @@ sna_dri2_event_free(struct sna_dri2_event *info) if (info->chained) sna_dri2_remove_event(info); + assert((info->front == NULL && info->back == NULL) || info->front != info->back); _sna_dri2_destroy_buffer(info->sna, info->draw, info->front); _sna_dri2_destroy_buffer(info->sna, info->draw, info->back); @@ -1809,8 +1828,10 @@ void sna_dri2_decouple_window(WindowPtr win) if (priv->front) { struct sna *sna = to_sna_from_drawable(&win->drawable); + assert(priv->crtc); sna_shadow_unset_crtc(sna, priv->crtc); + _sna_dri2_destroy_buffer(sna, NULL, priv->front); priv->front = NULL; } @@ -1833,6 +1854,7 @@ void sna_dri2_destroy_window(WindowPtr win) if (priv->front) { assert(priv->crtc); sna_shadow_unset_crtc(sna, priv->crtc); + _sna_dri2_destroy_buffer(sna, NULL, priv->front); } @@ -1947,6 +1969,7 @@ sna_dri2_flip(struct sna_dri2_event *info) info->front->pitch = info->back->pitch; get_private(info->front)->bo = bo; bo->active_scanout++; + assert(bo->active_scanout <= bo->refcnt); info->back->flags = tmp_flags; info->back->name = tmp_name; @@ -2338,6 +2361,7 @@ sna_dri2_xchg(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPtr back) assert(front_bo->active_scanout > 0); front_bo->active_scanout--; back_bo->active_scanout++; + assert(back_bo->active_scanout <= back_bo->refcnt); tmp = front->name; front->name = back->name; @@ -2364,8 +2388,6 @@ static void sna_dri2_xchg_crtc(struct sna *sna, DrawablePtr draw, xf86CrtcPtr cr { WindowPtr win = (WindowPtr)draw; struct dri2_window *priv = dri2_window(win); - DRI2Buffer2Ptr tmp; - struct kgem_bo *bo; DBG(("%s: exchange front=%d/%d and back=%d/%d, win id=%lu, pixmap=%ld %dx%d\n", __FUNCTION__, @@ -2375,7 +2397,7 @@ static void sna_dri2_xchg_crtc(struct sna *sna, DrawablePtr draw, xf86CrtcPtr cr get_window_pixmap(win)->drawable.serialNumber, get_window_pixmap(win)->drawable.width, get_window_pixmap(win)->drawable.height)); - assert(can_xchg_crtc(to_sna_from_drawable(draw), draw, crtc, front, back)); + assert(can_xchg_crtc(sna, draw, crtc, front, back)); if (APPLY_DAMAGE) { DBG(("%s: marking drawable as damaged\n", __FUNCTION__)); @@ -2388,69 +2410,72 @@ static void sna_dri2_xchg_crtc(struct sna *sna, DrawablePtr draw, xf86CrtcPtr cr sna->ignore_copy_area = false; } - tmp = calloc(1, sizeof(*tmp) + sizeof(struct sna_dri2_private)); - if (tmp == NULL) { - back->attachment = -1; - if (get_private(back)->proxy == NULL) { - get_private(back)->pixmap = get_private(front)->pixmap; - get_private(back)->proxy = sna_dri2_reference_buffer(get_private(front)->proxy ?: front); + if (priv->front == NULL) { + DRI2Buffer2Ptr tmp; + + tmp = calloc(1, sizeof(*tmp) + sizeof(struct sna_dri2_private)); + if (tmp == NULL) { + sna_shadow_unset_crtc(sna, crtc); + return; } - if (priv->front) { - assert(front == priv->front); - assert(get_private(priv->front)->refcnt > 1); - get_private(priv->front)->refcnt--; + tmp->attachment = DRI2BufferFrontLeft; + tmp->driverPrivate = tmp + 1; + tmp->cpp = back->cpp; + tmp->format = back->format; + + get_private(tmp)->refcnt = 1; + get_private(tmp)->bo = kgem_create_2d(&sna->kgem, + draw->width, draw->height, draw->bitsPerPixel, + get_private(back)->bo->tiling, + CREATE_SCANOUT | CREATE_EXACT); + if (get_private(tmp)->bo != NULL) { + tmp->pitch = get_private(tmp)->bo->pitch; + tmp->name = kgem_bo_flink(&sna->kgem, get_private(tmp)->bo); } - priv->front = sna_dri2_reference_buffer(back); - return; + if (tmp->name == 0) { + if (get_private(tmp)->bo != NULL) + kgem_bo_destroy(&sna->kgem, get_private(tmp)->bo); + sna_shadow_unset_crtc(sna, crtc); + return; + } + get_private(tmp)->size = get_private(back)->size; + get_private(tmp)->pixmap = get_private(front)->pixmap; + get_private(tmp)->proxy = sna_dri2_reference_buffer(front); + get_private(tmp)->bo->active_scanout++; + + priv->front = front = tmp; } + assert(front == priv->front); - *tmp = *back; - tmp->attachment = DRI2BufferFrontLeft; - tmp->driverPrivate = tmp + 1; - get_private(tmp)->refcnt = 1; - get_private(tmp)->bo = get_private(back)->bo; - get_private(tmp)->size = get_private(back)->size; - get_private(tmp)->pixmap = get_private(front)->pixmap; - get_private(tmp)->proxy = sna_dri2_reference_buffer(get_private(front)->proxy ?: front); - mark_stale(back); + { + struct kgem_bo *front_bo = get_private(front)->bo; + struct kgem_bo *back_bo = get_private(back)->bo; + unsigned tmp; - if (priv->front) { - DBG(("%s: replacing Window frontbuffer (was handle=%d) now handle=%d\n", - __FUNCTION__, - get_private(priv->front)->bo->handle, - get_private(tmp)->bo->handle)); - assert(front == priv->front); - assert(get_private(priv->front)->refcnt > 1); - get_private(priv->front)->refcnt--; - } - priv->front = tmp; - - if (get_private(front)->proxy) { - DBG(("%s: reusing current proxy frontbuffer\n", __FUNCTION__)); - front->attachment = DRI2BufferBackLeft; - ref(get_private(tmp)->bo); - back->attachment = DRI2BufferFrontLeft; - } else { - DBG(("%s: allocating new backbuffer\n", __FUNCTION__)); - back->name = 0; - back->flags = 0; - bo = kgem_create_2d(&sna->kgem, - draw->width, draw->height, draw->bitsPerPixel, - get_private(back)->bo->tiling, - CREATE_SCANOUT | CREATE_EXACT); - if (bo != NULL) { - get_private(back)->bo = bo; - back->pitch = bo->pitch; - get_private(back)->size = draw->height << 16 | draw->width; - back->name = kgem_bo_flink(&sna->kgem, bo); - } - if (back->name == 0) { - if (bo != NULL) - kgem_bo_destroy(&sna->kgem, bo); - get_private(back)->bo = NULL; - back->attachment = DRI2BufferFrontLeft; - } + assert(front_bo->refcnt); + assert(back_bo->refcnt); + + get_private(back)->bo = front_bo; + get_private(front)->bo = back_bo; + mark_stale(back); + + assert(front_bo->active_scanout > 0); + front_bo->active_scanout--; + back_bo->active_scanout++; + assert(back_bo->active_scanout <= back_bo->refcnt); + + tmp = front->name; + front->name = back->name; + back->name = tmp; + + tmp = front->pitch; + front->pitch = back->pitch; + back->pitch = tmp; + + tmp = front->flags; + front->flags = back->flags; + back->flags = tmp; } } @@ -2562,6 +2587,7 @@ void sna_dri2_vblank_handler(struct drm_event_vblank *event) goto done; } + assert((info->front == NULL && info->back == NULL) || info->front != info->back); switch (info->type) { case FLIP: /* If we can still flip... */ @@ -2611,6 +2637,12 @@ void sna_dri2_vblank_handler(struct drm_event_vblank *event) } if (info->pending.bo) { + DBG(("%s: swapping old back handle=%d [name=%d, active=%d] for pending handle=%d [name=%d, active=%d], front handle=%d [name=%d, active=%d]\n", + __FUNCTION__, + get_private(info->back)->bo->handle, info->back->name, get_private(info->back)->bo->active_scanout, + info->pending.bo->handle, info->pending.name, info->pending.bo->active_scanout, + get_private(info->front)->bo->handle, info->front->name, get_private(info->front)->bo->active_scanout)); + if (sna->mode.shadow && sna->mode.shadow_wait) { /* recursed from wait_for_shadow(), simply requeue */ DBG(("%s -- recursed from wait_for_shadow(), requeuing\n", __FUNCTION__)); @@ -2693,14 +2725,14 @@ sna_dri2_immediate_blit(struct sna *sna, struct sna_dri2_event *info, bool sync) { - DrawablePtr draw = info->draw; - struct sna_dri2_event *chain = dri2_chain(draw); + struct sna_dri2_event *chain = dri2_chain(info->draw); if (sna->flags & SNA_NO_WAIT) sync = false; DBG(("%s: emitting immediate blit, throttling client, synced? %d, chained? %d, pipe %d\n", __FUNCTION__, sync, chain != info, info->pipe)); + assert(chain); info->type = SWAP_COMPLETE; info->sync = sync; @@ -2709,6 +2741,7 @@ sna_dri2_immediate_blit(struct sna *sna, if (chain == info) { DBG(("%s: no pending blit, starting chain\n", __FUNCTION__)); + assert(info->front != info->back); if (can_xchg(info->sna, info->draw, info->front, info->back)) { sna_dri2_xchg(info->draw, info->front, info->back); } else if (can_xchg_crtc(info->sna, info->draw, info->crtc, @@ -2720,7 +2753,7 @@ sna_dri2_immediate_blit(struct sna *sna, assert(info->signal); - if ((!swap_limit(draw, 2 + !sync) && !sync) || + if ((!swap_limit(info->draw, 2 + !sync) && !sync) || !sna_next_vblank(info)) { DBG(("%s: fake triple buffering, unblocking client\n", __FUNCTION__)); frame_swap_complete(info, DRI2_BLIT_COMPLETE); @@ -2729,8 +2762,13 @@ sna_dri2_immediate_blit(struct sna *sna, return; } + DBG(("%s: current event front=%d [name=%d, active?=%d], back=%d [name=%d, active?=%d]\n", __FUNCTION__, + get_private(chain->front)->bo->handle, chain->front->name, get_private(chain->front)->bo->active_scanout, + get_private(chain->back)->bo->handle, chain->back->name, get_private(chain->back)->bo->active_scanout)); + if (chain->type == SWAP_COMPLETE) { assert(chain->draw == info->draw); + assert(chain->front = info->front); assert(chain->client == info->client); assert(chain->event_complete == info->event_complete); assert(chain->event_data == info->event_data); @@ -2756,7 +2794,7 @@ sna_dri2_immediate_blit(struct sna *sna, chain->pending.bo = NULL; } - if (chain->pending.bo == NULL && swap_limit(draw, 2 + !sync)) { + if (chain->pending.bo == NULL && swap_limit(info->draw, 2 + !sync)) { DBG(("%s: setting handle=%d as pending blit (current event front=%d, back=%d)\n", __FUNCTION__, get_private(info->back)->bo->handle, get_private(chain->front)->bo->handle, @@ -3076,14 +3114,18 @@ sna_dri2_schedule_flip(ClientPtr client, DrawablePtr draw, xf86CrtcPtr crtc, if (info && info->draw == draw) { assert(info->type != FLIP); assert(info->queued); + assert(info->front != info->back); if (info->front != front) { - assert(info->front == NULL); + assert(info->front != NULL); + _sna_dri2_destroy_buffer(sna, draw, info->front); info->front = sna_dri2_reference_buffer(front); } if (info->back != back) { + assert(info->back != NULL); _sna_dri2_destroy_buffer(sna, draw, info->back); info->back = sna_dri2_reference_buffer(back); } + assert(info->front != info->back); DBG(("%s: executing xchg of pending flip: flip_continue=%d, keepalive=%d, chain?=%d\n", __FUNCTION__, info->flip_continue, info->keepalive, current_msc < *target_msc)); sna_dri2_xchg(draw, front, back); info->keepalive = KEEPALIVE; @@ -3111,6 +3153,7 @@ sna_dri2_schedule_flip(ClientPtr client, DrawablePtr draw, xf86CrtcPtr crtc, assert(info->draw); info->signal = true; + assert(front != back); info->front = sna_dri2_reference_buffer(front); info->back = sna_dri2_reference_buffer(back); @@ -3174,6 +3217,7 @@ queue: info->signal = true; info->type = FLIP; + assert(front != back); info->front = sna_dri2_reference_buffer(front); info->back = sna_dri2_reference_buffer(back); @@ -3271,8 +3315,11 @@ sna_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front, WindowPtr win = (WindowPtr)draw; struct dri2_window *priv = dri2_window(win); - if (priv->front) + if (priv->front) { front = priv->front; + assert(front->attachment == DRI2BufferFrontLeft); + assert(get_private(front)->refcnt); + } if (win->clipList.extents.x2 <= win->clipList.extents.x1 || win->clipList.extents.y2 <= win->clipList.extents.y1) {