diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-12-20 10:19:01 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-12-20 12:48:28 +0000 |
commit | 0c12f7cb01e75de3bf9c2af8ac6d5b4152566457 (patch) | |
tree | 84c73987a2fc22e213a2f6d23aeb1e9905d68f85 | |
parent | d3a4f5db149888239b78df1b9fcc5379b1603005 (diff) |
sna: Tidy up some recent valgrind complaints with reuse of scratch pixmaps
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna.h | 2 | ||||
-rw-r--r-- | src/sna/sna_accel.c | 114 |
2 files changed, 72 insertions, 44 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h index 8869937d..8deccc19 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -145,7 +145,7 @@ struct sna_pixmap { uint8_t mapped :1; uint8_t flush :1; uint8_t gpu :1; - uint8_t freed :1; + uint8_t header :1; }; struct sna_glyph { diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 183541d0..4fd4fd90 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -269,11 +269,12 @@ static Bool sna_destroy_private(PixmapPtr pixmap, struct sna_pixmap *priv) kgem_bo_destroy(&sna->kgem, priv->cpu_bo); } - if (!sna->freed_pixmap && priv->freed) { + if (!sna->freed_pixmap && priv->header) { sna->freed_pixmap = pixmap; assert(priv->ptr == NULL); priv->gpu_bo = NULL; priv->cpu_bo = NULL; + priv->mapped = 0; return false; } @@ -370,6 +371,35 @@ static inline void sna_set_pixmap(PixmapPtr pixmap, struct sna_pixmap *sna) dixSetPrivate(&pixmap->devPrivates, &sna_pixmap_index, sna); } +static struct sna_pixmap * +_sna_pixmap_init(struct sna_pixmap *priv, PixmapPtr pixmap) +{ + list_init(&priv->list); + list_init(&priv->inactive); + priv->source_count = SOURCE_BIAS; + priv->pixmap = pixmap; + + return priv; +} + +static struct sna_pixmap * +_sna_pixmap_reset(PixmapPtr pixmap) +{ + struct sna_pixmap *priv; + + assert(pixmap->drawable.type == DRAWABLE_PIXMAP); + assert(pixmap->drawable.class == 0); + assert(pixmap->drawable.id == 0); + assert(pixmap->drawable.x == 0); + assert(pixmap->drawable.y == 0); + + priv = sna_pixmap(pixmap); + assert(priv != NULL); + + memset(priv, 0, sizeof(*priv)); + return _sna_pixmap_init(priv, pixmap); +} + static struct sna_pixmap *_sna_pixmap_attach(struct sna *sna, PixmapPtr pixmap) { @@ -379,12 +409,8 @@ static struct sna_pixmap *_sna_pixmap_attach(struct sna *sna, if (!priv) return NULL; - list_init(&priv->list); - list_init(&priv->inactive); - priv->pixmap = pixmap; - sna_set_pixmap(pixmap, priv); - return priv; + return _sna_pixmap_init(priv, pixmap); } struct sna_pixmap *sna_pixmap_attach(PixmapPtr pixmap) @@ -463,15 +489,15 @@ sna_pixmap_create_scratch(ScreenPtr screen, pixmap = sna->freed_pixmap; sna->freed_pixmap = NULL; - priv = sna_pixmap(pixmap); - memset(priv, 0, sizeof(*priv)); - list_init(&priv->list); - list_init(&priv->inactive); - priv->pixmap = pixmap; + pixmap->usage_hint = CREATE_PIXMAP_USAGE_SCRATCH; + pixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; + pixmap->refcnt = 1; + + priv = _sna_pixmap_reset(pixmap); } else { pixmap = create_pixmap(sna, screen, 0, 0, depth, CREATE_PIXMAP_USAGE_SCRATCH); - if (!pixmap) + if (pixmap == NullPixmap) return NullPixmap; priv = _sna_pixmap_attach(sna, pixmap); @@ -490,12 +516,14 @@ sna_pixmap_create_scratch(ScreenPtr screen, return NullPixmap; } - priv->freed = 1; + priv->header = true; sna_damage_all(&priv->gpu_damage, width, height); - miModifyPixmapHeader(pixmap, - width, height, depth, bpp, - priv->gpu_bo->pitch, NULL); + pixmap->drawable.width = width; + pixmap->drawable.height = height; + pixmap->drawable.depth = depth; + pixmap->drawable.bitsPerPixel = bpp; + pixmap->devKind = PixmapBytePad(width, depth); pixmap->devPrivate.ptr = NULL; return pixmap; @@ -506,7 +534,6 @@ static PixmapPtr sna_create_pixmap(ScreenPtr screen, unsigned int usage) { PixmapPtr pixmap; - struct sna_pixmap *priv; int pad, size; DBG(("%s(%d, %d, %d, usage=%x)\n", __FUNCTION__, @@ -538,34 +565,33 @@ static PixmapPtr sna_create_pixmap(ScreenPtr screen, usage = CREATE_PIXMAP_USAGE_SCRATCH_HEADER; #endif - /* XXX could use last deferred free? */ - pad = PixmapBytePad(width, depth); size = pad * height; - if (size < 4096) { + if (size <= 4096) { pixmap = create_pixmap(to_sna_from_screen(screen), screen, width, height, depth, usage); if (pixmap == NullPixmap) return NullPixmap; - priv = sna_pixmap_attach(pixmap); + sna_pixmap_attach(pixmap); } else { - pixmap = create_pixmap(to_sna_from_screen(screen), screen, - 0, 0, depth, usage); + struct sna *sna = to_sna_from_screen(screen); + + pixmap = create_pixmap(sna, screen, 0, 0, depth, usage); if (pixmap == NullPixmap) return NullPixmap; + if (sna_pixmap_attach(pixmap) == NULL) { + free(pixmap); + return create_pixmap(sna, screen, + width, height, depth, + usage); + } + pixmap->drawable.width = width; pixmap->drawable.height = height; pixmap->devKind = pad; pixmap->devPrivate.ptr = NULL; - - priv = sna_pixmap_attach(pixmap); - if (priv == NULL) { - free(pixmap); - return create_pixmap(to_sna_from_screen(screen), screen, - width, height, depth, usage); - } } return pixmap; @@ -1175,7 +1201,9 @@ sna_pixmap_create_upload(ScreenPtr screen, pixmap = sna->freed_pixmap; sna->freed_pixmap = NULL; - priv = sna_pixmap(pixmap); + pixmap->usage_hint = CREATE_PIXMAP_USAGE_SCRATCH; + pixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; + pixmap->refcnt = 1; } else { pixmap = create_pixmap(sna, screen, 0, 0, depth, CREATE_PIXMAP_USAGE_SCRATCH); @@ -1187,8 +1215,13 @@ sna_pixmap_create_upload(ScreenPtr screen, fbDestroyPixmap(pixmap); return NullPixmap; } + + sna_set_pixmap(pixmap, priv); } + priv = _sna_pixmap_reset(pixmap); + priv->header = true; + priv->gpu_bo = kgem_create_buffer(&sna->kgem, pad*height, KGEM_BUFFER_WRITE, &ptr); @@ -1200,19 +1233,14 @@ sna_pixmap_create_upload(ScreenPtr screen, priv->gpu_bo->pitch = pad; - priv->source_count = SOURCE_BIAS; - priv->cpu_bo = NULL; - priv->cpu_damage = priv->gpu_damage = NULL; - priv->ptr = NULL; - priv->pinned = 0; - priv->freed = 1; - list_init(&priv->list); - list_init(&priv->inactive); - - priv->pixmap = pixmap; - sna_set_pixmap(pixmap, priv); + pixmap->drawable.width = width; + pixmap->drawable.height = height; + pixmap->drawable.depth = depth; + pixmap->drawable.bitsPerPixel = bpp; + pixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; + pixmap->devKind = pad; + pixmap->devPrivate.ptr = ptr; - miModifyPixmapHeader(pixmap, width, height, depth, bpp, pad, ptr); return pixmap; } |