diff options
author | Eric Anholt <eric@anholt.net> | 2009-01-22 17:54:49 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-04-27 17:05:55 -0700 |
commit | 30c226eeb35f034c3ddb881e77454051dc210298 (patch) | |
tree | 5a0f98a4dfbb280c781ae6ba9761d58198ae4ba6 /src/i830_dri.c | |
parent | 47591334a183881704a121ae06ebc2fadebe6f73 (diff) |
Remove DRI1 support.
This was blocked on wide distribution of X Server 1.6 (now in the current or
next version of major distributions) and solutions for a couple of significant
architectural problems (vblank sync and frontbuffer rendering, which we now
have code or good plans for).
This includes disabling XVMC which is DRI1-only currently.
Diffstat (limited to 'src/i830_dri.c')
-rw-r--r-- | src/i830_dri.c | 1438 |
1 files changed, 1 insertions, 1437 deletions
diff --git a/src/i830_dri.c b/src/i830_dri.c index 93bb3409..745162d1 100644 --- a/src/i830_dri.c +++ b/src/i830_dri.c @@ -89,11 +89,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "i915_drm.h" -#include "dristruct.h" - -#ifdef DRI2 #include "dri2.h" +#ifdef DRI2 #if DRI2INFOREC_VERSION >= 1 #define USE_DRI2_1_1_0 #endif @@ -101,1438 +99,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. extern XF86ModuleData dri2ModuleData; #endif -static Bool I830InitVisualConfigs(ScreenPtr pScreen); -static Bool I830CreateContext(ScreenPtr pScreen, VisualPtr visual, - drm_context_t hwContext, void *pVisualConfigPriv, - DRIContextType contextStore); -static void I830DestroyContext(ScreenPtr pScreen, drm_context_t hwContext, - DRIContextType contextStore); -static void I830DRISwapContext(ScreenPtr pScreen, DRISyncType syncType, - DRIContextType readContextType, - void *readContextStore, - DRIContextType writeContextType, - void *writeContextStore); -static void I830DRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index); -static void I830DRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index); - -static void I830DRITransitionTo2d(ScreenPtr pScreen); -static void I830DRITransitionTo3d(ScreenPtr pScreen); - -#if (DRIINFO_MAJOR_VERSION > 5 || \ - (DRIINFO_MAJOR_VERSION == 5 && DRIINFO_MINOR_VERSION >= 4)) -#define DRI_DRIVER_FRAMEBUFFER_MAP 1 -#else -#define DRI_DRIVER_FRAMEBUFFER_MAP 0 -#endif - -extern void GlxSetVisualConfigs(int nconfigs, - __GLXvisualConfig * configs, - void **configprivs); - -static Bool -I830CleanupDma(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - drmI830Init info; - - memset(&info, 0, sizeof(drmI830Init)); - info.func = I830_CLEANUP_DMA; - - if (drmCommandWrite(pI830->drmSubFD, DRM_I830_INIT, - &info, sizeof(drmI830Init))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I830 Dma Cleanup Failed\n"); - return FALSE; - } - - return TRUE; -} - -static Bool -I830InitDma(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - I830RingBuffer *ring = &pI830->ring; - I830DRIPtr pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate; - drmI830Init info; - - memset(&info, 0, sizeof(drmI830Init)); - info.func = I830_INIT_DMA; - - /* Initialize fields that are used in the absence of GEM */ - if (!pI830->memory_manager && !pI830->use_drm_mode) { - info.ring_start = ring->mem->offset + pI830->LinearAddr; - info.ring_end = ring->mem->end + pI830->LinearAddr; - info.ring_size = ring->mem->size; - - /* Not used as of the middle of GEM development. */ - info.mmio_offset = (unsigned int)pI830DRI->regs; - - /* Not used as of before GEM development */ - info.front_offset = pI830->front_buffer->offset; - info.back_offset = pI830->back_buffer->offset; - info.depth_offset = pI830->depth_buffer->offset; - info.pitch = pScrn->displayWidth; - info.back_pitch = pScrn->displayWidth; - info.depth_pitch = pScrn->displayWidth; - info.w = pScrn->virtualX; - info.h = pScrn->virtualY; - } - - - info.sarea_priv_offset = sizeof(XF86DRISAREARec); - - /* This should probably have been moved alongside offset/pitch in the sarea. - */ - info.cpp = pI830->cpp; - - if (drmCommandWrite(pI830->drmSubFD, DRM_I830_INIT, - &info, sizeof(drmI830Init))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "I830 Dma Initialization Failed\n"); - return FALSE; - } - - return TRUE; -} - -static Bool -I830ResumeDma(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - drmI830Init info; - - memset(&info, 0, sizeof(drmI830Init)); - info.func = I830_RESUME_DMA; - - if (drmCommandWrite(pI830->drmSubFD, DRM_I830_INIT, - &info, sizeof(drmI830Init))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I830 Dma Resume Failed\n"); - return FALSE; - } - - return TRUE; -} - -static Bool -I830SetParam(ScrnInfoPtr pScrn, int param, int value) -{ - I830Ptr pI830 = I830PTR(pScrn); - drmI830SetParam sp; - - memset(&sp, 0, sizeof(sp)); - sp.param = param; - sp.value = value; - - if (drmCommandWrite(pI830->drmSubFD, DRM_I830_SETPARAM, &sp, sizeof(sp))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I830 SetParam Failed\n"); - return FALSE; - } - - return TRUE; -} - -Bool -I830DRISetHWS(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - drmI830HWS hws; - - hws.addr = pI830->hw_status->offset; - - if (drmCommandWrite(pI830->drmSubFD, DRM_I830_HWS_PAGE_ADDR, - &hws, sizeof(drmI830HWS))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "hw status page initialization Failed\n"); - return FALSE; - } - return TRUE; -} - -static Bool -I830InitVisualConfigs(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - int numConfigs = 0; - __GLXvisualConfig *pConfigs = NULL; - I830ConfigPrivPtr pI830Configs = NULL; - I830ConfigPrivPtr *pI830ConfigPtrs = NULL; - int accum, stencil, db, depth; - int i; - - switch (pScrn->bitsPerPixel) { - case 8: - case 24: - break; - - case 16: - numConfigs = 8; - - pConfigs = - (__GLXvisualConfig *) xcalloc(sizeof(__GLXvisualConfig), - numConfigs); - if (!pConfigs) - return FALSE; - - pI830Configs = - (I830ConfigPrivPtr) xcalloc(sizeof(I830ConfigPrivRec), - numConfigs); - if (!pI830Configs) { - xfree(pConfigs); - return FALSE; - } - - pI830ConfigPtrs = - (I830ConfigPrivPtr *) xcalloc(sizeof(I830ConfigPrivPtr), - numConfigs); - if (!pI830ConfigPtrs) { - xfree(pConfigs); - xfree(pI830Configs); - return FALSE; - } - - for (i = 0; i < numConfigs; i++) - pI830ConfigPtrs[i] = &pI830Configs[i]; - - i = 0; - depth = 1; - for (accum = 0; accum <= 1; accum++) { - for (stencil = 0; stencil <= 1; stencil++) { - for (db = 1; db >= 0; db--) { - pConfigs[i].vid = -1; - pConfigs[i].class = -1; - pConfigs[i].rgba = TRUE; - pConfigs[i].redSize = 5; - pConfigs[i].greenSize = 6; - pConfigs[i].blueSize = 5; - pConfigs[i].alphaSize = 0; - pConfigs[i].redMask = 0x0000F800; - pConfigs[i].greenMask = 0x000007E0; - pConfigs[i].blueMask = 0x0000001F; - pConfigs[i].alphaMask = 0; - if (accum) { - pConfigs[i].accumRedSize = 16; - pConfigs[i].accumGreenSize = 16; - pConfigs[i].accumBlueSize = 16; - pConfigs[i].accumAlphaSize = 0; - } else { - pConfigs[i].accumRedSize = 0; - pConfigs[i].accumGreenSize = 0; - pConfigs[i].accumBlueSize = 0; - pConfigs[i].accumAlphaSize = 0; - } - pConfigs[i].doubleBuffer = db ? TRUE : FALSE; - pConfigs[i].stereo = FALSE; - pConfigs[i].bufferSize = 16; - if (depth) - pConfigs[i].depthSize = 16; - else - pConfigs[i].depthSize = 0; - if (stencil) - pConfigs[i].stencilSize = 8; - else - pConfigs[i].stencilSize = 0; - pConfigs[i].auxBuffers = 0; - pConfigs[i].level = 0; - if (stencil || accum) - pConfigs[i].visualRating = GLX_SLOW_VISUAL_EXT; - else - pConfigs[i].visualRating = GLX_NONE_EXT; - pConfigs[i].transparentPixel = GLX_NONE_EXT; - pConfigs[i].transparentRed = 0; - pConfigs[i].transparentGreen = 0; - pConfigs[i].transparentBlue = 0; - pConfigs[i].transparentAlpha = 0; - pConfigs[i].transparentIndex = 0; - i++; - } - } - } - assert(i == numConfigs); - break; - - case 32: - numConfigs = 8; - - pConfigs = (__GLXvisualConfig *) xcalloc(sizeof(__GLXvisualConfig), - numConfigs); - if (!pConfigs) { - return FALSE; - } - - pI830Configs = (I830ConfigPrivPtr) xcalloc(sizeof(I830ConfigPrivRec), - numConfigs); - if (!pI830Configs) { - xfree(pConfigs); - return FALSE; - } - - pI830ConfigPtrs = (I830ConfigPrivPtr *) - xcalloc(sizeof(I830ConfigPrivPtr), numConfigs); - if (!pI830ConfigPtrs) { - xfree(pConfigs); - xfree(pI830Configs); - return FALSE; - } - - for (i = 0; i < numConfigs; i++) { - pI830ConfigPtrs[i] = &pI830Configs[i]; - } - - i = 0; - for (accum = 0; accum <= 1; accum++) { - for (depth = 1; depth >= 0; depth--) { /* and stencil */ - for (db = 1; db >= 0; db--) { - pConfigs[i].vid = -1; - pConfigs[i].class = -1; - pConfigs[i].rgba = TRUE; - pConfigs[i].redSize = 8; - pConfigs[i].greenSize = 8; - pConfigs[i].blueSize = 8; - pConfigs[i].alphaSize = 8; - pConfigs[i].redMask = 0x00FF0000; - pConfigs[i].greenMask = 0x0000FF00; - pConfigs[i].blueMask = 0x000000FF; - pConfigs[i].alphaMask = 0xFF000000; - if (accum) { - pConfigs[i].accumRedSize = 16; - pConfigs[i].accumGreenSize = 16; - pConfigs[i].accumBlueSize = 16; - pConfigs[i].accumAlphaSize = 16; - } else { - pConfigs[i].accumRedSize = 0; - pConfigs[i].accumGreenSize = 0; - pConfigs[i].accumBlueSize = 0; - pConfigs[i].accumAlphaSize = 0; - } - if (db) { - pConfigs[i].doubleBuffer = TRUE; - } else { - pConfigs[i].doubleBuffer = FALSE; - } - pConfigs[i].stereo = FALSE; - pConfigs[i].bufferSize = 32; - if (depth) { - pConfigs[i].depthSize = 24; - pConfigs[i].stencilSize = 8; - } else { - pConfigs[i].depthSize = 0; - pConfigs[i].stencilSize = 0; - } - pConfigs[i].auxBuffers = 0; - pConfigs[i].level = 0; - if (accum) { - pConfigs[i].visualRating = GLX_SLOW_VISUAL_EXT; - } else { - pConfigs[i].visualRating = GLX_NONE_EXT; - } - pConfigs[i].transparentPixel = GLX_NONE_EXT; - pConfigs[i].transparentRed = 0; - pConfigs[i].transparentGreen = 0; - pConfigs[i].transparentBlue = 0; - pConfigs[i].transparentAlpha = 0; - pConfigs[i].transparentIndex = 0; - i++; - } - } - } - if (i != numConfigs) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] Incorrect initialization of visuals\n"); - return FALSE; - } - break; - - } - pI830->numVisualConfigs = numConfigs; - pI830->pVisualConfigs = pConfigs; - pI830->pVisualConfigsPriv = pI830Configs; - GlxSetVisualConfigs(numConfigs, pConfigs, (void **)pI830ConfigPtrs); - return TRUE; -} - -static Bool -I830CheckDRIAvailable(ScrnInfoPtr pScrn) -{ - /* Hardware 3D rendering only implemented for 16bpp and 32 bpp */ - if (((pScrn->bitsPerPixel / 8) != 2 && pScrn->depth != 16) && - (pScrn->bitsPerPixel / 8) != 4) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] Direct rendering only supported in 16 and 32 bpp modes\n"); - return FALSE; - } - - /* Check that the GLX, DRI, and DRM modules have been loaded by testing - * for known symbols in each module. */ - if (!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] %s failed: glx not loaded\n", __FUNCTION__); - return FALSE; - } - if (!xf86LoaderCheckSymbol("DRIScreenInit")) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] %s failed: dri not loaded\n", __FUNCTION__); - return FALSE; - } - if (!xf86LoaderCheckSymbol("drmAvailable")) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] %s failed: libdrm not loaded\n", __FUNCTION__); - return FALSE; - } - if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] %s failed (libdri.a too old)\n", __FUNCTION__); - return FALSE; - } - - /* Check the DRI version */ - { - int major, minor, patch; - - DRIQueryVersion(&major, &minor, &patch); - if (major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION || - major < 5) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] %s failed because of a version mismatch.\n" - "[dri] libDRI version is %d.%d.%d but version %d.%d.x is needed.\n" - "[dri] Disabling DRI.\n", - "I830CheckDRIAvailable", major, minor, patch, - DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION); - return FALSE; - } - } - - return TRUE; -} - -Bool -I830DRIScreenInit(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - DRIInfoPtr pDRIInfo; - I830DRIPtr pI830DRI; - - DPRINTF(PFX, "I830DRIScreenInit\n"); - - if (!I830CheckDRIAvailable(pScrn)) - return FALSE; - - pDRIInfo = DRICreateInfoRec(); - if (!pDRIInfo) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] DRICreateInfoRec failed. Disabling DRI.\n"); - return FALSE; - } - - pI830->pDRIInfo = pDRIInfo; - pI830->LockHeld = 0; - - pDRIInfo->drmDriverName = "i915"; - if (IS_I965G(pI830)) - pDRIInfo->clientDriverName = "i965"; - else - pDRIInfo->clientDriverName = "i915"; - - if (xf86LoaderCheckSymbol("DRICreatePCIBusID")) { - pDRIInfo->busIdString = DRICreatePCIBusID(pI830->PciInfo); - } else { - pDRIInfo->busIdString = xalloc(64); - sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d", -#if XSERVER_LIBPCIACCESS - ((pI830->PciInfo->domain << 8) | pI830->PciInfo->bus), - pI830->PciInfo->dev, pI830->PciInfo->func -#else - ((pciConfigPtr) pI830->PciInfo->thisCard)->busnum, - ((pciConfigPtr) pI830->PciInfo->thisCard)->devnum, - ((pciConfigPtr) pI830->PciInfo->thisCard)->funcnum -#endif - ); - } - pDRIInfo->ddxDriverMajorVersion = I830_MAJOR_VERSION; - pDRIInfo->ddxDriverMinorVersion = I830_MINOR_VERSION; - pDRIInfo->ddxDriverPatchVersion = I830_PATCHLEVEL; - pDRIInfo->ddxDrawableTableEntry = I830_MAX_DRAWABLES; - - if (SAREA_MAX_DRAWABLES < I830_MAX_DRAWABLES) - pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES; - else - pDRIInfo->maxDrawableTableEntry = I830_MAX_DRAWABLES; - - if (sizeof(XF86DRISAREARec) + sizeof(drmI830Sarea) > SAREA_MAX) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] Data does not fit in SAREA\n"); - return FALSE; - } - /* This is a hack for now. We have to have more than a 4k page here - * because of the size of the state. However, the state should be - * in a per-context mapping. This will be added in the Mesa 3.5 port - * of the I830 driver. - */ - pDRIInfo->SAREASize = SAREA_MAX; - - if (!(pI830DRI = (I830DRIPtr) xcalloc(sizeof(I830DRIRec), 1))) { - DRIDestroyInfoRec(pI830->pDRIInfo); - pI830->pDRIInfo = NULL; - return FALSE; - } - pDRIInfo->devPrivate = pI830DRI; - pDRIInfo->devPrivateSize = sizeof(I830DRIRec); - pDRIInfo->contextSize = sizeof(I830DRIContextRec); - - pDRIInfo->CreateContext = I830CreateContext; - pDRIInfo->DestroyContext = I830DestroyContext; - pDRIInfo->SwapContext = I830DRISwapContext; - pDRIInfo->InitBuffers = I830DRIInitBuffers; - pDRIInfo->MoveBuffers = I830DRIMoveBuffers; - pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; - -#if DRIINFO_MAJOR_VERSION > 5 || \ - (DRIINFO_MAJOR_VERSION == 5 && DRIINFO_MINOR_VERSION >= 3) - if (pI830->accel == ACCEL_EXA) - pDRIInfo->texOffsetStart = I830TexOffsetStart; -#endif - -#if DRI_DRIVER_FRAMEBUFFER_MAP - /* DRI version is high enough that we can get the DRI code to not - * try to manage the framebuffer. - */ - pDRIInfo->frameBufferPhysicalAddress = 0; - pDRIInfo->frameBufferSize = 0; - pDRIInfo->frameBufferStride = 0; - pDRIInfo->dontMapFrameBuffer = TRUE; -#else - /* Supply a dummy mapping info required by DRI setup. - */ - pDRIInfo->frameBufferPhysicalAddress = (char *) pI830->LinearAddr; - pDRIInfo->frameBufferSize = GTT_PAGE_SIZE; - pDRIInfo->frameBufferStride = 1; -#endif - - pDRIInfo->TransitionTo2d = I830DRITransitionTo2d; - pDRIInfo->TransitionTo3d = I830DRITransitionTo3d; - - /* do driver-independent DRI screen initialization here */ - if (!DRIScreenInit(pScreen, pDRIInfo, &pI830->drmSubFD)) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] DRIScreenInit failed. Disabling DRI.\n"); - xfree(pDRIInfo->devPrivate); - pDRIInfo->devPrivate = NULL; - DRIDestroyInfoRec(pI830->pDRIInfo); - pI830->pDRIInfo = NULL; - return FALSE; - } - - /* Now, nuke dri.c's dummy frontbuffer map setup if we did that. */ - if (pDRIInfo->frameBufferSize != 0) { - int tmp; - drm_handle_t fb_handle; - void *ptmp; - - /* With the compat method, it will continue to report - * the wrong map out of GetDeviceInfo, which will break AIGLX. - */ - DRIGetDeviceInfo(pScreen, &fb_handle, &tmp, &tmp, &tmp, &tmp, &ptmp); - drmRmMap(pI830->drmSubFD, fb_handle); - - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Removed DRI frontbuffer mapping in compatibility mode.\n"); - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "DRIGetDeviceInfo will report incorrect frontbuffer " - "handle.\n"); - } - - /* Check the i915 DRM versioning */ - { - drmVersionPtr version; - - /* Check the DRM lib version. - * drmGetLibVersion was not supported in version 1.0, so check for - * symbol first to avoid possible crash or hang. - */ - if (xf86LoaderCheckSymbol("drmGetLibVersion")) { - version = drmGetLibVersion(pI830->drmSubFD); - } else - { - /* drmlib version 1.0.0 didn't have the drmGetLibVersion - * entry point. Fake it by allocating a version record - * via drmGetVersion and changing it to version 1.0.0 - */ - version = drmGetVersion(pI830->drmSubFD); - version->version_major = 1; - version->version_minor = 0; - version->version_patchlevel = 0; - } - -#define REQ_MAJ 1 -#define REQ_MIN 1 - if (version) { - if (version->version_major != REQ_MAJ || - version->version_minor < REQ_MIN) { - /* incompatible drm library version */ - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] I830DRIScreenInit failed because of a version mismatch.\n" - "[dri] libdrm.a module version is %d.%d.%d but version %d.%d.x is needed.\n" - "[dri] Disabling DRI.\n", - version->version_major, - version->version_minor, version->version_patchlevel, - REQ_MAJ, REQ_MIN); - drmFreeVersion(version); - I830DRICloseScreen(pScreen); - return FALSE; - } - drmFreeVersion(version); - } - - /* Check the i915 DRM version */ - version = drmGetVersion(pI830->drmSubFD); - if (version) { - if (version->version_major != 1 || version->version_minor < 3) { - /* incompatible drm version */ - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] %s failed because of a version mismatch.\n" - "[dri] i915 kernel module version is %d.%d.%d but version 1.3 or greater is needed.\n" - "[dri] Disabling DRI.\n", - "I830DRIScreenInit", - version->version_major, - version->version_minor, version->version_patchlevel); - I830DRICloseScreen(pScreen); - drmFreeVersion(version); - return FALSE; - } - /* Check whether the kernel module attached to the device isn't the - * one we expected (meaning it's the old i830 module). - */ - if (strncmp(version->name, pDRIInfo->drmDriverName, - strlen(pDRIInfo->drmDriverName))) - { - xf86DrvMsg(pScreen->myNum, X_WARNING, - "Detected i830 kernel module. The i915 kernel module " - "is required for DRI. Aborting.\n"); - I830DRICloseScreen(pScreen); - drmFreeVersion(version); - return FALSE; - } - pI830->drmMinor = version->version_minor; - drmFreeVersion(version); - } - } - - return TRUE; -} - -static void -I830InitTextureHeap(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - drmI830MemInitHeap drmHeap; - - if (pI830->textures == NULL) - return; - - /* Start up the simple memory manager for agp space */ - drmHeap.region = I830_MEM_REGION_AGP; - drmHeap.start = 0; - drmHeap.size = pI830->textures->size; - - if (drmCommandWrite(pI830->drmSubFD, DRM_I830_INIT_HEAP, - &drmHeap, sizeof(drmHeap))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] Failed to initialized agp heap manager\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "[drm] Initialized kernel agp heap manager, %ld\n", - pI830->textures->size); - - I830SetParam(pScrn, I830_SETPARAM_TEX_LRU_LOG_GRANULARITY, - pI830->TexGranularity); - } -} - -/* - * Map registers & ring buffer - */ -static Bool -I830DRIMapHW(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - DRIInfoPtr pDRIInfo = pI830->pDRIInfo; - I830DRIPtr pI830DRI = pDRIInfo->devPrivate; - - /* Kernel deals with direct hw access in this case */ - if (pI830->use_drm_mode) - return TRUE; - - DPRINTF(PFX, "I830DRIMapHW\n"); - pI830DRI->regsSize = I830_REG_SIZE; - if (drmAddMap(pI830->drmSubFD, (drm_handle_t)pI830->MMIOAddr, - pI830DRI->regsSize, DRM_REGISTERS, 0, - (drmAddress) &pI830DRI->regs) < 0) { - xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAddMap(regs) failed\n"); - DRICloseScreen(pScreen); - return FALSE; - } - xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Registers = 0x%08x\n", - (int)pI830DRI->regs); - - if (!pI830->memory_manager) { - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)pI830->ring.mem->offset + - pI830->LinearAddr, - pI830->ring.mem->size, DRM_AGP, 0, - (drmAddress) &pI830->ring_map) < 0) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[drm] drmAddMap(ring_map) failed. Disabling DRI\n"); - DRICloseScreen(pScreen); - return FALSE; - } - xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] ring buffer = 0x%08x\n", - (int)pI830->ring_map); - } - - return TRUE; -} - -/** - * Sets up mappings for static, lifetime-fixed allocations, and inital SAREA - * setup. - */ -Bool -I830DRIDoMappings(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - DRIInfoPtr pDRIInfo = pI830->pDRIInfo; - I830DRIPtr pI830DRI = pDRIInfo->devPrivate; - drmI830Sarea *sarea = (drmI830Sarea *) DRIGetSAREAPrivate(pScreen); - - if (!I830DRIMapHW(pScreen)) { - DRICloseScreen(pScreen); - return FALSE; - } - - if (!I830InitDma(pScrn)) { - DRICloseScreen(pScreen); - return FALSE; - } - - if (pI830->memory_manager == NULL) - intel_bufmgr_fake_set_last_dispatch(pI830->bufmgr, - (volatile unsigned int *) - &sarea->last_dispatch); - - /* init to zero to be safe */ - sarea->front_handle = 0; - sarea->back_handle = 0; - sarea->depth_handle = 0; - sarea->tex_handle = 0; - - /* Assign pScreen */ - pScrn->pScreen = pScreen; - - /* Need to initialize pScreen now to let RandR know. */ - pScrn->pScreen->width = pScrn->virtualX; - pScrn->pScreen->height = pScrn->virtualY; - - /* If we are using the kernel memory manager, we have to delay SAREA and - * mapping setup until our buffers are pinned at EnterVT, losing the - * opportunity to fail cleanly early on. - */ - if (pI830->memory_manager == NULL) { - if (!i830_update_dri_buffers(pScrn)) { - /* screen mappings probably failed */ - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[drm] drmAddMap(screen mappings) failed. " - "Disabling DRI\n"); - DRICloseScreen(pScreen); - return FALSE; - } - } - - if (pI830->allocate_classic_textures) - I830InitTextureHeap(pScrn); - - if (DEVICE_ID(pI830->PciInfo) != PCI_CHIP_845_G && - DEVICE_ID(pI830->PciInfo) != PCI_CHIP_I830_M) { - I830SetParam(pScrn, I830_SETPARAM_USE_MI_BATCHBUFFER_START, 1 ); - } - - pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate; - pI830DRI->deviceID = DEVICE_ID(pI830->PciInfo); - pI830DRI->width = pScrn->virtualX; - pI830DRI->height = pScrn->virtualY; - pI830DRI->mem = pScrn->videoRam * 1024; - pI830DRI->cpp = pI830->cpp; - - pI830DRI->bitsPerPixel = pScrn->bitsPerPixel; - - pI830DRI->sarea_priv_offset = sizeof(XF86DRISAREARec); - - if (!(I830InitVisualConfigs(pScreen))) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[dri] I830InitVisualConfigs failed. Disabling DRI\n"); - DRICloseScreen(pScreen); - return FALSE; - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] visual configs initialized\n"); - pI830->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; - - return TRUE; -} - -Bool -I830DRIInstIrqHandler(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - I830DRIPtr pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate; - - pI830DRI->irq = drmGetInterruptFromBusID(pI830->drmSubFD, -#if XSERVER_LIBPCIACCESS - ((pI830->PciInfo->domain << 8) | - pI830->PciInfo->bus), - pI830->PciInfo->dev, - pI830->PciInfo->func -#else - ((pciConfigPtr) pI830-> - PciInfo->thisCard)->busnum, - ((pciConfigPtr) pI830-> - PciInfo->thisCard)->devnum, - ((pciConfigPtr) pI830-> - PciInfo->thisCard)->funcnum -#endif - ); - - if (drmCtlInstHandler(pI830->drmSubFD, pI830DRI->irq)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] failure adding irq handler\n"); - pI830DRI->irq = 0; - return FALSE; - } else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "[drm] dma control initialized, using IRQ %d\n", - pI830DRI->irq); - - return TRUE; -} - -Bool -I830DRIResume(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - - DPRINTF(PFX, "I830DRIResume\n"); - - I830ResumeDma(pScrn); - - if (!pI830->memory_manager) - I830DRIInstIrqHandler(pScrn); - - return TRUE; -} - -void -I830DRICloseScreen(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - I830DRIPtr pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate; - - DPRINTF(PFX, "I830DRICloseScreen\n"); - - if (!pI830->memory_manager && pI830DRI->irq) { - drmCtlUninstHandler(pI830->drmSubFD); - pI830DRI->irq = 0; - } - - I830CleanupDma(pScrn); - - DRICloseScreen(pScreen); - - if (pI830->pDRIInfo) { - if (pI830->pDRIInfo->devPrivate) { - xfree(pI830->pDRIInfo->devPrivate); - pI830->pDRIInfo->devPrivate = NULL; - } - DRIDestroyInfoRec(pI830->pDRIInfo); - pI830->pDRIInfo = NULL; - } - if (pI830->pVisualConfigs) - xfree(pI830->pVisualConfigs); - if (pI830->pVisualConfigsPriv) - xfree(pI830->pVisualConfigsPriv); - pI830->directRenderingType = DRI_NONE; -} - -static Bool -I830CreateContext(ScreenPtr pScreen, VisualPtr visual, - drm_context_t hwContext, void *pVisualConfigPriv, - DRIContextType contextStore) -{ - return TRUE; -} - -static void -I830DestroyContext(ScreenPtr pScreen, drm_context_t hwContext, - DRIContextType contextStore) -{ -} - -Bool -I830DRIFinishScreenInit(ScreenPtr pScreen) -{ - DPRINTF(PFX, "I830DRIFinishScreenInit\n"); - - if (!DRIFinishScreenInit(pScreen)) - return FALSE; - - /* move irq initialize later in EnterVT, as then we - * would finish binding possible hw status page, which - * requires irq ctrl ioctl not be called that early. - */ - return TRUE; -} - -static void -I830DRISwapContext(ScreenPtr pScreen, DRISyncType syncType, - DRIContextType oldContextType, void *oldContext, - DRIContextType newContextType, void *newContext) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - - if (syncType == DRI_3D_SYNC && - oldContextType == DRI_2D_CONTEXT && newContextType == DRI_2D_CONTEXT) { - - if (I810_DEBUG & DEBUG_VERBOSE_DRI) - ErrorF("i830DRISwapContext (in)\n"); - - pI830->last_3d = LAST_3D_OTHER; - - if (!pScrn->vtSema) - return; - pI830->LockHeld = 1; - if (!pI830->memory_manager) - i830_refresh_ring(pScrn); - - } else if (syncType == DRI_2D_SYNC && - oldContextType == DRI_NO_CONTEXT && - newContextType == DRI_2D_CONTEXT) { - if (I810_DEBUG & DEBUG_VERBOSE_DRI) - ErrorF("i830DRISwapContext (out)\n"); - - if (!pScrn->vtSema) - return; - pI830->LockHeld = 0; - } else if (I810_DEBUG & DEBUG_VERBOSE_DRI) - ErrorF("i830DRISwapContext (other)\n"); -} - -static void -I830DRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) -{ - ScreenPtr pScreen = pWin->drawable.pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - BoxPtr pbox; - int nbox; - int buffer, first_buffer, last_buffer; - - if (I810_DEBUG & DEBUG_VERBOSE_DRI) - ErrorF("I830DRIInitBuffers\n"); - - first_buffer = I830_SELECT_BACK; - last_buffer = I830_SELECT_DEPTH; - - for (buffer = first_buffer; buffer <= last_buffer; buffer++) { - pbox = REGION_RECTS(prgn); - nbox = REGION_NUM_RECTS(prgn); - - if (!I830SelectBuffer(pScrn, buffer)) - continue; - - if (buffer == I830_SELECT_DEPTH) { - switch (pScrn->bitsPerPixel) { - case 16: - I830SetupForSolidFill(pScrn, 0xffff, GXcopy, -1); - break; - case 32: - I830SetupForSolidFill(pScrn, 0xffffff, GXcopy, -1); - break; - } - } else - I830SetupForSolidFill(pScrn, 0, GXcopy, -1); - while (nbox--) { - I830SubsequentSolidFillRect(pScrn, pbox->x1, pbox->y1, - pbox->x2 - pbox->x1, pbox->y2 - pbox->y1); - pbox++; - } - } - - I830SelectBuffer(pScrn, I830_SELECT_FRONT); - i830MarkSync(pScrn); -} - -/* This routine is a modified form of XAADoBitBlt with the calls to - * ScreenToScreenBitBlt built in. My routine has the prgnSrc as source - * instead of destination. My origin is upside down so the ydir cases - * are reversed. - */ -static void -I830DRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index) -{ - ScreenPtr pScreen = pParent->drawable.pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - BoxPtr pboxTmp, pboxNext, pboxBase; - DDXPointPtr pptTmp, pptNew2 = NULL; - int xdir, ydir; - -#if 0 - int screenwidth = pScrn->virtualX; - int screenheight = pScrn->virtualY; -#else - int screenwidth = pScreen->width; - int screenheight = pScreen->height; -#endif - - BoxPtr pbox = REGION_RECTS(prgnSrc); - int nbox = REGION_NUM_RECTS(prgnSrc); - - BoxPtr pboxNew1 = NULL; - BoxPtr pboxNew2 = NULL; - DDXPointPtr pptNew1 = NULL; - DDXPointPtr pptSrc = &ptOldOrg; - - int dx = pParent->drawable.x - ptOldOrg.x; - int dy = pParent->drawable.y - ptOldOrg.y; - int buffer, first_buffer, last_buffer; - - /* If the copy will overlap in Y, reverse the order */ - if (dy > 0) { - ydir = -1; - - if (nbox > 1) { - /* Keep ordering in each band, reverse order of bands */ - pboxNew1 = (BoxPtr) xalloc(sizeof(BoxRec) * nbox); - if (!pboxNew1) - return; - pptNew1 = (DDXPointPtr) xalloc(sizeof(DDXPointRec) * nbox); - if (!pptNew1) { - xfree(pboxNew1); - return; - } - pboxBase = pboxNext = pbox + nbox - 1; - while (pboxBase >= pbox) { - while ((pboxNext >= pbox) && (pboxBase->y1 == pboxNext->y1)) - pboxNext--; - pboxTmp = pboxNext + 1; - pptTmp = pptSrc + (pboxTmp - pbox); - while (pboxTmp <= pboxBase) { - *pboxNew1++ = *pboxTmp++; - *pptNew1++ = *pptTmp++; - } - pboxBase = pboxNext; - } - pboxNew1 -= nbox; - pbox = pboxNew1; - pptNew1 -= nbox; - pptSrc = pptNew1; - } - } else { - /* No changes required */ - ydir = 1; - } - - /* If the regions will overlap in X, reverse the order */ - if (dx > 0) { - xdir = -1; - - if (nbox > 1) { - /*reverse orderof rects in each band */ - pboxNew2 = (BoxPtr) xalloc(sizeof(BoxRec) * nbox); - pptNew2 = (DDXPointPtr) xalloc(sizeof(DDXPointRec) * nbox); - if (!pboxNew2 || !pptNew2) { - if (pptNew2) - xfree(pptNew2); - if (pboxNew2) - xfree(pboxNew2); - if (pboxNew1) { - xfree(pptNew1); - xfree(pboxNew1); - } - return; - } - pboxBase = pboxNext = pbox; - while (pboxBase < pbox + nbox) { - while ((pboxNext < pbox + nbox) && (pboxNext->y1 == pboxBase->y1)) - pboxNext++; - pboxTmp = pboxNext; - pptTmp = pptSrc + (pboxTmp - pbox); - while (pboxTmp != pboxBase) { - *pboxNew2++ = *--pboxTmp; - *pptNew2++ = *--pptTmp; - } - pboxBase = pboxNext; - } - pboxNew2 -= nbox; - pbox = pboxNew2; - pptNew2 -= nbox; - pptSrc = pptNew2; - } - } else { - /* No changes are needed */ - xdir = 1; - } - - /* SelectBuffer isn't really a good concept for the i810. - */ - I830EmitFlush(pScrn); - first_buffer = I830_SELECT_BACK; - last_buffer = I830_SELECT_DEPTH; - - for (buffer = first_buffer; buffer <= last_buffer; buffer++) { - if (!I830SelectBuffer(pScrn, buffer)) - continue; - I830SetupForScreenToScreenCopy(pScrn, xdir, ydir, GXcopy, -1, -1); - pbox = REGION_RECTS(prgnSrc); - nbox = REGION_NUM_RECTS(prgnSrc); - for (; nbox--; pbox++) { - - int x1 = pbox->x1; - int y1 = pbox->y1; - int destx = x1 + dx; - int desty = y1 + dy; - int w = pbox->x2 - x1 + 1; - int h = pbox->y2 - y1 + 1; - - if (destx < 0) - x1 -= destx, w += destx, destx = 0; - if (desty < 0) - y1 -= desty, h += desty, desty = 0; - if (destx + w > screenwidth) - w = screenwidth - destx; - if (desty + h > screenheight) - h = screenheight - desty; - if (w <= 0) - continue; - if (h <= 0) - continue; - - if (I810_DEBUG & DEBUG_VERBOSE_DRI) - ErrorF("MoveBuffers %d,%d %dx%d dx: %d dy: %d\n", - x1, y1, w, h, dx, dy); - - I830SubsequentScreenToScreenCopy(pScrn, x1, y1, destx, desty, w, h); - } - } - - I830SelectBuffer(pScrn, I830_SELECT_FRONT); - I830EmitFlush(pScrn); - - if (pboxNew2) { - xfree(pptNew2); - xfree(pboxNew2); - } - if (pboxNew1) { - xfree(pptNew1); - xfree(pboxNew1); - } - i830MarkSync(pScrn); -} - -static void -I830DRITransitionTo3d(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - - pI830->want_vblank_interrupts = TRUE; - I830DRISetVBlankInterrupt(pScrn, TRUE); -} - -static void -I830DRITransitionTo2d(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - I830Ptr pI830 = I830PTR(pScrn); - - pI830->want_vblank_interrupts = FALSE; - I830DRISetVBlankInterrupt(pScrn, FALSE); -} - -static int -i830_name_buffer (ScrnInfoPtr pScrn, i830_memory *mem) -{ - if (mem && mem->bo) - { - if (!mem->gem_name) - { - int ret; - ret = dri_bo_flink(mem->bo, &mem->gem_name); - if (ret != 0) - { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] failed to name buffer %d\n", -errno); - return -1; - } - } - return mem->gem_name; - } - return -1; -} - -/** - * Update the SAREA fields with current buffer information. - * - * Most of the SAREA fields are already updated by i830_do_addmap(). - * - * This does include other SAREA initialization which will actually be constant - * over the lifetime of the server. - */ -static void -i830_update_sarea(ScrnInfoPtr pScrn, drmI830Sarea *sarea) -{ - ScreenPtr pScreen = pScrn->pScreen; - I830Ptr pI830 = I830PTR(pScrn); - - if (pI830->directRenderingType == DRI_DRI2) - return; - - sarea->width = pScreen->width; - sarea->height = pScreen->height; - sarea->pitch = pScrn->displayWidth; - sarea->virtualX = pScrn->virtualX; - sarea->virtualY = pScrn->virtualY; - - sarea->front_tiled = (pI830->front_buffer->tiling != TILE_NONE); - sarea->back_tiled = (pI830->back_buffer->tiling != TILE_NONE); - sarea->depth_tiled = (pI830->depth_buffer->tiling != TILE_NONE); - sarea->rotated_tiled = FALSE; - - sarea->log_tex_granularity = pI830->TexGranularity; - - sarea->front_bo_handle = i830_name_buffer (pScrn, pI830->front_buffer); - sarea->back_bo_handle = i830_name_buffer (pScrn, pI830->back_buffer); - sarea->depth_bo_handle = i830_name_buffer (pScrn, pI830->depth_buffer); - - /* The rotation is now handled entirely by the X Server, so just leave the - * DRI unaware. - */ - sarea->rotation = 0; - sarea->rotated_offset = -1; - sarea->rotated_size = 0; - sarea->rotated_pitch = pScrn->displayWidth; -} - -/** - * Updates the DRI mapping for the given i830_memory struct, with the given - * flags. - */ -static int -i830_do_addmap(ScrnInfoPtr pScrn, i830_memory *mem, - drm_handle_t *sarea_handle, int *sarea_size, int *sarea_offset) -{ - I830Ptr pI830 = I830PTR(pScrn); - int size = mem->size; - - if (mem == pI830->front_buffer) { - /* Workaround for XAA pixmap cache: Don't use front_buffer->size - * and instead, calculate the visible frontbuffer size and round to - * avoid irritating the assertions of older DRI drivers. - */ - size = ROUND_TO_PAGE(pScrn->displayWidth * pScrn->virtualY * - pI830->cpp); - } - - if (*sarea_handle != 0 && - (*sarea_size != size || *sarea_offset != mem->offset)) - { - drmRmMap(pI830->drmSubFD, *sarea_handle); - *sarea_handle = 0; - *sarea_size = 0; - *sarea_offset = 0; - } - - if (*sarea_handle == 0) { - int ret; - - ret = drmAddMap(pI830->drmSubFD, - (drm_handle_t)(mem->offset + pI830->LinearAddr), - size, DRM_AGP, 0, - (drmAddress) sarea_handle); - if (ret == 0) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "[drm] mapped %s at 0x%08lx, handle = 0x%08x\n", - mem->name, mem->offset + pI830->LinearAddr, - (int)*sarea_handle); - *sarea_size = size; - *sarea_offset = mem->offset; - } else { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] failed to map %s at 0x%08lx\n", - mem->name, mem->offset + pI830->LinearAddr); - return FALSE; - } - } - - return TRUE; -} - -/** - * Updates the DRM mappings with the current buffer information. - * - * Some old DRI drivers may be unprepared for buffers actually moving at - * runtime, which would likely result in bus errors on software fallbacks or - * hangs or misrendering on hardware rendering. - */ -static Bool -i830_update_dri_mappings(ScrnInfoPtr pScrn, drmI830Sarea *sarea) -{ - I830Ptr pI830 = I830PTR(pScrn); - - if (!i830_do_addmap(pScrn, pI830->front_buffer, &sarea->front_handle, - &sarea->front_size, &sarea->front_offset)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disabling DRI.\n"); - return FALSE; - } - - if (!i830_do_addmap(pScrn, pI830->back_buffer, &sarea->back_handle, - &sarea->back_size, &sarea->back_offset)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disabling DRI.\n"); - return FALSE; - } - - sarea->third_handle = 0; - sarea->third_offset = 0; - sarea->third_size = 0; - - if (!i830_do_addmap(pScrn, pI830->depth_buffer, &sarea->depth_handle, - &sarea->depth_size, &sarea->depth_offset)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disabling DRI.\n"); - return FALSE; - } - - if (pI830->allocate_classic_textures) { - if (!i830_do_addmap(pScrn, pI830->textures, &sarea->tex_handle, - &sarea->tex_size, &sarea->tex_offset)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disabling DRI.\n"); - return FALSE; - } - } - - return TRUE; -} - -static void -i830_update_screen_private(ScrnInfoPtr pScrn, drmI830Sarea *sarea) -{ - I830Ptr pI830 = I830PTR(pScrn); - - pI830->pDRIInfo->frameBufferPhysicalAddress = (char *) pI830->LinearAddr; - pI830->pDRIInfo->frameBufferStride = pScrn->displayWidth * pI830->cpp; - pI830->pDRIInfo->frameBufferSize = sarea->front_size; -#if DRI_DRIVER_FRAMEBUFFER_MAP - pI830->pDRIInfo->hFrameBuffer = sarea->front_handle; -#endif -} - -/** - * Update the SAREA fields, DRI mappings, and screen info passed through the - * protocol. - * - * This gets called both at startup and after any of the buffers might have - * been relocated. - */ -Bool -i830_update_dri_buffers(ScrnInfoPtr pScrn) -{ - ScreenPtr pScreen = pScrn->pScreen; - I830Ptr pI830 = I830PTR(pScrn); - drmI830Sarea *sarea; - Bool success; - - if (pI830->directRenderingType != DRI_XF86DRI) - return TRUE; - - sarea = (drmI830Sarea *) DRIGetSAREAPrivate(pScreen); - - success = i830_update_dri_mappings(pScrn, sarea); - if (!success) - return FALSE; - i830_update_sarea(pScrn, sarea); - i830_update_screen_private(pScrn, sarea); - - return TRUE; -} - -Bool -I830DRISetVBlankInterrupt (ScrnInfoPtr pScrn, Bool on) -{ - I830Ptr pI830 = I830PTR(pScrn); - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - drmI830VBlankPipe pipe; - - /* If we have no 3d running, then don't bother enabling the vblank - * interrupt. - */ - if (!pI830->want_vblank_interrupts) - on = FALSE; - - if (pI830->directRenderingType == DRI_XF86DRI && pI830->drmMinor >= 5) { - if (on) { - if (xf86_config->num_crtc > 1 && xf86_config->crtc[1]->enabled) - if (pI830->drmMinor >= 6) - pipe.pipe = DRM_I830_VBLANK_PIPE_A | DRM_I830_VBLANK_PIPE_B; - else - pipe.pipe = DRM_I830_VBLANK_PIPE_B; - else - pipe.pipe = DRM_I830_VBLANK_PIPE_A; - } else { - pipe.pipe = 0; - } - if (drmCommandWrite(pI830->drmSubFD, DRM_I830_SET_VBLANK_PIPE, - &pipe, sizeof (pipe))) { - return FALSE; - } - } - - return TRUE; -} - -Bool -I830DRILock(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - - if (pI830->directRenderingType == DRI_XF86DRI && !pI830->LockHeld) { - DRILock(screenInfo.screens[pScrn->scrnIndex], 0); - pI830->LockHeld = 1; - if (!pI830->memory_manager) - i830_refresh_ring(pScrn); - return TRUE; - } - else - return FALSE; -} - - - -void -I830DRIUnlock(ScrnInfoPtr pScrn) -{ - I830Ptr pI830 = I830PTR(pScrn); - - if (pI830->directRenderingType == DRI_XF86DRI && pI830->LockHeld) { - DRIUnlock(screenInfo.screens[pScrn->scrnIndex]); - pI830->LockHeld = 0; - } -} - -#ifdef DRI2 - typedef struct { PixmapPtr pPixmap; unsigned int attachment; @@ -1901,5 +467,3 @@ void I830DRI2CloseScreen(ScreenPtr pScreen) DRI2CloseScreen(pScreen); pI830->directRenderingType = DRI_NONE; } - -#endif |