summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-06-24 13:32:45 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-06-24 13:35:22 +0100
commit471115a9806162bf0cafe27947f49d94fdd63d87 (patch)
treeed2b4d3632b689d419f96e9c26039ed97f71bf0a
parentc3b1a0d7046a83b6daec03e5a562116e3adf3c71 (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.c12
-rw-r--r--src/sna/gen4_render.c12
-rw-r--r--src/sna/gen5_render.c8
-rw-r--r--src/sna/gen6_render.c12
-rw-r--r--src/sna/sna_blt.c3
-rw-r--r--src/sna/sna_render.c7
-rw-r--r--src/sna/sna_render_inline.h17
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 */