summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-01-31 15:03:43 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2014-01-31 15:20:11 +0000
commitbdbb928ea38977bd2784f454f35db2ac2c13c34c (patch)
tree1c9bfb879bb957c6e6c1b7a6772ff69b9c571ab6
parentdfac4650e621055c5504c1bcf6df6449afa6d8d2 (diff)
sna: Actually reuse pixmap headers for ordinary pixmaps
commit 3dbf17f00e200e864818b0b8ca762183cff9085f [2.99.907] Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Tue Dec 3 12:10:01 2013 +0000 sna: Mark up an ordinary pixmap for reuse started to put the frequently allocated pixmaps into the object cache - but as those frequent allocations themselves did not use the cache, the cache kept growing. Bugzilla: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1272338 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_accel.c112
1 files changed, 59 insertions, 53 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 42d5fd93..3a7592a0 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -896,29 +896,12 @@ fallback:
if (sna->freed_pixmap) {
pixmap = create_pixmap_hdr(sna, 0);
-
- pixmap->drawable.width = width;
- pixmap->drawable.height = height;
- pixmap->drawable.depth = depth;
- pixmap->drawable.bitsPerPixel = bpp;
-
- DBG(("%s: serial=%ld, %dx%d\n",
- __FUNCTION__,
- pixmap->drawable.serialNumber,
- pixmap->drawable.width,
- pixmap->drawable.height));
-
priv = _sna_pixmap_reset(pixmap);
} else {
pixmap = create_pixmap(sna, screen, 0, 0, depth, 0);
if (pixmap == NullPixmap)
return NullPixmap;
- pixmap->drawable.width = width;
- pixmap->drawable.height = height;
- pixmap->drawable.depth = depth;
- pixmap->drawable.bitsPerPixel = bpp;
-
priv = sna_pixmap_attach(pixmap);
if (!priv) {
FreePixmap(pixmap);
@@ -926,6 +909,17 @@ fallback:
}
}
+ DBG(("%s: serial=%ld, %dx%d\n",
+ __FUNCTION__,
+ pixmap->drawable.serialNumber,
+ pixmap->drawable.width,
+ pixmap->drawable.height));
+
+ pixmap->drawable.width = width;
+ pixmap->drawable.height = height;
+ pixmap->drawable.depth = depth;
+ pixmap->drawable.bitsPerPixel = bpp;
+
priv->cpu_bo = kgem_create_map(&sna->kgem, addr, pitch*height, false);
if (priv->cpu_bo == NULL) {
priv->header = true;
@@ -940,6 +934,7 @@ fallback:
sna->debug_memory.cpu_bo_bytes += kgem_bo_size(priv->cpu_bo);
#endif
+ /* Be wary as we cannot cache SHM Pixmap in our freed cache */
priv->cpu = true;
priv->shm = true;
priv->stride = pitch;
@@ -988,19 +983,6 @@ sna_pixmap_create_scratch(ScreenPtr screen,
/* you promise never to access this via the cpu... */
if (sna->freed_pixmap) {
pixmap = create_pixmap_hdr(sna, CREATE_PIXMAP_USAGE_SCRATCH);
-
- pixmap->drawable.width = width;
- pixmap->drawable.height = height;
- pixmap->drawable.depth = depth;
- pixmap->drawable.bitsPerPixel = bpp;
-
- DBG(("%s: serial=%ld, usage=%d, %dx%d\n",
- __FUNCTION__,
- pixmap->drawable.serialNumber,
- pixmap->usage_hint,
- pixmap->drawable.width,
- pixmap->drawable.height));
-
priv = _sna_pixmap_reset(pixmap);
} else {
pixmap = create_pixmap(sna, screen, 0, 0, depth,
@@ -1008,11 +990,6 @@ sna_pixmap_create_scratch(ScreenPtr screen,
if (pixmap == NullPixmap)
return NullPixmap;
- pixmap->drawable.width = width;
- pixmap->drawable.height = height;
- pixmap->drawable.depth = depth;
- pixmap->drawable.bitsPerPixel = bpp;
-
priv = sna_pixmap_attach(pixmap);
if (!priv) {
FreePixmap(pixmap);
@@ -1020,9 +997,22 @@ sna_pixmap_create_scratch(ScreenPtr screen,
}
}
- priv->stride = PixmapBytePad(width, depth);
+ DBG(("%s: serial=%ld, usage=%d, %dx%d\n",
+ __FUNCTION__,
+ pixmap->drawable.serialNumber,
+ pixmap->usage_hint,
+ pixmap->drawable.width,
+ pixmap->drawable.height));
+
+ pixmap->drawable.width = width;
+ pixmap->drawable.height = height;
+ pixmap->drawable.depth = depth;
+ pixmap->drawable.bitsPerPixel = bpp;
pixmap->devPrivate.ptr = NULL;
+ priv->stride = PixmapBytePad(width, depth);
+ priv->header = true;
+
priv->gpu_bo = kgem_create_2d(&sna->kgem,
width, height, bpp, tiling,
CREATE_TEMPORARY);
@@ -1032,7 +1022,6 @@ sna_pixmap_create_scratch(ScreenPtr screen,
return NullPixmap;
}
- priv->header = true;
sna_damage_all(&priv->gpu_damage, width, height);
assert(to_sna_from_pixmap(pixmap) == sna);
@@ -1320,32 +1309,52 @@ static PixmapPtr sna_create_pixmap(ScreenPtr screen,
ptr = MAKE_STATIC_PTR(pixmap->devPrivate.ptr);
pad = pixmap->devKind;
flags &= ~(KGEM_CAN_CREATE_GPU | KGEM_CAN_CREATE_CPU);
+
+ priv = sna_pixmap_attach(pixmap);
+ if (priv == NULL) {
+ free(pixmap);
+ goto fallback;
+ }
} else {
DBG(("%s: creating GPU pixmap %dx%d, stride=%d, flags=%x\n",
__FUNCTION__, width, height, pad, flags));
- pixmap = create_pixmap(sna, screen, 0, 0, depth, usage);
- if (pixmap == NullPixmap)
- return NullPixmap;
+ if (sna->freed_pixmap) {
+ pixmap = create_pixmap_hdr(sna, CREATE_PIXMAP_USAGE_SCRATCH);
+ priv = _sna_pixmap_reset(pixmap);
+ } else {
+ pixmap = create_pixmap(sna, screen, 0, 0, depth, usage);
+ if (pixmap == NullPixmap)
+ return NullPixmap;
+
+ priv = sna_pixmap_attach(pixmap);
+ if (priv == NULL) {
+ free(pixmap);
+ goto fallback;
+ }
+ }
+
+ DBG(("%s: serial=%ld, usage=%d, %dx%d\n",
+ __FUNCTION__,
+ pixmap->drawable.serialNumber,
+ pixmap->usage_hint,
+ pixmap->drawable.width,
+ pixmap->drawable.height));
pixmap->drawable.width = width;
pixmap->drawable.height = height;
+ pixmap->drawable.depth = depth;
+ pixmap->drawable.bitsPerPixel = bits_per_pixel(depth);
pixmap->devKind = pad;
pixmap->devPrivate.ptr = NULL;
+ priv->header = true;
ptr = NULL;
}
- priv = sna_pixmap_attach(pixmap);
- if (priv == NULL) {
- free(pixmap);
- goto fallback;
- }
-
priv->stride = pad;
priv->create = flags;
priv->ptr = ptr;
- priv->header = ptr == NULL;
assert(to_sna_from_pixmap(pixmap) == sna);
assert(pixmap->drawable.pScreen == screen);
@@ -3708,19 +3717,18 @@ sna_pixmap_create_upload(ScreenPtr screen,
if (sna->freed_pixmap) {
pixmap = create_pixmap_hdr(sna, CREATE_PIXMAP_USAGE_SCRATCH);
+ priv = _sna_pixmap_reset(pixmap);
} else {
pixmap = create_pixmap(sna, screen, 0, 0, depth,
CREATE_PIXMAP_USAGE_SCRATCH);
if (!pixmap)
return NullPixmap;
- priv = malloc(sizeof(*priv));
+ priv = sna_pixmap_attach(pixmap);
if (!priv) {
FreePixmap(pixmap);
return NullPixmap;
}
-
- sna_set_pixmap(pixmap, priv);
}
pixmap->drawable.width = width;
@@ -3728,9 +3736,6 @@ sna_pixmap_create_upload(ScreenPtr screen,
pixmap->drawable.depth = depth;
pixmap->drawable.bitsPerPixel = bits_per_pixel(depth);
- priv = _sna_pixmap_reset(pixmap);
- priv->header = true;
-
priv->gpu_bo = kgem_create_buffer_2d(&sna->kgem,
width, height,
pixmap->drawable.bitsPerPixel,
@@ -3752,6 +3757,7 @@ sna_pixmap_create_upload(ScreenPtr screen,
pixmap->devPrivate.ptr = ptr;
priv->ptr = MAKE_STATIC_PTR(ptr);
priv->stride = priv->gpu_bo->pitch;
+ priv->header = true;
pixmap->usage_hint = 0;
if (!kgem_buffer_is_inplace(priv->gpu_bo))