Mesa (master): st/xorg: Try hard to not touch hardware after dropping the master

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Wed May 19 21:09:01 UTC 2010


Module: Mesa
Branch: master
Commit: 366798ac6f10daae059d299b92ddf709875cc7ca
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=366798ac6f10daae059d299b92ddf709875cc7ca

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Thu Apr 29 13:05:49 2010 +0100

st/xorg: Try hard to not touch hardware after dropping the master

---

 src/gallium/state_trackers/xorg/xorg_driver.c |   37 +++++++++++++++++--------
 src/gallium/state_trackers/xorg/xorg_exa.c    |    2 +
 2 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/src/gallium/state_trackers/xorg/xorg_driver.c b/src/gallium/state_trackers/xorg/xorg_driver.c
index 459d008..44520b8 100644
--- a/src/gallium/state_trackers/xorg/xorg_driver.c
+++ b/src/gallium/state_trackers/xorg/xorg_driver.c
@@ -334,17 +334,9 @@ static Bool
 drv_close_resource_management(ScrnInfoPtr pScrn)
 {
     modesettingPtr ms = modesettingPTR(pScrn);
-    int i;
 
     if (ms->screen) {
 	assert(ms->ctx == NULL);
-
-	for (i = 0; i < XORG_NR_FENCES; i++) {
-	    if (ms->fence[i]) {
-		ms->screen->fence_finish(ms->screen, ms->fence[i], 0);
-		ms->screen->fence_reference(ms->screen, &ms->fence[i], NULL);
-	    }
-	}
 	ms->screen->destroy(ms->screen);
     }
     ms->screen = NULL;
@@ -357,6 +349,22 @@ drv_close_resource_management(ScrnInfoPtr pScrn)
     return TRUE;
 }
 
+static void
+drv_cleanup_fences(ScrnInfoPtr pScrn)
+{
+    modesettingPtr ms = modesettingPTR(pScrn);
+    int i;
+
+    assert(ms->screen);
+
+    for (i = 0; i < XORG_NR_FENCES; i++) {
+	if (ms->fence[i]) {
+	    ms->screen->fence_finish(ms->screen, ms->fence[i], 0);
+	    ms->screen->fence_reference(ms->screen, &ms->fence[i], NULL);
+	}
+    }
+}
+
 static Bool
 drv_pre_init(ScrnInfoPtr pScrn, int flags)
 {
@@ -824,6 +832,10 @@ drv_leave_vt(int scrnIndex, int flags)
     drmModeRmFB(ms->fd, ms->fb_id);
     ms->fb_id = -1;
 
+    /* idle hardware */
+    if (!ms->kms)
+	drv_cleanup_fences(pScrn);
+
     if (drmDropMaster(ms->fd))
 	xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
 		   "drmDropMaster failed: %s\n", strerror(errno));
@@ -882,10 +894,6 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen)
     modesettingPtr ms = modesettingPTR(pScrn);
     CustomizerPtr cust = ms->cust;
 
-    if (pScrn->vtSema) {
-	drv_leave_vt(scrnIndex, 0);
-    }
-
     if (ms->cursor) {
        FreeCursor(ms->cursor, None);
        ms->cursor = NULL;
@@ -917,6 +925,11 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen)
 	xorg_exa_close(pScrn);
     ms->exa = NULL;
 
+    /* calls drop master make sure we don't talk to 3D HW after that */
+    if (pScrn->vtSema) {
+	drv_leave_vt(scrnIndex, 0);
+    }
+
     drv_close_resource_management(pScrn);
 
     drv_close_drm(pScrn);
diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c
index 65be8c3..31140f1 100644
--- a/src/gallium/state_trackers/xorg/xorg_exa.c
+++ b/src/gallium/state_trackers/xorg/xorg_exa.c
@@ -981,6 +981,8 @@ xorg_exa_close(ScrnInfoPtr pScrn)
 
    renderer_destroy(exa->renderer);
 
+   xorg_exa_finish(exa);
+
    if (exa->pipe)
       exa->pipe->destroy(exa->pipe);
    exa->pipe = NULL;




More information about the mesa-commit mailing list