NEWS                          |   26 
 configure.ac                  |   16 
 src/i830_render.c             |    3 
 src/i915_render.c             |  420 +++---------
 src/i965_render.c             |    3 
 src/intel.h                   |   12 
 src/intel_batchbuffer.c       |   39 -
 src/intel_batchbuffer.h       |    5 
 src/intel_display.c           |  104 +--
 src/intel_dri.c               |    3 
 src/intel_driver.c            |   15 
 src/intel_driver.h            |    1 
 src/intel_list.h              |   19 
 src/intel_module.c            |    2 
 src/intel_uxa.c               |   79 --
 src/intel_video.c             |    2 
 src/legacy/i810/Makefile.am   |    2 
 src/legacy/i810/i810.h        |    6 
 src/legacy/i810/i810_accel.c  |    4 
 src/legacy/i810/i810_driver.c |   36 -
 src/sna/Makefile.am           |    1 
 src/sna/gen2_render.c         |  172 ++---
 src/sna/gen3_render.c         |  465 +++++++++----
 src/sna/gen4_render.c         |  330 +++++++--
 src/sna/gen5_render.c         |  350 ++++++++--
 src/sna/gen6_render.c         |  555 +++++++++-------
 src/sna/gen7_render.c         |  717 +++++++++++++--------
 src/sna/kgem.c                | 1052 ++++++++++++++++++++++--------
 src/sna/kgem.h                |   33 
 src/sna/sna.h                 |   39 -
 src/sna/sna_accel.c           | 1428 ++++++++++++++++++++++++++----------------
 src/sna/sna_blt.c             |  168 ++--
 src/sna/sna_composite.c       |  170 ++---
 src/sna/sna_damage.c          |   50 -
 src/sna/sna_display.c         |  242 ++++---
 src/sna/sna_dri.c             |  282 ++++++--
 src/sna/sna_driver.c          |   18 
 src/sna/sna_glyphs.c          |   32 
 src/sna/sna_gradient.c        |   27 
 src/sna/sna_io.c              |  125 ---
 src/sna/sna_render.c          |  359 ++++++----
 src/sna/sna_render.h          |   17 
 src/sna/sna_render_inline.h   |   46 +
 src/sna/sna_stream.c          |    2 
 src/sna/sna_tiling.c          |    2 
 src/sna/sna_trapezoids.c      | 1335 +++++++++++++++++++++++++++++++--------
 src/sna/sna_video.c           |   21 
 src/sna/sna_video.h           |    9 
 src/sna/sna_video_sprite.c    |  432 ++++++++++++
 src/sna/sna_video_textured.c  |   11 
 uxa/uxa-glyphs.c              |  334 ---------
 uxa/uxa-priv.h                |    1 
 uxa/uxa-render.c              |  189 -----
 uxa/uxa.c                     |    4 
 54 files changed, 6215 insertions(+), 3600 deletions(-)

New commits:
commit ffdf9aca12adcfa1ec7ab7a1706873105a5f0d4a
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Sun Apr 29 21:59:52 2012 +0100

    legacy/i810: hwmc additionally depends upon building DRI
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/legacy/i810/Makefile.am b/src/legacy/i810/Makefile.am
index a1bdd85..e7fa04f 100644
--- a/src/legacy/i810/Makefile.am
+++ b/src/legacy/i810/Makefile.am
@@ -25,10 +25,10 @@ liblegacy_i810_la_SOURCES +=\
          i810_dri.c \
          i810_dri.h \
         $(NULL)
-endif
 
 if XVMC
 liblegacy_i810_la_SOURCES += \
        i810_hwmc.c \
        $(NULL)
 endif
+endif

commit 444da84c47266bcbbdf5121507901de8eb36f11b
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Sun Apr 29 21:49:04 2012 +0100

    configure: Version bump for 2.19.0 release

diff --git a/NEWS b/NEWS
index 9d2b15e..cc74879 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,29 @@
+Release 2.19.0 (2012-04-29)
+===========================
+More stability fixes for UXA and support for another variant of IvyBridge.
+Given the severity of the stability fixes, I strongly recommend everybody
+to upgrade to 2.19.0.
+
+* Prevent waiting on scanlines whilst not in control of the VT and therefore
+  whilst referencing foreign CRTC configurations.
+
+* Pixmap (and bo leak) during fallback glyph composition
+
+* Remove broken acceleration for rendering glyphs directly upon the
+  destination pixmap, exposed by cairo-1.12.0 (and coincidentally fix
+  another Pixmap leak upon fallback handling).
+
+* Add support for Ivy Bridge GT2 Server chipset [PCI id 0x016a]
+
+* Remove broken damage flushing with CompositeRectangles
+  https://bugs.freedesktop.org/show_bug.cgi?id=32547
+
+* Fix crash upon server start with multiple monitors
+  https://bugs.freedesktop.org/show_bug.cgi?id=47395
+
+* Fix composition issues resulting from overly aggressive Pixmap reuse
+  https://bugs.freedesktop.org/show_bug.cgi?id=47345
+
 Release 2.18.0 (2012-02-24)
 ===========================
 Time passes, a few more bugs have crept out of the woodwork that are a
diff --git a/configure.ac b/configure.ac
index 5124100..3770983 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-video-intel],
-        [2.18.0],
+        [2.19.0],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         [xf86-video-intel])
 AC_CONFIG_SRCDIR([Makefile.am])

