diff options
author | Thomas White <taw@bitwiz.org.uk> | 2009-07-22 17:29:18 +0100 |
---|---|---|
committer | Thomas White <taw@bitwiz.org.uk> | 2009-07-22 17:29:18 +0100 |
commit | 477353734de273195ee777eeace44f50aab00e47 (patch) | |
tree | e21606e082466f073053a17c0a17f203021b9c3a /src/glamo-kms-driver.c | |
parent | c9f31330d7847820a9cabebc193f22a176690a67 (diff) |
Drop in most of the rest of the code
Diffstat (limited to 'src/glamo-kms-driver.c')
-rw-r--r-- | src/glamo-kms-driver.c | 265 |
1 files changed, 240 insertions, 25 deletions
diff --git a/src/glamo-kms-driver.c b/src/glamo-kms-driver.c index c04a62f..1d9bac8 100644 --- a/src/glamo-kms-driver.c +++ b/src/glamo-kms-driver.c @@ -53,6 +53,7 @@ #include <sys/types.h> #include <dirent.h> +#include <stdint.h> #include <xorg-server.h> #include <drm.h> @@ -66,6 +67,8 @@ #include "xf86drm.h" #include "glamo.h" +#include "glamo-kms-driver.h" +#include "glamo-kms-exa.h" static const char *fbSymbols[] = { @@ -103,37 +106,68 @@ Bool GlamoKernelModesettingAvailable() } -static Bool crtc_resize(ScrnInfoPtr pScrn, int width, int height) +static Bool CreateFrontBuffer(ScrnInfoPtr pScrn) { -#if 0 - modesettingPtr ms = modesettingPTR(pScrn); - ScreenPtr pScreen = pScrn->pScreen; - PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen); - Bool fbAccessDisabled; - CARD8 *fbstart; - - if (width == pScrn->virtualX && height == pScrn->virtualY) + GlamoPtr pGlamo = GlamoPTR(pScrn); + ScreenPtr pScreen = pScrn->pScreen; + PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen); + Bool fbAccessDisabled; + int flags; + + pGlamo->noEvict = TRUE; + pScreen->ModifyPixmapHeader(rootPixmap, + pScrn->virtualX, pScrn->virtualY, + pScrn->depth, pScrn->bitsPerPixel, + pScrn->displayWidth * pScrn->bitsPerPixel/8, + NULL); + pGlamo->noEvict = FALSE; + + drmModeAddFB(ms->fd, + pScrn->virtualX, + pScrn->virtualY, + pScrn->depth, + pScrn->bitsPerPixel, + pScrn->displayWidth * pScrn->bitsPerPixel / 8, + driGetPixmapHandle(rootPixmap, &flags), &ms->fb_id); + + pScrn->frameX0 = 0; + pScrn->frameY0 = 0; + GlamoKMSAdjustFrame(pScrn->scrnIndex, + pScrn->frameX0, pScrn->frameY0, + 0); + return TRUE; +} - ErrorF("RESIZING TO %dx%d\n", width, height); - pScrn->virtualX = width; - pScrn->virtualY = height; +static Bool crtc_resize(ScrnInfoPtr pScrn, int width, int height) +{ + GlamoPtr pGlamo = GlamoPTR(pScrn); + ScreenPtr pScreen = pScrn->pScreen; + PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen); + Bool fbAccessDisabled; + CARD8 *fbstart; - /* HW dependent - FIXME */ - pScrn->displayWidth = pScrn->virtualX; + if ( (width == pScrn->virtualX) && (height == pScrn->virtualY) ) + return TRUE; /* Nothing to do */ - drmModeRmFB(ms->fd, ms->fb_id); + ErrorF("RESIZING TO %dx%d\n", width, height); - /* now create new frontbuffer */ - return CreateFrontBuffer(pScrn); -#endif - return FALSE; + pScrn->virtualX = width; + pScrn->virtualY = height; + + /* HW dependent - FIXME */ + pScrn->displayWidth = pScrn->virtualX; + + drmModeRmFB(pGlamo->drm_fd, pGlamo->fb_id); + + /* now create new frontbuffer */ + return CreateFrontBuffer(pScrn); } static const xf86CrtcConfigFuncsRec crtc_config_funcs = { - crtc_resize + crtc_resize }; @@ -224,33 +258,214 @@ Bool GlamoKMSPreInit(ScrnInfoPtr pScrn, int flags) } +static Bool GlamoKMSCloseScreen(int scrnIndex, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + GlamoPtr pGlamo = GlamoPTR(pScrn); + + if ( pScrn->vtSema ) { + GlamoKMSLeaveVT(scrnIndex, 0); + } + driCloseScreen(pScreen); + + pScreen->CreateScreenResources = pGlamo->createScreenResources; + + if ( pGlamo->exa ) { + ExaClose(pScrn); + } + + drmClose(pGlamo->drm_fd); + pGlamo->drm_fd = -1; + + pScrn->vtSema = FALSE; + pScreen->CloseScreen = pGlamo->CloseScreen; + return (*pScreen->CloseScreen)(scrnIndex, pScreen); +} + + Bool GlamoKMSScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + GlamoPtr pGlamo = GlamoPTR(pScrn); + VisualPtr visual; + unsigned long sys_mem; + int c; + MessageType from; + + /* Deal with server regeneration */ + if ( pGlamo->drm_fd < 0 ) { + pGlamo->drm_fd = drmOpen(NULL, "platform:glamo-fb"); + if ( pGlamo->drm_fd < 0 ) return FALSE; + } + + pScrn->pScreen = pScreen; + + /* HW dependent - FIXME */ + pScrn->displayWidth = pScrn->virtualX; + + miClearVisualTypes(); + + if ( !miSetVisualTypes(pScrn->depth, + miGetDefaultVisualMask(pScrn->depth), + pScrn->rgbBits, pScrn->defaultVisual) ) { + return FALSE; + } + + if ( !miSetPixmapDepths() ) return FALSE; + + pScrn->memPhysBase = 0; + pScrn->fbOffset = 0; + + if ( !fbScreenInit(pScreen, NULL, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, + pScrn->displayWidth, pScrn->bitsPerPixel) ) { + return FALSE; + } + + if (pScrn->bitsPerPixel > 8) { + /* Fixup RGB ordering */ + visual = pScreen->visuals + pScreen->numVisuals; + while (--visual >= pScreen->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = pScrn->offset.red; + visual->offsetGreen = pScrn->offset.green; + visual->offsetBlue = pScrn->offset.blue; + visual->redMask = pScrn->mask.red; + visual->greenMask = pScrn->mask.green; + visual->blueMask = pScrn->mask.blue; + } + } + } + + fbPictureInit(pScreen, NULL, 0); + + pGlamo->createScreenResources = pScreen->CreateScreenResources; + pScreen->CreateScreenResources = CreateScreenResources; + + xf86SetBlackWhitePixels(pScreen); + + pGlamo->exa = GlamoKMSExaInit(pScrn); + + miInitializeBackingStore(pScreen); + xf86SetBackingStore(pScreen); + xf86SetSilkenMouse(pScreen); + miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); + + /* Need to extend HWcursor support to handle mask interleave */ + if (!ms->SWCursor) { + xf86_cursors_init(pScreen, 64, 64, + HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | + HARDWARE_CURSOR_ARGB); + } + + /* Must force it before EnterVT, so we are in control of VT and + * later memory should be bound when allocating, e.g rotate_mem */ + pScrn->vtSema = TRUE; + + pScreen->SaveScreen = xf86SaveScreen; + pGlamo->CloseScreen = pScreen->CloseScreen; + pScreen->CloseScreen = GlamoKMSCloseScreen; + + if ( !xf86CrtcScreenInit(pScreen) ) return FALSE; + + if ( !miCreateDefColormap(pScreen) ) return FALSE; + + xf86DPMSInit(pScreen, xf86DPMSSet, 0); + + if ( serverGeneration == 1 ) { + xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + } + + driScreenInit(pScreen); + + return GlamoKMSEnterVT(scrnIndex, 1); } -Bool GlamoSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) +Bool GlamoKMSSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) { + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + return xf86SetSingleMode(pScrn, mode, RR_Rotate_0); } -void GlamoAdjustFrame(int scrnIndex, int x, int y, int flags) +void GlamoKMSAdjustFrame(int scrnIndex, int x, int y, int flags) { + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + xf86OutputPtr output = config->output[config->compat_output]; + xf86CrtcPtr crtc = output->crtc; + + if (crtc && crtc->enabled) { + crtc->funcs->mode_set(crtc, + pScrn->currentMode, + pScrn->currentMode, + x, y); + crtc->x = output->initial_x + x; + crtc->y = output->initial_y + y; + } } -Bool GlamoEnterVT(int scrnIndex, int flags) +Bool GlamoKMSEnterVT(int scrnIndex, int flags) { + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + GlamoPtr pGlamo = GlamoPTR(pScrn); + + driUnlock(pScrn->pScreen); + + /* Only save state once per server generation since that's what most + * drivers do. Could change this to save state at each VT enter. */ + if ( pGlamo->SaveGeneration != serverGeneration ) { + pGlamo->SaveGeneration = serverGeneration; + /* ...except there is no hardware state to save */ + } + + if ( !flags ) { + /* signals startup as we'll do this in CreateScreenResources */ + CreateFrontBuffer(pScrn); + } + + if ( !xf86SetDesiredModes(pScrn) ) return FALSE; + + return TRUE; } -void GlamoLeaveVT(int scrnIndex, int flags) +void GlamoKMSLeaveVT(int scrnIndex, int flags) { + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + GlamoPtr pGlamo = GlamoPTR(pScrn); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + int o; + + for (o = 0; o < config->num_crtc; o++) { + + xf86CrtcPtr crtc = config->crtc[o]; + + cursor_destroy(crtc); + + if ( crtc->rotatedPixmap || crtc->rotatedData ) { + crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap, + crtc->rotatedData); + crtc->rotatedPixmap = NULL; + crtc->rotatedData = NULL; + } + + } + + drmModeRmFB(pGlamo->drm_fd, pGlamo->fb_id); + + driLock(pScrn->pScreen); + + pScrn->vtSema = FALSE; } -ModeStatus GlamoValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, +ModeStatus GlamoKMSValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) { + return MODE_OK; } |