NEWS                          |   71 
 configure.ac                  |   31 
 man/intel.man                 |   19 
 src/intel_device.c            |    3 
 src/intel_module.c            |   12 
 src/sna/Makefile.am           |    4 
 src/sna/blt.c                 |   13 
 src/sna/brw/brw_eu_util.c     |  126 -
 src/sna/brw/brw_wm.c          |   16 
 src/sna/fb/fbline.c           |   14 
 src/sna/fb/fblinebits.h       |   15 
 src/sna/gen2_render.c         |   11 
 src/sna/gen3_render.c         |   15 
 src/sna/gen4_common.c         |   64 
 src/sna/gen4_common.h         |   49 
 src/sna/gen4_render.c         |   62 
 src/sna/gen5_render.c         |   72 
 src/sna/gen6_common.c         |   71 
 src/sna/gen6_common.h         |  192 ++
 src/sna/gen6_render.c         |  231 --
 src/sna/gen7_render.c         |  277 ---
 src/sna/kgem.c                |  733 ++++++---
 src/sna/kgem.h                |  155 --
 src/sna/sna.h                 |   57 
 src/sna/sna_accel.c           | 3255 ++++++++++++++++++++++++++----------------
 src/sna/sna_blt.c             | 1263 ++++++++++++----
 src/sna/sna_composite.c       |   20 
 src/sna/sna_damage.c          |   23 
 src/sna/sna_display.c         |  652 ++++++--
 src/sna/sna_dri.c             |   21 
 src/sna/sna_glyphs.c          |  235 +--
 src/sna/sna_io.c              | 1120 +++++++++-----
 src/sna/sna_reg.h             |   32 
 src/sna/sna_render.c          |    2 
 src/sna/sna_render.h          |   19 
 src/sna/sna_threads.c         |    4 
 src/sna/sna_tiling.c          |  320 ++++
 src/sna/sna_trapezoids.c      |   23 
 src/sna/sna_trapezoids_mono.c |    2 
 src/uxa/i915_video.c          |    5 
 src/uxa/intel_driver.c        |    3 
 src/uxa/intel_uxa.c           |    3 
 test/Makefile.am              |    2 
 tools/virtual.c               |  227 ++
 xvmc/i915_xvmc.c              |    2 
 xvmc/i965_xvmc.c              |    2 
 xvmc/intel_batchbuffer.c      |   60 
 xvmc/intel_batchbuffer.h      |    4 
 xvmc/intel_xvmc.c             |   58 
 xvmc/xvmc_vld.c               |    4 
 50 files changed, 6373 insertions(+), 3301 deletions(-)

New commits:
commit 7468a6b740af14d95e8f9bacd2e352ec98a9acf2
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Tue Nov 12 14:43:28 2013 +0000

    2.99.906 snapshot

diff --git a/NEWS b/NEWS
index 79cdf86..e4e980d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,45 @@
+Snapshot 2.99.906 (2013-11-13)
+==============================
+Several stability fixes required after the recent tweaking of the core
+mechanics to handle the updated TearFree and attempting to make static
+analyzers happy.
+
+ * Fix damage handling when rendering to a partially damaged GPU surface.
+   Regression in 2.99.905
+   https://bugs.freedesktop.org/show_bug.cgi?id=70527
+
+ * Use asprintf() instead of sprintf()
+   Regression in 2.99.905
+   https://bugs.freedesktop.org/show_bug.cgi?id=70835
+
+ * Improve accounting for fence overallocation on older gen2/3, and
+   improve the tiling mechanism to fit into the same aperture constraints
+   https://bugs.freedesktop.org/show_bug.cgi?id=70924
+
+ * Add an extra GPU flush on Sandybridge to fix some rare font corruption
+
+ * Rasterise lines through all clip boxes
+   https://bugs.freedesktop.org/show_bug.cgi?id=70802
+
+ * Fix regression from stricter handling of failures to move a GC to the GPU
+   Regression in 2.99.905
+   https://bugs.freedesktop.org/show_bug.cgi?id=71415
+
+ * Fix various fail along the memcpy_xor paths, including inadequate error
+   handling and integer overflow
+   https://bugs.freedesktop.org/show_bug.cgi?id=70527
+
+ * Fix outside-of-target stipple uploads
+   https://bugs.launchpad.net/bugs/1247785
+
+ * Fix clip detection for long glyphs
+   Incomplete bug fix (causing a regression) in 2.99.905
+   https://bugs.freedesktop.org/show_bug.cgi?id=70527
+
+ * Fix VSync for the render engine (Xv) on Haswell
+   https://bugs.freedesktop.org/show_bug.cgi?id=70527
+
+
 Snapshot 2.99.905 (2013-10-23)
 ==============================
 The highlight for this snapshot is the extension of TearFree to support
diff --git a/configure.ac b/configure.ac
index 539ad9b..0783d61 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-video-intel],
-        [2.99.905],
+        [2.99.906],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         [xf86-video-intel])
 AC_CONFIG_SRCDIR([Makefile.am])

