xf86-video-intel: 6 commits - src/sna/gen3_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_composite.c src/sna/sna_trapezoids.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Mar 14 13:21:49 PDT 2012
src/sna/gen3_render.c | 4 -
src/sna/kgem.c | 1
src/sna/kgem.h | 1
src/sna/sna_accel.c | 3
src/sna/sna_composite.c | 5 +
src/sna/sna_trapezoids.c | 163 ++++++++++++++++++++++++++++++++++++-----------
6 files changed, 136 insertions(+), 41 deletions(-)
New commits:
commit d0e05b4294b2f150a41dd95d52c2e6ee8479283d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Mar 14 20:19:30 2012 +0000
sna: Don't mark cached upload buffers for inactivity expiration
As these do not follow the normal rules of damage tracking, we have to
be careful not to force migration.
References: https://bugs.freedesktop.org/show_bug.cgi?id=42426
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 ce13982..e957b1b 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2073,7 +2073,8 @@ static inline struct sna_pixmap *
sna_pixmap_mark_active(struct sna *sna, struct sna_pixmap *priv)
{
assert(priv->gpu_bo);
- if (!priv->pinned && (priv->create & KGEM_CAN_CREATE_LARGE) == 0)
+ if (!priv->pinned && priv->gpu_bo->proxy == NULL &&
+ (priv->create & KGEM_CAN_CREATE_LARGE) == 0)
list_move(&priv->inactive, &sna->active_pixmaps);
priv->clear = false;
return priv;
commit 96ead26c4dddab637875c74a9afca6fd6662352b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Mar 14 19:56:42 2012 +0000
sna: Add a couple of asserts for inactive_partial reference counting
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 72751f3..761218f 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1257,6 +1257,7 @@ static void kgem_retire_partials(struct kgem *kgem)
kgem_bo_destroy(kgem, cached);
}
+ assert(bo->base.refcnt > 0);
if (bo->base.refcnt != 1)
continue;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 52e5e9c..7e5ffac 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -270,6 +270,7 @@ static inline void kgem_bo_flush(struct kgem *kgem, struct kgem_bo *bo)
static inline struct kgem_bo *kgem_bo_reference(struct kgem_bo *bo)
{
+ assert(bo->refcnt);
bo->refcnt++;
return bo;
}
commit 6a4ac18e37521d54dc36b215cbd27c56d20b2922
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Mar 14 11:51:39 2012 +0000
sna/traps: Use a more direct fallback path for the CPU
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index f05324f..f0f48e8 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2423,44 +2423,63 @@ trapezoids_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
DBG(("%s: mask (%dx%d) depth=%d, format=%08x\n",
__FUNCTION__, width, height, depth, format));
- scratch = sna_pixmap_create_upload(screen,
- width, height, 8,
- KGEM_BUFFER_WRITE);
- if (!scratch)
- return;
+ if (is_gpu(dst->pDrawable) || picture_is_gpu(src)) {
+ scratch = sna_pixmap_create_upload(screen,
+ width, height, 8,
+ KGEM_BUFFER_WRITE);
+ if (!scratch)
+ return;
- if (depth < 8) {
- image = pixman_image_create_bits(format, width, height,
- NULL, 0);
+ if (depth < 8) {
+ image = pixman_image_create_bits(format, width, height,
+ NULL, 0);
+ } else {
+ memset(scratch->devPrivate.ptr, 0, scratch->devKind*height);
+ image = pixman_image_create_bits(format, width, height,
+ scratch->devPrivate.ptr,
+ scratch->devKind);
+ }
+ if (image) {
+ for (; ntrap; ntrap--, traps++)
+ pixman_rasterize_trapezoid(image,
+ (pixman_trapezoid_t *)traps,
+ -bounds.x1, -bounds.y1);
+ if (depth < 8) {
+ pixman_image_t *a8;
+
+ a8 = pixman_image_create_bits(PIXMAN_a8, width, height,
+ scratch->devPrivate.ptr,
+ scratch->devKind);
+ if (a8) {
+ pixman_image_composite(PIXMAN_OP_SRC,
+ image, NULL, a8,
+ 0, 0,
+ 0, 0,
+ 0, 0,
+ width, height);
+ pixman_image_unref (a8);
+ }
+ }
+
+ pixman_image_unref(image);
+ }
} else {
+ scratch = screen->CreatePixmap(screen,
+ width, height, depth,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!scratch)
+ return;
+
memset(scratch->devPrivate.ptr, 0, scratch->devKind*height);
image = pixman_image_create_bits(format, width, height,
scratch->devPrivate.ptr,
scratch->devKind);
- }
- if (image) {
- for (; ntrap; ntrap--, traps++)
- pixman_rasterize_trapezoid(image,
- (pixman_trapezoid_t *)traps,
- -bounds.x1, -bounds.y1);
- if (depth < 8) {
- pixman_image_t *a8;
-
- a8 = pixman_image_create_bits(PIXMAN_a8, width, height,
- scratch->devPrivate.ptr,
- scratch->devKind);
- if (a8) {
- pixman_image_composite(PIXMAN_OP_SRC,
- image, NULL, a8,
- 0, 0,
- 0, 0,
- 0, 0,
- width, height);
- pixman_image_unref (a8);
- }
+ if (image) {
+ for (; ntrap; ntrap--, traps++)
+ pixman_rasterize_trapezoid(image,
+ (pixman_trapezoid_t *)traps,
+ -bounds.x1, -bounds.y1);
}
-
- pixman_image_unref(image);
}
mask = CreatePicture(0, &scratch->drawable,
commit 8580677ee6725144acf63f5cc2f8097376352d6e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Mar 14 11:46:18 2012 +0000
sna/traps: Rasterise using pixman inplace where appropriate
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 933f580..f05324f 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -2302,6 +2302,79 @@ trapezoids_bounds(int n, const xTrapezoid *t, BoxPtr box)
box->y2 = pixman_fixed_integer_ceil(y2);
}
+static bool
+is_mono(PicturePtr dst, PictFormatPtr mask)
+{
+ return mask ? mask->depth < 8 : dst->polyEdge==PolyEdgeSharp;
+}
+
+static bool
+trapezoids_inplace_fallback(CARD8 op,
+ PicturePtr src, PicturePtr dst, PictFormatPtr mask,
+ int ntrap, xTrapezoid *traps)
+{
+ pixman_image_t *image;
+ BoxRec box;
+ uint32_t color;
+ int dx, dy;
+
+ if (op != PictOpAdd)
+ return false;
+
+ if (is_mono(dst, mask)) {
+ if (dst->format != PICT_a1)
+ return false;
+ } else {
+ if (dst->format != PICT_a8)
+ return false;
+ }
+
+ if (!sna_picture_is_solid(src, &color) || (color >> 24) != 0xff) {
+ DBG(("%s: not an opaque solid source\n", __FUNCTION__));
+ return false;
+ }
+
+ box.x1 = dst->pDrawable->x;
+ box.y1 = dst->pDrawable->y;
+ box.x2 = dst->pDrawable->width;
+ box.y2 = dst->pDrawable->height;
+ if (pixman_region_contains_rectangle(dst->pCompositeClip,
+ &box) != PIXMAN_REGION_IN) {
+ DBG(("%s: requires clipping, drawable (%d,%d), (%d, %d), clip (%d, %d), (%d, %d)\n", __FUNCTION__,
+ box.x1, box.y1, box.x2, box.y2,
+ dst->pCompositeClip->extents.x1,
+ dst->pCompositeClip->extents.y1,
+ dst->pCompositeClip->extents.x2,
+ dst->pCompositeClip->extents.y2));
+ return false;
+ }
+
+ if (is_gpu(dst->pDrawable)) {
+ DBG(("%s: not performing inplace as dst is already on the GPU\n",
+ __FUNCTION__));
+ return false;
+ }
+
+ DBG(("%s\n", __FUNCTION__));
+
+ image = NULL;
+ if (sna_drawable_move_to_cpu(dst->pDrawable, MOVE_READ | MOVE_WRITE))
+ image = image_from_pict(dst, FALSE, &dx, &dy);
+ if (image) {
+ dx += dst->pDrawable->x;
+ dy += dst->pDrawable->y;
+
+ for (; ntrap; ntrap--, traps++)
+ pixman_rasterize_trapezoid(image,
+ (pixman_trapezoid_t *)traps,
+ dx, dy);
+
+ pixman_image_unref(image);
+ }
+
+ return true;
+}
+
static void
trapezoids_fallback(CARD8 op, PicturePtr src, PicturePtr dst,
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
@@ -2998,12 +3071,6 @@ project_trapezoid_onto_grid(const xTrapezoid *in,
return xTrapezoidValid(out);
}
-static bool
-is_mono(PicturePtr dst, PictFormatPtr mask)
-{
- return mask ? mask->depth < 8 : dst->polyEdge==PolyEdgeSharp;
-}
-
static span_func_t
choose_span(PicturePtr dst,
PictFormatPtr maskFormat,
@@ -4448,6 +4515,9 @@ fallback:
xSrc, ySrc, ntrap, traps))
return;
+ if (trapezoids_inplace_fallback(op, src, dst, maskFormat, ntrap, traps))
+ return;
+
DBG(("%s: fallback mask=%08x, ntrap=%d\n", __FUNCTION__,
maskFormat ? (unsigned)maskFormat->format : 0, ntrap));
trapezoids_fallback(op, src, dst, maskFormat,
commit 8a303f195b53a78dcbb2b6c84e7e691bedc86d25
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Mar 14 11:26:03 2012 +0000
sna: Remove existing damage before overwriting with a composite op
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index a610e7c..b098fcc 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -479,6 +479,11 @@ sna_composite(CARD8 op,
get_drawable_dx(dst->pDrawable),
get_drawable_dy(dst->pDrawable)));
+ if (op <= PictOpSrc) {
+ struct sna_pixmap *priv = sna_pixmap_from_drawable(dst->pDrawable);
+ sna_damage_subtract(&priv->cpu_damage, ®ion);
+ }
+
memset(&tmp, 0, sizeof(tmp));
if (!sna->render.composite(sna,
op, src, mask, dst,
commit 63eeb98463a77adadc26d9de1e640b75eefebf1a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Mar 14 10:30:47 2012 +0000
sna/gen3: Look harder to see if we can indeed use the BLT for composite
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index d3ed2ef..c567d6b 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2744,15 +2744,13 @@ gen3_render_composite(struct sna *sna,
width, height,
tmp);
- memset(&tmp->u.gen3, 0, sizeof(tmp->u.gen3));
-
if (!gen3_composite_set_target(sna, tmp, dst)) {
DBG(("%s: unable to set render target\n",
__FUNCTION__));
return FALSE;
}
- if (mask == NULL && sna->kgem.mode == KGEM_BLT &&
+ if (mask == NULL && sna->kgem.mode != KGEM_RENDER &&
sna_blt_composite(sna, op,
src, dst,
src_x, src_y,
More information about the xorg-commit
mailing list