Hello community, here is the log from the commit of package xf86-video-intel for openSUSE:Factory checked in at 2016-05-17 17:13:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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-11 16:37:08.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.xf86-video-intel.new/xf86-video-intel.changes 2016-05-17 17:13:58.000000000 +0200 @@ -1,0 +2,15 @@ +Mon May 16 14:37:18 UTC 2016 - [email protected] + +- Updated to 2.99.917.651_g34f63f2: + sna: Do not force ping-pong migration for TearFree + NoAccel + sna: Add a special case for fast DRI2CopyRegion and NoAccel + sna/dri2: Force consideration of the DRI2CopyRegion source as unclean + sna/dri2: Enforce swap-limits on stale buffers + sna/gen6+: Don't force a switch to BLT if the target bo cannot be blitted + sna/dri2: Force blocking wait if vblank queue fails + sna/dri2: Refactor open-coded __kgem_bo_is_busy + sna: Do not cache the current crtc bo after performing the setcrtc + sna: Ensure we only cache the local CRTC scanout buffer + (boo#980124). + +------------------------------------------------------------------- @@ -12,0 +28 @@ + Old: ---- xf86-video-intel-2.99.917.641_ge4ef6e9.tar.bz2 New: ---- xf86-video-intel-2.99.917.651_g34f63f2.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xf86-video-intel.spec ++++++ --- /var/tmp/diff_new_pack.Q4I8IP/_old 2016-05-17 17:13:59.000000000 +0200 +++ /var/tmp/diff_new_pack.Q4I8IP/_new 2016-05-17 17:13:59.000000000 +0200 @@ -20,7 +20,7 @@ %define backlighthelper 0 Name: xf86-video-intel -Version: 2.99.917.641_ge4ef6e9 +Version: 2.99.917.651_g34f63f2 Release: 0 Summary: Intel video driver for the Xorg X server License: MIT ++++++ xf86-video-intel-2.99.917.641_ge4ef6e9.tar.bz2 -> xf86-video-intel-2.99.917.651_g34f63f2.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/configure.ac new/xf86-video-intel-2.99.917.651_g34f63f2/configure.ac --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/configure.ac 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/configure.ac 2016-05-16 11:14:04.000000000 +0200 @@ -280,6 +280,9 @@ AM_CONDITIONAL(X11_DRI3, test "x$x11_dri3" = "xyes" -a "x$shm" = "xyes") AM_CONDITIONAL(X11_SHM, test "x$shm" = "xyes") +PKG_CHECK_MODULES(X11_VM, [xxf86vm], [x11_vm="yes"], [x11_vm="no"]) +AM_CONDITIONAL(X11_VM, test "x$x11_vm" = "xyes") + AC_ARG_ENABLE(tools, AS_HELP_STRING([--disable-tools], [Enable building and installing the miscellaneous tools [default=auto]]), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/blt.c new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/blt.c --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/blt.c 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/blt.c 2016-05-16 11:14:04.000000000 +0200 @@ -349,6 +349,71 @@ } } +static fast_memcpy void +memcpy_between_tiled_x__swizzle_0(const void *src, void *dst, int bpp, + int32_t src_stride, int32_t dst_stride, + int16_t src_x, int16_t src_y, + int16_t dst_x, int16_t dst_y, + uint16_t width, uint16_t height) +{ + const unsigned tile_width = 512; + const unsigned tile_height = 8; + const unsigned tile_size = 4096; + + const unsigned cpp = bpp / 8; + const unsigned tile_pixels = tile_width / cpp; + const unsigned tile_shift = ffs(tile_pixels) - 1; + const unsigned tile_mask = tile_pixels - 1; + + DBG(("%s(bpp=%d): src=(%d, %d), dst=(%d, %d), size=%dx%d, pitch=%d/%d\n", + __FUNCTION__, bpp, src_x, src_y, dst_x, dst_y, width, height, src_stride, dst_stride)); + assert(src != dst); + assert((dst_x & tile_mask) == (src_x & tile_mask)); + + while (height--) { + unsigned w = width * cpp; + uint8_t *dst_row = dst; + const uint8_t *src_row = src; + + dst_row += dst_y / tile_height * dst_stride * tile_height; + dst_row += (dst_y & (tile_height-1)) * tile_width; + if (dst_x) + dst_row += (dst_x >> tile_shift) * tile_size; + dst_y++; + + src_row += src_y / tile_height * src_stride * tile_height; + src_row += (src_y & (tile_height-1)) * tile_width; + if (src_x) + src_row += (src_x >> tile_shift) * tile_size; + src_y++; + + if (dst_x & tile_mask) { + const unsigned x = (dst_x & tile_mask) * cpp; + const unsigned len = min(tile_width - x, w); + + memcpy(assume_misaligned(dst_row + x, tile_width, x), + assume_misaligned(src_row + x, tile_width, x), + len); + + dst_row += tile_size; + src_row += tile_size; + w -= len; + } + + while (w >= tile_width) { + memcpy(assume_aligned(dst_row, tile_width), + assume_aligned(src_row, tile_width), + tile_width); + dst_row += tile_size; + src_row += tile_size; + w -= tile_width; + } + memcpy(assume_aligned(dst_row, tile_width), + assume_aligned(src_row, tile_width), + w); + } +} + #if defined(sse2) && defined(__x86_64__) sse2 static force_inline void @@ -461,7 +526,7 @@ while (len >= 64) { to_sse64(dst, src); dst += 64; - src = (const uint8_t *)src + 64; + src += 64; len -= 64; } if (len == 0) @@ -470,22 +535,22 @@ if (len & 32) { to_sse32(dst, src); dst += 32; - src = (const uint8_t *)src + 32; + src += 32; } if (len & 16) { to_sse16(dst, src); dst += 16; - src = (const uint8_t *)src + 16; + src += 16; } if (len & 8) { *(uint64_t *)dst = *(uint64_t *)src; dst += 8; - src = (const uint8_t *)src + 8; + src += 8; } if (len & 4) { *(uint32_t *)dst = *(uint32_t *)src; dst += 4; - src = (const uint8_t *)src + 4; + src += 4; } memcpy(dst, src, len & 3); } @@ -820,6 +885,86 @@ } } +sse2 static fast_memcpy void +memcpy_between_tiled_x__swizzle_0__sse2(const void *src, void *dst, int bpp, + int32_t src_stride, int32_t dst_stride, + int16_t src_x, int16_t src_y, + int16_t dst_x, int16_t dst_y, + uint16_t width, uint16_t height) +{ + const unsigned tile_width = 512; + const unsigned tile_height = 8; + const unsigned tile_size = 4096; + + const unsigned cpp = bpp / 8; + const unsigned tile_pixels = tile_width / cpp; + const unsigned tile_shift = ffs(tile_pixels) - 1; + const unsigned tile_mask = tile_pixels - 1; + + unsigned ox, lx; + + DBG(("%s(bpp=%d): src=(%d, %d), dst=(%d, %d), size=%dx%d, pitch=%d/%d\n", + __FUNCTION__, bpp, src_x, src_y, dst_x, dst_y, width, height, src_stride, dst_stride)); + assert(src != dst); + + width *= cpp; + dst_stride *= tile_height; + src_stride *= tile_height; + + assert((dst_x & tile_mask) == (src_x & tile_mask)); + if (dst_x & tile_mask) { + ox = (dst_x & tile_mask) * cpp; + lx = min(tile_width - ox, width); + assert(lx != 0); + } else + lx = 0; + + if (dst_x) + dst = (uint8_t *)dst + (dst_x >> tile_shift) * tile_size; + if (src_x) + src = (const uint8_t *)src + (src_x >> tile_shift) * tile_size; + + while (height--) { + const uint8_t *src_row; + uint8_t *dst_row; + unsigned w = width; + + dst_row = dst; + dst_row += dst_y / tile_height * dst_stride; + dst_row += (dst_y & (tile_height-1)) * tile_width; + dst_y++; + + src_row = src; + src_row += src_y / tile_height * src_stride; + src_row += (src_y & (tile_height-1)) * tile_width; + src_y++; + + if (lx) { + to_memcpy(dst_row + ox, src_row + ox, lx); + dst_row += tile_size; + src_row += tile_size; + w -= lx; + } + while (w >= tile_width) { + assert(((uintptr_t)dst_row & (tile_width - 1)) == 0); + assert(((uintptr_t)src_row & (tile_width - 1)) == 0); + to_sse128xN(assume_aligned(dst_row, tile_width), + assume_aligned(src_row, tile_width), + tile_width); + dst_row += tile_size; + src_row += tile_size; + w -= tile_width; + } + if (w) { + assert(((uintptr_t)dst_row & (tile_width - 1)) == 0); + assert(((uintptr_t)src_row & (tile_width - 1)) == 0); + to_memcpy(assume_aligned(dst_row, tile_width), + assume_aligned(src_row, tile_width), + w); + } + } +} + #endif #define memcpy_to_tiled_x(swizzle) \ @@ -1100,11 +1245,13 @@ if (cpu & SSE2) { kgem->memcpy_to_tiled_x = memcpy_to_tiled_x__swizzle_0__sse2; kgem->memcpy_from_tiled_x = memcpy_from_tiled_x__swizzle_0__sse2; + kgem->memcpy_between_tiled_x = memcpy_between_tiled_x__swizzle_0__sse2; } else #endif { kgem->memcpy_to_tiled_x = memcpy_to_tiled_x__swizzle_0; kgem->memcpy_from_tiled_x = memcpy_from_tiled_x__swizzle_0; + kgem->memcpy_between_tiled_x = memcpy_between_tiled_x__swizzle_0; } break; case I915_BIT_6_SWIZZLE_9: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/gen6_common.h new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen6_common.h --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/gen6_common.h 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/gen6_common.h 2016-05-16 11:14:04.000000000 +0200 @@ -52,6 +52,9 @@ if (bo && bo->tiling == I915_TILING_Y) return false; + if (bo && !kgem_bo_can_blt(&sna->kgem, bo)) + return false; + if (sna->render_state.gt < 2) return true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/kgem.h new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/kgem.h --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/kgem.h 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/kgem.h 2016-05-16 11:14:04.000000000 +0200 @@ -113,6 +113,12 @@ NUM_MAP_TYPES, }; +typedef void (*memcpy_box_func)(const void *src, void *dst, int bpp, + int32_t src_stride, int32_t dst_stride, + int16_t src_x, int16_t src_y, + int16_t dst_x, int16_t dst_y, + uint16_t width, uint16_t height); + struct kgem { unsigned wedged; int fd; @@ -212,16 +218,9 @@ void (*retire)(struct kgem *kgem); void (*expire)(struct kgem *kgem); - void (*memcpy_to_tiled_x)(const void *src, void *dst, int bpp, - int32_t src_stride, int32_t dst_stride, - int16_t src_x, int16_t src_y, - int16_t dst_x, int16_t dst_y, - uint16_t width, uint16_t height); - void (*memcpy_from_tiled_x)(const void *src, void *dst, int bpp, - int32_t src_stride, int32_t dst_stride, - int16_t src_x, int16_t src_y, - int16_t dst_x, int16_t dst_y, - uint16_t width, uint16_t height); + memcpy_box_func memcpy_to_tiled_x; + memcpy_box_func memcpy_from_tiled_x; + memcpy_box_func memcpy_between_tiled_x; struct kgem_bo *batch_bo; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/sna_display.c new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_display.c --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/sna_display.c 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_display.c 2016-05-16 11:14:04.000000000 +0200 @@ -210,8 +210,6 @@ struct pict_f_transform cursor_to_fb, fb_to_cursor; - RegionRec client_damage; /* XXX overlap with shadow damage? */ - uint16_t shadow_bo_width, shadow_bo_height; uint32_t rotation; @@ -1665,12 +1663,13 @@ sna->mode.shadow_region.extents.y1, sna->mode.shadow_region.extents.x2, sna->mode.shadow_region.extents.y2)); - ret = sna->render.copy_boxes(sna, GXcopy, - &pixmap->drawable, priv->gpu_bo, 0, 0, - &pixmap->drawable, bo, 0, 0, - region_rects(&sna->mode.shadow_region), - region_num_rects(&sna->mode.shadow_region), - 0); + if (!sna->render.copy_boxes(sna, GXcopy, + &pixmap->drawable, priv->gpu_bo, 0, 0, + &pixmap->drawable, bo, 0, 0, + region_rects(&sna->mode.shadow_region), + region_num_rects(&sna->mode.shadow_region), + 0)) + ERR(("%s: copy failed\n", __FUNCTION__)); } if (priv->cow) @@ -2552,7 +2551,7 @@ return NULL; } - if (sna->mode.shadow == NULL && !wedged(sna)) { + if (sna->mode.shadow == NULL) { struct kgem_bo *shadow; DBG(("%s: creating TearFree shadow bo\n", __FUNCTION__)); @@ -2743,7 +2742,6 @@ __FUNCTION__, sna_crtc_id(crtc), region.extents.x1, region.extents.y1, region.extents.x2, region.extents.y2)); - to_sna_crtc(crtc)->client_damage = region; assert(sna->mode.shadow_damage && sna->mode.shadow_active); damage = DamageRegion(sna->mode.shadow_damage); @@ -8516,6 +8514,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]); @@ -8530,6 +8531,9 @@ if (crtc->client_bo) continue; + if (crtc->shadow_bo) + continue; + 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, @@ -8592,7 +8596,7 @@ return; } - if (wedged(sna) || !move_crtc_to_gpu(sna)) { + if (!move_crtc_to_gpu(sna)) { DBG(("%s: forcing scanout update using the CPU\n", __FUNCTION__)); if (!sna_pixmap_move_to_cpu(sna->front, MOVE_READ)) return; @@ -8613,97 +8617,14 @@ damage.data = NULL; RegionIntersect(&damage, &damage, region); if (!box_empty(&damage.extents)) { - struct kgem_bo *bo = NULL; - DBG(("%s: fallback intersects pipe=%d [(%d, %d), (%d, %d)]\n", __FUNCTION__, __sna_crtc_pipe(sna_crtc), damage.extents.x1, damage.extents.y1, damage.extents.x2, damage.extents.y2)); - if (sna->flags & SNA_TEAR_FREE) { - RegionRec new_damage; - - RegionNull(&new_damage); - RegionCopy(&new_damage, &damage); - - bo = sna_crtc->cache_bo; - 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); - } else - RegionUnion(&damage, &damage, &sna_crtc->client_damage); - - DBG(("%s: TearFree fallback, shadow handle=%d, crtc handle=%d\n", __FUNCTION__, bo->handle, sna_crtc->bo->handle)); - - sna_crtc->client_damage = new_damage; - } - - if (bo == NULL) - bo = sna_crtc->bo; - sna_crtc_redisplay__fallback(crtc, &damage, bo); - - if (bo != sna_crtc->bo) { - struct drm_mode_crtc_page_flip arg; - - arg.crtc_id = __sna_crtc_id(sna_crtc); - arg.fb_id = get_fb(sna, bo, - crtc->mode.HDisplay, - crtc->mode.VDisplay); - - arg.user_data = (uintptr_t)sna_crtc; - arg.flags = DRM_MODE_PAGE_FLIP_EVENT; - arg.reserved = 0; - - if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_PAGE_FLIP, &arg)) { - if (sna_crtc_flip(sna, sna_crtc, bo, 0, 0)) { - DBG(("%s: removing handle=%d [active_scanout=%d] from scanout, installing handle=%d [active_scanout=%d]\n", - __FUNCTION__, sna_crtc->bo->handle, sna_crtc->bo->active_scanout, - bo->handle, bo->active_scanout)); - assert(sna_crtc->bo->active_scanout); - assert(sna_crtc->bo->refcnt >= sna_crtc->bo->active_scanout); - sna_crtc->bo->active_scanout--; - kgem_bo_destroy(&sna->kgem, sna_crtc->bo); - - sna_crtc->bo = bo; - sna_crtc->bo->active_scanout++; - sna_crtc->cache_bo = NULL; - } else { - DBG(("%s: flip [fb=%d] on crtc %d [%d, pipe=%d] failed - %d\n", - __FUNCTION__, arg.fb_id, i, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc), errno)); - xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR, - "Page flipping failed, disabling TearFree\n"); - sna->flags &= ~SNA_TEAR_FREE; - - damage.extents = crtc->bounds; - damage.data = NULL; - sna_crtc_redisplay__fallback(crtc, &damage, sna_crtc->bo); - - kgem_bo_destroy(&sna->kgem, bo); - sna_crtc->cache_bo = NULL; - } - } else { - sna->mode.flip_active++; - - assert(sna_crtc->flip_bo == NULL); - sna_crtc->flip_handler = shadow_flip_handler; - sna_crtc->flip_data = sna; - sna_crtc->flip_bo = bo; - sna_crtc->flip_bo->active_scanout++; - sna_crtc->flip_serial = sna_crtc->mode_serial; - sna_crtc->flip_pending = true; - - sna_crtc->cache_bo = kgem_bo_reference(sna_crtc->bo); - - DBG(("%s: recording flip on CRTC:%d handle=%d, active_scanout=%d, serial=%d\n", - __FUNCTION__, __sna_crtc_id(sna_crtc), sna_crtc->flip_bo->handle, sna_crtc->flip_bo->active_scanout, sna_crtc->flip_serial)); - } - } + sna_crtc_redisplay__fallback(crtc, + &damage, + sna_crtc->bo); } RegionUninit(&damage); @@ -8813,7 +8734,6 @@ sna_crtc->bo = kgem_bo_reference(bo); sna_crtc->bo->active_scanout++; - sna_crtc->cache_bo = kgem_bo_reference(bo); } else { BoxRec box; DrawableRec tmp; @@ -8841,10 +8761,10 @@ __FUNCTION__, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc)); sna_crtc_disable(crtc, false); } - - kgem_bo_destroy(&sna->kgem, bo); - sna_crtc->cache_bo = NULL; } + + kgem_bo_destroy(&sna->kgem, bo); + sna_crtc->cache_bo = NULL; continue; } sna->mode.flip_active++; @@ -8857,7 +8777,11 @@ sna_crtc->flip_serial = sna_crtc->mode_serial; sna_crtc->flip_pending = true; - sna_crtc->cache_bo = kgem_bo_reference(sna_crtc->bo); + if (sna_crtc->bo != sna->mode.shadow) { + assert_scanout(&sna->kgem, sna_crtc->bo, + crtc->mode.HDisplay, crtc->mode.VDisplay); + sna_crtc->cache_bo = kgem_bo_reference(sna_crtc->bo); + } DBG(("%s: recording flip on CRTC:%d handle=%d, active_scanout=%d, serial=%d\n", __FUNCTION__, __sna_crtc_id(sna_crtc), sna_crtc->flip_bo->handle, sna_crtc->flip_bo->active_scanout, sna_crtc->flip_serial)); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/sna_dri2.c new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_dri2.c --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/sna_dri2.c 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_dri2.c 2016-05-16 11:14:04.000000000 +0200 @@ -1246,6 +1246,7 @@ src_bo = src_priv->bo; assert(src_bo->refcnt); + kgem_bo_unclean(&sna->kgem, src_bo); if (is_front(src->attachment)) { struct sna_pixmap *priv; @@ -1616,6 +1617,9 @@ assert(draw); + if (crtc == NULL) + crtc = sna_primary_crtc(sna); + swap = sna_crtc_last_swap(crtc); DBG(("%s(type=%d): draw=%ld, pipe=%d, frame=%lld [msc %lld], tv=%d.%06d\n", __FUNCTION__, type, (long)draw->id, crtc ? sna_crtc_pipe(crtc) : -1, @@ -2549,33 +2553,27 @@ if (bo == NULL) return false; - DBG(("%s: handle=%d, domain: %d exec? %d, rq? %d\n", __FUNCTION__, - bo->handle, bo->domain, bo->exec != NULL, bo->rq != NULL)); - assert(bo->refcnt); - - if (bo->exec) - return true; - - if (bo->rq == NULL) - return false; - - return __kgem_busy(kgem, bo->handle); + return __kgem_bo_is_busy(kgem, bo); } static bool sna_dri2_blit_complete(struct sna_dri2_event *info) { - if (rq_is_busy(&info->sna->kgem, info->bo)) { + if (!info->bo) + return true; + + if (__kgem_bo_is_busy(&info->sna->kgem, info->bo)) { DBG(("%s: vsync'ed blit is still busy, postponing\n", __FUNCTION__)); if (sna_next_vblank(info)) return false; + + kgem_bo_sync__gtt(&info->sna->kgem, info->bo); } DBG(("%s: blit finished\n", __FUNCTION__)); - if (info->bo) { - kgem_bo_destroy(&info->sna->kgem, info->bo); - info->bo = NULL; - } + kgem_bo_destroy(&info->sna->kgem, info->bo); + info->bo = NULL; + return true; } @@ -3339,7 +3337,7 @@ __FUNCTION__, get_private(front)->pixmap->drawable.serialNumber, get_drawable_pixmap(draw)->drawable.serialNumber)); - goto fake; + goto skip; } if (get_private(back)->stale) { @@ -3483,7 +3481,7 @@ if (!sna_next_vblank(info)) goto fake; - swap_limit(draw, 2); + swap_limit(draw, 1); } else { fake: /* XXX Use a Timer to throttle the client? */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/sna_render.c new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_render.c --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/src/sna/sna_render.c 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/src/sna/sna_render.c 2016-05-16 11:14:04.000000000 +0200 @@ -2298,16 +2298,22 @@ struct kgem_bo *src, struct kgem_bo *dst) { - if (src->tiling != dst->tiling) - return false; + DBG(("%s: tiling=%d:%d, pitch=%d:%d, can_map=%d:%d[%d]\n", + __FUNCTION__, + src->tiling, dst->tiling, + src->pitch, dst->pitch, + kgem_bo_can_map__cpu(&sna->kgem, src, false), + kgem_bo_can_map__cpu(&sna->kgem, dst, true), + sna->kgem.has_wc_mmap)); - if (src->pitch != dst->pitch) + if (src->tiling != dst->tiling) return false; if (!kgem_bo_can_map__cpu(&sna->kgem, src, false)) return false; - if (!kgem_bo_can_map__cpu(&sna->kgem, dst, true)) + if (!kgem_bo_can_map__cpu(&sna->kgem, dst, true) && + !sna->kgem.has_wc_mmap) return false; DBG(("%s -- yes, src handle=%d, dst handle=%d\n", __FUNCTION__, src->handle, dst->handle)); @@ -2320,8 +2326,8 @@ const DrawableRec *dst_draw, struct kgem_bo *dst_bo, int16_t dx, int16_t dy, const BoxRec *box, int n, unsigned flags) { + memcpy_box_func detile = NULL; void *dst, *src; - bool clipped; if (op != GXcopy) return false; @@ -2329,25 +2335,53 @@ if (src_draw->depth != dst_draw->depth) return false; - clipped = (n > 1 || - box->x1 + dx > 0 || - box->y1 + dy > 0 || - box->x2 + dx < dst_draw->width || - box->y2 + dy < dst_draw->height); - dst = src = NULL; - if (!clipped && can_copy_cpu(sna, src_bo, dst_bo)) { - dst = kgem_bo_map__cpu(&sna->kgem, dst_bo); + if (can_copy_cpu(sna, src_bo, dst_bo)) { + if (src_bo->pitch != dst_bo->pitch || + dx != sx || dy != sy || n > 1 || + box->x1 + dx > 0 || + box->y1 + dy > 0 || + box->x2 + dx < dst_draw->width || + box->y2 + dy < dst_draw->height) { + if (dx != sx) /* not implemented in memcpy yet */ + goto use_gtt; + + switch (dst_bo->tiling) { + default: + case I915_TILING_Y: + goto use_gtt; + + case I915_TILING_X: + detile = sna->kgem.memcpy_between_tiled_x; + if (detile == NULL) + goto use_gtt; + break; + + case I915_TILING_NONE: + break; + } + } + + if (kgem_bo_can_map__cpu(&sna->kgem, dst_bo, true)) + dst = kgem_bo_map__cpu(&sna->kgem, dst_bo); + else + dst = kgem_bo_map__wc(&sna->kgem, dst_bo); src = kgem_bo_map__cpu(&sna->kgem, src_bo); } if (dst == NULL || src == NULL) { +use_gtt: dst = kgem_bo_map__gtt(&sna->kgem, dst_bo); src = kgem_bo_map__gtt(&sna->kgem, src_bo); if (dst == NULL || src == NULL) return false; + + detile = NULL; } else { - kgem_bo_sync__cpu_full(&sna->kgem, dst_bo, true); + if (dst == dst_bo->map__wc) + kgem_bo_sync__gtt(&sna->kgem, dst_bo); + else + kgem_bo_sync__cpu_full(&sna->kgem, dst_bo, true); kgem_bo_sync__cpu_full(&sna->kgem, src_bo, false); } @@ -2355,7 +2389,16 @@ __FUNCTION__, sx, sy, dx, dy, n)); if (sigtrap_get() == 0) { - do { + if (detile) { + do { + detile(src, dst, dst_draw->bitsPerPixel, + src_bo->pitch, dst_bo->pitch, + box->x1 + sx, box->y1 + sy, + box->x1 + dx, box->y1 + dy, + box->x2 - box->x1, box->y2 - box->y1); + box++; + } while (--n); + } else do { memcpy_blt(src, dst, dst_draw->bitsPerPixel, src_bo->pitch, dst_bo->pitch, box->x1 + sx, box->y1 + sy, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/test/Makefile.am new/xf86-video-intel-2.99.917.651_g34f63f2/test/Makefile.am --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/test/Makefile.am 2016-04-30 15:10:57.000000000 +0200 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/test/Makefile.am 2016-05-16 11:14:04.000000000 +0200 @@ -28,6 +28,12 @@ shm-test \ $(NULL) +if X11_VM +stress_TESTS += \ + xvidmode \ + $(NULL) +endif + if DRI2 stress_TESTS += \ dri2-race \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xf86-video-intel-2.99.917.641_ge4ef6e9/test/xvidmode.c new/xf86-video-intel-2.99.917.651_g34f63f2/test/xvidmode.c --- old/xf86-video-intel-2.99.917.641_ge4ef6e9/test/xvidmode.c 1970-01-01 01:00:00.000000000 +0100 +++ new/xf86-video-intel-2.99.917.651_g34f63f2/test/xvidmode.c 2016-05-16 11:14:04.000000000 +0200 @@ -0,0 +1,54 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <X11/Xlib.h> +#include <X11/extensions/xf86vmode.h> + +int main(void) +{ + Display *dpy; + XF86VidModeModeLine current; + XF86VidModeModeInfo **modes; + int num_modes, i; + int saved_mode = -1; + int dotclock; + + dpy = XOpenDisplay(NULL); + if (dpy == NULL) + dpy = XOpenDisplay(":0"); + + XF86VidModeGetModeLine(dpy, DefaultScreen(dpy), &dotclock, ¤t); + XF86VidModeGetAllModeLines(dpy, XDefaultScreen(dpy), + &num_modes, &modes); + for (i = 0; i < num_modes; i++) { + int this; + + this = (current.hdisplay == modes[i]->hdisplay && + current.vdisplay == modes[i]->vdisplay && + dotclock == modes[i]->dotclock); + if (this && saved_mode == -1) + saved_mode = i; + + printf("[%d] %dx%d%s\n", + i, + modes[i]->hdisplay, + modes[i]->vdisplay, + this ? "*" : ""); + } + + for (i = 0; i < num_modes; i++) { + printf("Switching to mode %dx%d\n", + modes[i]->hdisplay, + modes[i]->vdisplay); + XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy), modes[i]); + XSync(dpy, True); + } + + if (saved_mode != -1) { + XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy), + modes[saved_mode]); + XFlush(dpy); + } + + return 0; +}