commit 220a8e8b1425d08af7ac104540be16611279e807
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Wed Nov 13 09:52:14 2013 +0000

    Bump experimental ioctl command numbers
    
    In the meantime a new ioctl has snuck in.
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 7855884..8775d2b 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -129,7 +129,7 @@ search_snoop_cache(struct kgem *kgem, unsigned int 
num_pages, unsigned flags);
 #define LOCAL_I915_EXEC_NO_RELOC               (1<<11)
 #define LOCAL_I915_EXEC_HANDLE_LUT             (1<<12)
 
-#define LOCAL_I915_GEM_CREATE2       0x32
+#define LOCAL_I915_GEM_CREATE2       0x33
 #define LOCAL_IOCTL_I915_GEM_CREATE2 DRM_IOWR (DRM_COMMAND_BASE + 
LOCAL_I915_GEM_CREATE2, struct local_i915_gem_create2)
 struct local_i915_gem_create2 {
        uint64_t size;
@@ -145,7 +145,7 @@ struct local_i915_gem_create2 {
        uint32_t handle;
 };
 
-#define LOCAL_I915_GEM_USERPTR       0x33
+#define LOCAL_I915_GEM_USERPTR       0x34
 #define LOCAL_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + 
LOCAL_I915_GEM_USERPTR, struct local_i915_gem_userptr)
 struct local_i915_gem_userptr {
        uint64_t user_ptr;

commit 44c585a1d8c3b603a9c79bf7dfecf420575cfb61
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Tue Nov 12 18:59:54 2013 +0000

    sna: Discard cached upload proxy when writing to the pixmap via the CPU
    
    Reported-by: Zdenek Kabelac <zkabe...@redhat.com>
    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 983a5f3..30262c1 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1907,6 +1907,15 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int 
flags)
                        kgem_bo_undo(&sna->kgem, priv->cpu_bo);
        }
 
