xf86-video-intel: 3 commits - src/sna/sna_accel.c src/sna/sna_glyphs.c src/sna/sna.h src/sna/sna_io.c src/sna/sna_render.c src/sna/sna_tiling.c
Chris Wilson
ickle at kemper.freedesktop.org
Mon Mar 18 08:12:08 PDT 2013
src/sna/sna.h | 15 +++++++++++++++
src/sna/sna_accel.c | 15 ---------------
src/sna/sna_glyphs.c | 14 +++++++++++---
src/sna/sna_io.c | 15 ---------------
src/sna/sna_render.c | 3 +++
src/sna/sna_tiling.c | 15 ---------------
6 files changed, 29 insertions(+), 48 deletions(-)
New commits:
commit 308f0208de59620190dd3cb65b3243d2e8a7bd87
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Mar 18 15:04:22 2013 +0000
sna: Reset operation state between glyphs
We are not resetting sufficient state between operations as we presume
that all callers of Composite() currently pass in a blank state. In the
long run, we want to remove that burden and do a minimal initialisation.
References: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1156387
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 2f44113..3e2d79b 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -673,8 +673,6 @@ glyphs_slow(struct sna *sna,
if (NO_GLYPHS_SLOW)
return false;
- memset(&tmp, 0, sizeof(tmp));
-
DBG(("%s(op=%d, src=(%d, %d), nlist=%d, dst=(%d, %d)+(%d, %d))\n",
__FUNCTION__, op, src_x, src_y, nlist,
list->xOff, list->yOff, dst->pDrawable->x, dst->pDrawable->y));
@@ -740,7 +738,7 @@ glyphs_slow(struct sna *sna,
y - glyph->info.y,
glyph->info.width,
glyph->info.height,
- &tmp))
+ memset(&tmp, 0, sizeof(tmp))))
return false;
rects = REGION_RECTS(dst->pCompositeClip);
commit 4a37d57f9633bbd29f308239c1cd956767b277c0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Mar 18 15:00:01 2013 +0000
sna: Add a pair of sanity checks before creating the redirection target
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 6a2438f..2e29d95 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1873,6 +1873,8 @@ sna_render_composite_redirect(struct sna *sna,
int bpp = op->dst.pixmap->drawable.bitsPerPixel;
struct kgem_bo *bo;
+ assert(t->real_bo == NULL);
+
#if NO_REDIRECT
return false;
#endif
@@ -1954,6 +1956,7 @@ sna_render_composite_redirect(struct sna *sna,
t->real_bo = op->dst.bo;
t->real_damage = op->damage;
if (op->damage) {
+ assert(!DAMAGE_IS_ALL(op->damage));
t->damage = sna_damage_create();
op->damage = &t->damage;
}
commit 28371a34fa83f70a7af3c8d3bfd6c7cef9e35073
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Mar 18 14:49:58 2013 +0000
sna: Skip processing an all-clipped-out glyph
Along the slow path, skip all processing of glyphs that are not visible.
This is important as the slow path handles the per-glyph redirection
case, which is much more expensive.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index a244b97..13a5ce3 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -864,6 +864,21 @@ inline static bool is_clipped(const RegionRec *r,
r->extents.y2 - r->extents.y1 != d->height);
}
+inline static bool
+box_intersect(BoxPtr a, const BoxRec *b)
+{
+ if (a->x1 < b->x1)
+ a->x1 = b->x1;
+ if (a->x2 > b->x2)
+ a->x2 = b->x2;
+ if (a->y1 < b->y1)
+ a->y1 = b->y1;
+ if (a->y2 > b->y2)
+ a->y2 = b->y2;
+
+ return a->x1 < a->x2 && a->y1 < a->y2;
+}
+
unsigned sna_cpu_detect(void);
char *sna_cpu_features_to_string(unsigned features, char *line);
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index f654c1a..a2528f6 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4727,21 +4727,6 @@ typedef void (*sna_copy_func)(DrawablePtr src, DrawablePtr dst, GCPtr gc,
RegionPtr region, int dx, int dy,
Pixel bitPlane, void *closure);
-inline static bool
-box_intersect(BoxPtr a, const BoxRec *b)
-{
- if (a->x1 < b->x1)
- a->x1 = b->x1;
- if (a->x2 > b->x2)
- a->x2 = b->x2;
- if (a->y1 < b->y1)
- a->y1 = b->y1;
- if (a->y2 > b->y2)
- a->y2 = b->y2;
-
- return a->x1 < a->x2 && a->y1 < a->y2;
-}
-
static RegionPtr
sna_do_copy(DrawablePtr src, DrawablePtr dst, GCPtr gc,
int sx, int sy,
diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 3b1cf37..2f44113 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -692,11 +692,21 @@ glyphs_slow(struct sna *sna,
GlyphPtr glyph = *glyphs++;
struct sna_glyph priv;
BoxPtr rects;
+ BoxRec box;
int nrect;
if (!glyph_valid(glyph))
goto next_glyph;
+ box.x1 = x - glyph->info.x;
+ box.y1 = y - glyph->info.y;
+ box.x2 = bound(box.x1, glyph->info.width);
+ box.y2 = bound(box.y1, glyph->info.height);
+
+ if (!box_intersect(&box,
+ &dst->pCompositeClip->extents))
+ goto next_glyph;
+
priv = *sna_glyph(glyph);
if (priv.atlas == NULL) {
if (!glyph_cache(screen, &sna->render, glyph)) {
diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 41322ad..540f3a6 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -41,21 +41,6 @@
/* XXX Need to avoid using GTT fenced access for I915_TILING_Y on 855GM */
-static bool
-box_intersect(BoxPtr a, const BoxRec *b)
-{
- if (a->x1 < b->x1)
- a->x1 = b->x1;
- if (a->x2 > b->x2)
- a->x2 = b->x2;
- if (a->y1 < b->y1)
- a->y1 = b->y1;
- if (a->y2 > b->y2)
- a->y2 = b->y2;
-
- return a->x1 < a->x2 && a->y1 < a->y2;
-}
-
static inline bool upload_too_large(struct sna *sna, int width, int height)
{
return width * height * 4 > sna->kgem.max_upload_tile_size;
diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index 019b50a..02ab59d 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -795,21 +795,6 @@ done:
return ret;
}
-static bool
-box_intersect(BoxPtr a, const BoxRec *b)
-{
- if (a->x1 < b->x1)
- a->x1 = b->x1;
- if (a->x2 > b->x2)
- a->x2 = b->x2;
- if (a->y1 < b->y1)
- a->y1 = b->y1;
- if (a->y2 > b->y2)
- a->y2 = b->y2;
-
- return a->x1 < a->x2 && a->y1 < a->y2;
-}
-
bool
sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
More information about the xorg-commit
mailing list