xf86-video-intel: src/sna/sna_driver.c src/sna/sna.h
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jul 13 03:47:10 PDT 2012
src/sna/sna.h | 1
src/sna/sna_driver.c | 60 +++++++++++++++++++++++++++++----------------------
2 files changed, 36 insertions(+), 25 deletions(-)
New commits:
commit ea9ec18505645dfec85ab96bbbbbc1793830c737
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jul 13 11:39:01 2012 +0100
sna: Split CloseScreen into two phases
In order to get the ordering correct we need to free the xf86_cursors
before calling the miPointerCloseScreen. This requires us to insert a
hook at the top of the CloseScreen chain. However we still require the
final CloseScreen hook in order to do the fundamental clean up, hence
split the CloseScreen callback into two phases.
Reported-by: Jiri Slaby <jirislaby at gmail.com>
References: https://bugs.freedesktop.org/show_bug.cgi?id=47597
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 01e256a..6920343 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -235,6 +235,7 @@ struct sna {
ScreenBlockHandlerProcPtr BlockHandler;
ScreenWakeupHandlerProcPtr WakeupHandler;
+ CloseScreenProcPtr CloseScreen;
PicturePtr clear;
struct {
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 0eefa35..3871ab6 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -704,6 +704,8 @@ sna_uevent_fini(ScrnInfoPtr scrn)
sna->uevent_monitor = NULL;
}
}
+#else
+static void sna_uevent_fini(ScrnInfoPtr scrn) { }
#endif /* HAVE_UDEV */
static void sna_leave_vt(VT_FUNC_ARGS_DECL)
@@ -735,49 +737,57 @@ static Bool sna_mode_has_pending_events(struct sna *sna)
return poll(&pfd, 1, 0) == 1;
}
-static Bool sna_close_screen(CLOSE_SCREEN_ARGS_DECL)
+static Bool sna_early_close_screen(CLOSE_SCREEN_ARGS_DECL)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
struct sna *sna = to_sna(scrn);
- DepthPtr depths;
- int d;
DBG(("%s\n", __FUNCTION__));
-#if HAVE_UDEV
sna_uevent_fini(scrn);
-#endif
/* drain the event queues */
if (sna_mode_has_pending_events(sna))
sna_mode_wakeup(sna);
- if (scrn->vtSema == TRUE)
+ if (scrn->vtSema == TRUE) {
sna_leave_vt(VT_FUNC_ARGS(0));
+ scrn->vtSema = FALSE;
+ }
- sna_accel_close(sna);
+ if (sna->dri_open) {
+ sna_dri_close(sna, screen);
+ sna->dri_open = false;
+ }
xf86_cursors_fini(screen);
- depths = screen->allowedDepths;
- for (d = 0; d < screen->numDepths; d++)
- free(depths[d].vids);
- free(depths);
+ return TRUE;
+}
- free(screen->visuals);
+static Bool sna_late_close_screen(CLOSE_SCREEN_ARGS_DECL)
+{
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct sna *sna = to_sna(scrn);
+ DepthPtr depths;
+ int d;
- if (sna->dri_open) {
- sna_dri_close(sna, screen);
- sna->dri_open = false;
- }
+ DBG(("%s\n", __FUNCTION__));
if (sna->front) {
screen->DestroyPixmap(sna->front);
sna->front = NULL;
}
- xf86GARTCloseScreen(scrn->scrnIndex);
- scrn->vtSema = FALSE;
+ sna_accel_close(sna);
+
+ depths = screen->allowedDepths;
+ for (d = 0; d < screen->numDepths; d++)
+ free(depths[d].vids);
+ free(depths);
+
+ free(screen->visuals);
+
return TRUE;
}
@@ -878,7 +888,7 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
}
assert(screen->CloseScreen == NULL);
- screen->CloseScreen = sna_close_screen;
+ screen->CloseScreen = sna_late_close_screen;
if (!sna_accel_init(screen, sna)) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
"Hardware acceleration initialization failed\n");
@@ -893,8 +903,7 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
if (!miDCInitialize(screen, xf86GetPointerScreenFuncs()))
return FALSE;
- xf86DrvMsg(scrn->scrnIndex, X_INFO, "Initializing HW Cursor\n");
- if (!xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
+ if (xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
HARDWARE_CURSOR_INVERT_MASK |
@@ -902,10 +911,8 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
HARDWARE_CURSOR_UPDATE_UNHIDDEN |
- HARDWARE_CURSOR_ARGB)) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "Hardware cursor initialization failed\n");
- }
+ HARDWARE_CURSOR_ARGB))
+ xf86DrvMsg(scrn->scrnIndex, X_INFO, "HW Cursor enabled\n");
/* Must force it before EnterVT, so we are in control of VT and
* later memory should be bound when allocating, e.g rotate_mem */
@@ -920,6 +927,9 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
screen->SaveScreen = xf86SaveScreen;
screen->CreateScreenResources = sna_create_screen_resources;
+ sna->CloseScreen = screen->CloseScreen;
+ screen->CloseScreen = sna_early_close_screen;
+
if (!xf86CrtcScreenInit(screen))
return FALSE;
More information about the xorg-commit
mailing list