+       if (flags & MOVE_WRITE && priv->gpu_bo && priv->gpu_bo->proxy) {
+               DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
+               assert(DAMAGE_IS_ALL(priv->cpu_damage));
+               assert(!priv->pinned);
+               assert(!priv->mapped);
+               kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
+               priv->gpu_bo = NULL;
+       }
+
        if (DAMAGE_IS_ALL(priv->cpu_damage)) {
                DBG(("%s: CPU all-damaged\n", __FUNCTION__));
                assert(priv->gpu_damage == NULL || 
DAMAGE_IS_ALL(priv->gpu_damage));
@@ -2333,6 +2342,15 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 
        assert(priv->gpu_damage == NULL || priv->gpu_bo);
 
+       if (flags & MOVE_WRITE && priv->gpu_bo && priv->gpu_bo->proxy) {
+               DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
+               assert(DAMAGE_IS_ALL(priv->cpu_damage));
+               assert(!priv->pinned);
+               assert(!priv->mapped);
+               kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
+               priv->gpu_bo = NULL;
+       }
+
        if (sna_damage_is_all(&priv->cpu_damage,
                              pixmap->drawable.width,
                              pixmap->drawable.height)) {

commit 20e318c292a4e1336093dfbc77cb44d099c80050
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Sun Nov 10 10:28:01 2013 +0000

    intel-virtual-output: Manually adjust screen size
    
    When we modify the outputs and end up with a different screen size, we
    need to actually tell the display to resize with an explicit
    XRRSetScreenSize.
    
    Reported-by: Jethro Beekman <freedesktop-b...@jbeekman.nl>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=71441
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 504a68d..c3d7024 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -86,7 +86,10 @@ struct display {
        Window root;
        Visual *visual;
        Damage damage;
+       long timestamp;
 
+       int width;
+       int height;
        int depth;
 
        XRenderPictFormat *root_format;
@@ -144,6 +147,7 @@ struct clone {
        struct clone *active;
 
        struct output src, dst;
+       long timestamp;
 
        XShmSegmentInfo shm;
        XImage image;
@@ -432,6 +436,12 @@ static int clone_update_modes__randr(struct clone *clone)
        if (from_info == NULL)
                goto err;
 
+       DBG(("%s(%s-%s): timestamp %ld (last %ld)\n", __func__,
+            DisplayString(clone->src.dpy), clone->src.name,
+           from_info->timestamp, clone->timestamp));
+       if (from_info->timestamp == clone->timestamp)
+               goto err;
+
        to_res = _XRRGetScreenResourcesCurrent(clone->src.dpy, 
clone->src.window);
        if (to_res == NULL)
                goto err;
@@ -440,6 +450,30 @@ static int clone_update_modes__randr(struct clone *clone)
        if (to_info == NULL)
                goto err;
 
+       if (clone->dst.rr_crtc == from_info->crtc) {
+               for (i = 0; i < to_info->nmode; i++) {
+                       XRRModeInfo *mode, *old;
+
+                       mode = lookup_mode(to_res, to_info->modes[i]);
+                       if (mode == NULL)
+                               break;
+                       for (j = 0; j < from_info->nmode; j++) {
+                               old = lookup_mode(from_res, 
from_info->modes[j]);
+                               if (old && mode_equal(mode, old)) {
+                                       mode = NULL;
+                                       break;
+                               }
+                       }
+                       if (mode)
+                               break;
+               }
+               if (i == from_info->nmode && i == to_info->nmode) {
+                       DBG(("%s(%s-%s): no change in output\n", __func__,
+                            DisplayString(clone->src.dpy), clone->src.name));
+                       goto done;
+               }
+       }
+
        clone->dst.rr_crtc = from_info->crtc;
 
        /* Clear all current UserModes on the output, including any active ones 
*/
@@ -495,12 +529,16 @@ static int clone_update_modes__randr(struct clone *clone)
                        m.name = buf;
 
                        id = XRRCreateMode(clone->src.dpy, clone->src.window, 
&m);
+                       DBG(("%s(%s-%s): adding mode %ld: %s\n", __func__,
+                            DisplayString(clone->src.dpy), clone->src.name, 
id, mode->name));
                }
 
                XRRAddOutputMode(clone->src.dpy, clone->src.rr_output, id);
        }
        XUngrabServer(clone->src.dpy);
+done:
        ret = 0;
+       clone->timestamp = from_info->timestamp;
 
 err:
        if (to_info)
@@ -824,7 +862,7 @@ static void clone_update(struct clone *clone)
        clone->rr_update = 0;
 }
 
-static void context_update(struct context *ctx)
+static int context_update(struct context *ctx)
 {
        Display *dpy = ctx->display->dpy;
        XRRScreenResources *res;
@@ -835,8 +873,15 @@ static void context_update(struct context *ctx)
 
        res = _XRRGetScreenResourcesCurrent(dpy, ctx->display->root);
        if (res == NULL)
-               return;
+               return 0;
 
+       DBG(("%s timestamp %ld (last %ld)\n", DisplayString(dpy), 
res->timestamp, ctx->display->timestamp));
+       if (res->timestamp == ctx->display->timestamp) {
+               XRRFreeScreenResources(res);
+               return 0;
+       }
+
+       ctx->display->timestamp = res->timestamp;
        for (n = 0; n < ctx->nclone; n++) {
                struct output *output = &ctx->clones[n].src;
                XRROutputInfo *o;
@@ -902,7 +947,7 @@ static void context_update(struct context *ctx)
 
        DBG(("%s changed? %d\n", DisplayString(dpy), context_changed));
        if (!context_changed)
-               return;
+               return 0;
 
        for (n = 1; n < ctx->ndisplay; n++) {
                struct display *display = &ctx->display[n];
@@ -950,12 +995,42 @@ static void context_update(struct context *ctx)
                        continue;
 
                XGrabServer(display->dpy);
+
+               DBG(("%s: current size %dx%d, need %dx%d\n",
+                    DisplayString(display->dpy),
+                    display->width, display->height,
+                    x2, y2));
+
+               if (display->width != x2 || display->height != y2) {
+                       /* When shrinking we have to manually resize the fb */
+                       for (clone = display->clone; clone; clone = 
clone->next) {
+                               struct output *dst = &clone->dst;
+
+                               if (!dst->rr_crtc)
+                                       continue;
+
+                               DBG(("%s: disabling output '%s'\n",
+                                    DisplayString(dst->dpy), dst->name));
+                               XRRSetCrtcConfig(dst->dpy, res, dst->rr_crtc, 
CurrentTime,
+                                               0, 0, None, RR_Rotate_0, NULL, 
0);
+                               dst->rr_crtc = 0;
+                               dst->mode.id = 0;
+                       }
+
+                       DBG(("%s: XRRSetScreenSize %dx%d\n", 
DisplayString(display->dpy), x2, y2));
+                       XRRSetScreenSize(display->dpy, display->root, x2, y2, 
x2 * 96 / 25.4, y2 * 96 / 25.4);
+                       display->width = x2;
+                       display->height = y2;
+               }
+
                for (clone = display->clone; clone; clone = clone->next) {
                        struct output *src = &clone->src;
                        struct output *dst = &clone->dst;
                        XRROutputInfo *o;
+                       XRRPanning panning;
                        struct clone *set;
                        RRCrtc rr_crtc;
+                       Status ret;
 
                        DBG(("%s: copying configuration from %s (mode=%ld) to 
%s\n",
                             DisplayString(dst->dpy), src->name, 
(long)src->mode.id, dst->name));
@@ -1030,9 +1105,12 @@ err:
                        DBG(("%s: enabling output '%s' (%d,%d)x(%d,%d) on 
CRTC:%ld\n",
                             DisplayString(dst->dpy), dst->name,
                             dst->x, dst->y, dst->mode.width, dst->mode.height, 
(long)rr_crtc));
-                       XRRSetCrtcConfig(dst->dpy, res, rr_crtc, CurrentTime,
-                                        dst->x, dst->y, dst->mode.id, 
dst->rotation,
-                                        &dst->rr_output, 1);
+                       ret = XRRSetCrtcConfig(dst->dpy, res, rr_crtc, 
CurrentTime,
+                                              dst->x, dst->y, dst->mode.id, 
dst->rotation,
+                                              &dst->rr_output, 1);
+                       DBG(("%s-%s: XRRSetCrtcConfig %s\n", 
DisplayString(dst->dpy), dst->name, ret ? "failed" : "success"));
+                       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"));
                        dst->rr_crtc = rr_crtc;
                }
                XUngrabServer(display->dpy);
@@ -1050,6 +1128,8 @@ err:
                clone->active = ctx->active;
                ctx->active = clone;
        }
+
+       return 1;
 }
 
 static Cursor display_load_invisible_cursor(struct display *display)
@@ -1357,7 +1437,13 @@ static int clone_paint(struct clone *c)
             DisplayString(c->dst.dpy), c->dst.name,
             (long)c->dst.serial, (long)LastKnownRequestProcessed(c->dst.dpy)));
        if (c->dst.serial > LastKnownRequestProcessed(c->dst.dpy)) {
-               XPending(c->dst.dpy);
+               struct pollfd pfd;
+
+               pfd.fd = ConnectionNumber(c->dst.dpy);
+               pfd.events = POLLIN;
+               XEventsQueued(c->dst.dpy,
+                             poll(&pfd, 1, 0) ? QueuedAfterReading : 
QueuedAfterFlush);
+
                if (c->dst.serial > LastKnownRequestProcessed(c->dst.dpy)) {
                        c->dst.display->skip_clone++;
                        return EAGAIN;
@@ -1850,6 +1936,7 @@ static void display_init_randr_hpd(struct display 
*display)
        if (!XRRQueryVersion(display->dpy, &major, &minor))
                return;
 
+       DBG(("%s - randr version %d.%d\n", DisplayString(display->dpy), major, 
minor));
        if (major > 1 || (major == 1 && minor >= 2))
                XRRSelectInput(display->dpy, display->root, 
RROutputChangeNotifyMask);
 }
@@ -1957,6 +2044,13 @@ static int last_display_add_clones__randr(struct context 
*ctx)
                        return ret;
                }
 
