diff options
author | Thomas White <taw@bitwiz.org.uk> | 2009-07-28 01:28:36 +0100 |
---|---|---|
committer | Thomas White <taw@bitwiz.org.uk> | 2009-07-28 01:28:36 +0100 |
commit | 839e7e06a1e24c66233b77b50e454b286caadf93 (patch) | |
tree | de24a67c80b4cbd6a65a1d5994b6db09ac0bf8d1 /src | |
parent | cbbb356da7f4384c812c9db230657097992da1e7 (diff) |
De-crashify a few things
Diffstat (limited to 'src')
-rw-r--r-- | src/glamo-dri2.c | 1 | ||||
-rw-r--r-- | src/glamo-driver.c | 162 | ||||
-rw-r--r-- | src/glamo-kms-driver.c | 5 | ||||
-rw-r--r-- | src/glamo-kms-exa.c | 19 |
4 files changed, 108 insertions, 79 deletions
diff --git a/src/glamo-dri2.c b/src/glamo-dri2.c index 1a1d836..2491f82 100644 --- a/src/glamo-dri2.c +++ b/src/glamo-dri2.c @@ -174,7 +174,6 @@ void driScreenInit(ScreenPtr pScreen) dri2info.CreateBuffers = glamoCreateBuffers; dri2info.DestroyBuffers = glamoDestroyBuffers; dri2info.CopyRegion = glamoCopyRegion; - dri2info.Wait = NULL; if ( !DRI2ScreenInit(pScreen, &dri2info) ) return; } diff --git a/src/glamo-driver.c b/src/glamo-driver.c index f737725..002dca3 100644 --- a/src/glamo-driver.c +++ b/src/glamo-driver.c @@ -278,13 +278,101 @@ GlamoIdentify(int flags) } static Bool -GlamoProbe(DriverPtr drv, int flags) +GlamoFbdevProbe(DriverPtr drv, GDevPtr *devSections, int numDevSections) { + char *dev; + Bool foundScreen = FALSE; int i; ScrnInfoPtr pScrn; + + if (!xf86LoadDrvSubModule(drv, "fbdevhw")) return FALSE; + + for (i = 0; i < numDevSections; i++) { + + dev = xf86FindOptionValue(devSections[i]->options, "Device"); + if (fbdevHWProbe(NULL, dev, NULL)) { + int entity; + pScrn = NULL; + + entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE); + pScrn = xf86ConfigFbEntity(pScrn,0,entity, NULL, NULL, + NULL, NULL); + + if (pScrn) { + + foundScreen = TRUE; + + pScrn->driverVersion = GLAMO_VERSION; + pScrn->driverName = GLAMO_DRIVER_NAME; + pScrn->name = GLAMO_NAME; + pScrn->Probe = GlamoProbe; + pScrn->PreInit = GlamoPreInit; + pScrn->ScreenInit = GlamoScreenInit; + pScrn->SwitchMode = GlamoSwitchMode; + pScrn->AdjustFrame = fbdevHWAdjustFrameWeak(); + pScrn->EnterVT = GlamoEnterVT; + pScrn->LeaveVT = GlamoLeaveVT; + pScrn->ValidMode = fbdevHWValidModeWeak(); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "using %s\n", + dev ? dev : "default device\n"); + + } + } + + } + + return foundScreen; +} + +static Bool +GlamoKMSProbe(DriverPtr drv, GDevPtr *devSections, int numDevSections) +{ + ScrnInfoPtr pScrn = NULL; + int entity; + Bool foundScreen = FALSE; + int i; + + for ( i = 0; i < numDevSections; i++ ) { + + /* This is a little dodgy. We aren't really using fbdevhw + * (/dev/fb0 is irrelevant), but we need a device entity to make + * the later stages of initialisation work. xf86ClaimFbSlot() + * does the minimum required to make this work, so we use it + * despite the above. */ + entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE); + pScrn = xf86ConfigFbEntity(pScrn, 0, entity, NULL, NULL, NULL, + NULL); + + if ( pScrn ) { + + foundScreen = TRUE; + + /* Plug in KMS functions */ + pScrn->driverVersion = GLAMO_VERSION; + pScrn->driverName = GLAMO_DRIVER_NAME; + pScrn->name = GLAMO_NAME; + pScrn->PreInit = GlamoKMSPreInit; + pScrn->ScreenInit = GlamoKMSScreenInit; + pScrn->SwitchMode = GlamoKMSSwitchMode; + pScrn->AdjustFrame = GlamoKMSAdjustFrame; + pScrn->EnterVT = GlamoKMSEnterVT; + pScrn->LeaveVT = GlamoKMSLeaveVT; + pScrn->ValidMode = GlamoKMSValidMode; + + } + } + + return foundScreen; +} + +static Bool +GlamoProbe(DriverPtr drv, int flags) +{ + ScrnInfoPtr pScrn; GDevPtr *devSections; int numDevSections; - char *dev; Bool foundScreen = FALSE; TRACE("probe start"); @@ -294,75 +382,15 @@ GlamoProbe(DriverPtr drv, int flags) return FALSE; numDevSections = xf86MatchDevice(GLAMO_DRIVER_NAME, &devSections); - if (numDevSections <= 0) - return FALSE; + if (numDevSections <= 0) return FALSE; /* Is today a good day to use KMS? */ if ( GlamoKernelModesettingAvailable() ) { - - foundScreen = TRUE; - - pScrn = xf86AllocateScreen(drv, 0); - - /* Plug in KMS functions instead of the conventional ones */ - pScrn->driverVersion = GLAMO_VERSION; - pScrn->driverName = GLAMO_DRIVER_NAME; - pScrn->name = GLAMO_NAME; - pScrn->PreInit = GlamoKMSPreInit; - pScrn->ScreenInit = GlamoKMSScreenInit; - pScrn->SwitchMode = GlamoKMSSwitchMode; - pScrn->AdjustFrame = GlamoKMSAdjustFrame; - pScrn->EnterVT = GlamoKMSEnterVT; - pScrn->LeaveVT = GlamoKMSLeaveVT; - pScrn->ValidMode = GlamoKMSValidMode; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using KMS!"); - + foundScreen = GlamoKMSProbe(drv, devSections, numDevSections); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using KMS!\n"); } else { - - if (!xf86LoadDrvSubModule(drv, "fbdevhw")) - return FALSE; - - for (i = 0; i < numDevSections; i++) { - dev = xf86FindOptionValue(devSections[i]->options, - "Device"); - if (fbdevHWProbe(NULL, dev, NULL)) { - int entity; - pScrn = NULL; - - entity = xf86ClaimFbSlot(drv, 0, devSections[i], - TRUE); - pScrn = xf86ConfigFbEntity(pScrn,0,entity, NULL, - NULL, NULL, NULL); - - if (pScrn) { - foundScreen = TRUE; - - pScrn->driverVersion = GLAMO_VERSION; - pScrn->driverName = GLAMO_DRIVER_NAME; - pScrn->name = GLAMO_NAME; - pScrn->Probe = GlamoProbe; - pScrn->PreInit = GlamoPreInit; - pScrn->ScreenInit = GlamoScreenInit; - pScrn->SwitchMode = GlamoSwitchMode; - pScrn->AdjustFrame - = fbdevHWAdjustFrameWeak(); - pScrn->EnterVT = GlamoEnterVT; - pScrn->LeaveVT = GlamoLeaveVT; - pScrn->ValidMode - = fbdevHWValidModeWeak(); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "using %s\n", - dev ? dev : "default device"); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Not using KMS"); - - } - } - } - + foundScreen = GlamoFbdevProbe(drv, devSections, numDevSections); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not using KMS\n"); } xfree(devSections); diff --git a/src/glamo-kms-driver.c b/src/glamo-kms-driver.c index c92e4d6..bc4d933 100644 --- a/src/glamo-kms-driver.c +++ b/src/glamo-kms-driver.c @@ -212,8 +212,8 @@ Bool GlamoKMSPreInit(ScrnInfoPtr pScrn, int flags) pScrn->progClock = TRUE; pScrn->rgbBits = 8; - if ( !xf86SetDepthBpp(pScrn, 0, 0, 0, PreferConvert24to32 - | SupportConvert24to32 | Support32bppFb) ) { + /* Prefer 16bpp for everything */ + if ( !xf86SetDepthBpp(pScrn, 16, 16, 16, NoDepth24Support) ) { return FALSE; } @@ -341,6 +341,7 @@ Bool GlamoKMSScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, } pScrn->pScreen = pScreen; + pGlamo->pScreen = pScreen; /* HW dependent - FIXME */ pScrn->displayWidth = pScrn->virtualX; diff --git a/src/glamo-kms-exa.c b/src/glamo-kms-exa.c index 8e31a22..f46a0b1 100644 --- a/src/glamo-kms-exa.c +++ b/src/glamo-kms-exa.c @@ -518,12 +518,15 @@ void GlamoKMSExaInit(ScrnInfoPtr pScrn) if ( !exa ) return; pGlamo->exa = exa; + exa->exa_major = EXA_VERSION_MAJOR; + exa->exa_minor = EXA_VERSION_MINOR; exa->memoryBase = 0; exa->memorySize = 0; exa->offScreenBase = 0; - - exa->exa_major = EXA_VERSION_MAJOR; - exa->exa_minor = EXA_VERSION_MINOR; + exa->pixmapOffsetAlign = 2; + exa->pixmapPitchAlign = 2; + exa->maxX = 640; + exa->maxY = 640; /* Solid fills */ exa->PrepareSolid = GlamoKMSExaPrepareSolid; @@ -548,11 +551,6 @@ void GlamoKMSExaInit(ScrnInfoPtr pScrn) // exa->MarkSync = GlamoKMSExaMarkSync; exa->WaitMarker = GlamoKMSExaWaitMarker; - exa->pixmapOffsetAlign = 2; - exa->pixmapPitchAlign = 2; - - exa->maxX = 640; - exa->maxY = 640; pGlamo->cmdq_objs = malloc(1024); pGlamo->cmdq_obj_pos = malloc(1024); @@ -568,7 +566,10 @@ void GlamoKMSExaInit(ScrnInfoPtr pScrn) exa->PixmapIsOffscreen = GlamoKMSExaPixmapIsOffscreen; exa->ModifyPixmapHeader = GlamoKMSExaModifyPixmapHeader; - success = exaDriverInit(pGlamo->pScreen, exa); + /* Hook up with libdrm */ + pGlamo->bufmgr = glamo_bo_manager_gem_ctor(pGlamo->drm_fd); + + success = exaDriverInit(pScrn->pScreen, exa); if (success) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initialized EXA acceleration\n"); |