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:
parent
dfac4650e6
commit
bdbb928ea3
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Reference in New Issue