+
+               if (o->crtc) {
+                       DBG(("%s - disabling active output\n", 
DisplayString(display->dpy)));
+                       XRRSetCrtcConfig(display->dpy, res, o->crtc, 
CurrentTime,
+                                       0, 0, None, RR_Rotate_0, NULL, 0);
+               }
+
                XRRFreeOutputInfo(o);
        }
        XRRFreeScreenResources(res);
@@ -2100,6 +2194,10 @@ static int last_display_add_clones(struct context *ctx)
 {
        struct display *display = last_display(ctx);
 
+       display->width = DisplayWidth(display->dpy, 
DefaultScreen(display->dpy));
+       display->height = DisplayHeight(display->dpy, 
DefaultScreen(display->dpy));
+       DBG(("%s - initial size %dx%d\n", DisplayString(display->dpy), 
display->width, display->height));
+
        if (display->rr_active)
                return last_display_add_clones__randr(ctx);
 
@@ -2636,7 +2734,7 @@ int main(int argc, char **argv)
                int reconfigure = 0;
                int rr_update = 0;
 
-               DBG(("polling - enable timer? %d, nfd=%d\n", ctx.timer_active, 
ctx.nfd));
+               DBG(("polling - enable timer? %d, nfd=%d, ndisplay=%d\n", 
ctx.timer_active, ctx.nfd, ctx.ndisplay));
                ret = poll(ctx.pfd + !ctx.timer_active, ctx.nfd - 
!ctx.timer_active, -1);
                if (ret <= 0)
                        break;
@@ -2644,7 +2742,7 @@ int main(int argc, char **argv)
                /* pfd[0] is the timer, pfd[1] is the local display, pfd[2] is 
the mouse, pfd[3+] are the remotes */
 
                DBG(("poll reports %d fd awake\n", ret));
-               if (ctx.pfd[1].revents) {
+               if (ctx.pfd[1].revents || XPending(ctx.display[0].dpy)) {
                        DBG(("%s woken up\n", 
DisplayString(ctx.display[0].dpy)));
                        do {
                                XNextEvent(ctx.display->dpy, &e);
@@ -2702,13 +2800,11 @@ int main(int argc, char **argv)
                                } else {
                                        DBG(("unknown event %d\n", e.type));
                                }
-                       } while (XPending(ctx.display->dpy) || 
poll(&ctx.pfd[1], 1, 0) > 0);
-
-                       ret--;
+                       } while (XEventsQueued(ctx.display->dpy, 
QueuedAfterReading));
                }
 
