summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-10-04 11:23:36 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-10-04 11:23:36 +0100
commit4608e482615d4b4599608c7bc17ac8a9f9293840 (patch)
tree2382a445faa119751945af6b8b587f183f8349ff
parent83b8669abc7415202f9e0c764de675ffbcf45dac (diff)
sna/gen2: Allow fine damage tracking for render operations
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen2_render.c59
1 files changed, 42 insertions, 17 deletions
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index cf3088be..b6b259ee 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1429,25 +1429,40 @@ gen2_composite_picture(struct sna *sna,
static bool
gen2_composite_set_target(struct sna *sna,
struct sna_composite_op *op,
- PicturePtr dst)
+ PicturePtr dst,
+ int x, int y, int w, int h)
{
- struct sna_pixmap *priv;
+ BoxRec box;
op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
op->dst.format = dst->format;
- op->dst.width = op->dst.pixmap->drawable.width;
+ op->dst.width = op->dst.pixmap->drawable.width;
op->dst.height = op->dst.pixmap->drawable.height;
- priv = sna_pixmap_force_to_gpu(op->dst.pixmap, MOVE_WRITE | MOVE_READ);
- if (priv == NULL)
+ if (w && h) {
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + w;
+ box.y2 = y + h;
+ } else
+ sna_render_picture_extents(dst, &box);
+
+ op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
+ PREFER_GPU | FORCE_GPU | RENDER_GPU,
+ &box, &op->damage);
+ if (op->dst.bo == NULL)
return false;
- if (priv->gpu_bo->pitch < 8) {
+ if (op->dst.bo->pitch < 8) {
+ struct sna_pixmap *priv;
struct kgem_bo *bo;
- if (priv->pinned)
+ priv = sna_pixmap_move_to_gpu (op->dst.pixmap,
+ MOVE_READ | MOVE_WRITE);
+ if (priv == NULL || priv->pinned)
return false;
+ assert(op->dst.bo == priv->gpu_bo);
bo = kgem_replace_bo(&sna->kgem, priv->gpu_bo,
op->dst.width, op->dst.height, 8,
op->dst.pixmap->drawable.bitsPerPixel);
@@ -1456,15 +1471,26 @@ gen2_composite_set_target(struct sna *sna,
kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
priv->gpu_bo = bo;
- }
- op->dst.bo = priv->gpu_bo;
- op->damage = &priv->gpu_damage;
- if (sna_damage_is_all(&priv->gpu_damage, op->dst.width, op->dst.height))
- op->damage = NULL;
+ op->dst.bo = priv->gpu_bo;
+ op->damage = &priv->gpu_damage;
+ if (sna_damage_is_all(op->damage,
+ op->dst.width, op->dst.height))
+ op->damage = NULL;
+ }
get_drawable_deltas(dst->pDrawable, op->dst.pixmap,
&op->dst.x, &op->dst.y);
+
+ DBG(("%s: pixmap=%p, format=%08x, size=%dx%d, pitch=%d, delta=(%d,%d),damage=%p\n",
+ __FUNCTION__,
+ op->dst.pixmap, (int)op->dst.format,
+ op->dst.width, op->dst.height,
+ op->dst.bo->pitch,
+ op->dst.x, op->dst.y,
+ op->damage ? *op->damage : (void *)-1));
+
+ assert(op->dst.bo->proxy == NULL);
return true;
}
@@ -1778,14 +1804,13 @@ gen2_render_composite(struct sna *sna,
width, height,
tmp);
- if (!gen2_composite_set_target(sna, tmp, dst)) {
+ if (!gen2_composite_set_target(sna, tmp, dst,
+ dst_x, dst_y, width, height)) {
DBG(("%s: unable to set render target\n",
__FUNCTION__));
return false;
}
- sna_render_reduce_damage(tmp, dst_x, dst_y, width, height);
-
tmp->op = op;
if (too_large(tmp->dst.width, tmp->dst.height) ||
tmp->dst.bo->pitch > MAX_3D_PITCH) {
@@ -2263,12 +2288,12 @@ gen2_render_composite_spans(struct sna *sna,
width, height, flags, tmp);
}
- if (!gen2_composite_set_target(sna, &tmp->base, dst)) {
+ if (!gen2_composite_set_target(sna, &tmp->base, dst,
+ dst_x, dst_y, width, height)) {
DBG(("%s: unable to set render target\n",
__FUNCTION__));
return false;
}
- sna_render_reduce_damage(&tmp->base, dst_x, dst_y, width, height);
tmp->base.op = op;
if (too_large(tmp->base.dst.width, tmp->base.dst.height) ||