xf86-video-intel: src/sna/kgem.c src/sna/sna_render.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jan 25 05:54:23 PST 2012


 src/sna/kgem.c       |   12 +++++++-----
 src/sna/sna_render.c |   19 ++++++++++---------
 2 files changed, 17 insertions(+), 14 deletions(-)

New commits:
commit 36425ba49ecbd87b1e3bf4340ca2496d8de24a7f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 25 12:49:24 2012 +0000

    sna: Round up buffer allocations when downsampling
    
    The pathological case being nx1 or 1xm resulting in an illegal allocation
    request of 0 bytes.
    
    One such example is
      wolframalpha.com: x = (200 + x) / 100
    which generates an approximately 8500x1 image and so needs downscaling
    to fit in the render pipeline on all but IvyBridge. Bring on Ivy!
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index d85e930..1e78c1a 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -3251,20 +3251,22 @@ struct kgem_bo *kgem_upload_source_image_halved(struct kgem *kgem,
 	struct kgem_bo *bo;
 	pixman_image_t *src_image, *dst_image;
 	pixman_transform_t t;
+	int w, h;
 	void *dst;
 
 	DBG(("%s : (%d, %d), (%d, %d), stride=%d, bpp=%d\n",
 	     __FUNCTION__, x, y, width, height, stride, bpp));
 
-	bo = kgem_create_buffer_2d(kgem,
-				   width/2, height/2, bpp,
+	w = (width + 1) / 2;
+	h = (height + 1) / 2;
+
+	bo = kgem_create_buffer_2d(kgem, w, h, bpp,
 				   KGEM_BUFFER_WRITE_INPLACE,
 				   &dst);
 	if (bo == NULL)
 		return NULL;
 
-	dst_image = pixman_image_create_bits(format, width/2, height/2,
-					     dst, bo->pitch);
+	dst_image = pixman_image_create_bits(format, w, h, dst, bo->pitch);
 	if (dst_image == NULL)
 		goto cleanup_bo;
 
@@ -3286,7 +3288,7 @@ struct kgem_bo *kgem_upload_source_image_halved(struct kgem *kgem,
 			       x, y,
 			       0, 0,
 			       0, 0,
-			       width/2, height/2);
+			       w, h);
 
 	pixman_image_unref(src_image);
 	pixman_image_unref(dst_image);
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index af81735..d1cb60b 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -717,7 +717,8 @@ static int sna_render_picture_downsample(struct sna *sna,
 			goto fixup;
 
 		tmp = screen->CreatePixmap(screen,
-					   w/2, h/2, pixmap->drawable.depth,
+					   (w+1)/2, (h+1)/2,
+					   pixmap->drawable.depth,
 					   SNA_CREATE_SCRATCH);
 		if (!tmp)
 			goto fixup;
@@ -760,18 +761,18 @@ static int sna_render_picture_downsample(struct sna *sna,
 		ValidatePicture(tmp_src);
 
 		if (w > sna->render.max_3d_size) {
-			ww = w/4;
+			ww = (w+3)/4;
 			nj = 2;
 		} else {
-			ww = w/2;
+			ww = (w+1)/2;
 			nj = 1;
 		}
 
 		if (h > sna->render.max_3d_size) {
-			hh = h/4;
+			hh = (h+3)/4;
 			ni = 2;
 		} else {
-			hh = h/2;
+			hh = (h+1)/2;
 			ni = 1;
 		}
 
@@ -783,7 +784,7 @@ static int sna_render_picture_downsample(struct sna *sna,
 
 			b.y1 = hh*i;
 			if (i == ni - 1)
-				b.y2 = h/2;
+				b.y2 = (h+1)/2;
 			else
 				b.y2 = b.y1 + hh;
 
@@ -792,7 +793,7 @@ static int sna_render_picture_downsample(struct sna *sna,
 
 				b.x1 = ww*j;
 				if (j == nj - 1)
-					b.x2 = w/2;
+					b.x2 = (w+1)/2;
 				else
 					b.x2 = b.x1 + ww;
 
@@ -850,8 +851,8 @@ static int sna_render_picture_downsample(struct sna *sna,
 	channel->offset[1] = y - dst_y;
 	channel->scale[0] = 1.f/w;
 	channel->scale[1] = 1.f/h;
-	channel->width  = w / 2;
-	channel->height = h / 2;
+	channel->width  = (w + 1) / 2;
+	channel->height = (h + 1) / 2;
 	channel->bo = bo;
 	return 1;
 


More information about the xorg-commit mailing list