summaryrefslogtreecommitdiff
path: root/src/sna/sna_trapezoids.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sna/sna_trapezoids.c')
-rw-r--r--src/sna/sna_trapezoids.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 61b4fb17..9da9aae2 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -3148,7 +3148,7 @@ pixsolid_unaligned_box_row(struct pixman_inplace *pi,
if (x2 > extents->x2)
x2 = extents->x2, fx2 = 0;
- if (x2 < x1) {
+ if (x1 < x2) {
if (fx1) {
pixsolid_opacity(pi, x1, 1, y, h,
covered * (SAMPLES_X - fx1));
@@ -3389,7 +3389,7 @@ pixmask_unaligned_box_row(struct pixman_inplace *pi,
if (x2 > extents->x2)
x2 = extents->x2, fx2 = 0;
- if (x2 < x1) {
+ if (x1 < x2) {
if (fx1) {
pixmask_opacity(pi, x1, 1, y, h,
covered * (SAMPLES_X - fx1));
@@ -3412,10 +3412,9 @@ composite_unaligned_boxes_inplace(CARD8 op,
PicturePtr dst, int n, xTrapezoid *t,
bool force_fallback)
{
- PixmapPtr pixmap;
- int16_t dx, dy;
-
- if (!force_fallback && is_gpu(dst->pDrawable)) {
+ if (!force_fallback &&
+ (is_gpu(dst->pDrawable) ||
+ (src->pDrawable && is_gpu(src->pDrawable)))) {
DBG(("%s: fallback -- can not perform operation in place, destination busy\n",
__FUNCTION__));
@@ -3424,10 +3423,6 @@ composite_unaligned_boxes_inplace(CARD8 op,
src_x -= pixman_fixed_to_int(t[0].left.p1.x);
src_y -= pixman_fixed_to_int(t[0].left.p1.y);
-
- pixmap = get_drawable_pixmap(dst->pDrawable);
- get_drawable_deltas(dst->pDrawable, pixmap, &dx, &dy);
-
do {
struct pixman_inplace pi;
RegionRec clip;
@@ -3441,8 +3436,9 @@ composite_unaligned_boxes_inplace(CARD8 op,
clip.data = NULL;
if (!sna_compute_composite_region(&clip,
- NULL, NULL, dst,
- 0, 0,
+ src, NULL, dst,
+ clip.extents.x1 + src_x,
+ clip.extents.y1 + src_y,
0, 0,
clip.extents.x1, clip.extents.y1,
clip.extents.x2 - clip.extents.x1,
@@ -3455,8 +3451,23 @@ composite_unaligned_boxes_inplace(CARD8 op,
continue;
}
+ if (src->pDrawable) {
+ if (!sna_drawable_move_to_cpu(src->pDrawable,
+ MOVE_READ)) {
+ RegionUninit(&clip);
+ continue;
+ }
+ if (src->alphaMap) {
+ if (!sna_drawable_move_to_cpu(src->alphaMap->pDrawable,
+ MOVE_READ)) {
+ RegionUninit(&clip);
+ continue;
+ }
+ }
+ }
+
pi.image = image_from_pict(dst, FALSE, &pi.dx, &pi.dy);
- pi.source = image_from_pict(src, TRUE, &pi.sx, &pi.sy);
+ pi.source = image_from_pict(src, FALSE, &pi.sx, &pi.sy);
pi.sx += src_x;
pi.sy += src_y;
pi.mask = pixman_image_create_bits(PIXMAN_a8, 1, 1, NULL, 0);