summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-11-01 09:30:18 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-11-01 09:30:18 +0000
commit72bcd8f85c98502b13a67d9c606371afe513584c (patch)
tree99b922737b112c75ab027dddb57f5c79ceede8fd
parent4e363906a5ef15e1eb0a387cfb6b3445ac185b9d (diff)
sna: Try to reduce ping-pong migration for intermixed render/legacy code paths
References: https://bugs.freedesktop.org/show_bug.cgi?id=56591 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen2_render.c6
-rw-r--r--src/sna/gen3_render.c6
-rw-r--r--src/sna/gen4_render.c6
-rw-r--r--src/sna/gen5_render.c6
-rw-r--r--src/sna/gen6_render.c8
-rw-r--r--src/sna/gen7_render.c8
-rw-r--r--src/sna/sna_render_inline.h19
7 files changed, 31 insertions, 28 deletions
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 50126624..024b1076 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1614,7 +1614,6 @@ gen2_composite_fallback(struct sna *sna,
PicturePtr mask,
PicturePtr dst)
{
- struct sna_pixmap *priv;
PixmapPtr src_pixmap;
PixmapPtr mask_pixmap;
PixmapPtr dst_pixmap;
@@ -1653,8 +1652,7 @@ gen2_composite_fallback(struct sna *sna,
}
/* If anything is on the GPU, push everything out to the GPU */
- priv = sna_pixmap(dst_pixmap);
- if (priv && priv->gpu_damage && !priv->clear) {
+ if (dst_use_gpu(dst_pixmap)) {
DBG(("%s: dst is already on the GPU, try to use GPU\n",
__FUNCTION__));
return false;
@@ -1689,7 +1687,7 @@ gen2_composite_fallback(struct sna *sna,
if (too_large(dst_pixmap->drawable.width,
dst_pixmap->drawable.height) &&
- (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) {
+ dst_is_cpu(dst_pixmap)) {
DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__));
return true;
}
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 7c303f41..232d33fc 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2641,7 +2641,6 @@ gen3_composite_fallback(struct sna *sna,
PicturePtr mask,
PicturePtr dst)
{
- struct sna_pixmap *priv;
PixmapPtr src_pixmap;
PixmapPtr mask_pixmap;
PixmapPtr dst_pixmap;
@@ -2690,8 +2689,7 @@ gen3_composite_fallback(struct sna *sna,
}
/* If anything is on the GPU, push everything out to the GPU */
- priv = sna_pixmap(dst_pixmap);
- if (priv && priv->gpu_damage && !priv->clear) {
+ if (dst_use_gpu(dst_pixmap)) {
DBG(("%s: dst is already on the GPU, try to use GPU\n",
__FUNCTION__));
return false;
@@ -2726,7 +2724,7 @@ gen3_composite_fallback(struct sna *sna,
if (too_large(dst_pixmap->drawable.width,
dst_pixmap->drawable.height) &&
- (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) {
+ dst_is_cpu(dst_pixmap)) {
DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__));
return true;
}
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 8dc25d56..292018fe 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2119,7 +2119,6 @@ gen4_composite_fallback(struct sna *sna,
PicturePtr mask,
PicturePtr dst)
{
- struct sna_pixmap *priv;
PixmapPtr src_pixmap;
PixmapPtr mask_pixmap;
PixmapPtr dst_pixmap;
@@ -2158,8 +2157,7 @@ gen4_composite_fallback(struct sna *sna,
}
/* If anything is on the GPU, push everything out to the GPU */
- priv = sna_pixmap(dst_pixmap);
- if (priv && priv->gpu_damage && !priv->clear) {
+ if (dst_use_gpu(dst_pixmap)) {
DBG(("%s: dst is already on the GPU, try to use GPU\n",
__FUNCTION__));
return false;
@@ -2194,7 +2192,7 @@ gen4_composite_fallback(struct sna *sna,
if (too_large(dst_pixmap->drawable.width,
dst_pixmap->drawable.height) &&
- (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) {
+ dst_is_cpu(dst_pixmap)) {
DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__));
return true;
}
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 5d559377..79431c4b 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2130,7 +2130,6 @@ gen5_composite_fallback(struct sna *sna,
PicturePtr mask,
PicturePtr dst)
{
- struct sna_pixmap *priv;
PixmapPtr src_pixmap;
PixmapPtr mask_pixmap;
PixmapPtr dst_pixmap;
@@ -2169,8 +2168,7 @@ gen5_composite_fallback(struct sna *sna,
}
/* If anything is on the GPU, push everything out to the GPU */
- priv = sna_pixmap(dst_pixmap);
- if (priv && priv->gpu_damage && !priv->clear) {
+ if (dst_use_gpu(dst_pixmap)) {
DBG(("%s: dst is already on the GPU, try to use GPU\n",
__FUNCTION__));
return false;
@@ -2205,7 +2203,7 @@ gen5_composite_fallback(struct sna *sna,
if (too_large(dst_pixmap->drawable.width,
dst_pixmap->drawable.height) &&
- (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) {
+ dst_is_cpu(dst_pixmap)) {
DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__));
return true;
}
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index fd7f2958..a2487496 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2487,7 +2487,6 @@ gen6_composite_fallback(struct sna *sna,
PicturePtr mask,
PicturePtr dst)
{
- struct sna_pixmap *priv;
PixmapPtr src_pixmap;
PixmapPtr mask_pixmap;
PixmapPtr dst_pixmap;
@@ -2526,10 +2525,7 @@ gen6_composite_fallback(struct sna *sna,
}
/* If anything is on the GPU, push everything out to the GPU */
- priv = sna_pixmap(dst_pixmap);
- if (priv &&
- ((priv->gpu_damage && !priv->clear) ||
- (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo)))) {
+ if (dst_use_gpu(dst_pixmap)) {
DBG(("%s: dst is already on the GPU, try to use GPU\n",
__FUNCTION__));
return false;
@@ -2564,7 +2560,7 @@ gen6_composite_fallback(struct sna *sna,
if (too_large(dst_pixmap->drawable.width,
dst_pixmap->drawable.height) &&
- (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) {
+ dst_is_cpu(dst_pixmap)) {
DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__));
return true;
}
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index c3639f61..888c707d 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2604,7 +2604,6 @@ gen7_composite_fallback(struct sna *sna,
PicturePtr mask,
PicturePtr dst)
{
- struct sna_pixmap *priv;
PixmapPtr src_pixmap;
PixmapPtr mask_pixmap;
PixmapPtr dst_pixmap;
@@ -2643,10 +2642,7 @@ gen7_composite_fallback(struct sna *sna,
}
/* If anything is on the GPU, push everything out to the GPU */
- priv = sna_pixmap(dst_pixmap);
- if (priv &&
- ((priv->gpu_damage && !priv->clear) ||
- (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo)))) {
+ if (dst_use_gpu(dst_pixmap)) {
DBG(("%s: dst is already on the GPU, try to use GPU\n",
__FUNCTION__));
return false;
@@ -2681,7 +2677,7 @@ gen7_composite_fallback(struct sna *sna,
if (too_large(dst_pixmap->drawable.width,
dst_pixmap->drawable.height) &&
- (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage))) {
+ dst_is_cpu(dst_pixmap)) {
DBG(("%s: dst is on the CPU and too large\n", __FUNCTION__));
return true;
}
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 750faf54..2468b891 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -220,4 +220,23 @@ color_convert(uint32_t pixel,
return pixel;
}
+inline static bool dst_use_gpu(PixmapPtr pixmap)
+{
+ struct sna_pixmap *priv = sna_pixmap(pixmap);
+ if (priv == NULL)
+ return false;
+
+ if (priv->gpu_damage && !priv->clear &&
+ (!priv->cpu || !priv->cpu_damage || kgem_bo_is_busy(priv->gpu_bo)))
+ return true;
+
+ return priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo);
+}
+
+inline static bool dst_is_cpu(PixmapPtr pixmap)
+{
+ struct sna_pixmap *priv = sna_pixmap(pixmap);
+ return priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage);
+}
+
#endif /* SNA_RENDER_INLINE_H */