summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sna/sna_render.c11
-rw-r--r--src/sna/sna_tiling.c10
2 files changed, 17 insertions, 4 deletions
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index bc8b2de7..c2b9e798 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -622,7 +622,7 @@ static int sna_render_picture_downsample(struct sna *sna,
struct sna_pixmap *priv;
pixman_transform_t t;
PixmapPtr tmp;
- int width, height;
+ int width, height, size;
int sx, sy, ox, oy, ow, oh;
int error, ret = 0;
BoxRec box, b;
@@ -743,8 +743,13 @@ static int sna_render_picture_downsample(struct sna *sna,
ValidatePicture(tmp_dst);
ValidatePicture(tmp_src);
- w = sna->render.max_3d_size / sx - 2 * sx;
- h = sna->render.max_3d_size / sy - 2 * sy;
+ /* Use a small size to accommodate enlargement through tile alignment */
+ size = sna->render.max_3d_size - 4096 / pixmap->drawable.bitsPerPixel;
+ while (size * size * 4 > sna->kgem.max_copy_tile_size)
+ size /= 2;
+
+ w = size / sx - 2 * sx;
+ h = size / sy - 2 * sy;
DBG(("%s %d:%d downsampling using %dx%d GPU tiles\n",
__FUNCTION__, (width + w-1)/w, (height + h-1)/h, w, h));
diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index 00e111ce..c6e898b1 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -142,7 +142,8 @@ sna_tiling_composite_done(struct sna *sna,
/* Use a small step to accommodate enlargement through tile alignment */
step = sna->render.max_3d_size;
- if (tile->dst_x & (8*512 / tile->dst->pDrawable->bitsPerPixel - 1))
+ if (tile->dst_x & (8*512 / tile->dst->pDrawable->bitsPerPixel - 1) ||
+ tile->dst_y & 63)
step /= 2;
while (step * step * 4 > sna->kgem.max_copy_tile_size)
step /= 2;
@@ -330,7 +331,11 @@ sna_tiling_fill_boxes(struct sna *sna,
pixman_region_init_rects(&region, box, n);
+ /* Use a small step to accommodate enlargement through tile alignment */
step = sna->render.max_3d_size;
+ if (region.extents.x1 & (8*512 / dst->drawable.bitsPerPixel - 1) ||
+ region.extents.y1 & 63)
+ step /= 2;
while (step * step * 4 > sna->kgem.max_copy_tile_size)
step /= 2;
@@ -443,7 +448,10 @@ Bool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu,
pixman_region_init_rects(&region, box, nbox);
+ /* Use a small step to accommodate enlargement through tile alignment */
step = sna->render.max_3d_size;
+ if (region.extents.x1 & (8*512 / bpp - 1) || region.extents.y1 & 63)
+ step /= 2;
while (step * step * 4 > sna->kgem.max_copy_tile_size)
step /= 2;