commit a206a1eee1fb799d567d68db564d663cfc66f6cc
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Sat Apr 28 01:54:43 2012 +0100

    sna: Tune relocation array size
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 4def6b1..ad2fe84 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -171,7 +171,7 @@ struct kgem {
 
        uint32_t batch[4*1024];
        struct drm_i915_gem_exec_object2 exec[256];
-       struct drm_i915_gem_relocation_entry reloc[384];
+       struct drm_i915_gem_relocation_entry reloc[612];
 };
 
 #define KGEM_BATCH_RESERVED 1

commit 4f1908c651ef9e2af33d8831466a605234978c46
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Fri Apr 27 23:19:56 2012 +0100

    sna: PolyPoint only uses the gc->fgPixel
    
    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 f4d3de4..12017bd 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5560,8 +5560,7 @@ static Bool
 sna_poly_point_blt(DrawablePtr drawable,
                   struct kgem_bo *bo,
                   struct sna_damage **damage,
-                  GCPtr gc, uint32_t pixel,
-                  int mode, int n, DDXPointPtr pt,
+                  GCPtr gc, int mode, int n, DDXPointPtr pt,
                   bool clipped)
 {
        PixmapPtr pixmap = get_drawable_pixmap(drawable);
@@ -5574,7 +5573,7 @@ sna_poly_point_blt(DrawablePtr drawable,
        DBG(("%s: alu=%d, pixel=%08lx, clipped?=%d\n",
             __FUNCTION__, gc->alu, gc->fgPixel, clipped));
 
-       if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel))
+       if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel))
                return FALSE;
 
        get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -5704,7 +5703,6 @@ sna_poly_point(DrawablePtr drawable, GCPtr gc,
        struct sna *sna = to_sna_from_pixmap(pixmap);
        RegionRec region;
        unsigned flags;
-       uint32_t color;
 
        DBG(("%s(mode=%d, n=%d, pt[0]=(%d, %d)\n",
             __FUNCTION__, mode, n, pt[0].x, pt[0].y));
@@ -5729,7 +5727,7 @@ sna_poly_point(DrawablePtr drawable, GCPtr gc,
                goto fallback;
        }
 
-       if (PM_IS_SOLID(drawable, gc->planemask) && gc_is_solid(gc, &color)) {
+       if (PM_IS_SOLID(drawable, gc->planemask)) {
                struct sna_damage **damage;
                struct kgem_bo *bo;
 
@@ -5738,7 +5736,7 @@ sna_poly_point(DrawablePtr drawable, GCPtr gc,
 
                if ((bo = sna_drawable_use_bo(drawable, false, &region.extents, 
&damage)) &&
                    sna_poly_point_blt(drawable, bo, damage,
-                                      gc, color, mode, n, pt, flags & 2))
+                                      gc, mode, n, pt, flags & 2))
                        return;
        }
 

commit 8453034c7dd893f1d4c32ee87724f3a13137595d
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Fri Apr 27 22:08:51 2012 +0100

    sna/gen6: Allow ring switching at the start of a batch
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 5bbe5e3..38fb024 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -57,7 +57,7 @@
 #define NO_FILL_BOXES 0
 #define NO_CLEAR 0
 
-#define NO_RING_SWITCH 1
+#define NO_RING_SWITCH 0
 
 #define GEN6_MAX_SIZE 8192
 
@@ -2332,7 +2332,7 @@ static bool prefer_blt_ring(struct sna *sna)
 
 static bool can_switch_rings(struct sna *sna)
 {
-       return sna->kgem.has_semaphores && !NO_RING_SWITCH;
+       return sna->kgem.mode == KGEM_NONE && sna->kgem.has_semaphores && 
!NO_RING_SWITCH;
 }
 
 static Bool
@@ -2369,6 +2369,8 @@ try_blt(struct sna *sna,
        if (can_switch_rings(sna)) {
                if (sna_picture_is_solid(src, NULL))
                        return TRUE;
+               if (src->pDrawable)
+                       return TRUE;
        }
 
        return FALSE;
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 2228873..327714f 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -57,7 +57,7 @@
 #define NO_FILL_BOXES 0
 #define NO_CLEAR 0
 
-#define NO_RING_SWITCH 1
+#define NO_RING_SWITCH 0
 
 #define GEN7_MAX_SIZE 16384
 
@@ -2425,7 +2425,7 @@ static bool prefer_blt_ring(struct sna *sna)
 
 static bool can_switch_rings(struct sna *sna)
 {
-       return sna->kgem.has_semaphores && !NO_RING_SWITCH;
+       return sna->kgem.mode == KGEM_NONE && sna->kgem.has_semaphores && 
!NO_RING_SWITCH;
 }
 
 static Bool
@@ -2462,6 +2462,8 @@ try_blt(struct sna *sna,
        if (can_switch_rings(sna)) {
                if (sna_picture_is_solid(src, NULL))
                        return TRUE;
+               if (src->pDrawable)
+                       return TRUE;
        }
 
        return FALSE;

commit 93ad7793894787600c5074917c753fa7c6816134
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Fri Apr 27 22:03:55 2012 +0100

    sna: Tweak semaphores-enabled heuristic
    
    The kernel module now defaults to -1, confusing the test.
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 29f0e29..4302952 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -574,7 +574,7 @@ static bool semaphores_enabled(void)
        if (file) {
                int value;
                if (fscanf(file, "%d", &value) == 1)
-                       detected = value > 0;
+                       detected = value != 0;
                fclose(file);
        }
 

commit 986dbdda3bf8dcf208e55543d8a3393c4b53f10b
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Fri Apr 27 19:21:44 2012 +0100

    sna: Tweak placement choice for high-overhead operations
    
    Some operations cost more to setup than to transfer data back and forth!
    
    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 a5c1648..f4d3de4 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1923,6 +1923,7 @@ box_inplace(PixmapPtr pixmap, const BoxRec *box)
 
 static inline struct kgem_bo *
 sna_drawable_use_bo(DrawablePtr drawable,
+                   bool prefer_gpu,
                    const BoxRec *box,
                    struct sna_damage ***damage)
 {
@@ -1949,6 +1950,9 @@ sna_drawable_use_bo(DrawablePtr drawable,
                goto use_cpu_bo;
        }
 
+       if (!prefer_gpu && priv->gpu_bo && !kgem_bo_is_busy(priv->gpu_bo))
+               goto use_cpu_bo;
+
        if (DAMAGE_IS_ALL(priv->gpu_damage))
                goto use_gpu_bo;
 
@@ -1968,6 +1972,12 @@ sna_drawable_use_bo(DrawablePtr drawable,
                        goto use_cpu_bo;
                }
 
+               if (priv->cpu_damage && !prefer_gpu) {
+                       DBG(("%s: prefer cpu",
+                            __FUNCTION__));
+                       goto use_cpu_bo;
+               }
+
                if (!sna_pixmap_move_to_gpu(pixmap, MOVE_WRITE | MOVE_READ))
                        goto use_cpu_bo;
 
@@ -2932,7 +2942,8 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, 
RegionPtr region,
        int n;
        uint8_t rop = copy_ROP[gc->alu];
 
-       bo = sna_drawable_use_bo(&pixmap->drawable, &region->extents, &damage);
+       bo = sna_drawable_use_bo(&pixmap->drawable, true,
+                                &region->extents, &damage);
        if (bo == NULL)
                return false;
 
@@ -3054,7 +3065,8 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, 
RegionPtr region,
        if (gc->alu != GXcopy)
                return false;
 
-       bo = sna_drawable_use_bo(&pixmap->drawable, &region->extents, &damage);
+       bo = sna_drawable_use_bo(&pixmap->drawable, true,
+                                &region->extents, &damage);
        if (bo == NULL)
                return false;
 
@@ -4952,7 +4964,7 @@ sna_fill_spans(DrawablePtr drawable, GCPtr gc, int n,
        if (!PM_IS_SOLID(drawable, gc->planemask))
                goto fallback;
 
-       bo = sna_drawable_use_bo(drawable, &region.extents, &damage);
+       bo = sna_drawable_use_bo(drawable, true, &region.extents, &damage);
        if (bo) {
                if (gc_is_solid(gc, &color)) {
                        DBG(("%s: trying solid fill [alu=%d, pixel=%08lx] blt 
paths\n",
@@ -5502,7 +5514,7 @@ sna_copy_plane(DrawablePtr src, DrawablePtr dst, GCPtr gc,
        if (!PM_IS_SOLID(dst, gc->planemask))
                goto fallback;
 
-       arg.bo = sna_drawable_use_bo(dst, &region.extents, &arg.damage);
+       arg.bo = sna_drawable_use_bo(dst, true, &region.extents, &arg.damage);
        if (arg.bo) {
                if (arg.bo->tiling == I915_TILING_Y) {
                        assert(arg.bo == sna_pixmap_get_bo(pixmap));
@@ -5724,7 +5736,7 @@ sna_poly_point(DrawablePtr drawable, GCPtr gc,
                DBG(("%s: trying solid fill [%08lx] blt paths\n",
                     __FUNCTION__, gc->fgPixel));
 
-               if ((bo = sna_drawable_use_bo(drawable, &region.extents, 
&damage)) &&
+               if ((bo = sna_drawable_use_bo(drawable, false, &region.extents, 
&damage)) &&
                    sna_poly_point_blt(drawable, bo, damage,
                                       gc, color, mode, n, pt, flags & 2))
                        return;
@@ -6417,50 +6429,10 @@ sna_poly_line_extents(DrawablePtr drawable, GCPtr gc,
 inline static bool
 _use_zero_spans(DrawablePtr drawable, GCPtr gc, const BoxRec *extents)
 {
-       PixmapPtr pixmap;
-       struct sna_pixmap *priv;
-       BoxRec area;
-       int16_t dx, dy;
-
        if (USE_ZERO_SPANS)
                return USE_ZERO_SPANS > 0;
 
-       if (!drawable_gc_inplace_hint(drawable, gc))
-               return TRUE;
-
-       /* XXX check for GPU stalls on the gc (stipple, tile, etc) */
-
-       pixmap = get_drawable_pixmap(drawable);
-       priv = sna_pixmap(pixmap);
-       if (priv == NULL)
-               return FALSE;
-
-       if (DAMAGE_IS_ALL(priv->cpu_damage))
-               return FALSE;
-
-       if (priv->stride == 0 || priv->gpu_bo == NULL)
-               return FALSE;
-
-       if (!kgem_bo_is_busy(priv->gpu_bo))
-               return FALSE;
-
-       if (DAMAGE_IS_ALL(priv->gpu_damage))
-               return TRUE;
-
-       if (priv->gpu_damage == NULL)
-               return FALSE;
-
-       get_drawable_deltas(drawable, pixmap, &dx, &dy);
-       area = *extents;
-       area.x1 += dx;
-       area.x2 += dx;
-       area.y1 += dy;
-       area.y2 += dy;
-       DBG(("%s extents (%d, %d), (%d, %d)\n", __FUNCTION__,
-            area.x1, area.y1, area.x2, area.y2));
-
-       return sna_damage_contains_box(priv->gpu_damage,
-                                      &area) != PIXMAN_REGION_OUT;
+       return !drawable_gc_inplace_hint(drawable, gc);
 }
 
 static bool
@@ -6481,50 +6453,10 @@ use_zero_spans(DrawablePtr drawable, GCPtr gc, const 
BoxRec *extents)
 inline static bool
 _use_wide_spans(DrawablePtr drawable, GCPtr gc, const BoxRec *extents)
 {
-       PixmapPtr pixmap;
-       struct sna_pixmap *priv;
-       BoxRec area;
-       int16_t dx, dy;
-
        if (USE_WIDE_SPANS)
                return USE_WIDE_SPANS > 0;
 
-       if (!drawable_gc_inplace_hint(drawable, gc))
-               return TRUE;
-
-       /* XXX check for GPU stalls on the gc (stipple, tile, etc) */
-
-       pixmap = get_drawable_pixmap(drawable);
-       priv = sna_pixmap(pixmap);
-       if (priv == NULL)
-               return FALSE;
-
-       if (DAMAGE_IS_ALL(priv->cpu_damage))
-               return FALSE;
-
-       if (priv->stride == 0 || priv->gpu_bo == NULL)
-               return FALSE;
-
-       if (!kgem_bo_is_busy(priv->gpu_bo))
-               return FALSE;
-
-       if (DAMAGE_IS_ALL(priv->gpu_damage))
-               return TRUE;
-
-       if (priv->gpu_damage == NULL)
-               return FALSE;
-
-       get_drawable_deltas(drawable, pixmap, &dx, &dy);
-       area = *extents;
-       area.x1 += dx;
-       area.x2 += dx;
-       area.y1 += dy;
-       area.y2 += dy;
-       DBG(("%s extents (%d, %d), (%d, %d)\n", __FUNCTION__,
-            area.x1, area.y1, area.x2, area.y2));
-
-       return sna_damage_contains_box(priv->gpu_damage,
-                                      &area) != PIXMAN_REGION_OUT;
+       return !drawable_gc_inplace_hint(drawable, gc);
 }
 
 static bool
@@ -6605,7 +6537,7 @@ sna_poly_line(DrawablePtr drawable, GCPtr gc,
                     __FUNCTION__, (unsigned)color));
 
                if (data.flags & 4) {
-                       data.bo = sna_drawable_use_bo(drawable,
+                       data.bo = sna_drawable_use_bo(drawable, true,
                                                      &data.region.extents,
                                                      &data.damage);
                        if (data.bo &&
@@ -6616,8 +6548,8 @@ sna_poly_line(DrawablePtr drawable, GCPtr gc,
                                              data.flags & 2))
                                return;
                } else { /* !rectilinear */
-                       if (use_zero_spans(drawable, gc, &data.region.extents) 
&&
-                           (data.bo = sna_drawable_use_bo(drawable,
+                       if ((data.bo = sna_drawable_use_bo(drawable,
+                                                          
use_zero_spans(drawable, gc, &data.region.extents),
                                                           &data.region.extents,
                                                           &data.damage)) &&
                            sna_poly_zero_line_blt(drawable,
@@ -6630,7 +6562,8 @@ sna_poly_line(DrawablePtr drawable, GCPtr gc,
                }
        } else if (data.flags & 4) {
                /* Try converting these to a set of rectangles instead */
-               data.bo = sna_drawable_use_bo(drawable, &data.region.extents, 
&data.damage);
+               data.bo = sna_drawable_use_bo(drawable, true,
+                                             &data.region.extents, 
&data.damage);
                if (data.bo) {
                        DDXPointRec p1, p2;
                        xRectangle *rect;
@@ -6701,8 +6634,9 @@ sna_poly_line(DrawablePtr drawable, GCPtr gc,
        }
 
 spans_fallback:
-       if (use_wide_spans(drawable, gc, &data.region.extents) &&
-           (data.bo = sna_drawable_use_bo(drawable, &data.region.extents, 
&data.damage))) {
+       if ((data.bo = sna_drawable_use_bo(drawable,
+                                          use_wide_spans(drawable, gc, 
&data.region.extents),
+                                          &data.region.extents, 
&data.damage))) {
                DBG(("%s: converting line into spans\n", __FUNCTION__));
                get_drawable_deltas(drawable, data.pixmap, &data.dx, &data.dy);
                sna_gc(gc)->priv = &data;
@@ -7570,12 +7504,6 @@ sna_poly_segment(DrawablePtr drawable, GCPtr gc, int n, 
xSegment *seg)
        if (!PM_IS_SOLID(drawable, gc->planemask))
                goto fallback;
 
-       data.bo = sna_drawable_use_bo(drawable,
-                                     &data.region.extents,
-                                     &data.damage);
-       if (data.bo == NULL)
-               goto fallback;
-
        if (gc->lineStyle != LineSolid || gc->lineWidth > 1)
                goto spans_fallback;
        if (gc_is_solid(gc, &color)) {
@@ -7583,14 +7511,20 @@ sna_poly_segment(DrawablePtr drawable, GCPtr gc, int n, 
xSegment *seg)
                     __FUNCTION__, (unsigned)color, data.flags));
 
                if (data.flags & 4) {
-                       if (sna_poly_segment_blt(drawable,
+                       if ((data.bo = sna_drawable_use_bo(drawable, true,
+                                                          &data.region.extents,
+                                                          &data.damage)) &&
+                            sna_poly_segment_blt(drawable,
                                                 data.bo, data.damage,
                                                 gc, color, n, seg,
                                                 &data.region.extents,
                                                 data.flags & 2))
                                return;
                } else {
-                       if (use_zero_spans(drawable, gc, &data.region.extents) 
&&
+                       if ((data.bo = sna_drawable_use_bo(drawable,
+                                                          
use_zero_spans(drawable, gc, &data.region.extents),
+                                                          &data.region.extents,
+                                                          &data.damage)) &&
                            sna_poly_zero_segment_blt(drawable,
                                                      data.bo, data.damage,
                                                      gc, n, seg,
@@ -7603,6 +7537,12 @@ sna_poly_segment(DrawablePtr drawable, GCPtr gc, int n, 
xSegment *seg)
                xRectangle *rect;
                int i;
 
+               data.bo = sna_drawable_use_bo(drawable, true,
+                                             &data.region.extents,
+                                             &data.damage);
+               if (data.bo == NULL)
+                       goto fallback;
+
                DBG(("%s: converting to rectagnles\n", __FUNCTION__));
 
                rect = malloc (n * sizeof (xRectangle));
@@ -7660,7 +7600,10 @@ sna_poly_segment(DrawablePtr drawable, GCPtr gc, int n, 
xSegment *seg)
        }
 
 spans_fallback:
-       if (use_wide_spans(drawable, gc, &data.region.extents)) {
+       if ((data.bo = sna_drawable_use_bo(drawable,
+                                          use_wide_spans(drawable, gc, 
&data.region.extents),
+                                          &data.region.extents,
+                                          &data.damage))) {
                void (*line)(DrawablePtr, GCPtr, int, int, DDXPointPtr);
                int i;
 
@@ -8280,7 +8223,8 @@ sna_poly_rectangle(DrawablePtr drawable, GCPtr gc, int n, 
xRectangle *r)
            PM_IS_SOLID(drawable, gc->planemask)) {
                DBG(("%s: trying blt solid fill [%08lx] paths\n",
                     __FUNCTION__, gc->fgPixel));
-               if ((bo = sna_drawable_use_bo(drawable, &region.extents, 
&damage)) &&
+               if ((bo = sna_drawable_use_bo(drawable, true,
+                                             &region.extents, &damage)) &&
                    sna_poly_rectangle_blt(drawable, bo, damage,
                                           gc, n, r, &region.extents, flags&2))
                        return;
@@ -8288,7 +8232,8 @@ sna_poly_rectangle(DrawablePtr drawable, GCPtr gc, int n, 
xRectangle *r)
                /* Not a trivial outline, but we still maybe able to break it
                 * down into simpler operations that we can accelerate.
                 */
-               if (sna_drawable_use_bo(drawable, &region.extents, &damage)) {
+               if (sna_drawable_use_bo(drawable, true,
+                                       &region.extents, &damage)) {
                        miPolyRectangle(drawable, gc, n, r);
                        return;
                }
@@ -8408,8 +8353,8 @@ sna_poly_arc(DrawablePtr drawable, GCPtr gc, int n, xArc 
*arc)
        if (!PM_IS_SOLID(drawable, gc->planemask))
                goto fallback;
 
-       if (use_wide_spans(drawable, gc, &data.region.extents) &&
-           (data.bo = sna_drawable_use_bo(drawable,
+       if ((data.bo = sna_drawable_use_bo(drawable,
+                                          use_wide_spans(drawable, gc, 
&data.region.extents),
                                           &data.region.extents, 
&data.damage))) {
                uint32_t color;
 
@@ -8761,8 +8706,8 @@ sna_poly_fill_polygon(DrawablePtr draw, GCPtr gc,
        if (!PM_IS_SOLID(draw, gc->planemask))
                goto fallback;
 
-       if (use_wide_spans(draw, gc, &data.region.extents) &&
-           (data.bo = sna_drawable_use_bo(draw,
+       if ((data.bo = sna_drawable_use_bo(draw,
+                                          use_wide_spans(draw, gc, 
&data.region.extents),
                                           &data.region.extents,
                                           &data.damage))) {
                uint32_t color;
@@ -10174,12 +10119,15 @@ sna_poly_fill_rect(DrawablePtr draw, GCPtr gc, int n, 
xRectangle *rect)
                }
        }
 
+       bo = sna_drawable_use_bo(draw, true, &region.extents, &damage);
+       if (bo == NULL)
+               goto fallback;
+
        if (gc_is_solid(gc, &color)) {
                DBG(("%s: solid fill [%08x], testing for blt\n",
                     __FUNCTION__, color));
 
-               if ((bo = sna_drawable_use_bo(draw, &region.extents, &damage)) 
&&
-                   sna_poly_fill_rect_blt(draw,
+               if (sna_poly_fill_rect_blt(draw,
                                           bo, damage,
                                           gc, color, n, rect,
                                           &region.extents, flags & 2))
@@ -10187,16 +10135,14 @@ sna_poly_fill_rect(DrawablePtr draw, GCPtr gc, int n, 
xRectangle *rect)
        } else if (gc->fillStyle == FillTiled) {
                DBG(("%s: tiled fill, testing for blt\n", __FUNCTION__));
 
-               if ((bo = sna_drawable_use_bo(draw, &region.extents, &damage)) 
&&
-                   sna_poly_fill_rect_tiled_blt(draw, bo, damage,
+               if (sna_poly_fill_rect_tiled_blt(draw, bo, damage,
                                                 gc, n, rect,
                                                 &region.extents, flags & 2))
                        return;
        } else {
                DBG(("%s: stippled fill, testing for blt\n", __FUNCTION__));
 
-               if ((bo = sna_drawable_use_bo(draw, &region.extents, &damage)) 
&&
-                   sna_poly_fill_rect_stippled_blt(draw, bo, damage,
+               if (sna_poly_fill_rect_stippled_blt(draw, bo, damage,
                                                    gc, n, rect,
                                                    &region.extents, flags & 2))
                        return;
@@ -10330,8 +10276,7 @@ sna_poly_fill_arc(DrawablePtr draw, GCPtr gc, int n, 
xArc *arc)
        if (!PM_IS_SOLID(draw, gc->planemask))
                goto fallback;
 
-       if (use_wide_spans(draw, gc, &data.region.extents) &&
-           (data.bo = sna_drawable_use_bo(draw,
+       if ((data.bo = sna_drawable_use_bo(draw, true,
                                           &data.region.extents,
                                           &data.damage))) {
                uint32_t color;
@@ -10482,7 +10427,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
                return false;
        }
 
-       bo = sna_drawable_use_bo(drawable, &clip->extents, &damage);
+       bo = sna_drawable_use_bo(drawable, true, &clip->extents, &damage);
        if (bo == NULL)
                return false;
 
@@ -11392,7 +11337,8 @@ sna_image_glyph(DrawablePtr drawable, GCPtr gc,
        if (!PM_IS_SOLID(drawable, gc->planemask))
                goto fallback;
 
-       if ((bo = sna_drawable_use_bo(drawable, &region.extents, &damage)) &&
+       if ((bo = sna_drawable_use_bo(drawable, true,
+                                     &region.extents, &damage)) &&
            sna_reversed_glyph_blt(drawable, gc, x, y, n, info, base,
                                   bo, damage, &region,
                                   gc->fgPixel, gc->bgPixel, false))
@@ -11468,7 +11414,8 @@ sna_poly_glyph(DrawablePtr drawable, GCPtr gc,
        if (!gc_is_solid(gc, &fg))
                goto fallback;
 
-       if ((bo = sna_drawable_use_bo(drawable, &region.extents, &damage)) &&
+       if ((bo = sna_drawable_use_bo(drawable, true,
+                                     &region.extents, &damage)) &&
            sna_reversed_glyph_blt(drawable, gc, x, y, n, info, base,
                                   bo, damage, &region, fg, -1, true))
                goto out;
@@ -11505,7 +11452,7 @@ sna_push_pixels_solid_blt(GCPtr gc,
        int n;
        uint8_t rop = copy_ROP[gc->alu];
 
-       bo = sna_drawable_use_bo(drawable, &region->extents, &damage);
+       bo = sna_drawable_use_bo(drawable, true, &region->extents, &damage);
        if (bo == NULL)
                return false;
 

commit daac9a1d036d80ccce83438b49115a236a16bfb6
Author: Chris Wilson <ch...@chris-wilson.co.uk>
Date:   Fri Apr 27 16:50:28 2012 +0100

    sna: Micro-optimise common case of checking a single fenced bo
    
    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 4c4aa7c..29f0e29 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2977,7 +2977,45 @@ bool kgem_check_bo(struct kgem *kgem, ...)
        return true;
 }
 
-bool kgem_check_bo_fenced(struct kgem *kgem, ...)
+bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
+{
+       uint32_t size;
+
+       if (bo->proxy)
+               bo = bo->proxy;
+       if (bo->exec) {
+               if (kgem->gen < 40 &&
+                   bo->tiling != I915_TILING_NONE &&
+                   (bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) {
+                       if (kgem->nfence >= kgem->fence_max)
+                               return false;
+
+                       size = kgem->aperture_fenced;
+                       size += kgem_bo_fenced_size(kgem, bo);
+                       if (size > kgem->aperture_mappable)
+                               return false;
+               }
+
+               return true;
+       }
+
+       if (kgem->aperture > kgem->aperture_low)
+               return false;
+
+       if (kgem->nexec >= KGEM_EXEC_SIZE(kgem) - 1)
+               return false;
+
+       if (kgem->gen < 40 &&
+           bo->tiling != I915_TILING_NONE &&
+           kgem->nfence >= kgem->fence_max)
+               return false;
+
+       size = kgem->aperture;
+       size += num_pages(bo);
+       return size <= kgem->aperture_high;
+}
+
+bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 {
        va_list ap;
        struct kgem_bo *bo;
@@ -4165,7 +4203,7 @@ kgem_replace_bo(struct kgem *kgem,
        kgem_set_mode(kgem, KGEM_BLT);
        if (!kgem_check_batch(kgem, 8) ||
            !kgem_check_reloc(kgem, 2) ||
-           !kgem_check_bo_fenced(kgem, src, dst, NULL)) {
+           !kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
                _kgem_submit(kgem);
                _kgem_set_mode(kgem, KGEM_BLT);
        }
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 1235b83..4def6b1 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -344,7 +344,8 @@ static inline void kgem_advance_batch(struct kgem *kgem, 
int num_dwords)
 }
 
 bool kgem_check_bo(struct kgem *kgem, ...) __attribute__((sentinel(0)));
-bool kgem_check_bo_fenced(struct kgem *kgem, ...) __attribute__((sentinel(0)));
+bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo);
+bool kgem_check_many_bo_fenced(struct kgem *kgem, ...) 
__attribute__((sentinel(0)));
 
 void _kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo);
 static inline void kgem_add_bo(struct kgem *kgem, struct kgem_bo *bo)
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index dc084f0..a5c1648 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2975,7 +2975,7 @@ sna_put_xybitmap_blt(DrawablePtr drawable, GCPtr gc, 
RegionPtr region,
                void *ptr;
 
                if (!kgem_check_batch(&sna->kgem, 8) ||
-                   !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                   !kgem_check_bo_fenced(&sna->kgem, bo) ||
                    !kgem_check_reloc(&sna->kgem, 2)) {
                        _kgem_submit(&sna->kgem);
                        _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -3103,7 +3103,7 @@ sna_put_xypixmap_blt(DrawablePtr drawable, GCPtr gc, 
RegionPtr region,
                        void *ptr;
 
                        if (!kgem_check_batch(&sna->kgem, 12) ||
-                           !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                           !kgem_check_bo_fenced(&sna->kgem, bo) ||
                            !kgem_check_reloc(&sna->kgem, 2)) {
                                _kgem_submit(&sna->kgem);
                                _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -5117,7 +5117,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr 
drawable, GCPtr gc,
                if (src_stride <= 128) {
                        src_stride = ALIGN(src_stride, 8) / 4;
                        if (!kgem_check_batch(&sna->kgem, 7+src_stride) ||
-                           !kgem_check_bo_fenced(&sna->kgem, arg->bo, NULL) ||
+                           !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
                            !kgem_check_reloc(&sna->kgem, 1)) {
                                _kgem_submit(&sna->kgem);
                                _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -5159,7 +5159,7 @@ sna_copy_bitmap_blt(DrawablePtr _bitmap, DrawablePtr 
drawable, GCPtr gc,
                        void *ptr;
 
                        if (!kgem_check_batch(&sna->kgem, 8) ||
-                           !kgem_check_bo_fenced(&sna->kgem, arg->bo, NULL) ||
+                           !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
                            !kgem_check_reloc(&sna->kgem, 2)) {
                                _kgem_submit(&sna->kgem);
                                _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -5277,7 +5277,7 @@ sna_copy_plane_blt(DrawablePtr source, DrawablePtr 
drawable, GCPtr gc,
                     sx, sy, bx1, bx2));
 
                if (!kgem_check_batch(&sna->kgem, 8) ||
-                   !kgem_check_bo_fenced(&sna->kgem, arg->bo, NULL) ||
+                   !kgem_check_bo_fenced(&sna->kgem, arg->bo) ||
                    !kgem_check_reloc(&sna->kgem, 2)) {
                        _kgem_submit(&sna->kgem);
                        _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9195,7 +9195,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
                             __FUNCTION__, r->x + dx, r->y + dy, r->width, 
r->height));
 
                        if (!kgem_check_batch(&sna->kgem, 9) ||
-                           !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                           !kgem_check_bo_fenced(&sna->kgem, bo) ||
                            !kgem_check_reloc(&sna->kgem, 1)) {
                                _kgem_submit(&sna->kgem);
                                _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9243,7 +9243,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
                                        uint32_t *b;
 
                                        if (!kgem_check_batch(&sna->kgem, 9) ||
-                                           !kgem_check_bo_fenced(&sna->kgem, 
bo, NULL) ||
+                                           !kgem_check_bo_fenced(&sna->kgem, 
bo) ||
                                            !kgem_check_reloc(&sna->kgem, 1)) {
                                                _kgem_submit(&sna->kgem);
                                                _kgem_set_mode(&sna->kgem, 
KGEM_BLT);
@@ -9293,7 +9293,7 @@ sna_poly_fill_rect_stippled_8x8_blt(DrawablePtr drawable,
                                                uint32_t *b;
 
                                                if 
(!kgem_check_batch(&sna->kgem, 9) ||
-                                                   
!kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                                                   
!kgem_check_bo_fenced(&sna->kgem, bo) ||
                                                    
!kgem_check_reloc(&sna->kgem, 1)) {
                                                        
_kgem_submit(&sna->kgem);
                                                        
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9433,7 +9433,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
                        if (src_stride <= 128) {
                                src_stride = ALIGN(src_stride, 8) / 4;
                                if (!kgem_check_batch(&sna->kgem, 7+src_stride) 
||
-                                   !kgem_check_bo_fenced(&sna->kgem, bo, NULL) 
||
+                                   !kgem_check_bo_fenced(&sna->kgem, bo) ||
                                    !kgem_check_reloc(&sna->kgem, 1)) {
                                        _kgem_submit(&sna->kgem);
                                        _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9475,7 +9475,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
                                void *ptr;
 
                                if (!kgem_check_batch(&sna->kgem, 8) ||
-                                   !kgem_check_bo_fenced(&sna->kgem, bo, NULL) 
||
+                                   !kgem_check_bo_fenced(&sna->kgem, bo) ||
                                    !kgem_check_reloc(&sna->kgem, 2)) {
                                        _kgem_submit(&sna->kgem);
                                        _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9575,7 +9575,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
                                if (src_stride <= 128) {
                                        src_stride = ALIGN(src_stride, 8) / 4;
                                        if (!kgem_check_batch(&sna->kgem, 
7+src_stride) ||
-                                           !kgem_check_bo_fenced(&sna->kgem, 
bo, NULL) ||
+                                           !kgem_check_bo_fenced(&sna->kgem, 
bo) ||
                                            !kgem_check_reloc(&sna->kgem, 1)) {
                                                _kgem_submit(&sna->kgem);
                                                _kgem_set_mode(&sna->kgem, 
KGEM_BLT);
@@ -9614,7 +9614,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
                                        } while (--bh);
                                } else {
                                        if (!kgem_check_batch(&sna->kgem, 8) ||
-                                           !kgem_check_bo_fenced(&sna->kgem, 
bo, NULL) ||
+                                           !kgem_check_bo_fenced(&sna->kgem, 
bo) ||
                                            !kgem_check_reloc(&sna->kgem, 2)) {
                                                _kgem_submit(&sna->kgem);
                                                _kgem_set_mode(&sna->kgem, 
KGEM_BLT);
@@ -9715,7 +9715,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
                                        if (src_stride <= 128) {
                                                src_stride = ALIGN(src_stride, 
8) / 4;
                                                if 
(!kgem_check_batch(&sna->kgem, 7+src_stride) ||
-                                                   
!kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                                                   
!kgem_check_bo_fenced(&sna->kgem, bo) ||
                                                    
!kgem_check_reloc(&sna->kgem, 1)) {
                                                        
_kgem_submit(&sna->kgem);
                                                        
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9754,7 +9754,7 @@ sna_poly_fill_rect_stippled_1_blt(DrawablePtr drawable,
                                                } while (--bh);
                                        } else {
                                                if 
(!kgem_check_batch(&sna->kgem, 8) ||
-                                                   
!kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                                                   
!kgem_check_bo_fenced(&sna->kgem, bo) ||
                                                    
!kgem_check_reloc(&sna->kgem, 2)) {
                                                        
_kgem_submit(&sna->kgem);
                                                        
_kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -9856,7 +9856,7 @@ sna_poly_fill_rect_stippled_n_box(struct sna *sna,
                        len = bw*bh;
                        len = ALIGN(len, 8) / 4;
                        if (!kgem_check_batch(&sna->kgem, 7+len) ||
-                           !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                           !kgem_check_bo_fenced(&sna->kgem, bo) ||
                            !kgem_check_reloc(&sna->kgem, 1)) {
                                _kgem_submit(&sna->kgem);
                                _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -10512,7 +10512,7 @@ sna_glyph_blt(DrawablePtr drawable, GCPtr gc,
 
        kgem_set_mode(&sna->kgem, KGEM_BLT);
        if (!kgem_check_batch(&sna->kgem, 16) ||
-           !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+           !kgem_check_bo_fenced(&sna->kgem, bo) ||
            !kgem_check_reloc(&sna->kgem, 1)) {
                _kgem_submit(&sna->kgem);
                _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -11180,7 +11180,7 @@ sna_reversed_glyph_blt(DrawablePtr drawable, GCPtr gc,
 
        kgem_set_mode(&sna->kgem, KGEM_BLT);
        if (!kgem_check_batch(&sna->kgem, 16) ||
-           !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+           !kgem_check_bo_fenced(&sna->kgem, bo) ||
            !kgem_check_reloc(&sna->kgem, 1)) {
                _kgem_submit(&sna->kgem);
                _kgem_set_mode(&sna->kgem, KGEM_BLT);
@@ -11549,7 +11549,7 @@ sna_push_pixels_solid_blt(GCPtr gc,
                void *ptr;
 
                if (!kgem_check_batch(&sna->kgem, 8) ||
-                   !kgem_check_bo_fenced(&sna->kgem, bo, NULL) ||
+                   !kgem_check_bo_fenced(&sna->kgem, bo) ||
                    !kgem_check_reloc(&sna->kgem, 2)) {
                        _kgem_submit(&sna->kgem);
                        _kgem_set_mode(&sna->kgem, KGEM_BLT);
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index a81a145..82c61df 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -151,10 +151,10 @@ static bool sna_blt_fill_init(struct sna *sna,
        blt->bpp = bpp;
 
        kgem_set_mode(kgem, KGEM_BLT);
-       if (!kgem_check_bo_fenced(kgem, bo, NULL) ||
+       if (!kgem_check_bo_fenced(kgem, bo) ||
            !kgem_check_batch(kgem, 12)) {
                _kgem_submit(kgem);
-               assert(kgem_check_bo_fenced(kgem, bo, NULL));
+               assert(kgem_check_bo_fenced(kgem, bo));


-- 
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/e1syezf-0003nu...@vasks.debian.org

Reply via email to