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, ®ion.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, ®ion->extents, &damage); + bo = sna_drawable_use_bo(&pixmap->drawable, true, + ®ion->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, ®ion->extents, &damage); + bo = sna_drawable_use_bo(&pixmap->drawable, true, + ®ion->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, ®ion.extents, &damage); + bo = sna_drawable_use_bo(drawable, true, ®ion.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, ®ion.extents, &arg.damage); + arg.bo = sna_drawable_use_bo(dst, true, ®ion.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, ®ion.extents, &damage)) && + if ((bo = sna_drawable_use_bo(drawable, false, ®ion.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, ®ion.extents, &damage)) && + if ((bo = sna_drawable_use_bo(drawable, true, + ®ion.extents, &damage)) && sna_poly_rectangle_blt(drawable, bo, damage, gc, n, r, ®ion.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, ®ion.extents, &damage)) { + if (sna_drawable_use_bo(drawable, true, + ®ion.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, ®ion.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, ®ion.extents, &damage)) && - sna_poly_fill_rect_blt(draw, + if (sna_poly_fill_rect_blt(draw, bo, damage, gc, color, n, rect, ®ion.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, ®ion.extents, &damage)) && - sna_poly_fill_rect_tiled_blt(draw, bo, damage, + if (sna_poly_fill_rect_tiled_blt(draw, bo, damage, gc, n, rect, ®ion.extents, flags & 2)) return; } else { DBG(("%s: stippled fill, testing for blt\n", __FUNCTION__)); - if ((bo = sna_drawable_use_bo(draw, ®ion.extents, &damage)) && - sna_poly_fill_rect_stippled_blt(draw, bo, damage, + if (sna_poly_fill_rect_stippled_blt(draw, bo, damage, gc, n, rect, ®ion.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, ®ion.extents, &damage)) && + if ((bo = sna_drawable_use_bo(drawable, true, + ®ion.extents, &damage)) && sna_reversed_glyph_blt(drawable, gc, x, y, n, info, base, bo, damage, ®ion, 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, ®ion.extents, &damage)) && + if ((bo = sna_drawable_use_bo(drawable, true, + ®ion.extents, &damage)) && sna_reversed_glyph_blt(drawable, gc, x, y, n, info, base, bo, damage, ®ion, 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, ®ion->extents, &damage); + bo = sna_drawable_use_bo(drawable, true, ®ion->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