Hello community,

here is the log from the commit of package xf86-video-intel for 
openSUSE:Factory checked in at 2016-07-07 15:09:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xf86-video-intel (Old)
 and      /work/SRC/openSUSE:Factory/.xf86-video-intel.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xf86-video-intel"

Changes:
--------
--- /work/SRC/openSUSE:Factory/xf86-video-intel/xf86-video-intel.changes        
2016-05-23 17:30:02.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.xf86-video-intel.new/xf86-video-intel.changes   
2016-07-07 15:09:05.000000000 +0200
@@ -1,0 +2,31 @@
+Mon Jul  4 07:12:15 UTC 2016 - [email protected]
+
+- Update to 2.99.917.674_g9154dff
+  * Only shutdown secondary plances on CRTCs we own (boo#984747).
+  * Do not force migration to GPU for very large object.
+  * Skip wait_for_shadow when shadow is temprarily disabled.
+  * Avoid Recursion by testing shadow.wait.
+  * DRI3 is not supporteed by mesa/i915.
+  * Various minor fixes.
+
+-------------------------------------------------------------------
+Tue Jun 21 17:38:03 UTC 2016 - [email protected]
+
+- Update to 2.99.917.666_g7b6e219:
+   sna: Hide compiler warnings for change in uAPI defines
+   sna/video: Create one XvAdapter for each sprite plane
+   sna/video: Prepare for multiple sprite ports
+   sna: Record all sprite planes reported by the kernel
+   compat: Another day, another ABI change for OsBlockSGIO
+   sna: Use physical output size from the kernel
+   compat: Add OsBlockSIGIO/OsReleaseSIGIO wrappers
+   sna: Restore TearFree operation after switching everything off
+   sna/dri2: Avoid chaining swaps across a mode change
+   sna: Display errno when SETCURSOR fails
+   sna: Allow disconnected outputs to retain state without EDID checks
+   sna: Confirm the EDID is the same after a hotplug before ignoring
+   sna: Don't skip migration-to-GPU for TearFree
+   sna: Track the minimum damage when doing CRTC-local TearFree
+   sna: Fix increment of modeset serial after applying CRTC
+
+-------------------------------------------------------------------

Old:
----
  xf86-video-intel-2.99.917.651_g34f63f2.tar.bz2

New:
----
  xf86-video-intel-2.99.917.674_g9154dff.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xf86-video-intel.spec ++++++
--- /var/tmp/diff_new_pack.KtPzBq/_old  2016-07-07 15:09:06.000000000 +0200
+++ /var/tmp/diff_new_pack.KtPzBq/_new  2016-07-07 15:09:06.000000000 +0200
@@ -19,7 +19,7 @@
 %bcond_with glamor
 %bcond_with backlighthelper
 Name:           xf86-video-intel
-Version:        2.99.917.651_g34f63f2
+Version:        2.99.917.674_g9154dff
 Release:        0
 Summary:        Intel video driver for the Xorg X server
 License:        MIT

++++++ xf86-video-intel-2.99.917.651_g34f63f2.tar.bz2 -> 
xf86-video-intel-2.99.917.674_g9154dff.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/compat-api.h 
new/xf86-video-intel-2.99.917.674_g9154dff/src/compat-api.h
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/compat-api.h 2016-05-16 
11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/compat-api.h 2016-07-02 
18:30:50.000000000 +0200
@@ -246,8 +246,8 @@
 #define isGPU(S) 0
 #endif
 
-#endif
-
 #if HAS_DIRTYTRACKING_ROTATION
 #define PixmapSyncDirtyHelper(d, dd) PixmapSyncDirtyHelper(d)
 #endif
+
+#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/i915_pciids.h 
new/xf86-video-intel-2.99.917.674_g9154dff/src/i915_pciids.h
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/i915_pciids.h        
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/i915_pciids.h        
2016-07-02 18:30:50.000000000 +0200
@@ -309,6 +309,7 @@
        INTEL_VGA_DEVICE(0x5906, info), /* ULT GT1 */ \
        INTEL_VGA_DEVICE(0x590E, info), /* ULX GT1 */ \
        INTEL_VGA_DEVICE(0x5902, info), /* DT  GT1 */ \
+       INTEL_VGA_DEVICE(0x5908, info), /* Halo GT1 */ \
        INTEL_VGA_DEVICE(0x590B, info), /* Halo GT1 */ \
        INTEL_VGA_DEVICE(0x590A, info) /* SRV GT1 */
 
@@ -322,15 +323,12 @@
        INTEL_VGA_DEVICE(0x591D, info) /* WKS GT2 */
 
 #define INTEL_KBL_GT3_IDS(info) \
+       INTEL_VGA_DEVICE(0x5923, info), /* ULT GT3 */ \
        INTEL_VGA_DEVICE(0x5926, info), /* ULT GT3 */ \
-       INTEL_VGA_DEVICE(0x592B, info), /* Halo GT3 */ \
-       INTEL_VGA_DEVICE(0x592A, info) /* SRV GT3 */
+       INTEL_VGA_DEVICE(0x5927, info) /* ULT GT3 */
 
 #define INTEL_KBL_GT4_IDS(info) \
-       INTEL_VGA_DEVICE(0x5932, info), /* DT  GT4 */ \
-       INTEL_VGA_DEVICE(0x593B, info), /* Halo GT4 */ \
-       INTEL_VGA_DEVICE(0x593A, info), /* SRV GT4 */ \
-       INTEL_VGA_DEVICE(0x593D, info)  /* WKS GT4 */
+       INTEL_VGA_DEVICE(0x593B, info) /* Halo GT4 */
 
 #define INTEL_KBL_IDS(info) \
        INTEL_KBL_GT1_IDS(info), \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen2_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen2_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen2_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen2_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -1619,7 +1619,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen3_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen3_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen3_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen3_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -3228,7 +3228,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen4_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen4_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen4_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen4_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -1647,7 +1647,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen5_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen5_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen5_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen5_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -1599,7 +1599,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen6_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen6_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen6_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen6_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -1908,7 +1908,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen7_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen7_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen7_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen7_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -2150,7 +2150,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen8_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen8_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen8_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen8_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -1996,7 +1996,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen9_render.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen9_render.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen9_render.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/gen9_render.c    
2016-07-02 18:30:50.000000000 +0200
@@ -2002,7 +2002,9 @@
        } else
                sna_render_picture_extents(dst, &box);
 
