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

Reply via email to