diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-06-24 13:32:45 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-06-24 13:35:22 +0100 |
commit | 471115a9806162bf0cafe27947f49d94fdd63d87 (patch) | |
tree | ed2b4d3632b689d419f96e9c26039ed97f71bf0a | |
parent | c3b1a0d7046a83b6daec03e5a562116e3adf3c71 (diff) |
sna: Also allow BLT copies to discard the alpha channel
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/gen3_render.c | 12 | ||||
-rw-r--r-- | src/sna/gen4_render.c | 12 | ||||
-rw-r--r-- | src/sna/gen5_render.c | 8 | ||||
-rw-r--r-- | src/sna/gen6_render.c | 12 | ||||
-rw-r--r-- | src/sna/sna_blt.c | 3 | ||||
-rw-r--r-- | src/sna/sna_render.c | 7 | ||||
-rw-r--r-- | src/sna/sna_render_inline.h | 17 |
7 files changed, 45 insertions, 26 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c index 37eb6c2e..92edc721 100644 --- a/src/sna/gen3_render.c +++ b/src/sna/gen3_render.c @@ -3254,7 +3254,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu, struct sna_composite_op tmp; #if NO_COPY_BOXES - if (src->drawable.depth != dst->drawable->depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -3267,7 +3267,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu, DBG(("%s (%d, %d)->(%d, %d) x %d\n", __FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n)); - if (src->drawable.depth == dst->drawable.depth && + 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, @@ -3283,7 +3283,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu, dst_bo->pitch > 8192 || dst->drawable.width > 2048 || dst->drawable.height > 2048) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -3399,7 +3399,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu, struct sna_copy_op *tmp) { #if NO_COPY - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy(sna, alu, @@ -3410,7 +3410,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu, /* Prefer to use the BLT */ if (sna->kgem.mode == KGEM_BLT && - src->drawable.depth == dst->drawable.depth && + sna_blt_compare_depth(&src->drawable, &dst->drawable) && sna_blt_copy(sna, alu, src_bo, dst_bo, dst->drawable.bitsPerPixel, @@ -3422,7 +3422,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu, src->drawable.width > 2048 || src->drawable.height > 2048 || dst->drawable.width > 2048 || dst->drawable.height > 2048 || src_bo->pitch > 8192 || dst_bo->pitch > 8192) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy(sna, alu, src_bo, dst_bo, diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c index bb84de76..1037deb3 100644 --- a/src/sna/gen4_render.c +++ b/src/sna/gen4_render.c @@ -2150,7 +2150,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu, struct sna_composite_op tmp; #if NO_COPY_BOXES - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -2161,7 +2161,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu, #endif if (prefer_blt(sna) && - src->drawable.depth == dst->drawable.depth && + 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, @@ -2172,7 +2172,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu, if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo || src->drawable.width > 8192 || src->drawable.height > 8192 || dst->drawable.width > 8192 || dst->drawable.height > 8192) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -2257,7 +2257,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu, struct sna_copy_op *op) { #if NO_COPY - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy(sna, alu, @@ -2267,7 +2267,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu, #endif if (prefer_blt(sna) && - src->drawable.depth == dst->drawable.depth && + sna_blt_compare_depth(&src->drawable, &dst->drawable) && sna_blt_copy(sna, alu, src_bo, dst_bo, dst->drawable.bitsPerPixel, @@ -2277,7 +2277,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu, if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo || src->drawable.width > 8192 || src->drawable.height > 8192 || dst->drawable.width > 8192 || dst->drawable.height > 8192) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy(sna, alu, src_bo, dst_bo, diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c index 858a2f6b..a029d181 100644 --- a/src/sna/gen5_render.c +++ b/src/sna/gen5_render.c @@ -2099,7 +2099,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu, struct sna_composite_op tmp; if (sna->kgem.mode == KGEM_BLT && - src->drawable.depth == dst->drawable.depth && + 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, @@ -2110,7 +2110,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu, if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo || src->drawable.width > 8192 || src->drawable.height > 8192 || dst->drawable.width > 8192 || dst->drawable.height > 8192) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -2241,7 +2241,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu, DBG(("%s (alu=%d)\n", __FUNCTION__, alu)); if (sna->kgem.mode == KGEM_BLT && - src->drawable.depth == dst->drawable.depth && + sna_blt_compare_depth(&src->drawable, &dst->drawable) && sna_blt_copy(sna, alu, src_bo, dst_bo, dst->drawable.bitsPerPixel, @@ -2251,7 +2251,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu, if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo || src->drawable.width > 8192 || src->drawable.height > 8192 || dst->drawable.width > 8192 || dst->drawable.height > 8192) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy(sna, alu, src_bo, dst_bo, diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index b6d99736..2f0879e7 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -2289,7 +2289,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu, struct sna_composite_op tmp; #if NO_COPY_BOXES - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -2304,7 +2304,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu, src_bo == dst_bo)); if (sna->kgem.mode == KGEM_BLT && - src->drawable.depth == dst->drawable.depth && + 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, @@ -2315,7 +2315,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu, if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo || src->drawable.width > 8192 || src->drawable.height > 8192 || dst->drawable.width > 8192 || dst->drawable.height > 8192) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -2444,7 +2444,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu, struct sna_copy_op *op) { #if NO_COPY - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy(sna, alu, @@ -2459,7 +2459,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu, dst->drawable.width, dst->drawable.height)); if (sna->kgem.mode == KGEM_BLT && - src->drawable.depth == dst->drawable.depth && + sna_blt_compare_depth(&src->drawable, &dst->drawable) && sna_blt_copy(sna, alu, src_bo, dst_bo, dst->drawable.bitsPerPixel, @@ -2469,7 +2469,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu, if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo || src->drawable.width > 8192 || src->drawable.height > 8192 || dst->drawable.width > 8192 || dst->drawable.height > 8192) { - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy(sna, alu, src_bo, dst_bo, diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index 38b9113e..c8bf92ff 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -34,6 +34,7 @@ #include "sna.h" #include "sna_render.h" +#include "sna_render_inline.h" #include "sna_reg.h" #include <mipict.h> @@ -977,7 +978,7 @@ sna_blt_composite(struct sna *sna, return FALSE; } - if (src->pDrawable->depth != dst->pDrawable->depth) { + if (!sna_blt_compare_depth(src->pDrawable, dst->pDrawable)) { DBG(("%s: mismatching depth src=%d/%d, dst=%d/%d\n", __FUNCTION__, src->pDrawable->depth, src->pDrawable->bitsPerPixel, diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c index 58e9f206..21afd26e 100644 --- a/src/sna/sna_render.c +++ b/src/sna/sna_render.c @@ -27,6 +27,7 @@ #include "sna.h" #include "sna_render.h" +#include "sna_render_inline.h" #include <fb.h> @@ -51,7 +52,7 @@ sna_format_for_depth(int depth) case 8: return PICT_a8; case 15: return PICT_x1r5g5b5; case 16: return PICT_r5g6b5; - default: + default: assert(0); case 24: return PICT_x8r8g8b8; case 30: return PICT_x2r10g10b10; case 32: return PICT_a8r8g8b8; @@ -92,7 +93,7 @@ no_render_copy_boxes(struct sna *sna, uint8_t alu, { DBG(("%s (n=%d)\n", __FUNCTION__, n)); - if (src->drawable.depth != dst->drawable.depth) + if (!sna_blt_compare_depth(&src->drawable, &dst->drawable)) return FALSE; return sna_blt_copy_boxes(sna, alu, @@ -110,7 +111,7 @@ no_render_copy(struct sna *sna, uint8_t alu, { DBG(("%s ()\n", __FUNCTION__)); - if (src->drawable.depth == dst->drawable.depth && + if (sna_blt_compare_depth(&src->drawable, &dst->drawable) && sna_blt_copy(sna, alu, src_bo, dst_bo, dst->drawable.bitsPerPixel, tmp)) diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h index 33d84d4c..b09ad755 100644 --- a/src/sna/sna_render_inline.h +++ b/src/sna/sna_render_inline.h @@ -99,4 +99,21 @@ picture_is_gpu(PicturePtr picture) return is_gpu(picture->pDrawable); } +static inline Bool sna_blt_compare_depth(DrawablePtr src, DrawablePtr dst) +{ + if (src->depth == dst->depth) + return TRUE; + + /* Also allow for the alpha to be discarded on a copy */ + if (src->bitsPerPixel != dst->bitsPerPixel) + return FALSE; + + if (dst->depth == 24 && src->depth == 32) + return TRUE; + + /* Note that a depth-16 pixmap is r5g6b5, not x1r5g5b5. */ + + return FALSE; +} + #endif /* SNA_RENDER_INLINE_H */ |