-       hint = PREFER_GPU | FORCE_GPU | RENDER_GPU;
+       hint = PREFER_GPU | RENDER_GPU;
+       if (!need_tiling(sna, op->dst.width, op->dst.height))
+               hint |= FORCE_GPU;
        if (!partial) {
                hint |= IGNORE_DAMAGE;
                if (w == op->dst.width && h == op->dst.height)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna.h 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna.h
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna.h    2016-05-16 
11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna.h    2016-07-02 
18:30:50.000000000 +0200
@@ -259,8 +259,9 @@
 #define SNA_NO_VSYNC           0x40
 #define SNA_TRIPLE_BUFFER      0x80
 #define SNA_TEAR_FREE          0x100
-#define SNA_FORCE_SHADOW       0x200
-#define SNA_FLUSH_GTT          0x400
+#define SNA_WANT_TEAR_FREE     0x200
+#define SNA_FORCE_SHADOW       0x400
+#define SNA_FLUSH_GTT          0x800
 #define SNA_PERFORMANCE                0x1000
 #define SNA_POWERSAVE          0x2000
 #define SNA_HAS_FLIP           0x10000
@@ -610,8 +611,9 @@
 static inline void sna_present_cancel_flip(struct sna *sna) { }
 #endif
 
-extern bool sna_crtc_set_sprite_rotation(xf86CrtcPtr crtc, uint32_t rotation);
-extern uint32_t sna_crtc_to_sprite(xf86CrtcPtr crtc);
+extern unsigned sna_crtc_count_sprites(xf86CrtcPtr crtc);
+extern bool sna_crtc_set_sprite_rotation(xf86CrtcPtr crtc, unsigned idx, 
uint32_t rotation);
+extern uint32_t sna_crtc_to_sprite(xf86CrtcPtr crtc, unsigned idx);
 extern bool sna_crtc_is_transformed(xf86CrtcPtr crtc);
 
 #define CRTC_VBLANK 0x3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_display.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_display.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_display.c    
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_display.c    
2016-07-02 18:30:50.000000000 +0200
@@ -210,6 +210,7 @@
 
        struct pict_f_transform cursor_to_fb, fb_to_cursor;
 
+       RegionRec crtc_damage;
        uint16_t shadow_bo_width, shadow_bo_height;
 
        uint32_t rotation;
@@ -220,7 +221,9 @@
                        uint32_t supported;
                        uint32_t current;
                } rotation;
-       } primary, sprite;
+               struct list link;
+       } primary;
+       struct list sprites;
 
        uint32_t mode_serial, flip_serial;
 
@@ -442,10 +445,37 @@
        return bo->delta;
 }
 
-uint32_t sna_crtc_to_sprite(xf86CrtcPtr crtc)
+unsigned sna_crtc_count_sprites(xf86CrtcPtr crtc)
 {
+       struct plane *sprite;
+       unsigned count;
+
+       count = 0;
+       list_for_each_entry(sprite, &to_sna_crtc(crtc)->sprites, link)
+               count++;
+
+       return count;
+}
+
+static struct plane *lookup_sprite(struct sna_crtc *crtc, unsigned idx)
+{
+       struct plane *sprite;
+
+       list_for_each_entry(sprite, &crtc->sprites, link)
+               if (idx-- == 0)
+                       return sprite;
+
+       return NULL;
+}
+
+uint32_t sna_crtc_to_sprite(xf86CrtcPtr crtc, unsigned idx)
+{
+       struct plane *sprite;
+
        assert(to_sna_crtc(crtc));
-       return to_sna_crtc(crtc)->sprite.id;
+
+       sprite = lookup_sprite(to_sna_crtc(crtc), idx);
+       return sprite ? sprite->id : 0;
 }
 
 bool sna_crtc_is_transformed(xf86CrtcPtr crtc)
@@ -977,7 +1007,16 @@
                   sna_output->backlight.iface, best_iface, output->name);
 }
 
-#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,12,99,901,0)
+#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(22, 0)
+static inline int sigio_block(void)
+{
+       return 0;
+}
+static inline void sigio_unblock(int was_blocked)
+{
+       (void)was_blocked;
+}
+#elif XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,12,99,901,0)
 static inline int sigio_block(void)
 {
        OsBlockSIGIO();
@@ -1243,17 +1282,24 @@
        p->rotation.current = 0;
 }
 
