st/xorg: Cleanly shutdown
[mesa.git] / src / gallium / state_trackers / xorg / xorg_driver.c
index 923662b24a933ea7e843c62ce6001b069dc1fdbd..7da10427eca44002b93f021b955b0b2e4044fef7 100644 (file)
 #include "xf86.h"
 #include "xf86_OSproc.h"
 #include "compiler.h"
-#include "xf86RAC.h"
 #include "xf86PciInfo.h"
 #include "xf86Pci.h"
-#include "xf86Resources.h"
 #include "mipointer.h"
 #include "micmap.h"
 #include <X11/extensions/randr.h>
@@ -84,42 +82,10 @@ static const OptionInfoRec Options[] = {
     {-1, NULL, OPTV_NONE, {0}, FALSE}
 };
 
-/*
- * Functions that might be needed
- */
-
-static const char *exaSymbols[] = {
-    "exaGetVersion",
-    "exaDriverInit",
-    "exaDriverFini",
-    "exaOffscreenAlloc",
-    "exaOffscreenFree",
-    "exaWaitSync",
-    NULL
-};
-
-static const char *fbSymbols[] = {
-    "fbPictureInit",
-    "fbScreenInit",
-    NULL
-};
-
-static const char *ddcSymbols[] = {
-    "xf86PrintEDID",
-    "xf86SetDDCproperties",
-    NULL
-};
-
 /*
  * Exported Xorg driver functions to winsys
  */
 
-void
-xorg_tracker_loader_ref_sym_lists()
-{
-    LoaderRefSymLists(exaSymbols, fbSymbols, ddcSymbols, NULL);
-}
-
 const OptionInfoRec *
 xorg_tracker_available_options(int chipid, int busid)
 {
@@ -178,20 +144,22 @@ static Bool
 CreateFrontBuffer(ScrnInfoPtr pScrn)
 {
     modesettingPtr ms = modesettingPTR(pScrn);
-    ScreenPtr pScreen = pScrn->pScreen;
-    PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
     unsigned handle, stride;
+    struct pipe_texture *tex;
 
     ms->noEvict = TRUE;
-    xorg_exa_set_displayed_usage(rootPixmap);
-    pScreen->ModifyPixmapHeader(rootPixmap,
-                               pScrn->virtualX, pScrn->virtualY,
-                               pScrn->depth, pScrn->bitsPerPixel,
-                               pScrn->displayWidth * pScrn->bitsPerPixel / 8,
-                               NULL);
-    ms->noEvict = FALSE;
 
-    handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
+    tex = xorg_exa_create_root_texture(pScrn, pScrn->virtualX, pScrn->virtualY,
+                                      pScrn->depth, pScrn->bitsPerPixel);
+
+    if (!tex)
+       return FALSE;
+
+    if (!ms->api->local_handle_from_texture(ms->api, ms->screen,
+                                           tex,
+                                           &stride,
+                                           &handle))
+       return FALSE;
 
     drmModeAddFB(ms->fd,
                 pScrn->virtualX,
@@ -200,12 +168,39 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
                 pScrn->bitsPerPixel,
                 stride,
                 handle,
-                &ms->fb_id);
+                 &ms->fb_id);
 
     pScrn->frameX0 = 0;
     pScrn->frameY0 = 0;
     AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
 
+    pipe_texture_reference(&ms->root_texture, tex);
+    pipe_texture_reference(&tex, NULL);
+    return TRUE;
+}
+
+static Bool
+BindTextureToRoot(ScrnInfoPtr pScrn)
+{
+    modesettingPtr ms = modesettingPTR(pScrn);
+    ScreenPtr pScreen = pScrn->pScreen;
+    struct pipe_texture *check;
+    PixmapPtr rootPixmap;
+
+    rootPixmap = pScreen->GetScreenPixmap(pScreen);
+
+    xorg_exa_set_displayed_usage(rootPixmap);
+    xorg_exa_set_shared_usage(rootPixmap);
+    xorg_exa_set_texture(rootPixmap, ms->root_texture);
+    if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
+       FatalError("Couldn't adjust screen pixmap\n");
+
+    check = xorg_exa_get_texture(rootPixmap);
+    if (ms->root_texture != check)
+       FatalError("Created new root texture\n");
+
+    pipe_texture_reference(&check, NULL);
+
     return TRUE;
 }
 