-               for (i = 1; ret && i < ctx.ndisplay; i++) {
-                       if (ctx.pfd[i+2].revents == 0)
+               for (i = 1; i < ctx.ndisplay; i++) {
+                       if (ctx.pfd[i+2].revents == 0 && 
!XPending(ctx.display[i].dpy))
                                continue;
 
                        DBG(("%s woken up\n", 
DisplayString(ctx.display[i].dpy)));
@@ -2718,24 +2814,20 @@ int main(int argc, char **argv)
                                DBG(("%s received event %d\n", 
DisplayString(ctx.display[i].dpy), e.type));
                                if (ctx.display[i].rr_active && e.type == 
ctx.display[i].rr_event + RRNotify) {
                                        XRRNotifyEvent *re = (XRRNotifyEvent 
*)&e;
+
+                                       DBG(("%s received RRNotify, type %d\n", 
DisplayString(ctx.display[i].dpy), re->subtype));
                                        if (re->subtype == 
RRNotify_OutputChange) {
                                                XRROutputPropertyNotifyEvent 
*ro = (XRROutputPropertyNotifyEvent *)re;
                                                struct clone *clone;
 
+                                               DBG(("%s RRNotify_OutputChange, 
timestamp %ld\n", DisplayString(ctx.display[i].dpy), ro->timestamp));
                                                for (clone = 
ctx.display[i].clone; clone; clone = clone->next) {
                                                        if 
(clone->dst.rr_output == ro->output)
                                                                rr_update = 
clone->rr_update = 1;
                                                }
                                        }
                                }
-                       } while (XPending(ctx.display[i].dpy) || 
poll(&ctx.pfd[i+2], 1, 0) > 0);
-
-                       ret--;
-               }
-
-               if (reconfigure) {
-                       context_update(&ctx);
-                       display_reset_damage(ctx.display);
+                       } while (XEventsQueued(ctx.display[i].dpy, 
QueuedAfterReading));
                }
 
                if (rr_update) {
@@ -2743,6 +2835,9 @@ int main(int argc, char **argv)
                                clone_update(&ctx.clones[i]);
                }
 
+               if (reconfigure && context_update(&ctx))
+                       display_reset_damage(ctx.display);
+
                XPending(ctx.record);
 
                if (ctx.timer_active && read(ctx.timer, &count, sizeof(count)) 
> 0) {

commit 04d2cad65dbb07a2f03835a71fb7f5efc0235ea6
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Tue Nov 12 14:36:38 2013 +0000

    Add identification strings for new Atoms
    
    All of the new Atom (Baytrail) products ship with "HD Graphics".
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/intel_module.c b/src/intel_module.c
index 72c028e..e4bd65b 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -204,9 +204,17 @@ static const SymTabRec intel_chipsets[] = {
        {PCI_CHIP_HASWELL_CRW_E_GT1,            "HD Graphics" }, /* ??? */
        {PCI_CHIP_HASWELL_CRW_E_GT2,            "HD Graphics" }, /* ??? */
        {PCI_CHIP_HASWELL_CRW_E_GT3,            "Iris(TM) Pro Graphics 5200" },
-       {-1,                                    NULL}
+
+       /* Valleyview (Baytail) */
+       {0x0f30, "HD Graphics"},
+       {0x0f31, "HD Graphics"},
+       {0x0f32, "HD Graphics"},
+       {0x0f33, "HD Graphics"},
+       {0x0155, "HD Graphics"},
+       {0x0157, "HD Graphics"},
+
+       {-1, NULL} /* Sentinel */
 };
-#define NUM_CHIPSETS (sizeof(intel_chipsets) / sizeof(intel_chipsets[0]))
 
 static const struct pci_id_match intel_device_match[] = {
 #if UMS

commit a6bd3011710a3fd4cfe21a3d41a6ec9c929681bf
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Tue Nov 12 13:15:25 2013 +0000

    sna: Factor available memory into available aperture estimation
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 8226fd8..7855884 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1331,6 +1331,14 @@ void kgem_init(struct kgem *kgem, int fd, struct 
pci_device *dev, unsigned gen)
        if (kgem->max_gpu_size > totalram / 4)
                kgem->max_gpu_size = totalram / 4;
 
+       if (kgem->aperture_high > totalram / 2) {
+               kgem->aperture_high = totalram / 2;
+               kgem->aperture_low = kgem->aperture_high / 4;
+               DBG(("%s: reduced aperture watermaks to fit into ram; low=%d 
[%d], high=%d [%d]\n", __FUNCTION__,
+                    kgem->aperture_low, kgem->aperture_low / (1024*1024),
+                    kgem->aperture_high, kgem->aperture_high / (1024*1024)));
+       }
+
        kgem->max_cpu_size = kgem->max_object_size;
 
        half_gpu_max = kgem->max_gpu_size / 2;

commit 4493fb8d21fa013a074f7de66387e92ef23d191a
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Tue Nov 12 00:05:11 2013 +0000

    sna: Apply drawable offset to glyph bbox prior to checking for clipping
    
    This is a correction to
    
    commit ec0866e86d365ae3fd9790b1b263d49fc4981220
    Author: Chris Wilson <ch...@chris-wilson.co.uk>
    Date:   Wed Oct 16 22:39:54 2013 +0100
    
        sna/glyphs: Fix computation of extents for long strings
    
    in order for us to correctly detect when we need to clip.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=71191
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index f2c1788..759e415 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -517,18 +517,36 @@ static void apply_damage_clipped_to_dst(struct 
sna_composite_op *op,
        sna_damage_add_box(op->damage, &box);
 }
 
+static inline bool region_matches_pixmap(const RegionRec *r, PixmapPtr pixmap)
+{
+       return (r->extents.x2 - r->extents.x1 >= pixmap->drawable.width &&
+               r->extents.y2 - r->extents.y1 >= pixmap->drawable.height);
+}
+
 static inline bool clipped_glyphs(PicturePtr dst, int nlist, GlyphListPtr 
list, GlyphPtr *glyphs)
 {
        BoxRec box;
 
+       if (dst->pCompositeClip->data == NULL &&
+           region_matches_pixmap(dst->pCompositeClip,
+                                 get_drawable_pixmap(dst->pDrawable))) {
+               DBG(("%s: no, region matches drawable\n", __FUNCTION__));
+               return false;
+       }
+
        glyph_extents(nlist, list, glyphs, &box);
+
+       box.x1 += dst->pDrawable->x;
+       box.x2 += dst->pDrawable->x;
+       box.y1 += dst->pDrawable->y;
+       box.y2 += dst->pDrawable->y;
+
        DBG(("%s? glyph extents (%d, %d), (%d, %d), region (%d, %d), (%d, %d): 
%s\n",
             __FUNCTION__, box.x1, box.y1, box.x2, box.y2,
-            dst->pCompositeClip->extents.x1, dst->pCompositeClip->extents.y1, 
dst->pCompositeClip->extents.x2, dst->pCompositeClip->extents.y2,
-            (box.x1 < dst->pCompositeClip->extents.x1 ||
-             box.y1 < dst->pCompositeClip->extents.y1 ||
-             box.x2 > dst->pCompositeClip->extents.x2 ||
-             box.y2 > dst->pCompositeClip->extents.y2) ? "yes" : "no"));
+            dst->pCompositeClip->extents.x1, dst->pCompositeClip->extents.y1,
+            dst->pCompositeClip->extents.x2, dst->pCompositeClip->extents.y2,
+            pixman_region_contains_rectangle(dst->pCompositeClip,
+                                             &box) != PIXMAN_REGION_IN ?  
"yes" : "no"));
 
        return pixman_region_contains_rectangle(dst->pCompositeClip,
                                                &box) != PIXMAN_REGION_IN;

commit c489934ed732ed3d5a906939381c62a6bc1c38d5
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Mon Nov 11 14:56:22 2013 +0000

    xvmc: Handle allocation failure around batch submission
    
    If we fail to allocate a new batch, just stall and reuse the old one
    rather than crashing.
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/xvmc/i915_xvmc.c b/xvmc/i915_xvmc.c
index fbd4555..204d950 100644
--- a/xvmc/i915_xvmc.c
+++ b/xvmc/i915_xvmc.c
@@ -1207,7 +1207,7 @@ static int i915_xvmc_mc_render_surface(Display * display, 
XvMCContext * context,
                }
        }
 
-       intelFlushBatch(TRUE);
+       intelFlushBatch();
 
        i915_xvmc_free_render_state_buffers(pI915XvMC);
 
diff --git a/xvmc/i965_xvmc.c b/xvmc/i965_xvmc.c
index 1850480..198027f 100644
--- a/xvmc/i965_xvmc.c
+++ b/xvmc/i965_xvmc.c
@@ -841,7 +841,7 @@ static Status render_surface(Display * display,
                                }
                        }
                }