-bool sna_crtc_set_sprite_rotation(xf86CrtcPtr crtc, uint32_t rotation)
+bool sna_crtc_set_sprite_rotation(xf86CrtcPtr crtc,
+                                 unsigned idx,
+                                 uint32_t rotation)
 {
+       struct plane *sprite;
        assert(to_sna_crtc(crtc));
+
+       sprite = lookup_sprite(to_sna_crtc(crtc), idx);
+       if (!sprite)
+               return false;
+
        DBG(("%s: CRTC:%d [pipe=%d], sprite=%u set-rotation=%x\n",
             __FUNCTION__,
             sna_crtc_id(crtc), sna_crtc_pipe(crtc),
-            to_sna_crtc(crtc)->sprite.id, rotation));
+            sprite->id, rotation));
 
-       return rotation_set(to_sna(crtc->scrn),
-                           &to_sna_crtc(crtc)->sprite,
-                           rotation_reduce(&to_sna_crtc(crtc)->sprite, 
rotation));
+       return rotation_set(to_sna(crtc->scrn), sprite,
+                           rotation_reduce(sprite, rotation));
 }
 
 #if HAS_DEBUG_FULL
@@ -1447,9 +1493,12 @@
        ret = 0;
        if (unlikely(drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETCRTC, &arg))) {
                ret = errno;
-               sna_crtc->mode_serial++;
-               sna_crtc_force_outputs_on(crtc);
+               goto unblock;
        }
+
+       sna_crtc->mode_serial++;
+       sna_crtc_force_outputs_on(crtc);
+
 unblock:
        kmsg_close(&kmsg, ret);
        sigio_unblock(sigio);
@@ -1493,6 +1542,8 @@
                goto done;
 
        assert(sna->mode.shadow_damage);
+       if (sna->mode.shadow_wait)
+               return ret;
 
        if ((flags & MOVE_WRITE) == 0) {
                if ((flags & __MOVE_SCANOUT) == 0) {
@@ -1535,7 +1586,6 @@
 
        assert(sna->mode.shadow_active);
        sna->mode.shadow_wait = true;
-       sna->mode.shadow_enabled = false;
 
        flip_active = sna->mode.flip_active;
        if (flip_active) {
@@ -1587,10 +1637,8 @@
                        bo = sna->mode.shadow;
                }
        }
-       assert(!sna->mode.shadow_enabled);
        assert(sna->mode.shadow_wait);
        sna->mode.shadow_wait = false;
-       sna->mode.shadow_enabled = true;
 
        if (bo->refcnt > 1) {
                bo = kgem_create_2d(&sna->kgem,
@@ -2746,6 +2794,7 @@
        assert(sna->mode.shadow_damage && sna->mode.shadow_active);
        damage = DamageRegion(sna->mode.shadow_damage);
        RegionUnion(damage, damage, &region);
+       to_sna_crtc(crtc)->crtc_damage = region;
 
        DBG(("%s: damage now %dx[(%d, %d), (%d, %d)]\n",
             __FUNCTION__,
@@ -2991,10 +3040,14 @@
 sna_crtc_destroy(xf86CrtcPtr crtc)
 {
        struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
+       struct plane *sprite, *sn;
 
        if (sna_crtc == NULL)
                return;
 
+       list_for_each_entry_safe(sprite, sn, &sna_crtc->sprites, link)
+               free(sprite);
+
        free(sna_crtc);
        crtc->driver_private = NULL;
 }
@@ -3144,6 +3197,17 @@
        return type;
 }
 
+static void add_sprite_plane(struct sna_crtc *crtc,
+                            struct plane *details)
+{
+       struct plane *sprite = malloc(sizeof(*sprite));
+       if (!sprite)
+               return;
+
+       memcpy(sprite, details, sizeof(*sprite));
+       list_add(&sprite->link, &crtc->sprites);
+}
+
 static void
 sna_crtc_find_planes(struct sna *sna, struct sna_crtc *crtc)
 {
@@ -3217,8 +3281,7 @@
                        break;
 
                case DRM_PLANE_TYPE_OVERLAY:
-                       if (crtc->sprite.id == 0)
-                               crtc->sprite = details;
+                       add_sprite_plane(crtc, &details);
                        break;
                }
        }
@@ -3233,7 +3296,6 @@
        crtc->rotation = RR_Rotate_0;
        crtc->primary.rotation.supported = RR_Rotate_0;
        crtc->primary.rotation.current = RR_Rotate_0;
-       crtc->sprite.rotation = crtc->primary.rotation;
 }
 
 static void
@@ -3285,14 +3347,13 @@
                return true;
        }
 
+       list_init(&sna_crtc->sprites);
        sna_crtc_init__rotation(sna, sna_crtc);
-
        sna_crtc_find_planes(sna, sna_crtc);
 
-       DBG(("%s: CRTC:%d [pipe=%d], primary id=%x: supported-rotations=%x, 
current-rotation=%x, sprite id=%x: supported-rotations=%x, 
current-rotation=%x\n",
+       DBG(("%s: CRTC:%d [pipe=%d], primary id=%x: supported-rotations=%x, 
current-rotation=%x\n",
             __FUNCTION__, id, get_pipe.pipe,
-            sna_crtc->primary.id, sna_crtc->primary.rotation.supported, 
sna_crtc->primary.rotation.current,
-            sna_crtc->sprite.id, sna_crtc->sprite.rotation.supported, 
sna_crtc->sprite.rotation.current));
+            sna_crtc->primary.id, sna_crtc->primary.rotation.supported, 
sna_crtc->primary.rotation.current));
 
        list_init(&sna_crtc->shadow_link);
 
@@ -3440,6 +3501,8 @@
        switch (compat_conn.conn.connection) {
        case DRM_MODE_CONNECTED:
                sna_output->status = XF86OutputStatusConnected;
+               output->mm_width = compat_conn.conn.mm_width;
+               output->mm_height = compat_conn.conn.mm_height;
                break;
        case DRM_MODE_DISCONNECTED:
                sna_output->status = XF86OutputStatusDisconnected;
@@ -3482,6 +3545,27 @@
        return MODE_OK;
 }
 
+static void sna_output_set_parsed_edid(xf86OutputPtr output, xf86MonPtr mon)
+{
+       unsigned conn_mm_width, conn_mm_height;
+
+       /* We set the output size based on values from the kernel */
+       conn_mm_width = output->mm_width;
+       conn_mm_height = output->mm_height;
+
+       xf86OutputSetEDID(output, mon);
+
+       if (output->mm_width != conn_mm_width || output->mm_height != 
conn_mm_height) {
+               DBG(("%s)%s): kernel and Xorg disagree over physical size: 
kernel=%dx%dmm, Xorg=%dx%dmm\n",
+                    __FUNCTION__, output->name,
+                    conn_mm_width, conn_mm_height,
+                    output->mm_width, output->mm_height));
+       }
+
+       output->mm_width = conn_mm_width;
+       output->mm_height = conn_mm_height;
+}
+
 static void
 sna_output_attach_edid(xf86OutputPtr output)
 {
@@ -3589,7 +3673,7 @@
        }
 
 done:
-       xf86OutputSetEDID(output, mon);
+       sna_output_set_parsed_edid(output, mon);
        if (raw) {
                sna_output->edid_raw = raw;
                sna_output->edid_len = blob.length;
@@ -5016,19 +5100,25 @@
 {
        union compat_mode_get_connector compat_conn;
        struct drm_mode_modeinfo dummy;
+       struct drm_mode_get_blob blob;
        xf86OutputStatus status;
+       char *edid;
 
        VG_CLEAR(compat_conn);
 
+       compat_conn.conn.connection = -1;
        compat_conn.conn.connector_id = output->id;
        compat_conn.conn.count_modes = 1; /* skip detect */
        compat_conn.conn.modes_ptr = (uintptr_t)&dummy;
        compat_conn.conn.count_encoders = 0;
-       compat_conn.conn.count_props = 0;
+       compat_conn.conn.props_ptr = (uintptr_t)output->prop_ids;
+       compat_conn.conn.prop_values_ptr = (uintptr_t)output->prop_values;
+       compat_conn.conn.count_props = output->num_props;
 
-       (void)drmIoctl(sna->kgem.fd,
-                      DRM_IOCTL_MODE_GETCONNECTOR,
-                      &compat_conn.conn);
+       if (drmIoctl(sna->kgem.fd,
+                    DRM_IOCTL_MODE_GETCONNECTOR,
+                    &compat_conn.conn) == 0)
+               output->update_properties = false;
 
        switch (compat_conn.conn.connection) {
        case DRM_MODE_CONNECTED:
@@ -5042,7 +5132,28 @@
                status = XF86OutputStatusUnknown;
                break;
        }
-       return output->status == status;
+       if (output->status != status)
+               return false;
+
+       if (status != XF86OutputStatusConnected)
+               return true;
+
+       if (output->edid_len == 0)
+               return false;
+
+       edid = alloca(output->edid_len);
+
+       VG_CLEAR(blob);
+       blob.blob_id = output->prop_values[output->edid_idx];
+       blob.length = output->edid_len;
+       blob.data = (uintptr_t)edid;
+       if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPBLOB, &blob))
+               return false;
+
+       if (blob.length != output->edid_len)
+               return false;
+
+       return memcmp(edid, output->edid_raw, output->edid_len) == 0;
 }
 
 void sna_mode_discover(struct sna *sna, bool tell)