@@ -213,10 +208,9 @@ static Bool
 crtc_resize(ScrnInfoPtr pScrn, int width, int height)
 {
     modesettingPtr ms = modesettingPTR(pScrn);
-    //ScreenPtr pScreen = pScrn->pScreen;
-    //PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
-    //Bool fbAccessDisabled;
-    //CARD8 *fbstart;
+    unsigned handle, stride;
+    PixmapPtr rootPixmap;
+    ScreenPtr pScreen = pScrn->pScreen;
 
     if (width == pScrn->virtualX && height == pScrn->virtualY)
        return TRUE;
@@ -226,13 +220,40 @@ crtc_resize(ScrnInfoPtr pScrn, int width, int height)
     pScrn->virtualX = width;
     pScrn->virtualY = height;
 
+    /*
+     * Remove the old framebuffer & texture.
+     */
+    drmModeRmFB(ms->fd, ms->fb_id);
+    pipe_texture_reference(&ms->root_texture, NULL);
+
+
+    rootPixmap = pScreen->GetScreenPixmap(pScreen);
+    if (!pScreen->ModifyPixmapHeader(rootPixmap, width, height, -1, -1, -1, NULL))
+       return FALSE;
+
+    /* takes one ref */
+    ms->root_texture = xorg_exa_get_texture(rootPixmap);
+
+    if (!ms->api->local_handle_from_texture(ms->api, ms->screen,
+                                           ms->root_texture,
+                                           &stride,
+                                           &handle))
+       FatalError("Could not get handle and stride from texture\n");
+
+    drmModeAddFB(ms->fd,
+                pScrn->virtualX,
+                pScrn->virtualY,
+                pScrn->depth,
+                pScrn->bitsPerPixel,
+                stride,
+                handle,
+                 &ms->fb_id);
+
     /* HW dependent - FIXME */
     pScrn->displayWidth = pScrn->virtualX;
 
-    drmModeRmFB(ms->fd, ms->fb_id);
-
     /* now create new frontbuffer */
-    return CreateFrontBuffer(pScrn);
+    return CreateFrontBuffer(pScrn) && BindTextureToRoot(pScrn);
 }
 
 static const xf86CrtcConfigFuncsRec crtc_config_funcs = {
@@ -288,10 +309,6 @@ PreInit(ScrnInfoPtr pScrn, int flags)
     } else
        ms->entityPrivate = NULL;
 
-    if (xf86RegisterResources(ms->pEnt->index, NULL, ResNone)) {
-       return FALSE;
-    }
-
     if (xf86IsEntityShared(pScrn->entityList[0])) {
        if (xf86IsPrimInitDone(pScrn->entityList[0])) {
            /* do something */
@@ -312,7 +329,6 @@ PreInit(ScrnInfoPtr pScrn, int flags)
     if (ms->fd < 0)
        return FALSE;
 
-    pScrn->racMemFlags = RAC_FB | RAC_COLORMAP;
     pScrn->monitor = pScrn->confScreen->monitor;
     pScrn->progClock = TRUE;
     pScrn->rgbBits = 8;
@@ -398,8 +414,6 @@ PreInit(ScrnInfoPtr pScrn, int flags)
        return FALSE;
     }
 
-    xf86LoaderReqSymLists(fbSymbols, NULL);
-
     xf86LoadSubModule(pScrn, "exa");
 
 #ifdef DRI2
@@ -470,7 +484,6 @@ CreateScreenResources(ScreenPtr pScreen)
     modesettingPtr ms = modesettingPTR(pScrn);
     PixmapPtr rootPixmap;
     Bool ret;
-    unsigned handle, stride;
 
     ms->noEvict = TRUE;
 
@@ -478,28 +491,14 @@ CreateScreenResources(ScreenPtr pScreen)
     ret = pScreen->CreateScreenResources(pScreen);
     pScreen->CreateScreenResources = CreateScreenResources;
 
-    rootPixmap = pScreen->GetScreenPixmap(pScreen);
-
-    xorg_exa_set_displayed_usage(rootPixmap);
-    if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
-       FatalError("Couldn't adjust screen pixmap\n");
+    BindTextureToRoot(pScrn);
 
     ms->noEvict = FALSE;
 
-    handle = xorg_exa_get_pixmap_handle(rootPixmap, &stride);
-
-    drmModeAddFB(ms->fd,
-                pScrn->virtualX,
-                pScrn->virtualY,
-                pScrn->depth,
-                pScrn->bitsPerPixel,
-                stride,
-                handle,
-                 &ms->fb_id);
-
     AdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
 
 #ifdef DRM_MODE_FEATURE_DIRTYFB
+    rootPixmap = pScreen->GetScreenPixmap(pScreen);
     ms->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,
                               pScreen, rootPixmap);
 
