sna: Actually reuse pixmap headers for ordinary pixmaps

commit 3dbf17f00e [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>
This commit is contained in:
Chris Wilson 2014-01-31 15:03:43 +00:00
parent dfac4650e6
commit bdbb928ea3
1 changed files with 59 additions and 53 deletions

View File

@ -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))