xf86-video-intel: 6 commits - src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_io.c
Chris Wilson
ickle at kemper.freedesktop.org
Sat Apr 28 09:53:31 PDT 2012
src/sna/gen6_render.c | 6 -
src/sna/gen7_render.c | 6 -
src/sna/kgem.c | 44 ++++++++-
src/sna/kgem.h | 5 -
src/sna/sna_accel.c | 233 +++++++++++++++++++-------------------------------
src/sna/sna_blt.c | 34 +++----
src/sna/sna_io.c | 6 -
7 files changed, 161 insertions(+), 173 deletions(-)
New commits:
commit a206a1eee1fb799d567d68db564d663cfc66f6cc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Apr 28 01:54:43 2012 +0100
sna: Tune relocation array size
Signed-off-by: Chris Wilson <chris at 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 <chris at 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 <chris at 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 <chris at 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 <chris at 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 <chris at 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 <chris at 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 <chris at 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 <chris at 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 <chris at 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 <chris at 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));
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -293,9 +293,9 @@ static Bool sna_blt_copy_init(struct sna *sna,
}
kgem_set_mode(kgem, KGEM_BLT);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL)) {
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
_kgem_submit(kgem);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL))
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
return FALSE;
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -345,9 +345,9 @@ static Bool sna_blt_alpha_fixup_init(struct sna *sna,
blt->pixel = alpha;
kgem_set_mode(kgem, KGEM_BLT);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL)) {
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
_kgem_submit(kgem);
- if (!kgem_check_bo_fenced(kgem, src, dst, NULL))
+ if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
return FALSE;
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -1103,10 +1103,10 @@ prepare_blt_copy(struct sna *sna,
if (!kgem_bo_can_blt(&sna->kgem, priv->gpu_bo))
return FALSE;
- if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo, priv->gpu_bo, NULL)) {
+ if (!kgem_check_many_bo_fenced(&sna->kgem, op->dst.bo, priv->gpu_bo, NULL)) {
_kgem_submit(&sna->kgem);
- if (!kgem_check_bo_fenced(&sna->kgem,
- op->dst.bo, priv->gpu_bo, NULL))
+ if (!kgem_check_many_bo_fenced(&sna->kgem,
+ op->dst.bo, priv->gpu_bo, NULL))
return FALSE;
_kgem_set_mode(&sna->kgem, KGEM_BLT);
}
@@ -1577,9 +1577,9 @@ sna_blt_composite(struct sna *sna,
if (width && height)
reduce_damage(tmp, dst_x, dst_y, width, height);
- if (!kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo, NULL)) {
+ if (!kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo)) {
_kgem_submit(&sna->kgem);
- assert(kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo, NULL));
+ assert(kgem_check_bo_fenced(&sna->kgem, priv->gpu_bo));
_kgem_set_mode(&sna->kgem, KGEM_BLT);
}
@@ -1884,9 +1884,9 @@ static bool sna_blt_fill_box(struct sna *sna, uint8_t alu,
kgem_set_mode(kgem, KGEM_BLT);
if (!kgem_check_batch(kgem, 6) ||
!kgem_check_reloc(kgem, 1) ||
- !kgem_check_bo_fenced(kgem, bo, NULL)) {
+ !kgem_check_bo_fenced(kgem, bo)) {
_kgem_submit(kgem);
- assert(kgem_check_bo_fenced(&sna->kgem, bo, NULL));
+ assert(kgem_check_bo_fenced(&sna->kgem, bo));
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -1957,10 +1957,10 @@ Bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
}
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(&sna->kgem, bo, NULL));
+ assert(kgem_check_bo_fenced(&sna->kgem, bo));
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -2122,9 +2122,9 @@ Bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
kgem_set_mode(kgem, KGEM_BLT);
if (!kgem_check_batch(kgem, 8) ||
!kgem_check_reloc(kgem, 2) ||
- !kgem_check_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
+ !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
_kgem_submit(kgem);
- if (!kgem_check_bo_fenced(kgem, dst_bo, src_bo, NULL))
+ if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL))
return sna_tiling_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 02a5c75..2539518 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -360,7 +360,7 @@ fallback:
if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) ||
kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) ||
!kgem_check_batch(kgem, 8) ||
- !kgem_check_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
+ !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -732,7 +732,7 @@ tile:
if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) ||
kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) ||
!kgem_check_batch(kgem, 8) ||
- !kgem_check_bo_fenced(kgem, dst_bo, NULL)) {
+ !kgem_check_bo_fenced(kgem, dst_bo)) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
}
@@ -969,7 +969,7 @@ fallback:
if (kgem->nexec + 2 > KGEM_EXEC_SIZE(kgem) ||
kgem->nreloc + 2 > KGEM_RELOC_SIZE(kgem) ||
!kgem_check_batch(kgem, 8) ||
- !kgem_check_bo_fenced(kgem, dst_bo, NULL)) {
+ !kgem_check_bo_fenced(kgem, dst_bo)) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
}
More information about the xorg-commit
mailing list