xf86-video-intel: 3 commits - src/sna/kgem.c src/sna/sna_composite.c src/sna/sna_glyphs.c src/sna/sna_io.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Nov 7 14:55:49 PST 2011


 src/sna/kgem.c          |   33 +++++++++++++++++++++------------
 src/sna/sna_composite.c |    6 +++++-
 src/sna/sna_glyphs.c    |    8 +++++---
 src/sna/sna_io.c        |    5 ++---
 4 files changed, 33 insertions(+), 19 deletions(-)

New commits:
commit 33351d5c3dd912534c54e64ccfc7adc4c6f6ecae
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 7 22:57:44 2011 +0000

    sna/glyphs: Bypass masks for single glyphs
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index a6f867f..532dd80 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -405,8 +405,12 @@ sna_composite(CARD8 op,
 	     dst_x, dst_y, dst->pDrawable->x, dst->pDrawable->y,
 	     width, height));
 
-	if (mask && sna_composite_mask_is_opaque(mask))
+	if (mask && sna_composite_mask_is_opaque(mask)) {
+		DBG(("%s: removing opaque %smask\n",
+		     __FUNCTION__,
+		     mask->componentAlpha && PICT_FORMAT_RGB(mask->format) ? "CA " : ""));
 		mask = NULL;
+	}
 
 	if (!sna_compute_composite_region(&region,
 					  src, mask, dst,
diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index acec111..b189930 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -727,8 +727,8 @@ glyphs_via_mask(struct sna *sna,
 		pixman_image_t *mask_image;
 		int s;
 
-		DBG(("%s: smal mask, rendering glyphs to upload buffer\n",
-		     __FUNCTION__));
+		DBG(("%s: small mask [format=%lx, depth=%d], rendering glyphs to upload buffer\n",
+		     __FUNCTION__, format->format, format->depth));
 
 upload:
 		pixmap = sna_pixmap_create_upload(screen,
@@ -1237,7 +1237,9 @@ sna_glyphs(CARD8 op,
 
 	/* XXX discard the mask for non-overlapping glyphs? */
 
-	if (!mask || (op == PictOpAdd && dst->format == mask->format)) {
+	if (!mask ||
+	    (((nlist == 1 && list->len == 1) || op == PictOpAdd) &&
+	     dst->format == (mask->depth << 24 | mask->format))) {
 		if (glyphs_to_dst(sna, op,
 				  src, dst,
 				  src_x, src_y,
commit e4872225ace7e3b129292f5822aa75b84c52beff
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 7 22:57:05 2011 +0000

    sna/io: Minor tidy of setting command flags
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 963efb3..cc37901 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -131,8 +131,6 @@ void sna_read_boxes(struct sna *sna,
 	}
 
 	cmd = XY_SRC_COPY_BLT_CMD;
-	if (cpp == 4)
-		cmd |= BLT_WRITE_ALPHA | BLT_WRITE_RGB;
 	src_pitch = src_bo->pitch;
 	if (kgem->gen >= 40 && src_bo->tiling) {
 		cmd |= BLT_SRC_TILED;
@@ -142,7 +140,8 @@ void sna_read_boxes(struct sna *sna,
 	br13 = 0xcc << 16;
 	switch (cpp) {
 	default:
-	case 4: br13 |= 1 << 25; /* RGB8888 */
+	case 4: cmd |= BLT_WRITE_ALPHA | BLT_WRITE_RGB;
+		br13 |= 1 << 25; /* RGB8888 */
 	case 2: br13 |= 1 << 24; /* RGB565 */
 	case 1: break;
 	}
commit 5ba8ba7421e36bcdf83e84423595326939dbe7cd
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 7 22:55:10 2011 +0000

    sna: Avoid overwriting an upload buffer during readback
    
    Reported-by: Clemens Eisserer <linuxhippy at gmail.com>
    Buzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42677
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 29f572b..7274a8c 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -166,7 +166,8 @@ static int gem_write(int fd, uint32_t handle,
 	return drmIoctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite);
 }
 
-static int gem_read(int fd, uint32_t handle, const void *dst, int length)
+static int gem_read(int fd, uint32_t handle, const void *dst,
+		    int offset, int length)
 {
 	struct drm_i915_gem_pread pread;
 
@@ -174,7 +175,7 @@ static int gem_read(int fd, uint32_t handle, const void *dst, int length)
 	     handle, length));
 
 	pread.handle = handle;
-	pread.offset = 0;
+	pread.offset = offset;
 	pread.size = length;
 	pread.data_ptr = (uintptr_t)dst;
 	return drmIoctl(fd, DRM_IOCTL_I915_GEM_PREAD, &pread);
@@ -775,7 +776,7 @@ static void kgem_finish_partials(struct kgem *kgem)
 		}
 
 		list_del(&bo->base.list);
-		if (bo->write && bo->need_io) {
+		if (bo->need_io) {
 			DBG(("%s: handle=%d, uploading %d/%d\n",
 			     __FUNCTION__, bo->base.handle, bo->used, bo->alloc));
 			assert(!kgem_busy(kgem, bo->base.handle));
@@ -1995,11 +1996,18 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
 	list_for_each_entry(bo, &kgem->partial, base.list) {
 		if (flags == KGEM_BUFFER_LAST && bo->write) {
 			/* We can reuse any write buffer which we can fit */
-			if (size < bo->alloc) {
-				DBG(("%s: reusing write buffer for read of %d bytes? used=%d, total=%d\n",
-				     __FUNCTION__, size, bo->used, bo->alloc));
-				offset = 0;
-				goto done;
+			if (size <= bo->alloc) {
+				if (bo->base.refcnt == 1 && bo->base.exec) {
+					DBG(("%s: reusing write buffer for read of %d bytes? used=%d, total=%d\n",
+					     __FUNCTION__, size, bo->used, bo->alloc));
+					offset = 0;
+					goto done;
+				} else if (bo->used + size <= bo->alloc) {
+					DBG(("%s: reusing unfinished write buffer for read of %d bytes? used=%d, total=%d\n",
+					     __FUNCTION__, size, bo->used, bo->alloc));
+					offset = bo->used;
+					goto done;
+				}
 			}
 		}
 
@@ -2013,7 +2021,7 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
 			/* no users, so reset */
 			bo->used = 0;
 
-		if (bo->used + size < bo->alloc) {
+		if (bo->used + size <= bo->alloc) {
 			DBG(("%s: reusing partial buffer? used=%d + size=%d, total=%d\n",
 			     __FUNCTION__, bo->used, size, bo->alloc));
 			offset = bo->used;
@@ -2061,7 +2069,7 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
 				return NULL;
 			}
 		}
-		bo->need_io = true;
+		bo->need_io = write;
 	} else {
 		__kgem_bo_init(&bo->base, handle, alloc);
 		bo->base.vmap = true;
@@ -2206,8 +2214,9 @@ void kgem_buffer_read_sync(struct kgem *kgem, struct kgem_bo *_bo)
 	     offset, length, bo->base.vmap));
 
 	if (!bo->base.vmap) {
-		gem_read(kgem->fd, bo->base.handle,
-			 (char *)(bo+1)+offset, length);
+		gem_read(kgem->fd,
+			 bo->base.handle, (char *)(bo+1)+offset,
+			 offset, length);
 		bo->base.needs_flush = false;
 		if (bo->base.gpu)
 			kgem_retire(kgem);


More information about the xorg-commit mailing list