-               intelFlushBatch(TRUE);
+               intelFlushBatch();
                UNLOCK_HARDWARE(intel_ctx->hw_context);
        }
        return Success;
diff --git a/xvmc/intel_batchbuffer.c b/xvmc/intel_batchbuffer.c
index 3fa16bb..b427d85 100644
--- a/xvmc/intel_batchbuffer.c
+++ b/xvmc/intel_batchbuffer.c
@@ -62,6 +62,15 @@ static void i965_end_batch(void)
        xvmc_driver->batch.ptr += 4;
 }
 
+static void reset_batch(void)
+{
+       dri_bo *bo = xvmc_driver->batch.buf;
+
+       xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr = bo->virtual;
+       xvmc_driver->batch.size = bo->size;
+       xvmc_driver->batch.space = bo->size - 8;
+}
+
 Bool intelInitBatchBuffer(void)
 {
        if ((xvmc_driver->batch.buf =
@@ -71,59 +80,50 @@ Bool intelInitBatchBuffer(void)
                return False;
        }
 
-       drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
+       if (drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf)) {
+               drm_intel_bo_unreference(xvmc_driver->batch.buf);
+               return False;
+       }
 
-       xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
-       xvmc_driver->batch.size = BATCH_SIZE;
-       xvmc_driver->batch.space = BATCH_SIZE;
-       xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
+       reset_batch();
        return True;
 }
 
 void intelFiniBatchBuffer(void)
 {
-       drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
+       if (xvmc_driver->batch.buf == NULL)
+               return;
 
        drm_intel_bo_unreference(xvmc_driver->batch.buf);
 }
 