@@ -5787,8 +5898,8 @@
                        sna_crtc->cursor = cursor;
                        sna_crtc->last_cursor_size = cursor->size;
                } else {
-                       ERR(("%s: failed to show cursor on CRTC:%d [pipe=%d], 
disabling hwcursor\n",
-                            __FUNCTION__, sna_crtc_id(crtc), 
sna_crtc_pipe(crtc)));
+                       ERR(("%s: failed to show cursor on CRTC:%d [pipe=%d], 
disabling hwcursor: errno=%d\n",
+                            __FUNCTION__, sna_crtc_id(crtc), 
sna_crtc_pipe(crtc), errno));
                        sna->cursor.disable = true;
                }
        }
@@ -6019,8 +6130,8 @@
                                        sna_crtc->last_cursor_size = 0;
                        }
                } else {
-                       ERR(("%s: failed to update cursor on CRTC:%d [pipe=%d], 
disabling hwcursor\n",
-                            __FUNCTION__, sna_crtc_id(crtc), 
sna_crtc_pipe(crtc)));
+                       ERR(("%s: failed to update cursor on CRTC:%d [pipe=%d], 
disabling hwcursor: errno=%d\n",
+                            __FUNCTION__, sna_crtc_id(crtc), 
sna_crtc_pipe(crtc), errno));
                        /* XXX How to force switch back to SW cursor?
                         * Right now we just want until the next cursor image
                         * change, which is fairly frequent.
@@ -6184,8 +6295,12 @@
                return;
 
 #define LOCAL_IOCTL_GET_CAP    DRM_IOWR(0x0c, struct local_get_cap)
-#define DRM_CAP_CURSOR_WIDTH   8
-#define DRM_CAP_CURSOR_HEIGHT  9
+#ifndef DRM_CAP_CURSOR_WIDTH
+#define DRM_CAP_CURSOR_WIDTH   0x8
+#endif
+#ifndef DRM_CAP_CURSOR_HEIGHT
+#define DRM_CAP_CURSOR_HEIGHT  0x9
+#endif
 
 #define I915_PARAM_HAS_COHERENT_PHYS_GTT 29
 
@@ -7044,6 +7159,15 @@
        probe_capabilities(sna);
        sna_present_update(sna);
 
+       /* Allow TearFree to come back on when everything is off */
+       if (!sna->mode.front_active && sna->flags & SNA_WANT_TEAR_FREE) {
+               if ((sna->flags & SNA_TEAR_FREE) == 0)
+                       DBG(("%s: enable TearFree next modeset\n",
+                            __FUNCTION__));
+
+               sna->flags |= SNA_TEAR_FREE;
+       }
+
        sna->mode.dirty = false;
 }
 
