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, ®ion); + 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;