-void intelFlushBatch(Bool refill)
+void intelFlushBatch(void)
 {
-       i965_end_batch();
+       dri_bo *bo;
 
-       drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
+       i965_end_batch();
 
        drm_intel_bo_exec(xvmc_driver->batch.buf,
                          xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr,
                          0, 0, 0);
 
-       drm_intel_bo_unreference(xvmc_driver->batch.buf);
-       if ((xvmc_driver->batch.buf =
-            drm_intel_bo_alloc(xvmc_driver->bufmgr,
-                               "batch buffer", BATCH_SIZE, 0x1000)) == NULL) {
-               fprintf(stderr, "unable to alloc batch buffer\n");
+       bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+                               "batch buffer", BATCH_SIZE, 0x1000);
+       if (bo != NULL && drm_intel_gem_bo_map_gtt(bo) == 0) {
+               drm_intel_bo_unreference(xvmc_driver->batch.buf);
+               xvmc_driver->batch.buf = bo;
+       } else {
+               if (bo != NULL)
+                       drm_intel_bo_unreference(bo);
+               drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
        }
 
-       drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
-
-       xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
-       xvmc_driver->batch.size = BATCH_SIZE;
-       xvmc_driver->batch.space = BATCH_SIZE;
-       xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
-}
-
-void intelBatchbufferRequireSpace(int size)
-{
-       assert(xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size <
-              xvmc_driver->batch.size - 8);
-       if (xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size
-           >= xvmc_driver->batch.size - 8)
-               intelFlushBatch(1);
+       reset_batch();
 }
 
 void intelBatchbufferData(const void *data, unsigned bytes, unsigned flags)
 {
-       intelBatchbufferRequireSpace(bytes);
+       assert(bytes <= xvmc_driver->batch.space);
        memcpy(xvmc_driver->batch.ptr, data, bytes);
        xvmc_driver->batch.ptr += bytes;
        xvmc_driver->batch.space -= bytes;
diff --git a/xvmc/intel_batchbuffer.h b/xvmc/intel_batchbuffer.h
index 7fae6f7..c63ee5e 100644
--- a/xvmc/intel_batchbuffer.h
+++ b/xvmc/intel_batchbuffer.h
@@ -11,8 +11,6 @@ extern int VERBOSE;
 #define BEGIN_BATCH(n)                                                  \
     do {                                                                \
        assert(xvmc_driver->batch.space >= (n) *4);                     \
-        if (xvmc_driver->batch.space < (n)*4)                           \
-            intelFlushBatch(TRUE);                                     \
         batch_ptr = xvmc_driver->batch.ptr;                             \
     } while (0)
 
@@ -46,7 +44,7 @@ extern int VERBOSE;
         xvmc_driver->batch.ptr = batch_ptr;                              \
     } while(0)
 
-extern void intelFlushBatch(Bool);
+extern void intelFlushBatch(void);
 extern void intelBatchbufferData(const void *, unsigned, unsigned);
 extern Bool intelInitBatchBuffer(void);
 extern void intelFiniBatchBuffer(void);
diff --git a/xvmc/intel_xvmc.c b/xvmc/intel_xvmc.c
index ff13d03..2a2c8b9 100644
--- a/xvmc/intel_xvmc.c
+++ b/xvmc/intel_xvmc.c
@@ -313,6 +313,16 @@ _X_EXPORT Status XvMCCreateContext(Display * display, 
XvPortID port,
        }
        drm_intel_bufmgr_gem_enable_reuse(xvmc_driver->bufmgr);
 
+       if (!intelInitBatchBuffer()) {
+               XFree(priv_data);
+               context->privData = NULL;
+
+               dri_bufmgr_destroy(xvmc_driver->bufmgr);
+               xvmc_driver = NULL;
+
+               return BadAlloc;
+       }
+
        /* call driver hook.
         * driver hook should free priv_data after return if success.*/
        ret =
@@ -320,14 +330,18 @@ _X_EXPORT Status XvMCCreateContext(Display * display, 
XvPortID port,
                                           priv_data);
        if (ret) {
                XVMC_ERR("driver create context failed\n");
+               intelFiniBatchBuffer();
+
                XFree(priv_data);
                context->privData = NULL;
+
+               dri_bufmgr_destroy(xvmc_driver->bufmgr);
                xvmc_driver = NULL;
                return ret;
        }
 
+
        pthread_mutex_init(&xvmc_driver->ctxmutex, NULL);
-       intelInitBatchBuffer();
        intel_xvmc_dump_open();
 
        return Success;
diff --git a/xvmc/xvmc_vld.c b/xvmc/xvmc_vld.c
index e576294..4c684ff 100644
--- a/xvmc/xvmc_vld.c
+++ b/xvmc/xvmc_vld.c
@@ -1010,7 +1010,7 @@ static Status put_slice2(Display * display, XvMCContext * 
context,
        cs_buffer();
        vld_send_media_object(media_state.slice_data.bo,
                              nbytes, 0, mb_row, 6, 127, q_scale_code);
-       intelFlushBatch(TRUE);
+       intelFlushBatch();
        UNLOCK_HARDWARE(intel_ctx->hw_context);
 
        return Success;
@@ -1207,7 +1207,7 @@ static Status render_surface(Display * display,
                        }
                }
        }
