xf86-video-intel: src/sna/sna_dri.c
Chris Wilson
ickle at kemper.freedesktop.org
Mon Feb 11 13:50:44 PST 2013
src/sna/sna_dri.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
New commits:
commit a4442045df9164651702b166e0de2bfd25e8a76f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Mon Feb 11 21:16:19 2013 +0000
sna/dri: Harden the replacement of the back buffer against alloc failure
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 82cb2b4..ebdd66a 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1525,6 +1525,8 @@ sna_dri_flip_get_back(struct sna *sna, struct sna_dri_frame_event *info)
info->cache.bo ? info->cache.bo->handle : 0));
bo = get_private(info->back)->bo;
+ assert(bo->refcnt);
+ assert(bo->flush);
if (!(bo == info->scanout[0].bo || bo == info->scanout[1].bo))
return;
@@ -1533,10 +1535,8 @@ sna_dri_flip_get_back(struct sna *sna, struct sna_dri_frame_event *info)
if (bo == NULL ||
bo == info->scanout[0].bo ||
bo == info->scanout[1].bo) {
- if (bo) {
- DBG(("%s: discarding old backbuffer\n", __FUNCTION__));
- kgem_bo_destroy(&sna->kgem, bo);
- }
+ struct kgem_bo *old_bo = bo;
+
DBG(("%s: allocating new backbuffer\n", __FUNCTION__));
bo = kgem_create_2d(&sna->kgem,
info->draw->width,
@@ -1544,17 +1544,34 @@ sna_dri_flip_get_back(struct sna *sna, struct sna_dri_frame_event *info)
info->draw->bitsPerPixel,
get_private(info->front)->bo->tiling,
CREATE_SCANOUT | CREATE_EXACT);
+ if (bo == NULL)
+ return;
+
name = kgem_bo_flink(&sna->kgem, bo);
+ if (name == 0) {
+ kgem_bo_destroy(&sna->kgem, bo);
+ return;
+ }
+
+ if (old_bo) {
+ DBG(("%s: discarding old backbuffer\n", __FUNCTION__));
+ kgem_bo_destroy(&sna->kgem, old_bo);
+ }
}
info->cache.bo = get_private(info->back)->bo;
info->cache.name = info->back->name;
+ assert(info->cache.bo->refcnt);
+ assert(info->cache.name);
get_private(info->back)->bo = bo;
info->back->name = name;
assert(get_private(info->back)->bo != info->scanout[0].bo);
assert(get_private(info->back)->bo != info->scanout[1].bo);
+
+ assert(bo->refcnt);
+ assert(bo->flush);
}
static bool
More information about the xorg-commit
mailing list