summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-06-17 12:26:30 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-06-17 12:26:30 +0100
commit542aeca6e67fc64f9133ca3e27ac8eca28af6d25 (patch)
tree7772ba8fe86b028f6fca17e762a9a3ed494d47b4
parent4ff5cc539bc3f88ab9c05dc67c25aab08cbdf859 (diff)
sna: Tweak creation 8x8 tiled patterns
Avoid reading back from a GTT mmapping. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_accel.c27
-rw-r--r--src/sna/sna_dri2.c2
2 files changed, 15 insertions, 14 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 43fb6b99..5d9723b4 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -12256,45 +12256,46 @@ sna_poly_fill_rect_tiled_nxm_blt(DrawablePtr drawable,
PixmapPtr pixmap = get_drawable_pixmap(drawable);
struct sna *sna = to_sna_from_pixmap(pixmap);
PixmapPtr tile = gc->tile.pixmap;
+ int w, h, bpp = tile->drawable.bitsPerPixel;
struct kgem_bo *upload;
- int w, h, cpp;
void *ptr;
bool ret;
DBG(("%s: %dx%d\n", __FUNCTION__,
tile->drawable.width, tile->drawable.height));
+ assert(tile->drawable.height && tile->drawable.height <= 8);
+ assert(tile->drawable.width && tile->drawable.width <= 8);
if (!sna_pixmap_move_to_cpu(tile, MOVE_READ))
return false;
- upload = kgem_create_buffer(&sna->kgem, 8*tile->drawable.bitsPerPixel,
- KGEM_BUFFER_WRITE_INPLACE,
+ upload = kgem_create_buffer(&sna->kgem, 8*bpp,
+ tile->drawable.height < 8 ? KGEM_BUFFER_WRITE : KGEM_BUFFER_WRITE_INPLACE,
&ptr);
if (upload == NULL)
return false;
- assert(tile->drawable.height && tile->drawable.height <= 8);
- assert(tile->drawable.width && tile->drawable.width <= 8);
- assert(has_coherent_ptr(sna, sna_pixmap(tile), MOVE_READ));
- upload->pitch = 8*tile->drawable.bitsPerPixel >> 3; /* for sanity checks */
+ upload->pitch = bpp; /* for sanity checks */
assert(tile->devKind);
- cpp = tile->drawable.bitsPerPixel/8;
+ assert(has_coherent_ptr(sna, sna_pixmap(tile), MOVE_READ));
for (h = 0; h < tile->drawable.height; h++) {
uint8_t *src = (uint8_t *)tile->devPrivate.ptr + tile->devKind*h;
- uint8_t *dst = (uint8_t *)ptr + 8*cpp*h;
+ uint8_t *dst = (uint8_t *)ptr + bpp*h;
- w = tile->drawable.width*cpp;
+ w = tile->drawable.width*bpp/8;
memcpy(dst, src, w);
- while (w < 8*cpp) {
- memcpy(dst+w, dst, w);
+ while (w < bpp) {
+ memcpy(dst+w, src, w);
w *= 2;
}
+ assert(w == bpp);
}
while (h < 8) {
- memcpy((uint8_t*)ptr + h*w, ptr, h*w);
+ memcpy((uint8_t*)ptr + bpp*h, ptr, bpp*h);
h *= 2;
}
+ assert(h == 8);
ret = sna_poly_fill_rect_tiled_8x8_blt(drawable, bo, damage,
upload, gc, n, rect,
diff --git a/src/sna/sna_dri2.c b/src/sna/sna_dri2.c
index 2686b7c8..c35e0bdf 100644
--- a/src/sna/sna_dri2.c
+++ b/src/sna/sna_dri2.c
@@ -1705,7 +1705,7 @@ sna_dri2_xchg(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPtr back)
assert(front_bo != back_bo);
DBG(("%s: win=%ld, exchange front=%d/%d and back=%d/%d, pixmap=%ld %dx%d\n",
- __FUNCTION__, win->id,
+ __FUNCTION__, win->drawable.id,
front_bo->handle, front->name,
back_bo->handle, back->name,
pixmap->drawable.serialNumber,