@@ -512,6 +511,8 @@ CreateScreenResources(ScreenPtr pScreen)
                   "Failed to create screen damage record\n");
        return FALSE;
     }
+#else
+    (void)rootPixmap;
 #endif
 
     return ret;
@@ -540,6 +541,9 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
            return FALSE;
     }
 
+    if (!ms->api)
+       ms->api = drm_api_create();
+
     if (!ms->screen) {
        ms->screen = ms->api->create_screen(ms->api, ms->fd, NULL);
 
@@ -598,6 +602,9 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     xf86SetBlackWhitePixels(pScreen);
 
     ms->exa = xorg_exa_init(pScrn);
+    ms->debug_fallback = debug_get_bool_option("XORG_DEBUG_FALLBACK", TRUE);
+
+    xorg_init_video(pScreen);
 
     miInitializeBackingStore(pScreen);
     xf86SetBackingStore(pScreen);
@@ -647,8 +654,8 @@ AdjustFrame(int scrnIndex, int x, int y, int flags)
     xf86CrtcPtr crtc = output->crtc;
 
     if (crtc && crtc->enabled) {
-       crtc->funcs->mode_set(crtc, pScrn->currentMode, pScrn->currentMode, x,
-                             y);
+       crtc->funcs->set_mode_major(crtc, pScrn->currentMode,
+                                   RR_Rotate_0, x, y);
        crtc->x = output->initial_x + x;
        crtc->y = output->initial_y + y;
     }
@@ -660,10 +667,6 @@ FreeScreen(int scrnIndex, int flags)
     FreeRec(xf86Screens[scrnIndex]);
 }
 
-/* HACK */
-void
-cursor_destroy(xf86CrtcPtr crtc);
-
 static void
 LeaveVT(int scrnIndex, int flags)
 {
@@ -675,7 +678,7 @@ LeaveVT(int scrnIndex, int flags)
     for (o = 0; o < config->num_crtc; o++) {
        xf86CrtcPtr crtc = config->crtc[o];
 
-       cursor_destroy(crtc);
+       crtc_cursor_destroy(crtc);
 
        if (crtc->rotatedPixmap || crtc->rotatedData) {
            crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap,
@@ -725,8 +728,11 @@ EnterVT(int scrnIndex, int flags)
        SaveHWState(pScrn);
     }
 
-    if (!flags)                               /* signals startup as we'll do this in CreateScreenResources */
-       CreateFrontBuffer(pScrn);
+    if (!CreateFrontBuffer(pScrn))
+       return FALSE;
+
+    if (!flags && !BindTextureToRoot(pScrn))
+       return FALSE;
 
     if (!xf86SetDesiredModes(pScrn))
        return FALSE;
@@ -766,11 +772,15 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
     }
 #endif
 
+    pipe_texture_reference(&ms->root_texture, NULL);
+
     if (ms->exa)
        xorg_exa_close(pScrn);
 
+    if (ms->api && ms->api->destroy)
        ms->api->destroy(ms->api);
-       ms->api = NULL;
+    ms->api = NULL;
+
     drmClose(ms->fd);
     ms->fd = -1;