@@ -7803,143 +7927,46 @@
        return disabled;
 }
 
-static xf86CrtcPtr
-lookup_crtc_by_id(struct sna *sna, int id)
+static bool
+sna_mode_disable_secondary_planes(struct sna *sna)
 {
        xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+       bool disabled = false;
        int c;
 
+       /* Disable all secondary planes on our CRTCs, just in case
+        * other userspace left garbage in them.
+        */
        for (c = 0; c < sna->mode.num_real_crtc; c++) {
                xf86CrtcPtr crtc = config->crtc[c];
-               if (__sna_crtc_id(to_sna_crtc(crtc)) == id)
-                       return crtc;
-       }
-
-       return NULL;
-}
-
-static int plane_type(struct sna *sna, int id)
-{
-       struct local_mode_obj_get_properties arg;
-       uint64_t stack_props[24];
-       uint32_t *props = (uint32_t *)stack_props;
-       uint64_t *values = stack_props + 8;
-       int i, type = -1;
-
-       memset(&arg, 0, sizeof(struct local_mode_obj_get_properties));
-       arg.obj_id = id;
-       arg.obj_type = LOCAL_MODE_OBJECT_PLANE;
-
-       arg.props_ptr = (uintptr_t)props;
-       arg.prop_values_ptr = (uintptr_t)values;
-       arg.count_props = 16;
-
-       if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_OBJ_GETPROPERTIES, &arg))
-               return -1;
-
-       DBG(("%s: object %d (type %x) has %d props\n", __FUNCTION__,
-            id, LOCAL_MODE_OBJECT_PLANE, arg.count_props));
-
-       if (arg.count_props > 16) {
-               props = malloc(2*sizeof(uint64_t)*arg.count_props);
-               if (props == NULL)
-                       return -1;
-
-               values = (uint64_t *)props + arg.count_props;
-
-               arg.props_ptr = (uintptr_t)props;
-               arg.prop_values_ptr = (uintptr_t)values;
-
-               if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_OBJ_GETPROPERTIES, 
&arg))
-                       arg.count_props = 0;
-       }
-       VG(VALGRIND_MAKE_MEM_DEFINED(arg.props_ptr, 
sizeof(uint32_t)*arg.count_props));
-       VG(VALGRIND_MAKE_MEM_DEFINED(arg.prop_values_ptr, 
sizeof(uint64_t)*arg.count_props));
-
-       for (i = 0; i < arg.count_props; i++) {
-               struct drm_mode_get_property prop;
-
-               memset(&prop, 0, sizeof(prop));
-               prop.prop_id = props[i];
-               if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop)) {
-                       ERR(("%s: prop[%d].id=%d GETPROPERTY failed with 
errno=%d\n",
-                            __FUNCTION__, i, props[i], errno));
-                       continue;
-               }
-
-               DBG(("%s: prop[%d] .id=%ld, .name=%s, .flags=%x, .value=%ld\n", 
__FUNCTION__, i,
-                    (long)props[i], prop.name, (unsigned)prop.flags, 
(long)values[i]));
-
-               if (strcmp(prop.name, "type") == 0) {
-                       type = values[i];
-                       break;
-               }
-       }
-
-       if (props != (uint32_t *)stack_props)
-               free(props);
-
-       return type;
-}
-
-static bool
-sna_mode_disable_secondary_planes(struct sna *sna)
-{
-       struct local_mode_get_plane_res r;
-       uint32_t stack_planes[64];
-       uint32_t *planes = stack_planes;
-       bool disabled = false;
-       int i;
-
-       VG_CLEAR(r);
-       r.plane_id_ptr = (uintptr_t)planes;
-       r.count_planes = ARRAY_SIZE(stack_planes);
-       if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_GETPLANERESOURCES, &r))
-               return false;
-
-       DBG(("%s: %d planes\n", __FUNCTION__, (int)r.count_planes));
-
-       if (r.count_planes > ARRAY_SIZE(stack_planes)) {
-               planes = malloc(sizeof(uint32_t)*r.count_planes);
-               if (planes == NULL)
-                       return false;
-
-               r.plane_id_ptr = (uintptr_t)planes;
-               if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_GETPLANERESOURCES, 
&r))
-                       r.count_planes = 0;
-       }
-
-       VG(VALGRIND_MAKE_MEM_DEFINED(planes, sizeof(uint32_t)*r.count_planes));
-
-       for (i = 0; i < r.count_planes; i++) {
-               struct local_mode_get_plane p;
-               struct local_mode_set_plane s;
-
-               VG_CLEAR(p);
-               p.plane_id = planes[i];
-               p.count_format_types = 0;
-               if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_GETPLANE, &p))
-                       continue;
+               struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
+               struct plane *plane;
 
