summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-14 23:21:29 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-15 09:48:52 +0000
commitea299f2523d5adeca84274bb7003cde8ec743a44 (patch)
tree8ee9f58b419bcad9fca5e998f074d9d9e21f5e8c
parent007da2f97894814eaded4d24e0481f950ca7bd00 (diff)
sna/gen3: Check reused source for validity
Be sure the mask picture has a valid format even though it points to the same pixels as the valid source. And also be wary if the source was converted to a solid, but the mask is not. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen3_render.c66
1 files changed, 61 insertions, 5 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index a3db4bb1..cd59a089 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -281,6 +281,56 @@ static uint32_t gen3_get_dst_format(uint32_t format)
#undef BIAS
}
+static Bool gen3_check_format(PicturePtr p)
+{
+ switch (p->format) {
+ case PICT_a8:
+ case PICT_a8r8g8b8:
+ case PICT_x8r8g8b8:
+ case PICT_a8b8g8r8:
+ case PICT_x8b8g8r8:
+ case PICT_a2r10g10b10:
+ case PICT_a2b10g10r10:
+ case PICT_r5g6b5:
+ case PICT_b5g6r5:
+ case PICT_a1r5g5b5:
+ case PICT_a1b5g5r5:
+ case PICT_a4r4g4b4:
+ case PICT_a4b4g4r4:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+static Bool gen3_check_xformat(PicturePtr p)
+{
+ switch (p->format) {
+ case PICT_a8r8g8b8:
+ case PICT_x8r8g8b8:
+ case PICT_a8b8g8r8:
+ case PICT_x8b8g8r8:
+ case PICT_r5g6b5:
+ case PICT_b5g6r5:
+ case PICT_a1r5g5b5:
+ case PICT_x1r5g5b5:
+ case PICT_a1b5g5r5:
+ case PICT_x1b5g5r5:
+ case PICT_a2r10g10b10:
+ case PICT_x2r10g10b10:
+ case PICT_a2b10g10r10:
+ case PICT_x2b10g10r10:
+ case PICT_a8:
+ case PICT_a4r4g4b4:
+ case PICT_x4r4g4b4:
+ case PICT_a4b4g4r4:
+ case PICT_x4b4g4r4:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
static uint32_t gen3_texture_repeat(uint32_t repeat)
{
#define REPEAT(x) \
@@ -353,9 +403,9 @@ static uint32_t gen3_filter(uint32_t filter)
}
}
-static bool gen3_check_filter(uint32_t filter)
+static bool gen3_check_filter(PicturePtr p)
{
- switch (filter) {
+ switch (p->filter) {
case PictFilterNearest:
case PictFilterBilinear:
return TRUE;
@@ -2153,7 +2203,7 @@ gen3_composite_picture(struct sna *sna,
return sna_render_picture_fixup(sna, picture, channel,
x, y, w, h, dst_x, dst_y);
- if (!gen3_check_filter(picture->filter))
+ if (!gen3_check_filter(picture))
return sna_render_picture_fixup(sna, picture, channel,
x, y, w, h, dst_x, dst_y);
@@ -2354,7 +2404,7 @@ has_alphamap(PicturePtr p)
static bool
source_fallback(PicturePtr p)
{
- return has_alphamap(p) || !gen3_check_filter(p->filter) || !gen3_check_repeat(p);
+ return has_alphamap(p) || !gen3_check_xformat(p) || !gen3_check_filter(p) || !gen3_check_repeat(p);
}
static bool
@@ -2465,6 +2515,9 @@ reuse_source(struct sna *sna,
if ((src->pDrawable == NULL || mask->pDrawable != src->pDrawable))
return FALSE;
+ if (sc->is_solid)
+ return FALSE;
+
DBG(("%s: mask reuses source drawable\n", __FUNCTION__));
if (!sna_transform_equal(src->transform, mask->transform))
@@ -2476,7 +2529,10 @@ reuse_source(struct sna *sna,
if (!gen3_check_repeat(mask))
return FALSE;
- if (!gen3_check_filter(mask->filter))
+ if (!gen3_check_filter(mask))
+ return FALSE;
+
+ if (!gen3_check_format(mask))
return FALSE;
DBG(("%s: reusing source channel for mask with a twist\n",