diff options
author | Zhigang Gong <zhigang.gong@linux.intel.com> | 2012-06-11 13:05:48 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@linux.intel.com> | 2012-06-11 16:44:37 +0800 |
commit | 3ed87725dc79c6dd51598a4ed060ad8c53306d55 (patch) | |
tree | 8c813de94f619bd3e6bc82039da5152563214686 /src/glamor_copyarea.c | |
parent | d3e0c76f8cd17784b0b57ddaafe30c9996ac67de (diff) |
largepixmap: Fix the selfcopy issue.
If the source and destination are the same pixmap/fbo, and we
need to split the copy to small pieces. Then we do need to
consider the sequence of the small pieces when the copy area
has overlaps. This commit take the reverse/upsidedown into
the clipping function, thus it can generate correct sequence
and avoid corruption self copying.
Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
Diffstat (limited to 'src/glamor_copyarea.c')
-rw-r--r-- | src/glamor_copyarea.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/glamor_copyarea.c b/src/glamor_copyarea.c index 4d68dbe..bfd957a 100644 --- a/src/glamor_copyarea.c +++ b/src/glamor_copyarea.c @@ -458,17 +458,18 @@ _glamor_copy_n_to_n(DrawablePtr src, int n_dst_region, i, j; PixmapPtr temp_source_pixmap; glamor_pixmap_private *temp_source_priv = NULL; - int temp_dx = 0, temp_dy = 0; RegionTranslate(®ion, dst_x_off, dst_y_off); if (!force_clip) clipped_dst_regions = glamor_compute_clipped_regions(dst_pixmap_priv, - ®ion, &n_dst_region, 0); + ®ion, &n_dst_region, 0, + reverse, upsidedown); else clipped_dst_regions = glamor_compute_clipped_regions_ext(dst_pixmap_priv, ®ion, &n_dst_region, glamor_priv->max_fbo_size, - glamor_priv->max_fbo_size); + glamor_priv->max_fbo_size, + reverse, upsidedown); for(i = 0; i < n_dst_region; i++) { int n_src_region; @@ -484,7 +485,8 @@ _glamor_copy_n_to_n(DrawablePtr src, -dst_x_off + src_x_off + dx, -dst_y_off + src_y_off + dy); clipped_src_regions = glamor_compute_clipped_regions(src_pixmap_priv, clipped_dst_regions[i].region, - &n_src_region, 0); + &n_src_region, 0, + reverse, upsidedown); DEBUGF("Source is large pixmap.\n"); for (j = 0; j < n_src_region; j++) { @@ -507,9 +509,7 @@ _glamor_copy_n_to_n(DrawablePtr src, *temp_source_priv = *src_pixmap_priv; temp_source_priv->large.box = src_pixmap_priv->large.box_array[clipped_src_regions[j].block_idx]; temp_source_priv->base.fbo = src_pixmap_priv->large.fbo_array[clipped_src_regions[j].block_idx]; - /* XXX need revisit here. */ - temp_dx = dx/* - src_x_off*/; - temp_dy = dy/* - src_y_off*/; + temp_source_priv->base.pixmap = temp_source_pixmap; } assert(temp_source_pixmap || !(src_pixmap_priv == dst_pixmap_priv && (clipped_src_regions[j].block_idx != clipped_dst_regions[i].block_idx))); @@ -531,8 +531,9 @@ _glamor_copy_n_to_n(DrawablePtr src, n_current_boxes, dx, dy, reverse, upsidedown, bitplane, closure); else { - ok = __glamor_copy_n_to_n(&temp_source_pixmap->drawable, dst, gc, current_boxes, - n_current_boxes, temp_dx, temp_dy, reverse, + ok = __glamor_copy_n_to_n(&temp_source_pixmap->drawable, + dst, gc, current_boxes, + n_current_boxes, dx, dy, reverse, upsidedown, bitplane, closure); temp_source_priv->type = GLAMOR_MEMORY; temp_source_priv->base.fbo = NULL; |