-               if (p.fb_id == 0 || p.crtc_id == 0)
-                       continue;
+               list_for_each_entry(plane, &sna_crtc->sprites, link) {
+                       struct local_mode_get_plane p;
+                       struct local_mode_set_plane s;
+
+                       VG_CLEAR(p);
+                       p.plane_id = plane->id;
+                       p.count_format_types = 0;
+                       if (drmIoctl(sna->kgem.fd,
+                                    LOCAL_IOCTL_MODE_GETPLANE,
+                                    &p))
+                               continue;
 
-               if (plane_type(sna, p.plane_id) == DRM_PLANE_TYPE_PRIMARY)
-                       continue;
+                       if (p.fb_id == 0 || p.crtc_id == 0)
+                               continue;
 
-               memset(&s, 0, sizeof(s));
-               s.plane_id = p.plane_id;
-               s.crtc_id = p.crtc_id;
-               if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s)) {
-                       xf86CrtcPtr crtc = lookup_crtc_by_id(sna, p.crtc_id);
-                       if (crtc)
+                       memset(&s, 0, sizeof(s));
+                       s.plane_id = p.plane_id;
+                       s.crtc_id = p.crtc_id;
+                       if (drmIoctl(sna->kgem.fd,
+                                    LOCAL_IOCTL_MODE_SETPLANE,
+                                    &s))
                                disabled |= sna_mode_shutdown_crtc(crtc);
                }
        }
 
-       if (planes != stack_planes)
-               free(planes);
-
        return disabled;
 }
 
@@ -8011,6 +8038,7 @@
 sna_crtc_hide_planes(struct sna *sna, struct sna_crtc *crtc)
 {
        struct local_mode_set_plane s;
+       struct plane *plane;
 
        if (crtc->primary.id == 0)
                return false;
@@ -8020,8 +8048,10 @@
        if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s))
                return false;
 
-       s.plane_id = crtc->sprite.id;
-       (void)drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s);
+       list_for_each_entry(plane, &crtc->sprites, link) {
+               s.plane_id = plane->id;
+               (void)drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s);
+       }
 
        __sna_crtc_disable(sna, crtc);
        return true;
@@ -8045,12 +8075,14 @@
 
        for (i = 0; i < sna->mode.num_real_crtc; i++) {
                struct sna_crtc *sna_crtc = to_sna_crtc(config->crtc[i]);
+               struct plane *plane;
 
                assert(sna_crtc != NULL);
 
                /* Force the rotation property to be reset on next use */
                rotation_reset(&sna_crtc->primary);
-               rotation_reset(&sna_crtc->sprite);
+               list_for_each_entry(plane, &sna_crtc->sprites, link)
+                       rotation_reset(plane);
        }
 
        /* VT switching, likely to be fbcon so make the backlight usable */
@@ -8514,11 +8546,9 @@
        xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
        int i;
 
-       if (sna->flags & SNA_TEAR_FREE)
-               return true;
-
        for (i = 0; i < sna->mode.num_real_crtc; i++) {
                struct sna_crtc *crtc = to_sna_crtc(config->crtc[i]);
+               unsigned hint;
 
                assert(crtc);
 
@@ -8534,10 +8564,13 @@
                if (crtc->shadow_bo)
                        continue;
 
+               hint = MOVE_READ | MOVE_ASYNC_HINT | __MOVE_SCANOUT;
+               if (sna->flags & SNA_TEAR_FREE)
+                       hint |= __MOVE_FORCE;
+
                DBG(("%s: CRTC %d [pipe=%d] requires frontbuffer\n",
                     __FUNCTION__, __sna_crtc_id(crtc), __sna_crtc_pipe(crtc)));
-               return sna_pixmap_move_to_gpu(sna->front,
-                                             MOVE_READ | MOVE_ASYNC_HINT | 
__MOVE_SCANOUT);
+               return sna_pixmap_move_to_gpu(sna->front, hint);
        }
 
        return true;
