Makefile.am | 6 NEWS | 51 - configure.ac | 50 - src/Makefile.am | 4 src/backlight.c | 492 ++++++++++ src/backlight.h | 56 + src/fd.c | 69 + src/fd.h | 33 src/intel_device.c | 104 -- src/intel_driver.h | 2 src/intel_module.c | 6 src/sna/fb/fbpointbits.h | 23 src/sna/gen2_render.c | 70 - src/sna/gen3_render.c | 5 src/sna/gen4_render.c | 3 src/sna/gen5_render.c | 28 src/sna/gen6_common.h | 21 src/sna/gen6_render.c | 39 src/sna/gen7_render.c | 5 src/sna/gen8_render.c | 14 src/sna/kgem.c | 63 - src/sna/kgem.h | 2 src/sna/sna.h | 22 src/sna/sna_accel.c | 345 ++++--- src/sna/sna_blt.c | 263 +++++ src/sna/sna_composite.c | 25 src/sna/sna_display.c | 777 +++++++--------- src/sna/sna_driver.c | 26 src/sna/sna_glyphs.c | 90 + src/sna/sna_io.c | 4 src/sna/sna_reg.h | 1 src/sna/sna_render.c | 13 src/sna/sna_render.h | 5 src/sna/sna_render_inline.h | 28 src/sna/sna_threads.c | 142 +- src/sna/sna_tiling.c | 6 src/sna/sna_transform.c | 57 + src/sna/sna_trapezoids.c | 77 - src/sna/sna_trapezoids_boxes.c | 250 ++--- src/sna/sna_trapezoids_imprecise.c | 82 + src/sna/sna_trapezoids_mono.c | 7 src/sna/sna_trapezoids_precise.c | 86 + src/sna/sna_video_sprite.c | 14 src/uxa/i830_reg.h | 12 src/uxa/intel_batchbuffer.c | 16 src/uxa/intel_batchbuffer.h | 8 src/uxa/intel_display.c | 238 ---- src/uxa/intel_driver.c | 77 - src/uxa/intel_uxa.c | 24 src/uxa/intel_video.c | 3 tools/.gitignore | 2 tools/Makefile.am | 29 tools/backlight_helper.c | 36 tools/org.x.xf86-video-intel.backlight-helper.policy.in | 19 tools/virtual.c | 192 ++- 55 files changed, 2698 insertions(+), 1424 deletions(-)
New commits: commit 582adf067c275a18f55bb43945348b84cb7eb3c4 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Wed Mar 19 14:57:25 2014 +0000 2.99.911 snapshot diff --git a/NEWS b/NEWS index bcafafb..e209609 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,48 @@ +Snapshot 2.99.911 (2014-03-19) +============================== +Hans de Geode has been working on making the Xserver work without +privileges under the supervision of systemd/logind. This necessitated a +few new features for us: server fds (where we are passed which fd to use +to talk to our device by the Xserver who may in turn receive it from +logind or other host) and a small backlight helper so that we can continue +to provide a RandR backlight property when running without root privileges. + + * Flush when changing blend modes on Ironlake, or else single glyphs + are sometimes rendered incorrectly + Regression from 2.20.15 + https://bugs.freedesktop.org/show_bug.cgi?id=74882 + + * Fix pixmap offsets for pixman fallbacks onto Composite redirected + windows + https://bugs.freedesktop.org/show_bug.cgi?id=73811 + + * Fix blending onto 8-bit destinations, typically used for generating + masks in complex Render operations, on gen2 + https://bugs.freedesktop.org/show_bug.cgi?id=75818 + + * Handle failure to create DRI bo more carefully. For example on gen3, + the DDX supports pixmaps that are much, much larger than OpenGL can + use and do not support the tiling modes that we request for OpenGL. + https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1289049 + + * Fix a bookkeeping bug with proxy buffers that are marked active but + not actually inserted into a request (so they end up permanently + active and confuse everybody). + https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1289923 + + * Actually turn off displays with DPMS off for UXA. + Regression from 2.99.903, but requires + + kernel commit c9976dcf55c8aaa7037427b239f15e5acfc01a3a + Author: Chris Wilson <ch...@chris-wilson.co.uk> + Date: Sun Sep 29 19:15:07 2013 +0100 + + drm/i915: Only apply DPMS to the encoder if enabled + + instead for correct behaviour on Haswell. + https://code.google.com/p/chromium/issues/detail?id=341135 + + Snapshot 2.99.910 (2014-02-10) ============================== Another latent bug exposed by recent changes merit another snapshot for diff --git a/configure.ac b/configure.ac index f68cdf4..7542898 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-video-intel], - [2.99.910], + [2.99.911], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-video-intel]) AC_CONFIG_SRCDIR([Makefile.am]) commit 6802ee00e52515ca886b956f6c0a0e27d708fb31 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Wed Mar 19 10:25:05 2014 +0000 sna: Assert after applying clipping that the draw rectangle is wholly contained Otherwise we ignore the purpose of applying the clip! Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 4f08e99..a192d06 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -12149,7 +12149,7 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable, if (clip.data == NULL) { const BoxRec *box = &clip.extents; - DBG(("%s: single clip box [(%d, %d), (%d, %d)]", + DBG(("%s: single clip box [(%d, %d), (%d, %d)]\n", __FUNCTION__, box->x1, box->y1, box->x2, box->y2)); while (n--) { BoxRec r; @@ -12162,10 +12162,6 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable, DBG(("%s: rectangle [(%d, %d), (%d, %d)]\n", __FUNCTION__, r.x1, r.y1, r.x2, r.y2)); - assert(r.x1 + dx >= 0); - assert(r.y1 + dy >= 0); - assert(r.x2 + dx <= pixmap->drawable.width); - assert(r.y2 + dy <= pixmap->drawable.height); if (box_intersect(&r, box)) { int height = r.y2 - r.y1; @@ -12174,6 +12170,11 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable, if (tile_y < 0) tile_y += tile_height; + assert(r.x1 + dx >= 0); + assert(r.y1 + dy >= 0); + assert(r.x2 + dx <= pixmap->drawable.width); + assert(r.y2 + dy <= pixmap->drawable.height); + while (height) { int width = r.x2 - r.x1; int dst_x = r.x1, tile_x; @@ -12234,14 +12235,15 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable, region.extents.y1, region.extents.x2, region.extents.y2)); + + region.data = NULL; + RegionIntersect(®ion, ®ion, &clip); + assert(region.extents.x1 + dx >= 0); assert(region.extents.y1 + dy >= 0); assert(region.extents.x2 + dx <= pixmap->drawable.width); assert(region.extents.y2 + dy <= pixmap->drawable.height); - region.data = NULL; - RegionIntersect(®ion, ®ion, &clip); - nbox = RegionNumRects(®ion); box = RegionRects(®ion); DBG(("%s: split into %d boxes after clipping\n", __FUNCTION__, nbox)); commit 15be6b7c9a89bfdac923d2a27649f539c430366f Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Tue Mar 18 16:31:07 2014 +0000 uxa: Implement minimal flushing for bdw+ Based on the patch by Kenneth Graunke, "Several places (such as intel_cache_expire) call intel_emit_batch_flush, so it needs to work on Broadwell. Sometimes the batch is empty, in which case current_batch may not yet be BLT_RING. The PIPE_CONTROL code has not been ported to work on Broadwell, so trying to do a render ring flush will hang the GPU. It also doesn't make any sense to do a render ring flush, given that we never use the render ring for UXA on Broadwell." Cc: Kenneth Graunke <kenn...@whitecape.org> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/uxa/intel_batchbuffer.c b/src/uxa/intel_batchbuffer.c index 4aabe48..dedf7f8 100644 --- a/src/uxa/intel_batchbuffer.c +++ b/src/uxa/intel_batchbuffer.c @@ -183,16 +183,23 @@ void intel_batch_emit_flush(ScrnInfoPtr scrn) int flags; assert (!intel->in_batch_atomic); - assert (INTEL_INFO(intel)->gen < 0100); /* Big hammer, look to the pipelined flushes in future. */ - if ((INTEL_INFO(intel)->gen >= 060)) { + if ((INTEL_INFO(intel)->gen >= 0100)) { + /* Only BLT supported */ + BEGIN_BATCH_BLT(4); + OUT_BATCH(MI_FLUSH_DW | 2); + OUT_BATCH(0); /* address low */ + OUT_BATCH(0); /* address high */ + OUT_BATCH(0); /* dword data */ + ADVANCE_BATCH(); + } else if ((INTEL_INFO(intel)->gen >= 060)) { if (intel->current_batch == BLT_BATCH) { BEGIN_BATCH_BLT(4); OUT_BATCH(MI_FLUSH_DW | 2); - OUT_BATCH(0); - OUT_BATCH(0); - OUT_BATCH(0); + OUT_BATCH(0); /* address */ + OUT_BATCH(0); /* qword low */ + OUT_BATCH(0); /* qword high */ ADVANCE_BATCH(); } else { if ((INTEL_INFO(intel)->gen == 060)) { commit 6446bf96f0cc01e730c240f7ed5c91f5d2292139 Author: Hans de Goede <hdego...@redhat.com> Date: Tue Mar 18 15:16:30 2014 +0100 intel: Don't close the fd on probe failure if it is server managed I hit this corner case when testing a single X server spanning both intel gfx + an usb display link adapter driven by xf86-video-modesetting. In this scenario the intel driver gets its platformProbe method called first, and if it then closes the server managed fd, the xf86-video-modesetting gets EBADFD errors. Signed-off-by: Hans de Goede <hdego...@redhat.com> diff --git a/src/intel_device.c b/src/intel_device.c index e95936b..11118c2 100644 --- a/src/intel_device.c +++ b/src/intel_device.c @@ -339,7 +339,8 @@ int intel_open_device(int entity_num, return fd; err_close: - close(fd); + if (master_count == 0) /* Don't close server-fds */ + close(fd); err_path: free(local_path); return -1; commit 4a6e09c6cdb13773bca5f6831f9f5164008699c9 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Tue Mar 18 15:52:19 2014 +0000 uxa: Add support for server managed fds (via intel_device) Based on the patch by Hans de Goede, this removes the handling of drmOpen() and DRM_MASTER from within uxa and instead uses the common routines. This reduces the duplicate code from within uxa, and enables new features such as server managed fds. Cc: Hans de Goede <hdego...@redhat.com> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/intel_device.c b/src/intel_device.c index c0e1582..e95936b 100644 --- a/src/intel_device.c +++ b/src/intel_device.c @@ -441,20 +441,6 @@ int intel_put_master(ScrnInfoPtr scrn) return ret; } -void __intel_uxa_release_device(ScrnInfoPtr scrn) -{ - struct intel_device *dev = intel_device(scrn); - if (dev && dev->open_count == 0) { - intel_set_device(scrn, NULL); - - drmClose(dev->fd); - if (dev->render_node != dev->master_node) - free(dev->render_node); - free(dev->master_node); - free(dev); - } -} - void intel_put_device(ScrnInfoPtr scrn) { struct intel_device *dev = intel_device(scrn); diff --git a/src/intel_driver.h b/src/intel_driver.h index b2cb1b9..182a30e 100644 --- a/src/intel_driver.h +++ b/src/intel_driver.h @@ -132,8 +132,6 @@ int intel_get_master(ScrnInfoPtr scrn); int intel_put_master(ScrnInfoPtr scrn); void intel_put_device(ScrnInfoPtr scrn); -void __intel_uxa_release_device(ScrnInfoPtr scrn); - #define hosted() (0) #endif /* INTEL_DRIVER_H */ diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c index 7ea3b63..0a4fe2a 100644 --- a/src/uxa/intel_driver.c +++ b/src/uxa/intel_driver.c @@ -247,62 +247,9 @@ static void intel_check_dri_option(ScrnInfoPtr scrn) static Bool intel_open_drm_master(ScrnInfoPtr scrn) { intel_screen_private *intel = intel_get_screen_private(scrn); - struct pci_device *dev = intel->PciInfo; - drmSetVersion sv; - struct drm_i915_getparam gp; - int err, has_gem; - char busid[20]; - snprintf(busid, sizeof(busid), "pci:%04x:%02x:%02x.%d", - dev->domain, dev->bus, dev->dev, dev->func); - - intel->drmSubFD = drmOpen(NULL, busid); - if (intel->drmSubFD == -1) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "[drm] Failed to open DRM device for %s: %s\n", - busid, strerror(errno)); - return FALSE; - } - - /* Check that what we opened was a master or a master-capable FD, - * by setting the version of the interface we'll use to talk to it. - * (see DRIOpenDRMMaster() in DRI1) - */ - sv.drm_di_major = 1; - sv.drm_di_minor = 1; - sv.drm_dd_major = -1; - sv.drm_dd_minor = -1; - err = drmSetInterfaceVersion(intel->drmSubFD, &sv); - if (err != 0) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "[drm] failed to set drm interface version.\n"); - drmClose(intel->drmSubFD); - intel->drmSubFD = -1; - return FALSE; - } - - has_gem = FALSE; - gp.param = I915_PARAM_HAS_GEM; - gp.value = &has_gem; - (void)drmCommandWriteRead(intel->drmSubFD, DRM_I915_GETPARAM, - &gp, sizeof(gp)); - if (!has_gem) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "[drm] Failed to detect GEM. Kernel 2.6.28 required.\n"); - drmClose(intel->drmSubFD); - intel->drmSubFD = -1; - return FALSE; - } - - return TRUE; -} - -static void intel_close_drm_master(intel_screen_private *intel) -{ - if (intel && intel->drmSubFD > 0) { - drmClose(intel->drmSubFD); - intel->drmSubFD = -1; - } + intel->drmSubFD = intel_get_device(scrn); + return intel->drmSubFD != -1; } static int intel_init_bufmgr(intel_screen_private *intel) @@ -1090,8 +1037,8 @@ static void I830FreeScreen(FREE_SCREEN_ARGS_DECL) if (intel && !((uintptr_t)intel & 1)) { intel_mode_fini(intel); - intel_close_drm_master(intel); intel_bufmgr_fini(intel); + intel_put_device(scrn); free(intel); scrn->driverPrivate = NULL; @@ -1102,14 +1049,12 @@ static void I830LeaveVT(VT_FUNC_ARGS_DECL) { SCRN_INFO_PTR(arg); intel_screen_private *intel = intel_get_screen_private(scrn); - int ret; xf86RotateFreeShadow(scrn); xf86_hide_cursors(scrn); - ret = drmDropMaster(intel->drmSubFD); - if (ret) + if (intel_put_master(scrn)) xf86DrvMsg(scrn->scrnIndex, X_WARNING, "drmDropMaster failed: %s\n", strerror(errno)); } @@ -1121,13 +1066,12 @@ static Bool I830EnterVT(VT_FUNC_ARGS_DECL) { SCRN_INFO_PTR(arg); intel_screen_private *intel = intel_get_screen_private(scrn); - int ret; - ret = drmSetMaster(intel->drmSubFD); - if (ret) { + if (intel_get_master(scrn)) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "drmSetMaster failed: %s\n", strerror(errno)); + return FALSE; } if (!xf86SetDesiredModes(scrn)) @@ -1293,8 +1237,6 @@ static Bool I830PMEvent(SCRN_ARG_TYPE arg, pmEvent event, Bool undo) Bool intel_init_scrn(ScrnInfoPtr scrn) { - __intel_uxa_release_device(scrn); - scrn->PreInit = I830PreInit; scrn->ScreenInit = I830ScreenInit; scrn->SwitchMode = I830SwitchMode; commit dc66e663a06f2ce7685eba1fdf9fad01786bcb4f Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Mon Mar 17 13:46:05 2014 +0000 sna: Improve guard against loading palettes whilst headless Whilst hosted, which is very similar to being headless, we do not even have the kmode pointer and so checking kmode->count_crtcs is fatal. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index de08cb9..6e2d118 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -3513,7 +3513,16 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna) num_fake = 1; mode->kmode = drmModeGetResources(sna->kgem.fd); + if (mode->kmode && + (mode->kmode->count_crtcs == 0 || + mode->kmode->count_connectors == 0)) { + drmModeFreeResources(mode->kmode); + mode->kmode = NULL; + } if (mode->kmode) { + assert(mode->kmode->count_crtcs); + assert(mode->kmode->count_connectors); + xf86CrtcConfigInit(scrn, &sna_mode_funcs); XF86_CRTC_CONFIG_PTR(scrn)->xf86_crtc_notify = sna_crtc_config_notify; diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index ef30149..5e1f440 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -1038,7 +1038,7 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL) if (!miCreateDefColormap(screen)) return FALSE; - if (sna->mode.kmode->count_crtcs && + if (sna->mode.kmode && !xf86HandleColormaps(screen, 256, 8, sna_load_palette, NULL, CMAP_RELOAD_ON_MODE_SWITCH | CMAP_PALETTED_TRUECOLOR)) commit 28ebbe8fa902a1d3ee4ecbda5041de5e7b68ada7 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Mon Mar 17 07:56:39 2014 +0000 sna: Fix logic inversion in use of imprecise transform conversion An accidental drop of the if (!is_translation) broke composite copies under a transform. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76244 Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index 41058c6..284f77e 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -2515,13 +2515,15 @@ fill: return false; } - if (sna_transform_is_imprecise_integer_translation(src->transform, src->filter, - dst->polyMode == PolyModePrecise, - &tx, &ty)) { + if (!sna_transform_is_imprecise_integer_translation(src->transform, src->filter, + dst->polyMode == PolyModePrecise, + &tx, &ty)) { DBG(("%s: source transform is not an integer translation\n", __FUNCTION__)); return false; } + DBG(("%s: converting transform to integer translation? (%d, %d)\n", + __FUNCTION__, src->transform != NULL, tx, ty)); x += tx; y += ty; diff --git a/src/sna/sna_transform.c b/src/sna/sna_transform.c index 57d1987..3b54df4 100644 --- a/src/sna/sna_transform.c +++ b/src/sna/sna_transform.c @@ -102,36 +102,49 @@ sna_transform_is_imprecise_integer_translation(const PictTransform *t, int16_t *tx, int16_t *ty) { if (t == NULL) { + DBG(("%s: no transform\n", __FUNCTION__)); *tx = *ty = 0; return true; } + DBG(("%s: FilterNearest?=%d, precise?=%d, transform=[%f %f %f, %f %f %f, %f %f %f]\n", + __FUNCTION__, filter==PictFilterNearest, precise, + t->matrix[0][0]/65536., t->matrix[0][1]/65536., t->matrix[0][2]/65536., + t->matrix[1][0]/65536., t->matrix[1][1]/65536., t->matrix[1][2]/65536., + t->matrix[2][0]/65536., t->matrix[2][1]/65536., t->matrix[2][2]/65536.)); + if (t->matrix[0][0] != IntToxFixed(1) || t->matrix[0][1] != 0 || t->matrix[1][0] != 0 || t->matrix[1][1] != IntToxFixed(1) || t->matrix[2][0] != 0 || t->matrix[2][1] != 0 || - t->matrix[2][2] != IntToxFixed(1)) + t->matrix[2][2] != IntToxFixed(1)) { + DBG(("%s: not unity scaling\n", __FUNCTION__)); return false; + } - DBG(("%s: filter=%d, translation (%x, %x), precise? %d\n", - __FUNCTION__, filter, t->matrix[0][2], t->matrix[1][2], precise)); if (filter != PictFilterNearest) { if (precise) { if (pixman_fixed_fraction(t->matrix[0][2]) || - pixman_fixed_fraction(t->matrix[1][2])) + pixman_fixed_fraction(t->matrix[1][2])) { + DBG(("%s: precise, fractional translation\n", __FUNCTION__)); return false; + } } else { int f; f = pixman_fixed_fraction(t->matrix[0][2]); - if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4) + if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4) { + DBG(("%s: imprecise, fractional translation X\n", __FUNCTION__)); return false; + } f = pixman_fixed_fraction(t->matrix[1][2]); - if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4) + if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4) { + DBG(("%s: imprecise, fractional translation Y\n", __FUNCTION__)); return false; + } } } commit 57e63221ec0fa304a02beed356549cadb28bcf19 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Fri Mar 14 19:49:59 2014 +0000 intel-virtual-output: Minor DBG fixes Improve the summary after failing to detect MIT-SHM, and fix a DBG Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/configure.ac b/configure.ac index 7bf07ae..f68cdf4 100644 --- a/configure.ac +++ b/configure.ac @@ -235,7 +235,9 @@ if test "x$tools" = "xyes"; then AC_CHECK_HEADERS([X11/extensions/XShm.h X11/extensions/shmproto.h X11/extensions/shmstr.h], [], [tools=no], [#include <X11/Xlibint.h> #include <X11/Xproto.h>]) +fi +if test "x$tools" = "xyes"; then tools_msg="$tools_msg intel-virtual-output" fi diff --git a/tools/virtual.c b/tools/virtual.c index c994574..5883950 100644 --- a/tools/virtual.c +++ b/tools/virtual.c @@ -1201,7 +1201,7 @@ err: (long)src->mode.id, src->mode.width, src->mode.height, - dst->name (long)id,)); + dst->name, (long)id)); XRRAddOutputMode(dst->dpy, dst->rr_output, id); dst->mode.id = id; } else { commit 8cc1f005c69786243ac69f6505087071787e6f87 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Fri Mar 14 15:55:41 2014 +0000 intel-virtual-output: Iterate over remote outputs in the same order as listed If we walk the output lists in the same order as they are listed by RandR, we are more likely to hit favourable priority sorting. E.g. the user is likely to setup the outputs in the same order as listed, meaning fewer CRTC transitions etc. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/tools/virtual.c b/tools/virtual.c index cf38315..c994574 100644 --- a/tools/virtual.c +++ b/tools/virtual.c @@ -2163,6 +2163,20 @@ static struct display *last_display(struct context *ctx) return &ctx->display[ctx->ndisplay-1]; } +static void reverse_clone_list(struct display *display) +{ + struct clone *list = NULL; + + while (display->clone) { + struct clone *clone = display->clone; + display->clone = clone->next; + clone->next = list; + list = clone; + } + + display->clone = list; +} + static int last_display_add_clones__randr(struct context *ctx) { struct display *display = last_display(ctx); @@ -2236,6 +2250,8 @@ static int last_display_add_clones__randr(struct context *ctx) XRRFreeOutputInfo(o); } XRRFreeScreenResources(res); + + reverse_clone_list(display); return 0; } @@ -2309,6 +2325,8 @@ static int last_display_add_clones__xinerama(struct context *ctx) ctx->active = clone; } XFree(xi); + + reverse_clone_list(display); return 0; } commit a55bbe3b598616ef4464e50cb9364c8cdf0b513a Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Fri Mar 14 15:47:20 2014 +0000 intel-virtual-output: Disable panning before setting mode on CRTC For whatever reason, presumably to do with the switch between CRTCs, we need to disable the panning before setting the mode in order for our desired CRTC position to take effect. Reported-by: Jeff Katz <bugzi...@kraln.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76146 Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/tools/virtual.c b/tools/virtual.c index 9e267be..cf38315 100644 --- a/tools/virtual.c +++ b/tools/virtual.c @@ -1252,6 +1252,10 @@ err: dst->x, dst->y, dst->mode.width, dst->mode.height, dst->rotation, (long)rr_crtc, dst->mode.id)); + ret = XRRSetPanning(dst->dpy, res, rr_crtc, memset(&panning, 0, sizeof(panning))); + DBG(("%s-%s: XRRSetPanning %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success")); + (void)ret; + ret = XRRSetCrtcConfig(dst->dpy, res, rr_crtc, CurrentTime, dst->x, dst->y, dst->mode.id, dst->rotation, &dst->rr_output, 1); @@ -1259,10 +1263,6 @@ err: if (ret) goto err; - ret = XRRSetPanning(dst->dpy, res, rr_crtc, memset(&panning, 0, sizeof(panning))); - DBG(("%s-%s: XRRSetPanning %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success")); - (void)ret; - if (EXTRA_DBG) { XRRCrtcInfo *c; XRRPanning *p; commit 5079830bd5f01740c4cbf84888bdf7a93bb2868e Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Fri Mar 14 14:34:48 2014 +0000 intel-virtual-output: Mode names are freed with ScreenResources So we have to be careful not to continue to reference the strings after they may be freed. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/tools/virtual.c b/tools/virtual.c index 0dfd308..9e267be 100644 --- a/tools/virtual.c +++ b/tools/virtual.c @@ -1151,9 +1151,9 @@ static int context_update(struct context *ctx) RRCrtc rr_crtc; Status ret; - DBG(("%s: copying configuration from %s (mode=%ld: %s) to %s\n", + DBG(("%s: copying configuration from %s (mode=%ld: %dx%d) to %s\n", DisplayString(dst->dpy), - src->name, (long)src->mode.id, src->mode.name, + src->name, (long)src->mode.id, src->mode.width, src->mode.height, dst->name)); if (src->mode.id == 0) { @@ -1188,15 +1188,20 @@ err: /* XXX User names must be unique! */ m = src->mode; m.nameLength = snprintf(buf, sizeof(buf), - "%s.%ld-%s", src->name, (long)src->mode.id, src->mode.name); + "%s.%ld-%dx%d", src->name, + (long)src->mode.id, + src->mode.width, + src->mode.height); m.name = buf; id = XRRCreateMode(dst->dpy, dst->window, &m); if (id) { - DBG(("%s: adding mode %ld: %s to %s\n", + DBG(("%s: adding mode %ld: %dx%d to %s, new mode %ld\n", DisplayString(dst->dpy), - (long)id, src->mode.name, - dst->name)); + (long)src->mode.id, + src->mode.width, + src->mode.height, + dst->name (long)id,)); XRRAddOutputMode(dst->dpy, dst->rr_output, id); dst->mode.id = id; } else { commit c64d2572bafeacae25e9b58c8372ce91858c3832 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Fri Mar 14 13:08:43 2014 +0000 sna: Allow some leeway when deciding to discard common translations Under PictFilterNearest, we can ignore fractional translations (not all renderers discard those.) And if we are being approximate, we can loosen our tolerance as well. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c index 2ebfde6..e3931e3 100644 --- a/src/sna/gen2_render.c +++ b/src/sna/gen2_render.c @@ -1550,7 +1550,7 @@ gen2_composite_picture(struct sna *sna, y += dy + picture->pDrawable->y; channel->is_affine = sna_transform_is_affine(picture->transform); - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); x += dx; diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c index 69f4668..bb98beb 100644 --- a/src/sna/gen3_render.c +++ b/src/sna/gen3_render.c @@ -2859,7 +2859,7 @@ static bool gen3_gradient_setup(struct sna *sna, channel->card_format = MAPSURF_32BIT | MT_32BIT_ARGB8888; channel->filter = PictFilterNearest; channel->is_affine = sna_transform_is_affine(picture->transform); - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, PictFilterNearest, false, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); ox += dx; @@ -3086,7 +3086,7 @@ gen3_composite_picture(struct sna *sna, x += dx + picture->pDrawable->x; y += dy + picture->pDrawable->y; - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); x += dx; diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c index f377315..88db06e 100644 --- a/src/sna/gen4_render.c +++ b/src/sna/gen4_render.c @@ -1577,7 +1577,7 @@ gen4_composite_picture(struct sna *sna, y += dy + picture->pDrawable->y; channel->is_affine = sna_transform_is_affine(picture->transform); - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); x += dx; diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c index e4db739..5508d49 100644 --- a/src/sna/gen5_render.c +++ b/src/sna/gen5_render.c @@ -1516,7 +1516,7 @@ gen5_composite_picture(struct sna *sna, y += dy + picture->pDrawable->y; channel->is_affine = sna_transform_is_affine(picture->transform); - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); x += dx; diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index 577d1c0..f1f7946 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -1713,8 +1713,8 @@ gen6_composite_picture(struct sna *sna, uint32_t color; int16_t dx, dy; - DBG(("%s: (%d, %d)x(%d, %d), dst=(%d, %d)\n", - __FUNCTION__, x, y, w, h, dst_x, dst_y)); + DBG(("%s: (%d, %d)x(%d, %d), dst=(%d, %d), precise=%d\n", + __FUNCTION__, x, y, w, h, dst_x, dst_y, precise)); channel->is_solid = false; channel->card_format = -1; @@ -1766,7 +1766,7 @@ gen6_composite_picture(struct sna *sna, y += dy + picture->pDrawable->y; channel->is_affine = sna_transform_is_affine(picture->transform); - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); x += dx; @@ -1790,6 +1790,36 @@ gen6_composite_picture(struct sna *sna, x, y, w, h, dst_x, dst_y); } + DBG(("%s: pixmap, repeat=%d, filter=%d, transform?=%d [affine? %d], format=%08x\n", + __FUNCTION__, + channel->repeat, channel->filter, + channel->transform != NULL, channel->is_affine, + channel->pict_format)); + if (channel->transform) { +#define f2d(x) (((double)(x))/65536.) + DBG(("%s: transform=[%f %f %f, %f %f %f, %f %f %f] (raw [%x %x %x, %x %x %x, %x %x %x])\n", + __FUNCTION__, + f2d(channel->transform->matrix[0][0]), + f2d(channel->transform->matrix[0][1]), + f2d(channel->transform->matrix[0][2]), + f2d(channel->transform->matrix[1][0]), + f2d(channel->transform->matrix[1][1]), + f2d(channel->transform->matrix[1][2]), + f2d(channel->transform->matrix[2][0]), + f2d(channel->transform->matrix[2][1]), + f2d(channel->transform->matrix[2][2]), + channel->transform->matrix[0][0], + channel->transform->matrix[0][1], + channel->transform->matrix[0][2], + channel->transform->matrix[1][0], + channel->transform->matrix[1][1], + channel->transform->matrix[1][2], + channel->transform->matrix[2][0], + channel->transform->matrix[2][1], + channel->transform->matrix[2][2])); +#undef f2d + } + return sna_render_pixmap_bo(sna, channel, pixmap, x, y, w, h, dst_x, dst_y); } diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index 4f61661..6c1fe26 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -2029,7 +2029,7 @@ gen7_composite_picture(struct sna *sna, y += dy + picture->pDrawable->y; channel->is_affine = sna_transform_is_affine(picture->transform); - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); x += dx; diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c index ddf376b..9e63483 100644 --- a/src/sna/gen8_render.c +++ b/src/sna/gen8_render.c @@ -1806,7 +1806,7 @@ gen8_composite_picture(struct sna *sna, y += dy + picture->pDrawable->y; channel->is_affine = sna_transform_is_affine(picture->transform); - if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) { + if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) { DBG(("%s: integer translation (%d, %d), removing\n", __FUNCTION__, dx, dy)); x += dx; diff --git a/src/sna/sna.h b/src/sna/sna.h index 4651632..f0ddda5 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -764,10 +764,13 @@ sna_get_transformed_coordinates_3d(int x, int y, float *x_out, float *y_out, float *z_out); bool sna_transform_is_affine(const PictTransform *t); -bool sna_transform_is_integer_translation(const PictTransform *t, - int16_t *tx, int16_t *ty); bool sna_transform_is_translation(const PictTransform *t, pixman_fixed_t *tx, pixman_fixed_t *ty); +bool sna_transform_is_integer_translation(const PictTransform *t, + int16_t *tx, int16_t *ty); +bool sna_transform_is_imprecise_integer_translation(const PictTransform *t, + int filter, bool precise, + int16_t *tx, int16_t *ty); static inline bool sna_affine_transform_is_rotation(const PictTransform *t) { diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index 302a00b..41058c6 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -2515,7 +2515,9 @@ fill: return false; } - if (!sna_transform_is_integer_translation(src->transform, &tx, &ty)) { + if (sna_transform_is_imprecise_integer_translation(src->transform, src->filter, + dst->polyMode == PolyModePrecise, + &tx, &ty)) { DBG(("%s: source transform is not an integer translation\n", __FUNCTION__)); return false; diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c index 74dfc9e..d34b517 100644 --- a/src/sna/sna_composite.c +++ b/src/sna/sna_composite.c @@ -527,7 +527,9 @@ sna_composite_fb(CARD8 op, src->filter != PictFilterConvolution && (op == PictOpSrc || (op == PictOpOver && !PICT_FORMAT_A(src->format))) && (dst->format == src->format || dst->format == alphaless(src->format)) && - sna_transform_is_integer_translation(src->transform, &tx, &ty)) { + sna_transform_is_imprecise_integer_translation(src->transform, src->filter, + dst->polyMode == PolyModePrecise, + &tx, &ty)) { PixmapPtr dst_pixmap = get_drawable_pixmap(dst->pDrawable); PixmapPtr src_pixmap = get_drawable_pixmap(src->pDrawable); int16_t sx = src_x + tx - (dst->pDrawable->x + dst_x); diff --git a/src/sna/sna_transform.c b/src/sna/sna_transform.c index 55cc1ad..57d1987 100644 --- a/src/sna/sna_transform.c +++ b/src/sna/sna_transform.c @@ -96,6 +96,50 @@ sna_transform_is_integer_translation(const PictTransform *t, int16_t *tx, int16_ return true; -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: https://lists.debian.org/e1wtslv-00080t...@moszumanska.debian.org