xf86-video-intel: 3 commits - src/sna/sna_accel.c src/sna/sna_damage.c src/sna/sna_damage.h
Chris Wilson
ickle at kemper.freedesktop.org
Mon Nov 14 04:21:09 PST 2011
src/sna/sna_accel.c | 37 +++++++++++++++++--------------------
src/sna/sna_damage.c | 34 +++++++++++++++++-----------------
src/sna/sna_damage.h | 29 ++++++++++++++++++++++++-----
3 files changed, 58 insertions(+), 42 deletions(-)
New commits:
commit 99338ebe61917a07611cbc81cfaf70c0ec905014
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Nov 14 12:04:49 2011 +0000
sna: Check whether damage can be reduced to all-damage on moving to GPU
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 9fd5acc..ac76525 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -712,8 +712,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
assert(priv->gpu);
assert(priv->gpu_bo);
- sna_damage_reduce(&priv->cpu_damage,
- pixmap->drawable.width, pixmap->drawable.height);
+ sna_damage_reduce(&priv->cpu_damage);
DBG(("%s: CPU damage? %d\n", __FUNCTION__, priv->cpu_damage != NULL));
if (priv->cpu_damage == NULL)
@@ -1008,8 +1007,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap)
if (priv == NULL)
return NULL;
- sna_damage_reduce(&priv->cpu_damage,
- pixmap->drawable.width, pixmap->drawable.height);
+ sna_damage_reduce(&priv->cpu_damage);
DBG(("%s: CPU damage? %d\n", __FUNCTION__, priv->cpu_damage != NULL));
if (priv->gpu_bo == NULL) {
@@ -1069,9 +1067,10 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap)
__sna_damage_destroy(priv->cpu_damage);
priv->cpu_damage = NULL;
- sna_damage_reduce(&priv->gpu_damage,
- pixmap->drawable.width, pixmap->drawable.height);
+ sna_damage_reduce(&priv->gpu_damage);
done:
+ sna_damage_reduce_all(&priv->gpu_damage,
+ pixmap->drawable.width, pixmap->drawable.height);
list_del(&priv->list);
priv->gpu = true;
return priv;
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 2d7d65d..95a92a5 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -1242,10 +1242,9 @@ static int _sna_damage_get_boxes(struct sna_damage *damage, BoxPtr *boxes)
return REGION_NUM_RECTS(&damage->region);
}
-struct sna_damage *_sna_damage_reduce(struct sna_damage *damage,
- int width, int height)
+struct sna_damage *_sna_damage_reduce(struct sna_damage *damage)
{
- DBG(("%s(width=%d, height=%d)\n", __FUNCTION__, width, height));
+ DBG(("%s\n", __FUNCTION__));
if (damage->n)
__sna_damage_reduce(damage);
@@ -1253,13 +1252,6 @@ struct sna_damage *_sna_damage_reduce(struct sna_damage *damage,
if (!pixman_region_not_empty(&damage->region)) {
__sna_damage_destroy(damage);
damage = NULL;
- } else {
- if (damage->region.data == NULL &&
- damage->extents.x1 <= 0 &&
- damage->extents.y1 <= 0 &&
- damage->extents.x2 >= width &&
- damage->extents.y2 >= height)
- damage = _sna_damage_all(damage, width, height);
}
return damage;
diff --git a/src/sna/sna_damage.h b/src/sna/sna_damage.h
index c62e831..7fc6d02 100644
--- a/src/sna/sna_damage.h
+++ b/src/sna/sna_damage.h
@@ -127,15 +127,34 @@ int sna_damage_contains_box(struct sna_damage *damage,
int sna_damage_get_boxes(struct sna_damage *damage, BoxPtr *boxes);
-struct sna_damage *_sna_damage_reduce(struct sna_damage *damage,
- int width, int height);
-static inline void sna_damage_reduce(struct sna_damage **damage,
- int width, int height)
+struct sna_damage *_sna_damage_reduce(struct sna_damage *damage);
+static inline void sna_damage_reduce(struct sna_damage **damage)
{
if (*damage == NULL)
return;
- *damage = _sna_damage_reduce(*damage, width, height);
+ if ((*damage)->mode != DAMAGE_ALL)
+ *damage = _sna_damage_reduce(*damage);
+}
+
+static inline void sna_damage_reduce_all(struct sna_damage **damage,
+ int width, int height)
+{
+ DBG(("%s(width=%d, height=%d)\n", __FUNCTION__, width, height));
+
+ if (*damage == NULL)
+ return;
+
+ if ((*damage)->mode == DAMAGE_ADD &&
+ (*damage)->extents.x1 <= 0 &&
+ (*damage)->extents.y1 <= 0 &&
+ (*damage)->extents.x2 >= width &&
+ (*damage)->extents.y2 >= height) {
+ if ((*damage)->n)
+ *damage = _sna_damage_reduce(*damage);
+ if ((*damage)->region.data == NULL)
+ *damage = _sna_damage_all(*damage, width, height);
+ }
}
void __sna_damage_destroy(struct sna_damage *damage);
commit 00d1c539e4b69636bfc35c0c47a6f1db3a33e731
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Nov 14 11:19:42 2011 +0000
sna/damage: Add a little more verbosity to debugging
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 73fca8f..9fd5acc 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1370,6 +1370,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
kgem_bo_sync(&sna->kgem, priv->cpu_bo, true);
if (region_subsumes_drawable(region, &pixmap->drawable)) {
+ DBG(("%s: replacing entire pixmap\n", __FUNCTION__));
sna_damage_all(&priv->cpu_damage,
pixmap->drawable.width,
pixmap->drawable.height);
@@ -1380,8 +1381,10 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
sna_damage_add(&priv->cpu_damage, region);
if (sna_damage_is_all(&priv->cpu_damage,
pixmap->drawable.width,
- pixmap->drawable.height))
+ pixmap->drawable.height)) {
+ DBG(("%s: replaced entire pixmap\n", __FUNCTION__));
sna_pixmap_destroy_gpu_bo(sna, priv);
+ }
}
if (priv->flush)
list_move(&priv->list, &sna->dirty_pixmaps);
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 03bb881..2d7d65d 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -121,13 +121,21 @@ static const char *_debug_describe_damage(char *buf, int max,
if (str_max > sizeof(damage_str))
str_max = sizeof(damage_str);
- sprintf(damage_str, "[%d : ...]", damage->n);
- snprintf(buf, max, "[[(%d, %d), (%d, %d)]: %s + %s]",
- damage->extents.x1, damage->extents.y1,
- damage->extents.x2, damage->extents.y2,
- _debug_describe_region(region_str, str_max,
- &damage->region),
- damage_str);
+ if (damage->mode == DAMAGE_ALL) {
+ snprintf(buf, max, "[[(%d, %d), (%d, %d)]: all]",
+ damage->extents.x1, damage->extents.y1,
+ damage->extents.x2, damage->extents.y2);
+ assert(damage->n == 0);
+ } else {
+ sprintf(damage_str, "[%d : ...]", damage->n);
+ snprintf(buf, max, "[[(%d, %d), (%d, %d)]: %s %c %s]",
+ damage->extents.x1, damage->extents.y1,
+ damage->extents.x2, damage->extents.y2,
+ _debug_describe_region(region_str, str_max,
+ &damage->region),
+ damage->mode == DAMAGE_SUBTRACT ? '-' : '+',
+ damage_str);
+ }
return buf;
}
commit 60c0fc101adbc457a7c1927602175f8079175e10
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Nov 14 11:12:47 2011 +0000
sna: Refactor some common code into the common destroy-gpu-bo function
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 4d4d408..73fca8f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -164,8 +164,12 @@ sna_copy_init_blt(struct sna_copy_op *copy,
static void sna_pixmap_destroy_gpu_bo(struct sna *sna, struct sna_pixmap *priv)
{
- kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
- priv->gpu_bo = NULL;
+ sna_damage_destroy(&priv->gpu_damage);
+
+ if (priv->gpu_bo && !priv->pinned) {
+ kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
+ priv->gpu_bo = NULL;
+ }
/* and reset the upload counter */
priv->source_count = SOURCE_BIAS;
@@ -526,9 +530,7 @@ done:
sna_damage_all(&priv->cpu_damage,
pixmap->drawable.width,
pixmap->drawable.height);
-
- if (priv->gpu_bo && !priv->pinned)
- sna_pixmap_destroy_gpu_bo(sna, priv);
+ sna_pixmap_destroy_gpu_bo(sna, priv);
if (priv->flush)
list_move(&priv->list, &sna->dirty_pixmaps);
@@ -1368,23 +1370,18 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
kgem_bo_sync(&sna->kgem, priv->cpu_bo, true);
if (region_subsumes_drawable(region, &pixmap->drawable)) {
- sna_damage_destroy(&priv->gpu_damage);
sna_damage_all(&priv->cpu_damage,
pixmap->drawable.width,
pixmap->drawable.height);
- if (priv->gpu_bo && !priv->pinned)
- sna_pixmap_destroy_gpu_bo(sna, priv);
+ sna_pixmap_destroy_gpu_bo(sna, priv);
} else {
assert_pixmap_contains_box(pixmap, RegionExtents(region));
sna_damage_subtract(&priv->gpu_damage, region);
sna_damage_add(&priv->cpu_damage, region);
if (sna_damage_is_all(&priv->cpu_damage,
pixmap->drawable.width,
- pixmap->drawable.height)) {
- sna_damage_destroy(&priv->gpu_damage);
- if (priv->gpu_bo && !priv->pinned)
- sna_pixmap_destroy_gpu_bo(sna, priv);
- }
+ pixmap->drawable.height))
+ sna_pixmap_destroy_gpu_bo(sna, priv);
}
if (priv->flush)
list_move(&priv->list, &sna->dirty_pixmaps);
@@ -2130,12 +2127,10 @@ fallback:
if (dst_priv) {
if (alu == GXcopy) {
if (replaces) {
- sna_damage_destroy(&dst_priv->gpu_damage);
sna_damage_all(&dst_priv->cpu_damage,
dst_pixmap->drawable.width,
dst_pixmap->drawable.height);
- if (dst_priv->gpu_bo && !dst_priv->pinned)
- sna_pixmap_destroy_gpu_bo(sna, dst_priv);
+ sna_pixmap_destroy_gpu_bo(sna, dst_priv);
} else {
assert_pixmap_contains_box(dst_pixmap,
RegionExtents(®ion));
More information about the xorg-commit
mailing list