diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/.lastcommit xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/.lastcommit --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/.lastcommit 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/.lastcommit 2012-11-01 18:08:01.000000000 +0000 @@ -1 +1 @@ -commit 4dfc83359d006a4e410e3280003b49683309afc3 +commit 72bcd8f85c98502b13a67d9c606371afe513584c diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/ChangeLog xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/ChangeLog --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/ChangeLog 2012-10-22 18:22:14.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/ChangeLog 2012-11-01 18:08:27.000000000 +0000 @@ -1,9 +1,159 @@ -commit 0eaa02f2000b5d77b63573b135c16e1bde7d916e +commit f8b67b7eff02c1da6145cf8833c84a11259255f4 Author: Robert Hooker -Date: Mon Oct 22 14:21:39 2012 -0400 +Date: Thu Nov 1 14:08:01 2012 -0400 Add debian tree from origin/ubuntu +commit 72bcd8f85c98502b13a67d9c606371afe513584c +Author: Chris Wilson +Date: Thu Nov 1 09:30:18 2012 +0000 + + sna: Try to reduce ping-pong migration for intermixed render/legacy code paths + + References: https://bugs.freedesktop.org/show_bug.cgi?id=56591 + Signed-off-by: Chris Wilson + +commit 4e363906a5ef15e1eb0a387cfb6b3445ac185b9d +Author: Chris Wilson +Date: Wed Oct 31 22:58:59 2012 +0000 + + sna: Set a valid box when checking for GPU bo for BLT composite ops + + Reported-by: Jiri Slaby + References: https://bugs.freedesktop.org/show_bug.cgi?id=47597 + Signed-off-by: Chris Wilson + +commit b924831e445615b82a53b10e1849720e933eddfe +Author: Chris Wilson +Date: Wed Oct 31 22:55:56 2012 +0000 + + sna: Preserve mode if flushing before a scanline wait + + Reported-by: Jiri Slaby + References: https://bugs.freedesktop.org/show_bug.cgi?id=47597 + Signed-off-by: Chris Wilson + +commit 678f9586807071bef813bb69d451f14d2fcbcc04 +Author: Chris Wilson +Date: Wed Oct 31 11:26:18 2012 +0000 + + sna: assert that the source is not the GTT mapping when uploading + + Signed-off-by: Chris Wilson + +commit 783b8048a6d1a9fd0a73ebf7768ae17dc0b21900 +Author: Chris Wilson +Date: Wed Oct 31 11:16:09 2012 +0000 + + sna: Prefer to use the GPU for uploads if continuing on the GPU + + Signed-off-by: Chris Wilson + +commit 74c912880c302889f38fe5898c8038a0ba20e5db +Author: Chris Wilson +Date: Wed Oct 31 10:57:54 2012 +0000 + + sna: Fix a typo in a DBG + + Reported-by: Matti Ruohonen + Signed-off-by: Chris Wilson + +commit f48a821aa73cb40a51baafc6cd2b063f1f91d864 +Author: Chris Wilson +Date: Wed Oct 31 10:53:47 2012 +0000 + + sna: Add a few DBG tracepoints to screen init/fini + + Signed-off-by: Chris Wilson + +commit bf81d552c4be039fbcf3272387828b1a8b3fbdb8 +Author: Chris Wilson +Date: Wed Oct 31 08:50:44 2012 +0000 + + sna: Clamp the drawable box to prevent int16 overflow + + And assert that the box is valid when migrating. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=56591 + Signed-off-by: Chris Wilson + +commit 31eb704b2ad7c861ec4e61fb9de0e9592fc6d269 +Author: Chris Wilson +Date: Fri Oct 26 13:57:30 2012 +0100 + + sna: Ensure that the trap is clipped if it ends within the boundary pixel + + Reported-and-tested-by: Jiri Slaby + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56395 + Signed-off-by: Chris Wilson + +commit ef431b2d35c1bf4d77bbcc73688951d22f6aa135 +Author: Chris Wilson +Date: Thu Oct 25 10:15:39 2012 +0100 + + uxa: Drain the DRM event queue before server regeneration + + Adam Jackson notes that what appeared to be my paranoid ramblings in SNA + actually served a purpose - it prevents a server crash following + server regen if an indirect client happened to be running at the time + (e.g. LIBGL_INDIRECT_ALWAYS=1 glxgears). + + Reported-by: Adam Jackson + Signed-off-by: Chris Wilson + +commit efb8ff16491ecfb4d9c0c6a718684310d949d8d3 +Author: Chris Wilson +Date: Wed Oct 24 22:56:20 2012 +0100 + + sna: Add missing ValidatePicture() for flattening alphamaps + + Reported-by: Armands Liepins + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56367 + Signed-off-by: Chris Wilson + +commit 1a489142c8e6a4828348cc9afbd0f430d3b1e2d8 +Author: Chris Wilson +Date: Tue Oct 23 23:43:50 2012 +0100 + + sna: Disable RandR hotplug events if Xinerama is enabled + + Since RandR itself is disabled if Xinerama is enabled, for example with + ZaphodHeads, calling RRGetInfo() upon a hotplug event generates an + assertion. + + Reported-by: Stephen Liang + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55260 + Signed-off-by: Chris Wilson + +commit d87c2756db1af6e4af15864ab0f44d1454079236 +Author: Chris Wilson +Date: Tue Oct 23 15:50:56 2012 +0100 + + sna: Beware 16-bit overflow when computing sample areas + + Reported-by: Ognian Tenchev + References: https://bugs.freedesktop.org/show_bug.cgi?id=56324 + Signed-off-by: Chris Wilson + +commit c7f48684cdebc24128a5fa5678614af3deb14b3b +Author: Chris Wilson +Date: Tue Oct 23 15:17:56 2012 +0100 + + sna: Only disallow hw sprite scaling on Haswell + + Earlier chips (Ironlake, Sandybridge and Ivybridge) have integrated + sprite scalers. + + Signed-off-by: Chris Wilson + +commit 5c3ea9cf6900855502fcd56214a1b9e180265ff5 +Author: Chris Wilson +Date: Mon Oct 22 22:35:17 2012 +0100 + + sna: Update DRI buffer if attached to the framebuffer for TearFree flips + + Signed-off-by: Chris Wilson + commit 4dfc83359d006a4e410e3280003b49683309afc3 Author: Chris Wilson Date: Mon Oct 22 14:56:01 2012 +0100 diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/debian/changelog xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/debian/changelog --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/debian/changelog 2012-11-01 18:12:21.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/debian/changelog 2012-11-01 18:12:21.000000000 +0000 @@ -1,12 +1,12 @@ -xserver-xorg-video-intel (2:2.20.12+git20121022.4dfc8335-0ubuntu0sarvatt) quantal; urgency=low +xserver-xorg-video-intel (2:2.20.12+git20121101.72bcd8f8-0ubuntu0sarvatt) quantal; urgency=low - * Checkout from git 20121022 (master branch) up to commit - 4dfc83359d006a4e410e3280003b49683309afc3 + * Checkout from git 20121101 (master branch) up to commit + 72bcd8f85c98502b13a67d9c606371afe513584c * Only added debian/ tree from origin/ubuntu * hook: Drop fix-glamor-check.diff (upstream) * Note: SNA can now be picked via AccelMethod in xorg.conf. - -- Robert Hooker Mon, 22 Oct 2012 14:22:14 -0400 + -- Robert Hooker Thu, 01 Nov 2012 14:08:27 -0400 xserver-xorg-video-intel (2:2.20.9-0ubuntu2) quantal; urgency=low diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/intel.h xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/intel.h --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/intel.h 2012-10-01 16:20:36.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/intel.h 2012-11-01 18:08:01.000000000 +0000 @@ -366,6 +366,7 @@ extern void intel_mode_init(struct intel_screen_private *intel); extern void intel_mode_disable_unused_functions(ScrnInfoPtr scrn); extern void intel_mode_remove_fb(intel_screen_private *intel); +extern void intel_mode_close(intel_screen_private *intel); extern void intel_mode_fini(intel_screen_private *intel); extern int intel_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crtc); diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/intel_display.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/intel_display.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/intel_display.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/intel_display.c 2012-11-01 18:08:01.000000000 +0000 @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -1830,6 +1831,26 @@ } } +static Bool has_pending_events(int fd) +{ + struct pollfd pfd; + pfd.fd = fd; + pfd.events = POLLIN; + return poll(&pfd, 1, 0) == 1; +} + +void +intel_mode_close(intel_screen_private *intel) +{ + struct intel_mode *mode = intel->modes; + + if (mode == NULL) + return; + + while (has_pending_events(mode->fd)) + drmHandleEvent(mode->fd, &mode->event_context); +} + void intel_mode_fini(intel_screen_private *intel) { diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/intel_driver.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/intel_driver.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/intel_driver.c 2012-10-01 16:20:36.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/intel_driver.c 2012-11-01 18:08:01.000000000 +0000 @@ -1139,6 +1139,8 @@ I830UeventFini(scrn); #endif + intel_mode_close(intel); + DeleteCallback(&FlushCallback, intel_flush_callback, scrn); intel_glamor_close_screen(screen); diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen2_render.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen2_render.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen2_render.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen2_render.c 2012-11-01 18:08:01.000000000 +0000 @@ -1614,7 +1614,6 @@ PicturePtr mask, PicturePtr dst) { - struct sna_pixmap *priv; PixmapPtr src_pixmap; PixmapPtr mask_pixmap; PixmapPtr dst_pixmap; @@ -1653,8 +1652,7 @@ } /* If anything is on the GPU, push everything out to the GPU */ - priv = sna_pixmap(dst_pixmap); - if (priv && priv->gpu_damage && !priv->clear) { + if (dst_use_gpu(dst_pixmap)) { DBG(("%s: dst is already on the GPU, try to use GPU\n", __FUNCTION__)); return false; @@ -1689,7 +1687,7 @@ if (too_large(dst_pixmap->drawable.width, dst_pixmap->drawable.height) && - (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) { + dst_is_cpu(dst_pixmap)) { DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__)); return true; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen3_render.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen3_render.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen3_render.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen3_render.c 2012-11-01 18:08:01.000000000 +0000 @@ -2641,7 +2641,6 @@ PicturePtr mask, PicturePtr dst) { - struct sna_pixmap *priv; PixmapPtr src_pixmap; PixmapPtr mask_pixmap; PixmapPtr dst_pixmap; @@ -2690,8 +2689,7 @@ } /* If anything is on the GPU, push everything out to the GPU */ - priv = sna_pixmap(dst_pixmap); - if (priv && priv->gpu_damage && !priv->clear) { + if (dst_use_gpu(dst_pixmap)) { DBG(("%s: dst is already on the GPU, try to use GPU\n", __FUNCTION__)); return false; @@ -2726,7 +2724,7 @@ if (too_large(dst_pixmap->drawable.width, dst_pixmap->drawable.height) && - (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) { + dst_is_cpu(dst_pixmap)) { DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__)); return true; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen4_render.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen4_render.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen4_render.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen4_render.c 2012-11-01 18:08:01.000000000 +0000 @@ -2119,7 +2119,6 @@ PicturePtr mask, PicturePtr dst) { - struct sna_pixmap *priv; PixmapPtr src_pixmap; PixmapPtr mask_pixmap; PixmapPtr dst_pixmap; @@ -2158,8 +2157,7 @@ } /* If anything is on the GPU, push everything out to the GPU */ - priv = sna_pixmap(dst_pixmap); - if (priv && priv->gpu_damage && !priv->clear) { + if (dst_use_gpu(dst_pixmap)) { DBG(("%s: dst is already on the GPU, try to use GPU\n", __FUNCTION__)); return false; @@ -2194,7 +2192,7 @@ if (too_large(dst_pixmap->drawable.width, dst_pixmap->drawable.height) && - (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) { + dst_is_cpu(dst_pixmap)) { DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__)); return true; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen5_render.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen5_render.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen5_render.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen5_render.c 2012-11-01 18:08:01.000000000 +0000 @@ -2130,7 +2130,6 @@ PicturePtr mask, PicturePtr dst) { - struct sna_pixmap *priv; PixmapPtr src_pixmap; PixmapPtr mask_pixmap; PixmapPtr dst_pixmap; @@ -2169,8 +2168,7 @@ } /* If anything is on the GPU, push everything out to the GPU */ - priv = sna_pixmap(dst_pixmap); - if (priv && priv->gpu_damage && !priv->clear) { + if (dst_use_gpu(dst_pixmap)) { DBG(("%s: dst is already on the GPU, try to use GPU\n", __FUNCTION__)); return false; @@ -2205,7 +2203,7 @@ if (too_large(dst_pixmap->drawable.width, dst_pixmap->drawable.height) && - (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) { + dst_is_cpu(dst_pixmap)) { DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__)); return true; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen6_render.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen6_render.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen6_render.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen6_render.c 2012-11-01 18:08:01.000000000 +0000 @@ -2487,7 +2487,6 @@ PicturePtr mask, PicturePtr dst) { - struct sna_pixmap *priv; PixmapPtr src_pixmap; PixmapPtr mask_pixmap; PixmapPtr dst_pixmap; @@ -2526,10 +2525,7 @@ } /* If anything is on the GPU, push everything out to the GPU */ - priv = sna_pixmap(dst_pixmap); - if (priv && - ((priv->gpu_damage && !priv->clear) || - (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo)))) { + if (dst_use_gpu(dst_pixmap)) { DBG(("%s: dst is already on the GPU, try to use GPU\n", __FUNCTION__)); return false; @@ -2564,7 +2560,7 @@ if (too_large(dst_pixmap->drawable.width, dst_pixmap->drawable.height) && - (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) { + dst_is_cpu(dst_pixmap)) { DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__)); return true; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen7_render.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen7_render.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/gen7_render.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/gen7_render.c 2012-11-01 18:08:01.000000000 +0000 @@ -2604,7 +2604,6 @@ PicturePtr mask, PicturePtr dst) { - struct sna_pixmap *priv; PixmapPtr src_pixmap; PixmapPtr mask_pixmap; PixmapPtr dst_pixmap; @@ -2643,10 +2642,7 @@ } /* If anything is on the GPU, push everything out to the GPU */ - priv = sna_pixmap(dst_pixmap); - if (priv && - ((priv->gpu_damage && !priv->clear) || - (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo)))) { + if (dst_use_gpu(dst_pixmap)) { DBG(("%s: dst is already on the GPU, try to use GPU\n", __FUNCTION__)); return false; @@ -2681,7 +2677,7 @@ if (too_large(dst_pixmap->drawable.width, dst_pixmap->drawable.height) && - (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) { + dst_is_cpu(dst_pixmap)) { DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__)); return true; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/kgem.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/kgem.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/kgem.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/kgem.c 2012-11-01 18:08:01.000000000 +0000 @@ -4934,10 +4934,10 @@ struct kgem_bo *kgem_upload_source_image(struct kgem *kgem, const void *data, - BoxPtr box, + const BoxRec *box, int stride, int bpp) { - int width = box->x2 - box->x1; + int width = box->x2 - box->x1; int height = box->y2 - box->y1; struct kgem_bo *bo; void *dst; diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/kgem.h xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/kgem.h --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/kgem.h 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/kgem.h 2012-11-01 18:08:01.000000000 +0000 @@ -222,7 +222,7 @@ struct kgem_bo *kgem_upload_source_image(struct kgem *kgem, const void *data, - BoxPtr box, + const BoxRec *box, int stride, int bpp); void kgem_proxy_bo_attach(struct kgem_bo *bo, struct kgem_bo **ptr); @@ -390,8 +390,11 @@ static inline uint32_t *kgem_get_batch(struct kgem *kgem, int num_dwords) { - if (!kgem_check_batch(kgem, num_dwords)) + if (!kgem_check_batch(kgem, num_dwords)) { + unsigned mode = kgem->mode; _kgem_submit(kgem); + _kgem_set_mode(kgem, mode); + } return kgem->batch + kgem->nbatch; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna.h xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna.h --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna.h 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna.h 2012-11-01 18:08:01.000000000 +0000 @@ -368,6 +368,7 @@ static inline void sna_dri_destroy_window(WindowPtr win) { } static inline void sna_dri_close(struct sna *sna, ScreenPtr pScreen) { } #endif +void sna_dri_pixmap_update_bo(struct sna *sna, PixmapPtr pixmap); extern int sna_crtc_to_pipe(xf86CrtcPtr crtc); extern int sna_crtc_to_plane(xf86CrtcPtr crtc); @@ -480,6 +481,24 @@ sna_drawable_use_bo(DrawablePtr drawable, unsigned flags, const BoxRec *box, struct sna_damage ***damage); +inline static int16_t bound(int16_t a, uint16_t b) +{ + int v = (int)a + (int)b; + if (v > MAXSHORT) + return MAXSHORT; + return v; +} + +inline static int16_t clamp(int16_t a, int16_t b) +{ + int v = (int)a + (int)b; + if (v > MAXSHORT) + return MAXSHORT; + if (v < MINSHORT) + return MINSHORT; + return v; +} + static inline bool box_inplace(PixmapPtr pixmap, const BoxRec *box) { diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_accel.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_accel.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_accel.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_accel.c 2012-11-01 18:08:01.000000000 +0000 @@ -1390,6 +1390,9 @@ kgem_bo_is_busy(priv->gpu_bo), kgem_bo_is_busy(priv->cpu_bo))); + if (!priv->cpu) + return true; + if (flags & (MOVE_WRITE | MOVE_ASYNC_HINT)) return true; @@ -2359,8 +2362,11 @@ struct sna_pixmap *priv = sna_pixmap(pixmap); RegionRec i, r; - DBG(("%s()\n", __FUNCTION__)); + DBG(("%s: pixmap=%ld box=(%d, %d), (%d, %d), flags=%x\n", + __FUNCTION__, pixmap->drawable.serialNumber, + box->x1, box->y1, box->x2, box->y2, flags)); + assert(box->x2 > box->x1 && box->y2 > box->y1); assert_pixmap_damage(pixmap); assert_pixmap_contains_box(pixmap, box); assert(!wedged(sna)); @@ -2439,6 +2445,7 @@ pixmap->devPrivate.ptr = priv->ptr; pixmap->devKind = priv->stride; } + assert(!priv->mapped); if (n == 1 && !priv->pinned && box->x1 <= 0 && box->y1 <= 0 && box->x2 >= pixmap->drawable.width && @@ -2483,6 +2490,7 @@ pixmap->devPrivate.ptr = priv->ptr; pixmap->devKind = priv->stride; } + assert(!priv->mapped); ok = sna_write_boxes(sna, pixmap, priv->gpu_bo, 0, 0, pixmap->devPrivate.ptr, @@ -2518,6 +2526,7 @@ pixmap->devPrivate.ptr = priv->ptr; pixmap->devKind = priv->stride; } + assert(!priv->mapped); ok = sna_write_boxes(sna, pixmap, priv->gpu_bo, 0, 0, pixmap->devPrivate.ptr, @@ -2573,6 +2582,7 @@ box->x1, box->y1, box->x2, box->y2, flags)); + assert(box->x2 > box->x1 && box->y2 > box->y1); assert_pixmap_damage(pixmap); assert_drawable_contains_box(drawable, box); @@ -3087,9 +3097,6 @@ assert(pixmap_contains_damage(pixmap, priv->cpu_damage)); DBG(("%s: uploading %d damage boxes\n", __FUNCTION__, n)); - if (!priv->cpu) - flags |= MOVE_ASYNC_HINT; - ok = false; if (use_cpu_bo_for_upload(sna, priv, flags)) { DBG(("%s: using CPU bo for upload to GPU\n", __FUNCTION__)); @@ -3104,6 +3111,7 @@ pixmap->devPrivate.ptr = priv->ptr; pixmap->devKind = priv->stride; } + assert(!priv->mapped); if (n == 1 && !priv->pinned && (box->x2 - box->x1) >= pixmap->drawable.width && (box->y2 - box->y1) >= pixmap->drawable.height) { @@ -3335,24 +3343,6 @@ box->y2 = y; } -static int16_t bound(int16_t a, uint16_t b) -{ - int v = (int)a + (int)b; - if (v > MAXSHORT) - return MAXSHORT; - return v; -} - -static int16_t clamp(int16_t a, int16_t b) -{ - int v = (int)a + (int)b; - if (v > MAXSHORT) - return MAXSHORT; - if (v < MINSHORT) - return MINSHORT; - return v; -} - static inline bool box32_to_box16(const Box32Rec *b32, BoxRec *b16) { b16->x1 = b32->x1; @@ -14144,6 +14134,8 @@ { PictureScreenPtr ps; + DBG(("%s\n", __FUNCTION__)); + if (!miPictureInit(screen, NULL, 0)) return false; @@ -14171,6 +14163,8 @@ { const char *backend; + DBG(("%s\n", __FUNCTION__)); + sna_font_key = AllocateFontPrivateIndex(); list_init(&sna->flush_pixmaps); @@ -14279,6 +14273,8 @@ void sna_accel_create(struct sna *sna) { + DBG(("%s\n", __FUNCTION__)); + if (!sna_glyphs_create(sna)) goto fail; @@ -14317,6 +14313,8 @@ void sna_accel_close(struct sna *sna) { + DBG(("%s\n", __FUNCTION__)); + sna_composite_close(sna); sna_gradients_close(sna); sna_glyphs_close(sna); @@ -14409,4 +14407,5 @@ void sna_accel_free(struct sna *sna) { + DBG(("%s\n", __FUNCTION__)); } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_blt.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_blt.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_blt.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_blt.c 2012-11-01 18:08:01.000000000 +0000 @@ -1715,8 +1715,14 @@ was_clear = sna_drawable_is_clear(dst->pDrawable); tmp->dst.pixmap = get_drawable_pixmap(dst->pDrawable); - dst_box.x1 = dst_x; dst_box.x2 = dst_x + width; - dst_box.y1 = dst_y; dst_box.y2 = dst_y + height; + if (width | height) { + dst_box.x1 = dst_x; + dst_box.x2 = bound(dst_x, width); + dst_box.y1 = dst_y; + dst_box.y2 = bound(dst_y, height); + } else + sna_render_picture_extents(dst, &dst_box); + bo = sna_drawable_use_bo(dst->pDrawable, PREFER_GPU, &dst_box, &tmp->damage); if (bo && !kgem_bo_can_blt(&sna->kgem, bo)) { DBG(("%s: can not blit to dst, tiling? %d, pitch? %d\n", diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_composite.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_composite.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_composite.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_composite.c 2012-11-01 18:08:01.000000000 +0000 @@ -619,14 +619,6 @@ REGION_UNINIT(NULL, ®ion); } -static int16_t bound(int16_t a, uint16_t b) -{ - int v = (int)a + (int)b; - if (v > MAXSHORT) - return MAXSHORT; - return v; -} - static bool _pixman_region_init_clipped_rectangles(pixman_region16_t *region, unsigned int num_rects, diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_display.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_display.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_display.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_display.c 2012-11-01 18:08:01.000000000 +0000 @@ -2792,6 +2792,8 @@ uint32_t event; uint32_t *b; + assert(sna->kgem.mode != KGEM_NONE); + if (pipe == 0) { if (full_height) event = MI_WAIT_FOR_PIPEA_SVBLANK; @@ -2804,7 +2806,6 @@ event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW; } - kgem_set_mode(&sna->kgem, KGEM_BLT); b = kgem_get_batch(&sna->kgem, 5); /* The documentation says that the LOAD_SCAN_LINES command * always comes in pairs. Don't ask me why. */ @@ -2822,6 +2823,8 @@ { uint32_t *b; + assert(sna->kgem.mode != KGEM_NONE); + /* * Pre-965 doesn't have SVBLANK, so we need a bit * of extra time for the blitter to start up and @@ -2830,7 +2833,6 @@ if (full_height) y2 -= 2; - kgem_set_mode(&sna->kgem, KGEM_BLT); b = kgem_get_batch(&sna->kgem, 5); /* The documentation says that the LOAD_SCAN_LINES command * always comes in pairs. Don't ask me why. */ @@ -3223,6 +3225,7 @@ for (i = 0; i < config->num_crtc; i++) { struct sna_crtc *crtc = config->crtc[i]->driver_private; + struct drm_mode_crtc_page_flip arg; DBG(("%s: crtc %d [%d, pipe=%d] active? %d\n", __FUNCTION__, i, crtc->id, crtc->pipe, crtc->bo != NULL)); @@ -3230,41 +3233,33 @@ continue; assert(config->crtc[i]->enabled); + assert(crtc->dpms_mode == DPMSModeOn); - if (crtc->dpms_mode == DPMSModeOn) { - struct drm_mode_crtc_page_flip arg; - arg.crtc_id = crtc->id; - arg.fb_id = get_fb(sna, new, - sna->scrn->virtualX, - sna->scrn->virtualY); - if (arg.fb_id == 0) - goto disable; - - /* Only the reference crtc will finally deliver its page flip - * completion event. All other crtc's events will be discarded. - */ - arg.user_data = 0; - arg.flags = DRM_MODE_PAGE_FLIP_EVENT; - arg.reserved = 0; - - if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_PAGE_FLIP, &arg)) { - DBG(("%s: flip [fb=%d] on crtc %d [%d, pipe=%d] failed - %d\n", - __FUNCTION__, arg.fb_id, i, crtc->id, crtc->pipe, errno)); + arg.crtc_id = crtc->id; + arg.fb_id = get_fb(sna, new, + sna->scrn->virtualX, + sna->scrn->virtualY); + if (arg.fb_id == 0) + goto disable; + + arg.user_data = 0; + arg.flags = DRM_MODE_PAGE_FLIP_EVENT; + arg.reserved = 0; + + if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_PAGE_FLIP, &arg)) { + DBG(("%s: flip [fb=%d] on crtc %d [%d, pipe=%d] failed - %d\n", + __FUNCTION__, arg.fb_id, i, crtc->id, crtc->pipe, errno)); disable: - sna_crtc_disable(config->crtc[i]); - continue; - } - sna->mode.shadow_flip++; + sna_crtc_disable(config->crtc[i]); + continue; } + sna->mode.shadow_flip++; kgem_bo_destroy(&sna->kgem, old); crtc->bo = kgem_bo_reference(new); } if (sna->mode.shadow) { - /* XXX only works if the kernel stalls fwrites to the current - * scanout whilst the flip is pending - */ while (sna->mode.shadow_flip) sna_mode_wakeup(sna); (void)sna->render.copy_boxes(sna, GXcopy, @@ -3276,8 +3271,9 @@ kgem_submit(&sna->kgem); sna_pixmap(sna->front)->gpu_bo = old; - sna->mode.shadow = new; + sna_dri_pixmap_update_bo(sna, sna->front); + sna->mode.shadow = new; new->flush = old->flush; } diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_dri.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_dri.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_dri.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_dri.c 2012-11-01 18:08:01.000000000 +0000 @@ -207,6 +207,27 @@ ((void **)dixGetPrivateAddr(&pixmap->devPrivates, &sna_pixmap_key))[2] = ptr; } +void +sna_dri_pixmap_update_bo(struct sna *sna, PixmapPtr pixmap) +{ + DRI2Buffer2Ptr buffer; + struct sna_dri_private *private; + struct kgem_bo *bo; + + buffer = sna_pixmap_get_buffer(pixmap); + if (buffer == NULL) + return; + + private = get_private(buffer); + assert(private->pixmap == pixmap); + + bo = sna_pixmap(pixmap)->gpu_bo; + buffer->name = kgem_bo_flink(&sna->kgem, bo); + private->bo = bo; + + /* XXX DRI2InvalidateDrawable(&pixmap->drawable); */ +} + static DRI2Buffer2Ptr sna_dri_create_buffer(DrawablePtr draw, unsigned int attachment, @@ -464,8 +485,10 @@ struct drm_i915_gem_busy busy; int mode; - if (sna->kgem.gen < 60) + if (sna->kgem.gen < 60) { + kgem_set_mode(&sna->kgem, KGEM_BLT); return; + } if (sync) { DBG(("%s: sync, force RENDER ring\n", __FUNCTION__)); diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_driver.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_driver.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_driver.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_driver.c 2012-11-01 18:08:01.000000000 +0000 @@ -639,6 +639,12 @@ DBG(("%s\n", __FUNCTION__)); + /* RandR will be disabled if Xinerama is active, and so generating + * RR hotplug events is then verboten. + */ + if (!dixPrivateKeyRegistered(rrPrivKey)) + return; + if (!xf86GetOptValBool(sna->Options, OPTION_HOTPLUG, &hotplug)) from = X_DEFAULT, hotplug = TRUE; xf86DrvMsg(scrn->scrnIndex, from, "hotplug detection: \"%s\"\n", diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_render.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_render.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_render.c 2012-10-01 16:20:36.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_render.c 2012-11-01 18:08:01.000000000 +0000 @@ -474,7 +474,7 @@ static struct kgem_bo *upload(struct sna *sna, struct sna_composite_channel *channel, PixmapPtr pixmap, - BoxPtr box) + const BoxRec *box) { struct sna_pixmap *priv; struct kgem_bo *bo; @@ -587,8 +587,8 @@ } else { box.x1 = x; box.y1 = y; - box.x2 = x + w; - box.y2 = y + h; + box.x2 = bound(x, w); + box.y2 = bound(y, h); if (channel->repeat == RepeatNone || channel->repeat == RepeatPad) { if (box.x1 < 0) @@ -661,8 +661,8 @@ box.x1 = x; box.y1 = y; - box.x2 = x + w; - box.y2 = y + h; + box.x2 = bound(x, w); + box.y2 = bound(y, h); if (channel->transform) { pixman_vector_t v; @@ -843,8 +843,8 @@ box.x1 = x; box.y1 = y; - box.x2 = x + w; - box.y2 = y + h; + box.x2 = bound(x, w); + box.y2 = bound(y, h); DBG(("%s: unaligned box (%d, %d), (%d, %d)\n", __FUNCTION__, box.x1, box.y1, box.x2, box.y2)); @@ -934,8 +934,8 @@ box.x1 = x; box.y1 = y; - box.x2 = x + w; - box.y2 = y + h; + box.x2 = bound(x, w); + box.y2 = bound(y, h); if (channel->transform) pixman_transform_bounds(channel->transform, &box); @@ -1077,8 +1077,8 @@ ox = box.x1 = x; oy = box.y1 = y; - box.x2 = x + w; - box.y2 = y + h; + box.x2 = bound(x, w); + box.y2 = bound(y, h); if (channel->transform) { pixman_vector_t v; @@ -1334,6 +1334,7 @@ assert(w <= sna->render.max_3d_size && h <= sna->render.max_3d_size); /* XXX shortcut a8? */ + DBG(("%s: %dx%d\n", __FUNCTION__, w, h)); pixmap = screen->CreatePixmap(screen, w, h, 32, SNA_CREATE_SCRATCH); if (pixmap == NullPixmap) @@ -1346,6 +1347,8 @@ if (tmp == NULL) return 0; + ValidatePicture(tmp); + old_format = picture->format; picture->format = PICT_FORMAT(PICT_FORMAT_BPP(picture->format), PICT_FORMAT_TYPE(picture->format), @@ -1627,8 +1630,8 @@ if (w != 0 && h != 0) { box.x1 = x; box.y1 = y; - box.x2 = x + w; - box.y2 = y + h; + box.x2 = bound(x, w); + box.y2 = bound(y, h); if (channel->transform) { DBG(("%s: has transform, converting whole surface\n", @@ -1764,9 +1767,9 @@ __FUNCTION__, op->dst.bo->pitch, sna->render.max_3d_pitch)); box.x1 = x; - box.x2 = x + width; + box.x2 = bound(x, width); box.y1 = y; - box.y2 = y + height; + box.y2 = bound(y, height); /* Ensure we align to an even tile row */ if (op->dst.bo->tiling) { @@ -1860,8 +1863,8 @@ t->box.x1 = x + op->dst.x; t->box.y1 = y + op->dst.y; - t->box.x2 = t->box.x1 + width; - t->box.y2 = t->box.y1 + height; + t->box.x2 = bound(t->box.x1, width); + t->box.y2 = bound(t->box.y1, height); DBG(("%s: original box (%d, %d), (%d, %d)\n", __FUNCTION__, t->box.x1, t->box.y1, t->box.x2, t->box.y2)); diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_render_inline.h xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_render_inline.h --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_render_inline.h 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_render_inline.h 2012-11-01 18:08:01.000000000 +0000 @@ -146,8 +146,8 @@ { box->x1 = p->pDrawable->x; box->y1 = p->pDrawable->y; - box->x2 = p->pDrawable->x + p->pDrawable->width; - box->y2 = p->pDrawable->y + p->pDrawable->height; + box->x2 = bound(box->x1, p->pDrawable->width); + box->y2 = bound(box->y1, p->pDrawable->height); if (box->x1 < p->pCompositeClip->extents.x1) box->x1 = p->pCompositeClip->extents.x1; @@ -158,6 +158,8 @@ box->x2 = p->pCompositeClip->extents.x2; if (box->y2 > p->pCompositeClip->extents.y2) box->y2 = p->pCompositeClip->extents.y2; + + assert(box->x2 > box->x1 && box->y2 > box->y1); } static inline void @@ -218,4 +220,23 @@ return pixel; } +inline static bool dst_use_gpu(PixmapPtr pixmap) +{ + struct sna_pixmap *priv = sna_pixmap(pixmap); + if (priv == NULL) + return false; + + if (priv->gpu_damage && !priv->clear && + (!priv->cpu || !priv->cpu_damage || kgem_bo_is_busy(priv->gpu_bo))) + return true; + + return priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo); +} + +inline static bool dst_is_cpu(PixmapPtr pixmap) +{ + struct sna_pixmap *priv = sna_pixmap(pixmap); + return priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage); +} + #endif /* SNA_RENDER_INLINE_H */ diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_trapezoids.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_trapezoids.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_trapezoids.c 2012-10-01 16:20:36.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_trapezoids.c 2012-11-01 18:08:01.000000000 +0000 @@ -3073,13 +3073,13 @@ uint8_t covered) { int16_t x1 = pixman_fixed_to_int(trap->left.p1.x) + dx; - int16_t fx1 = grid_coverage(SAMPLES_X, trap->left.p1.x); + uint16_t fx1 = grid_coverage(SAMPLES_X, trap->left.p1.x); int16_t x2 = pixman_fixed_to_int(trap->right.p2.x) + dx; - int16_t fx2 = grid_coverage(SAMPLES_X, trap->right.p2.x); + uint16_t fx2 = grid_coverage(SAMPLES_X, trap->right.p2.x); if (x1 < extents->x1) x1 = extents->x1, fx1 = 0; - if (x2 > extents->x2) + if (x2 >= extents->x2) x2 = extents->x2, fx2 = 0; DBG(("%s: x=(%d.%d, %d.%d), y=%dx%d, covered=%d\n", __FUNCTION__, @@ -3171,13 +3171,13 @@ uint8_t covered) { int16_t x1 = pixman_fixed_to_int(trap->left.p1.x); - int16_t fx1 = grid_coverage(SAMPLES_X, trap->left.p1.x); + uint16_t fx1 = grid_coverage(SAMPLES_X, trap->left.p1.x); int16_t x2 = pixman_fixed_to_int(trap->right.p1.x); - int16_t fx2 = grid_coverage(SAMPLES_X, trap->right.p1.x); + uint16_t fx2 = grid_coverage(SAMPLES_X, trap->right.p1.x); if (x1 < extents->x1) x1 = extents->x1, fx1 = 0; - if (x2 > extents->x2) + if (x2 >= extents->x2) x2 = extents->x2, fx2 = 0; if (x1 < x2) { @@ -3276,9 +3276,9 @@ extents = REGION_RECTS(&clip); while (count--) { int16_t y1 = dy + pixman_fixed_to_int(t->top); - int16_t fy1 = pixman_fixed_frac(t->top); + uint16_t fy1 = pixman_fixed_frac(t->top); int16_t y2 = dy + pixman_fixed_to_int(t->bottom); - int16_t fy2 = pixman_fixed_frac(t->bottom); + uint16_t fy2 = pixman_fixed_frac(t->bottom); DBG(("%s: t=(%d, %d), (%d, %d), extents (%d, %d), (%d, %d)\n", __FUNCTION__, @@ -3291,7 +3291,7 @@ if (y1 < extents->y1) y1 = extents->y1, fy1 = 0; - if (y2 > extents->y2) + if (y2 >= extents->y2) y2 = extents->y2, fy2 = 0; if (y1 < y2) { @@ -3363,13 +3363,13 @@ extents = REGION_RECTS(&clip); while (count--) { int16_t y1 = pixman_fixed_to_int(t->top); - int16_t fy1 = pixman_fixed_frac(t->top); + uint16_t fy1 = pixman_fixed_frac(t->top); int16_t y2 = pixman_fixed_to_int(t->bottom); - int16_t fy2 = pixman_fixed_frac(t->bottom); + uint16_t fy2 = pixman_fixed_frac(t->bottom); if (y1 < extents->y1) y1 = extents->y1, fy1 = 0; - if (y2 > extents->y2) + if (y2 >= extents->y2) y2 = extents->y2, fy2 = 0; if (y1 < y2) { if (fy1) { @@ -3429,13 +3429,13 @@ uint8_t covered) { int16_t x1 = pixman_fixed_to_int(trap->left.p1.x); - int16_t fx1 = grid_coverage(SAMPLES_X, trap->left.p1.x); + uint16_t fx1 = grid_coverage(SAMPLES_X, trap->left.p1.x); int16_t x2 = pixman_fixed_to_int(trap->right.p1.x); - int16_t fx2 = grid_coverage(SAMPLES_X, trap->right.p1.x); + uint16_t fx2 = grid_coverage(SAMPLES_X, trap->right.p1.x); if (x1 < extents->x1) x1 = extents->x1, fx1 = 0; - if (x2 > extents->x2) + if (x2 >= extents->x2) x2 = extents->x2, fx2 = 0; if (x1 < x2) { @@ -3526,9 +3526,9 @@ extents = REGION_RECTS(&clip); while (count--) { int16_t y1 = pixman_fixed_to_int(t->top); - int16_t fy1 = pixman_fixed_frac(t->top); + uint16_t fy1 = pixman_fixed_frac(t->top); int16_t y2 = pixman_fixed_to_int(t->bottom); - int16_t fy2 = pixman_fixed_frac(t->bottom); + uint16_t fy2 = pixman_fixed_frac(t->bottom); if (y1 < extents->y1) y1 = extents->y1, fy1 = 0; diff -Nru xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_video_sprite.c xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_video_sprite.c --- xserver-xorg-video-intel-2.20.12+git20121022.4dfc8335/src/sna/sna_video_sprite.c 2012-10-22 18:21:39.000000000 +0000 +++ xserver-xorg-video-intel-2.20.12+git20121101.72bcd8f8/src/sna/sna_video_sprite.c 2012-11-01 18:08:01.000000000 +0000 @@ -114,8 +114,15 @@ unsigned int *p_w, unsigned int *p_h, pointer data) { - *p_w = vid_w; - *p_h = vid_h; + struct sna *sna = to_sna(scrn); + + if (sna->kgem.gen == 75) { + *p_w = vid_w; + *p_h = vid_h; + } else { + *p_w = drw_w; + *p_h = drw_h; + } } static void