From: Michel Dänzer <[email protected]> Previously we assumed every pixmap destroyed during a software fallback was also created during a software fallback and had access prepared, but that's not always true.
Fixes a server abort reported by 邓逸昕 <[email protected]> . Signed-off-by: Michel Dänzer <[email protected]> Tested-by: 邓逸昕 <[email protected]> --- Would be great if this could make it into 1.9. exa/exa_classic.c | 14 +++++++++++--- exa/exa_driver.c | 14 +++++++++++--- exa/exa_mixed.c | 16 ++++++++++++---- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/exa/exa_classic.c b/exa/exa_classic.c index 2cfeda5..b95df9e 100644 --- a/exa/exa_classic.c +++ b/exa/exa_classic.c @@ -220,10 +220,18 @@ exaDestroyPixmap_classic (PixmapPtr pPixmap) if (pPixmap->refcnt == 1) { ExaPixmapPriv (pPixmap); + int i; - /* During a fallback we must finish access, but we don't know the index. */ - if (pExaScr->fallback_counter) - exaFinishAccess(&pPixmap->drawable, -1); + /* Finish access if it was prepared (e.g. pixmap created during + * software fallback) + */ + for (i = 0; i < EXA_NUM_PREPARE_INDICES; i++) { + if (pExaScr->access[i].pixmap == pPixmap) { + exaFinishAccess(&pPixmap->drawable, i); + pExaScr->access[i].pixmap = NULL; + break; + } + } if (pExaPixmap->area) { diff --git a/exa/exa_driver.c b/exa/exa_driver.c index abe79ba..1f5214f 100644 --- a/exa/exa_driver.c +++ b/exa/exa_driver.c @@ -192,10 +192,18 @@ exaDestroyPixmap_driver (PixmapPtr pPixmap) if (pPixmap->refcnt == 1) { ExaPixmapPriv (pPixmap); + int i; - /* During a fallback we must finish access, but we don't know the index. */ - if (pExaScr->fallback_counter) - exaFinishAccess(&pPixmap->drawable, -1); + /* Finish access if it was prepared (e.g. pixmap created during + * software fallback) + */ + for (i = 0; i < EXA_NUM_PREPARE_INDICES; i++) { + if (pExaScr->access[i].pixmap == pPixmap) { + exaFinishAccess(&pPixmap->drawable, i); + pExaScr->access[i].pixmap = NULL; + break; + } + } if (pExaPixmap->driverPriv) pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv); diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c index 7fa771d..6d434d6 100644 --- a/exa/exa_mixed.c +++ b/exa/exa_mixed.c @@ -244,10 +244,18 @@ exaDestroyPixmap_mixed(PixmapPtr pPixmap) if (pPixmap->refcnt == 1) { ExaPixmapPriv (pPixmap); - - /* During a fallback we must finish access, but we don't know the index. */ - if (pExaScr->fallback_counter) - exaFinishAccess(&pPixmap->drawable, -1); + int i; + + /* Finish access if it was prepared (e.g. pixmap created during + * software fallback) + */ + for (i = 0; i < EXA_NUM_PREPARE_INDICES; i++) { + if (pExaScr->access[i].pixmap == pPixmap) { + exaFinishAccess(&pPixmap->drawable, i); + pExaScr->access[i].pixmap = NULL; + break; + } + } if (pExaScr->deferred_mixed_pixmap == pPixmap) pExaScr->deferred_mixed_pixmap = NULL; -- 1.7.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
