xf86-video-intel: 3 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_gradient.c src/sna/sna_render.h
Chris Wilson
ickle at kemper.freedesktop.org
Sat Dec 29 08:16:57 PST 2012
src/sna/gen4_render.c | 8 ++++
src/sna/gen5_render.c | 8 ++++
src/sna/gen6_render.c | 8 ++++
src/sna/gen7_render.c | 8 ++++
src/sna/kgem.c | 19 ++++++-----
src/sna/kgem.h | 9 +++--
src/sna/sna_gradient.c | 80 ++++++++++++++++++++++++++++++++++++-------------
src/sna/sna_render.h | 2 -
8 files changed, 110 insertions(+), 32 deletions(-)
New commits:
commit 1c2ece369177ea6c3fd2f254b2554ceadf5590de
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Dec 29 15:53:23 2012 +0000
sna/gen4+: Try using the BLT before doing a tiled copy
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 84d7853..3486e08 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2478,6 +2478,14 @@ fallback_tiled_dst:
if (tmp.redirect.real_bo)
kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
fallback_tiled:
+ if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+ sna_blt_copy_boxes(sna, alu,
+ src_bo, src_dx, src_dy,
+ dst_bo, dst_dx, dst_dy,
+ dst->drawable.bitsPerPixel,
+ box, n))
+ return true;
+
return sna_tiling_copy_boxes(sna, alu,
src, src_bo, src_dx, src_dy,
dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 34cfd0e..5b48537 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2443,6 +2443,14 @@ fallback_tiled_dst:
if (tmp.redirect.real_bo)
kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
fallback_tiled:
+ if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+ sna_blt_copy_boxes(sna, alu,
+ src_bo, src_dx, src_dy,
+ dst_bo, dst_dx, dst_dy,
+ dst->drawable.bitsPerPixel,
+ box, n))
+ return true;
+
return sna_tiling_copy_boxes(sna, alu,
src, src_bo, src_dx, src_dy,
dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 0c55a2d..dd8f0dc 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2897,6 +2897,14 @@ fallback_tiled_dst:
if (tmp.redirect.real_bo)
kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
fallback_tiled:
+ if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+ sna_blt_copy_boxes(sna, alu,
+ src_bo, src_dx, src_dy,
+ dst_bo, dst_dx, dst_dy,
+ dst->drawable.bitsPerPixel,
+ box, n))
+ return true;
+
return sna_tiling_copy_boxes(sna, alu,
src, src_bo, src_dx, src_dy,
dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index d1ab2e3..edab5db 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2990,6 +2990,14 @@ fallback_tiled_dst:
if (tmp.redirect.real_bo)
kgem_bo_destroy(&sna->kgem, tmp.dst.bo);
fallback_tiled:
+ if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
+ sna_blt_copy_boxes(sna, alu,
+ src_bo, src_dx, src_dy,
+ dst_bo, dst_dx, dst_dy,
+ dst->drawable.bitsPerPixel,
+ box, n))
+ return true;
+
return sna_tiling_copy_boxes(sna, alu,
src, src_bo, src_dx, src_dy,
dst, dst_bo, dst_dx, dst_dy,
commit 09ca8feb3455c979e799ddf26daae8f2de2813e1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Dec 29 15:42:02 2012 +0000
sna: Move the primary color cache into the alpha cache
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index 5f06fbc..c437b27 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -260,11 +260,8 @@ sna_render_finish_solid(struct sna *sna, bool force)
old = NULL;
}
- cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
- 0, sizeof(uint32_t));
- cache->bo[0]->pitch = 4;
if (force)
- cache->size = 1;
+ cache->size = 0;
if (old)
kgem_bo_destroy(&sna->kgem, old);
@@ -283,7 +280,38 @@ sna_render_get_solid(struct sna *sna, uint32_t color)
if (color == 0xffffffff) {
DBG(("%s(white)\n", __FUNCTION__));
- return kgem_bo_reference(cache->bo[0]);
+ return kgem_bo_reference(sna->render.alpha_cache.bo[255+7]);
+ }
+
+ if ((color >> 24) == 0xff) {
+ int v = 0;
+
+ if (((color >> 16) & 0xff) == 0)
+ v |= 0;
+ else if (((color >> 16) & 0xff) == 0xff)
+ v |= 1 << 2;
+ else
+ v = -1;
+
+ if (((color >> 8) & 0xff) == 0)
+ v |= 0;
+ else if (((color >> 8) & 0xff) == 0xff)
+ v |= 1 << 1;
+ else
+ v = -1;
+
+ if (((color >> 0) & 0xff) == 0)
+ v |= 0;
+ else if (((color >> 0) & 0xff) == 0xff)
+ v |= 1 << 0;
+ else
+ v = -1;
+
+ if (v >= 0) {
+ DBG(("%s(primary (%d,%d,%d): %d)\n",
+ __FUNCTION__, v & 4, v & 2, v & 1, v));
+ return kgem_bo_reference(sna->render.alpha_cache.bo[255+v]);
+ }
}
if (cache->color[cache->last] == color) {
@@ -292,7 +320,7 @@ sna_render_get_solid(struct sna *sna, uint32_t color)
return kgem_bo_reference(cache->bo[cache->last]);
}
- for (i = 1; i < cache->size; i++) {
+ for (i = 0; i < cache->size; i++) {
if (cache->color[i] == color) {
if (cache->bo[i] == NULL) {
DBG(("sna_render_get_solid(%d) = %x (recreate)\n",
@@ -326,7 +354,7 @@ done:
static bool sna_alpha_cache_init(struct sna *sna)
{
struct sna_alpha_cache *cache = &sna->render.alpha_cache;
- uint32_t color[256];
+ uint32_t color[256 + 7];
int i;
DBG(("%s\n", __FUNCTION__));
@@ -346,6 +374,28 @@ static bool sna_alpha_cache_init(struct sna *sna)
cache->bo[i]->pitch = 4;
}
+
+ /* primary */
+ for (i = 1; i < 8; i++) {
+ int j = 255+i;
+
+ color[j] = 0xff << 24;
+ if (i & 1)
+ color[j] |= 0xff << 0;
+ if (i & 2)
+ color[j] |= 0xff << 8;
+ if (i & 4)
+ color[j] |= 0xff << 16;
+ cache->bo[j] = kgem_create_proxy(&sna->kgem,
+ cache->cache_bo,
+ sizeof(uint32_t)*j,
+ sizeof(uint32_t));
+ if (cache->bo[j] == NULL)
+ return false;
+
+ cache->bo[j]->pitch = 4;
+ }
+
return kgem_bo_write(&sna->kgem, cache->cache_bo, color, sizeof(color));
}
@@ -360,19 +410,9 @@ static bool sna_solid_cache_init(struct sna *sna)
if (!cache->cache_bo)
return false;
- /*
- * Initialise [0] with white since it is very common and filling the
- * zeroth slot simplifies some of the checks.
- */
- cache->color[0] = 0xffffffff;
- cache->bo[0] = kgem_create_proxy(&sna->kgem, cache->cache_bo,
- 0, sizeof(uint32_t));
- if (cache->bo[0] == NULL)
- return false;
-
- cache->bo[0]->pitch = 4;
- cache->dirty = 1;
- cache->size = 1;
+ cache->color[0] = 0;
+ cache->dirty = 0;
+ cache->size = 0;
cache->last = 0;
return true;
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index d116e40..2f44479 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -254,7 +254,7 @@ struct sna_render {
struct sna_alpha_cache {
struct kgem_bo *cache_bo;
- struct kgem_bo *bo[256];
+ struct kgem_bo *bo[256+7];
} alpha_cache;
struct sna_solid_cache {
commit 8c56c9b1da9e078bd5b7ff4ebc5d8b23f593d500
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Dec 29 14:14:41 2012 +0000
sna: Allow a flush to occur before batching a flush-bo
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 1e8d656..21d5d1c 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -3929,19 +3929,19 @@ bool kgem_check_bo(struct kgem *kgem, ...)
struct kgem_bo *bo;
int num_exec = 0;
int num_pages = 0;
+ bool flush = false;
va_start(ap, kgem);
while ((bo = va_arg(ap, struct kgem_bo *))) {
+ while (bo->proxy)
+ bo = bo->proxy;
if (bo->exec)
continue;
- while (bo->proxy) {
- bo = bo->proxy;
- if (bo->exec)
- continue;
- }
num_pages += num_pages(bo);
num_exec++;
+
+ flush |= bo->flush;
}
va_end(ap);
@@ -3951,7 +3951,7 @@ bool kgem_check_bo(struct kgem *kgem, ...)
if (!num_pages)
return true;
- if (kgem_flush(kgem))
+ if (kgem_flush(kgem, flush))
return false;
if (kgem->aperture > kgem->aperture_low &&
@@ -4002,7 +4002,7 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
return true;
}
- if (kgem_flush(kgem))
+ if (kgem_flush(kgem, bo->flush))
return false;
if (kgem->nexec >= KGEM_EXEC_SIZE(kgem) - 1)
@@ -4040,6 +4040,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
int num_exec = 0;
int num_pages = 0;
int fenced_size = 0;
+ bool flush = false;
va_start(ap, kgem);
while ((bo = va_arg(ap, struct kgem_bo *))) {
@@ -4063,6 +4064,8 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
fenced_size += kgem_bo_fenced_size(kgem, bo);
num_fence++;
}
+
+ flush |= bo->flush;
}
va_end(ap);
@@ -4079,7 +4082,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
}
if (num_pages) {
- if (kgem_flush(kgem))
+ if (kgem_flush(kgem, flush))
return false;
if (kgem->aperture > kgem->aperture_low &&
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index cc4ef6a..bf45793 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -302,9 +302,12 @@ static inline void kgem_submit(struct kgem *kgem)
_kgem_submit(kgem);
}
-static inline bool kgem_flush(struct kgem *kgem)
+static inline bool kgem_flush(struct kgem *kgem, bool flush)
{
- return kgem->flush && kgem_ring_is_idle(kgem, kgem->ring);
+ if (kgem->nexec == 0)
+ return false;
+
+ return (kgem->flush ^ flush) && kgem_ring_is_idle(kgem, kgem->ring);
}
static inline void kgem_bo_submit(struct kgem *kgem, struct kgem_bo *bo)
@@ -571,7 +574,7 @@ static inline bool __kgem_bo_is_busy(struct kgem *kgem, struct kgem_bo *bo)
DBG(("%s: handle=%d, domain: %d exec? %d, rq? %d\n", __FUNCTION__,
bo->handle, bo->domain, bo->exec != NULL, bo->rq != NULL));
assert(bo->refcnt);
- if (kgem_flush(kgem))
+ if (kgem_flush(kgem, bo->flush))
kgem_submit(kgem);
if (bo->rq && !bo->exec)
kgem_retire(kgem);
More information about the xorg-commit
mailing list