-       intelFlushBatch(TRUE);
+       intelFlushBatch();
        UNLOCK_HARDWARE(intel_ctx->hw_context);
        return Success;
 }

commit 3e93449b5492a4fc09401c23f8754655b63959b5
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Mon Nov 11 13:15:07 2013 +0000

    intel-virtual-output: Fix format specifiers for Visual DBG
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 602b84c..504a68d 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1467,7 +1467,7 @@ static int record_mouse(struct context *ctx)
 
 static int bad_visual(Visual *visual, int depth)
 {
-       DBG(("%s? depth=%d, visual: class=%d, bits_per_rgb=%d, red_mask=%08x, 
green_mask=%08x, blue_mask=%08x\n",
+       DBG(("%s? depth=%d, visual: class=%d, bits_per_rgb=%d, red_mask=%08lx, 
green_mask=%08lx, blue_mask=%08lx\n",
             __func__, depth,
             visual->class,
             visual->bits_per_rgb,

commit 31b5ff5889593337bf504dafa116a428bf1ffe9c
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Mon Nov 11 12:56:30 2013 +0000

    intel-virtual-output: Fix cut'n'paste DBG error
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 4da8309..602b84c 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1137,7 +1137,7 @@ static void display_flush_cursor(struct display *display)
        }
 
        DBG(("%s setting cursor position (%d, %d), visible? %d\n",
-            DisplayString(c->dst.dpy), x, y, display->cursor_visible));
+            DisplayString(display->dpy), x, y, display->cursor_visible));
        XWarpPointer(display->dpy, None, display->root, 0, 0, 0, 0, x, y);
 
        cursor = None;

commit 29fcc15efabb5b1f7e1e0211da9714cf9e3cbd1c
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Mon Nov 11 11:44:17 2013 +0000

    sna: Assert that gc->funcs is never set to NULL
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=71415
    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 9cff1de..983a5f3 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3948,6 +3948,7 @@ static bool must_check sna_gc_move_to_cpu(GCPtr gc,
        assert(gc->ops == (GCOps *)&sna_gc_ops);
        gc->ops = (GCOps *)&sna_gc_ops__cpu;
 
+       assert(gc->funcs);
        sgc->old_funcs = gc->funcs;
        gc->funcs = (GCFuncs *)&sna_gc_funcs__cpu;
 
@@ -4010,6 +4011,7 @@ static void sna_gc_move_to_gpu(GCPtr gc)
 
        gc->ops = (GCOps *)&sna_gc_ops;
        gc->funcs = sna_gc(gc)->old_funcs;
+       assert(gc->funcs);
        gc->pCompositeClip = sna_gc(gc)->priv;
        assert(gc->pCompositeClip);
 }

commit aa140ef1e62c349936be5f153e4be7688e129e63
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Mon Nov 11 11:38:46 2013 +0000

    sna: Add a couple more asserts to track a potential NULL gc->pCompositeClip
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=71415
    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 b1dc2f7..9cff1de 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3942,6 +3942,8 @@ static bool must_check sna_gc_move_to_cpu(GCPtr gc,
        long changes = sgc->changes;
 
        DBG(("%s, changes=%lx\n", __FUNCTION__, changes));
+       assert(drawable);
+       assert(region);
 
        assert(gc->ops == (GCOps *)&sna_gc_ops);
        gc->ops = (GCOps *)&sna_gc_ops__cpu;
@@ -3949,6 +3951,7 @@ static bool must_check sna_gc_move_to_cpu(GCPtr gc,
        sgc->old_funcs = gc->funcs;
        gc->funcs = (GCFuncs *)&sna_gc_funcs__cpu;
 
+       assert(gc->pCompositeClip);
        sgc->priv = gc->pCompositeClip;
        gc->pCompositeClip = region;
 
@@ -3983,7 +3986,6 @@ static bool must_check sna_gc_move_to_cpu(GCPtr gc,
 
                fbValidateGC(gc, changes, drawable);
 
-               gc->serialNumber = drawable->serialNumber;
                sgc->serial = drawable->serialNumber;
        }
        sgc->changes = 0;
@@ -4009,6 +4011,7 @@ static void sna_gc_move_to_gpu(GCPtr gc)
        gc->ops = (GCOps *)&sna_gc_ops;
        gc->funcs = sna_gc(gc)->old_funcs;
        gc->pCompositeClip = sna_gc(gc)->priv;
+       assert(gc->pCompositeClip);
 }
 
 static inline bool clip_box(BoxPtr box, GCPtr gc)
@@ -4016,6 +4019,7 @@ static inline bool clip_box(BoxPtr box, GCPtr gc)


-- 
To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/e1vjqif-00016w...@moszumanska.debian.org

Reply via email to