@@ -8690,23 +8723,28 @@
                sigio = sigio_block();
                if (!box_empty(&damage.extents)) {
                        if (sna->flags & SNA_TEAR_FREE) {
+                               RegionRec new_damage;
                                struct drm_mode_crtc_page_flip arg;
                                struct kgem_bo *bo;
 
-                               RegionUninit(&damage);
-                               damage.extents = crtc->bounds;
-                               damage.data = NULL;
+                               RegionNull(&new_damage);
+                               RegionCopy(&new_damage, &damage);
 
                                bo = sna_crtc->cache_bo;
-                               if (bo == NULL)
+                               if (bo == NULL) {
+                                       damage.extents = crtc->bounds;
+                                       damage.data = NULL;
                                        bo = kgem_create_2d(&sna->kgem,
                                                            crtc->mode.HDisplay,
                                                            crtc->mode.VDisplay,
                                                            
crtc->scrn->bitsPerPixel,
                                                            
sna_crtc->bo->tiling,
                                                            CREATE_SCANOUT);
-                               if (bo == NULL)
-                                       continue;
+                                       if (bo == NULL)
+                                               continue;
+                               } else
+                                       RegionUnion(&damage, &damage, 
&sna_crtc->crtc_damage);
+                               sna_crtc->crtc_damage = new_damage;
 
                                sna_crtc_redisplay(crtc, &damage, bo);
                                kgem_bo_submit(&sna->kgem, bo);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_dri2.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_dri2.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_dri2.c       
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_dri2.c       
2016-07-02 18:30:50.000000000 +0200
@@ -2513,7 +2513,7 @@
        switch (chain->type) {
        case SWAP_COMPLETE:
                DBG(("%s: emitting chained vsync'ed blit\n", __FUNCTION__));
-               if (chain->sna->mode.shadow && chain->sna->mode.shadow_wait) {
+               if (chain->sna->mode.shadow_wait) {
                        /* recursed from wait_for_shadow(), simply requeue */
                        DBG(("%s -- recursed from wait_for_shadow(), 
requeuing\n", __FUNCTION__));
                        if (sna_next_vblank(chain))
@@ -2608,7 +2608,7 @@
                /* else fall through to blit */
        case SWAP:
                assert(info->signal);
-               if (sna->mode.shadow && sna->mode.shadow_wait) {
+               if (sna->mode.shadow_wait) {
                        /* recursed from wait_for_shadow(), simply requeue */
                        DBG(("%s -- recursed from wait_for_shadow(), 
requeuing\n", __FUNCTION__));
                } else if (can_xchg(info->sna, draw, info->front, info->back)) {
@@ -2654,7 +2654,7 @@
                             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) {
+                       if (sna->mode.shadow_wait) {
                                /* recursed from wait_for_shadow(), simply 
requeue */
                                DBG(("%s -- recursed from wait_for_shadow(), 
requeuing\n", __FUNCTION__));
                                if (sna_next_vblank(info))
@@ -2792,9 +2792,8 @@
             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) {
+       if (chain->type == SWAP_COMPLETE && chain->front == info->front) {
                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);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_driver.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_driver.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_driver.c     
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_driver.c     
2016-07-02 18:30:50.000000000 +0200
@@ -437,7 +437,7 @@
 
        level = intel_option_cast_to_unsigned(sna->Options, OPTION_DRI, 
DEFAULT_DRI_LEVEL);
 #if HAVE_DRI3
-       if (level >= 3)
+       if (level >= 3 && sna->kgem.gen >= 040)
                sna->dri3.available = !!xf86LoadSubModule(sna->scrn, "dri3");
 #endif
 #if HAVE_DRI2
@@ -481,7 +481,7 @@
                from = X_CONFIG;
 
        if (enable)
-               sna->flags |= SNA_TEAR_FREE;
+               sna->flags |= SNA_WANT_TEAR_FREE | SNA_TEAR_FREE;
 
 done:
        xf86DrvMsg(sna->scrn->scrnIndex, from, "TearFree %sabled\n",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_video.h 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_video.h
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_video.h      
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_video.h      
2016-07-02 18:30:50.000000000 +0200
@@ -72,6 +72,8 @@
 struct sna_video {
        struct sna *sna;
 
+       int idx; /* XXX expose struct plane instead? */
+
        int brightness;
        int contrast;
        int saturation;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_video_sprite.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_video_sprite.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_video_sprite.c       
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/sna/sna_video_sprite.c       
2016-07-02 18:30:50.000000000 +0200
@@ -91,7 +91,7 @@
                        continue;
 
                memset(&s, 0, sizeof(s));
-               s.plane_id = sna_crtc_to_sprite(crtc);
+               s.plane_id = sna_crtc_to_sprite(crtc, video->idx);
                if (drmIoctl(video->sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, 
&s))
                        xf86DrvMsg(video->sna->scrn->scrnIndex, X_ERROR,
                                   "failed to disable plane\n");
@@ -224,7 +224,7 @@
        /* XXX handle video spanning multiple CRTC */
 
        VG_CLEAR(s);
-       s.plane_id = sna_crtc_to_sprite(crtc);
+       s.plane_id = sna_crtc_to_sprite(crtc, video->idx);
 
 #define DRM_I915_SET_SPRITE_COLORKEY 0x2b
 #define LOCAL_IOCTL_I915_SET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + 
DRM_I915_SET_SPRITE_COLORKEY, struct local_intel_sprite_colorkey)
@@ -422,7 +422,7 @@
                        if (video->bo[pipe]) {
                                struct local_mode_set_plane s;
                                memset(&s, 0, sizeof(s));
-                               s.plane_id = sna_crtc_to_sprite(crtc);
+                               s.plane_id = sna_crtc_to_sprite(crtc, 
video->idx);
                                if (drmIoctl(video->sna->kgem.fd, 
LOCAL_IOCTL_MODE_SETPLANE, &s))
                                        xf86DrvMsg(video->sna->scrn->scrnIndex, 
X_ERROR,
                                                   "failed to disable plane\n");
@@ -461,8 +461,8 @@
 
                /* if sprite can't handle rotation natively, store it for the 
copy func */
                rotation = RR_Rotate_0;
-               if (!sna_crtc_set_sprite_rotation(crtc, crtc->rotation)) {
-                       sna_crtc_set_sprite_rotation(crtc, RR_Rotate_0);
+               if (!sna_crtc_set_sprite_rotation(crtc, video->idx, 
crtc->rotation)) {
+                       sna_crtc_set_sprite_rotation(crtc, video->idx, 
RR_Rotate_0);
                        rotation = crtc->rotation;
                }
                sna_video_frame_set_rotation(video, &frame, rotation);
@@ -651,25 +651,28 @@
        return color_key & ((1 << scrn->depth) - 1);
 }
 
-static bool sna_video_has_sprites(struct sna *sna)
+static int sna_video_has_sprites(struct sna *sna)
 {
        xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+       unsigned min;
        int i;
 
        DBG(("%s: num_crtc=%d\n", __FUNCTION__, sna->mode.num_real_crtc));
 
        if (sna->mode.num_real_crtc == 0)
-               return false;
+               return 0;
 
+       min = -1;
        for (i = 0; i < sna->mode.num_real_crtc; i++) {
-               if (!sna_crtc_to_sprite(config->crtc[i])) {
-                       DBG(("%s: no sprite found on pipe %d\n", __FUNCTION__, 
sna_crtc_pipe(config->crtc[i])));
-                       return false;
-               }
+               unsigned count =  sna_crtc_count_sprites(config->crtc[i]);
+               DBG(("%s: %d sprites found on pipe %d\n", __FUNCTION__,
+                    count, sna_crtc_pipe(config->crtc[i])));
+               if (count < min)
+                       min = count;
        }
 
-       DBG(("%s: yes\n", __FUNCTION__));
-       return true;
+       DBG(("%s: min=%d\n", __FUNCTION__, min));
+       return min;
 }
 
 void sna_video_sprite_setup(struct sna *sna, ScreenPtr screen)
@@ -677,16 +680,18 @@
        XvAdaptorPtr adaptor;
        struct sna_video *video;
        XvPortPtr port;
+       int count, i;
 
-       if (!sna_video_has_sprites(sna))
+       count = sna_video_has_sprites(sna);
+       if (!count)
                return;
 
        adaptor = sna_xv_adaptor_alloc(sna);
        if (!adaptor)
                return;
 
-       video = calloc(1, sizeof(*video));
-       port = calloc(1, sizeof(*port));
+       video = calloc(count, sizeof(*video));
+       port = calloc(count, sizeof(*port));
        if (video == NULL || port == NULL) {
                free(video);
                free(port);
@@ -731,36 +736,43 @@
        adaptor->ddPutImage = sna_video_sprite_put_image;
        adaptor->ddQueryImageAttributes = sna_video_sprite_query;
 
-       adaptor->nPorts = 1;
+       adaptor->nPorts = count;
        adaptor->pPorts = port;
 
-       adaptor->base_id = port->id = FakeClientID(0);
-       AddResource(port->id, XvGetRTPort(), port);
-       port->pAdaptor = adaptor;
-       port->pNotify =  NULL;
-       port->pDraw =  NULL;
-       port->client =  NULL;
-       port->grab.client =  NULL;
-       port->time = currentTime;
-       port->devPriv.ptr = video;
-
-       video->sna = sna;
-       video->alignment = 64;
-       video->color_key = sna_video_sprite_color_key(sna);
-       video->color_key_changed = ~0;
-       video->has_color_key = true;
-       video->brightness = -19;        /* (255/219) * -16 */
-       video->contrast = 75;   /* 255/219 * 64 */
-       video->saturation = 146;        /* 128/112 * 128 */
-       video->desired_crtc = NULL;
-       video->gamma5 = 0xc0c0c0;
-       video->gamma4 = 0x808080;
-       video->gamma3 = 0x404040;
-       video->gamma2 = 0x202020;
-       video->gamma1 = 0x101010;
-       video->gamma0 = 0x080808;
-       RegionNull(&video->clip);
-       video->SyncToVblank = 1;
+       for (i = 0; i < count; i++) {
+               port->id = FakeClientID(0);
+               AddResource(port->id, XvGetRTPort(), port);
+               port->pAdaptor = adaptor;
+               port->pNotify =  NULL;
+               port->pDraw =  NULL;
+               port->client =  NULL;
+               port->grab.client =  NULL;
+               port->time = currentTime;
+               port->devPriv.ptr = video;
+
+               video->sna = sna;
+               video->idx = i;
+               video->alignment = 64;
+               video->color_key = sna_video_sprite_color_key(sna);
+               video->color_key_changed = ~0;
+               video->has_color_key = true;
+               video->brightness = -19;        /* (255/219) * -16 */
+               video->contrast = 75;   /* 255/219 * 64 */
+               video->saturation = 146;        /* 128/112 * 128 */
+               video->desired_crtc = NULL;
+               video->gamma5 = 0xc0c0c0;
+               video->gamma4 = 0x808080;
+               video->gamma3 = 0x404040;
+               video->gamma2 = 0x202020;
+               video->gamma1 = 0x101010;
+               video->gamma0 = 0x080808;
+               RegionNull(&video->clip);
+               video->SyncToVblank = 1;
+
+               port++;
+               video++;
+       }
+       adaptor->base_id = adaptor->pPorts[0].id;
 
        xvColorKey = MAKE_ATOM("XV_COLORKEY");
        xvAlwaysOnTop = MAKE_ATOM("XV_ALWAYS_ON_TOP");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xf86-video-intel-2.99.917.651_g34f63f2/src/uxa/intel_driver.c 
new/xf86-video-intel-2.99.917.674_g9154dff/src/uxa/intel_driver.c
--- old/xf86-video-intel-2.99.917.651_g34f63f2/src/uxa/intel_driver.c   
2016-05-16 11:14:04.000000000 +0200
+++ new/xf86-video-intel-2.99.917.674_g9154dff/src/uxa/intel_driver.c   
2016-07-02 18:30:50.000000000 +0200
@@ -244,7 +244,7 @@
 
        intel->dri2 = intel->dri3 = DRI_NONE;
        level = intel_option_cast_to_unsigned(intel->Options, OPTION_DRI, 
DEFAULT_DRI_LEVEL);
-       if (level < 3)
+       if (level < 3 || INTEL_INFO(intel)->gen < 040)
                intel->dri3 = DRI_DISABLED;
        if (level < 2)
                intel->dri2 = DRI_DISABLED;


Reply via email to