xf86-video-intel: 4 commits - src/sna/sna_accel.c src/sna/sna_damage.c src/sna/sna_render.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu Dec 29 06:22:55 PST 2011
src/sna/sna_accel.c | 42 ++++++++++++++++++++++++++++++++++++------
src/sna/sna_damage.c | 8 ++++----
src/sna/sna_render.c | 4 ++--
3 files changed, 42 insertions(+), 12 deletions(-)
New commits:
commit 0dc5c0651cb691fb8811cdf3075b3d322f9d37f8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Dec 29 13:49:23 2011 +0000
sna: Tune disarming of the scanout flush timer
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 feb171f..ee8d7ea 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -9162,9 +9162,8 @@ static void _sna_accel_disarm_timer(struct sna *sna, int id) { }
static bool sna_accel_flush(struct sna *sna)
{
struct sna_pixmap *priv = sna_accel_scanout(sna);
- bool nothing_to_do =
- priv->cpu_damage == NULL && priv->gpu_bo->rq == NULL;
- bool need_throttle = sna->kgem.busy;
+ bool nothing_to_do = priv->cpu_damage == NULL && sna->kgem.nbatch == 0;
+ bool need_throttle = priv->gpu_bo->rq;
DBG(("%s (time=%ld), nothing_to_do=%d, busy? %d\n",
__FUNCTION__, (long)GetTimeInMillis(),
commit ccd895c61d9f409a36c70eaf02d7ab43cc6c03c2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Dec 29 12:09:04 2011 +0000
sna: Allow uploading inplace to a freshly created GPU bo
If the operation is favoured to be performed using a WC upload, presume
that we will use the uploaded pixmap on the GPU and so prefer to create
a GPU buffer to hold the fresh data.
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 04382e4..feb171f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -802,6 +802,23 @@ region_subsumes_drawable(RegionPtr region, DrawablePtr drawable)
extents->y2 >= drawable->height;
}
+static bool
+region_subsumes_gpu_damage(const RegionRec *region, struct sna_pixmap *priv)
+{
+ if (region->data)
+ return false;
+
+ if (priv->gpu_damage) {
+ const BoxRec *extents = ®ion->extents;
+ const BoxRec *damage = &priv->gpu_damage->extents;
+ if (extents->x2 < damage->x2 || extents->x1 > damage->x1 ||
+ extents->y2 < damage->y2 || extents->y1 > damage->y1)
+ return false;
+ }
+
+ return true;
+}
+
static bool sync_will_stall(struct kgem_bo *bo)
{
return kgem_bo_is_busy(bo);
@@ -1715,6 +1732,10 @@ sna_put_image_upload_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
__FUNCTION__, nbox,
box->x1, box->y1, box->x2, box->y2));
+ if (priv->gpu_bo == NULL &&
+ !sna_pixmap_create_mappable_gpu(pixmap))
+ return FALSE;
+
assert(priv->gpu_bo);
if (gc->alu == GXcopy &&
@@ -1780,15 +1801,21 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
goto blt;
}
+ if (!priv->pinned && priv->gpu_bo &&
+ region_subsumes_gpu_damage(region, priv) &&
+ kgem_bo_map_will_stall(&sna->kgem, priv->gpu_bo)) {
+ sna_damage_destroy(&priv->gpu_damage);
+ sna_pixmap_destroy_gpu_bo(sna, priv);
+ }
+
/* XXX performing the upload inplace is currently about 20x slower
* for putimage10 on gen6 -- mostly due to slow page faulting in kernel.
* So we try again with vma caching and only for pixmaps who will be
* immediately flushed...
*/
if ((priv->flush ||
- (priv->gpu_bo &&
- region_inplace(sna, pixmap, region, priv) &&
- !kgem_bo_map_will_stall(&sna->kgem, priv->gpu_bo))) &&
+ (region_inplace(sna, pixmap, region, priv) &&
+ (priv->gpu_bo == NULL || !kgem_bo_map_will_stall(&sna->kgem, priv->gpu_bo)))) &&
sna_put_image_upload_blt(drawable, gc, region,
x, y, w, h, bits, stride)) {
if (region_subsumes_drawable(region, &pixmap->drawable)) {
commit f85a853455249fd782e907ce1d78d11f75362def
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Dec 29 11:59:57 2011 +0000
sna: Only update the damage region as necesary for contains-box
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 02c125a..f2a5a93 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -1112,11 +1112,11 @@ static int _sna_damage_contains_box(struct sna_damage *damage,
if (!sna_damage_maybe_contains_box(damage, box))
return PIXMAN_REGION_OUT;
- if (damage->mode == DAMAGE_SUBTRACT)
- __sna_damage_reduce(damage);
-
ret = pixman_region_contains_rectangle(&damage->region, (BoxPtr)box);
- if (ret != PIXMAN_REGION_OUT || !damage->dirty)
+ if (!damage->dirty)
+ return ret;
+
+ if (damage->mode == DAMAGE_ADD && ret == PIXMAN_REGION_IN)
return ret;
__sna_damage_reduce(damage);
commit f53936407bd68f3d36ab525b4e0531fad58098e3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Dec 29 11:59:37 2011 +0000
sna: Reset the source counter upon dirtying the shadow pixmap
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 9c04e1d..04382e4 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -783,6 +783,7 @@ done:
list_move(&priv->list, &sna->dirty_pixmaps);
}
+ priv->source_count = SOURCE_BIAS;
priv->gpu = false;
return true;
}
@@ -1063,6 +1064,7 @@ done:
if (dx | dy)
RegionTranslate(region, -dx, -dy);
+ priv->source_count = SOURCE_BIAS;
priv->gpu = false;
return true;
}
@@ -1867,6 +1869,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
}
if (priv->flush)
list_move(&priv->list, &sna->dirty_pixmaps);
+ priv->source_count = SOURCE_BIAS;
blt:
get_drawable_deltas(drawable, pixmap, &dx, &dy);
@@ -9204,6 +9207,7 @@ sna_pixmap_free_gpu(struct sna *sna, struct sna_pixmap *priv)
pixmap->drawable.height);
sna_pixmap_destroy_gpu_bo(sna, priv);
+ priv->source_count = SOURCE_BIAS;
priv->gpu = false;
return true;
}
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index c859244..e7c3df4 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -337,7 +337,7 @@ move_to_gpu(PixmapPtr pixmap, const BoxRec *box)
count = SOURCE_BIAS;
priv = sna_pixmap(pixmap);
if (priv)
- count = ++priv->source_count;
+ count = priv->source_count++;
DBG(("%s: migrate box (%d, %d), (%d, %d)? source count=%d, fraction=%d/%d [%d]\n",
__FUNCTION__,
@@ -346,7 +346,7 @@ move_to_gpu(PixmapPtr pixmap, const BoxRec *box)
pixmap->drawable.width * pixmap->drawable.height,
pixmap->drawable.width * pixmap->drawable.height / (w*h)));
- return count*w*h >= pixmap->drawable.width * pixmap->drawable.height;
+ return count*w*h > pixmap->drawable.width * pixmap->drawable.height;
}
static Bool
More information about the xorg-commit
mailing list