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(®ion,
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