/** * @param pScreen screen being initialized * @param pScreenInfo EXA driver record * * exaDriverInit sets up EXA given a driver record filled in by the driver. * pScreenInfo should have been allocated by exaDriverAlloc(). See the * comments in _ExaDriver for what must be filled in and what is optional. * * @return TRUE if EXA was successfully initialized. */ Bool exaDriverInit (ScreenPtr pScreen, ExaDriverPtr pScreenInfo) { ExaScreenPrivPtr pExaScr; #ifdef RENDER PictureScreenPtr ps; #endif if (!pScreenInfo) return FALSE; if (!pScreenInfo->memoryBase) { LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::memoryBase must be " "non-zero\n", pScreen->myNum); return FALSE; } if (!pScreenInfo->memorySize) { LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::memorySize must be " "non-zero\n", pScreen->myNum); return FALSE; } if (pScreenInfo->offScreenBase > pScreenInfo->memorySize) { LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::offScreenBase must be <= " "ExaDriverRec::memorySize\n", pScreen->myNum); return FALSE; } if (!pScreenInfo->PrepareSolid) { LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::PrepareSolid must be " "non-NULL\n", pScreen->myNum); return FALSE; } if (!pScreenInfo->PrepareCopy) { LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::PrepareCopy must be " "non-NULL\n", pScreen->myNum); return FALSE; } if (!pScreenInfo->WaitMarker) { LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::WaitMarker must be " "non-NULL\n", pScreen->myNum); return FALSE; } if (pScreenInfo->exa_major != EXA_VERSION_MAJOR || pScreenInfo->exa_minor > EXA_VERSION_MINOR) { LogMessage(X_ERROR, "EXA(%d): driver's EXA version requirements " "(%d.%d) are incompatible with EXA version (%d.%d)\n", pScreen->myNum, pScreenInfo->exa_major, pScreenInfo->exa_minor, EXA_VERSION_MAJOR, EXA_VERSION_MINOR); return FALSE; } #ifdef RENDER ps = GetPictureScreenIfSet(pScreen); #endif if (exaGeneration != serverGeneration) { exaScreenPrivateIndex = AllocateScreenPrivateIndex(); exaPixmapPrivateIndex = AllocatePixmapPrivateIndex(); exaGeneration = serverGeneration; } pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1); if (!pExaScr) { LogMessage(X_WARNING, "EXA(%d): Failed to allocate screen private\n", pScreen->myNum); return FALSE; } pExaScr->info = pScreenInfo; pScreen->devPrivates[exaScreenPrivateIndex].ptr = (pointer) pExaScr; pExaScr->migration = ExaMigrationAlways; exaDDXDriverInit(pScreen); /* * Replace various fb screen functions */ pExaScr->SavedCloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = exaCloseScreen; pExaScr->SavedCreateGC = pScreen->CreateGC; pScreen->CreateGC = exaCreateGC; pExaScr->SavedGetImage = pScreen->GetImage; pScreen->GetImage = exaGetImage; pExaScr->SavedGetSpans = pScreen->GetSpans; pScreen->GetSpans = exaGetSpans; pExaScr->SavedCopyWindow = pScreen->CopyWindow; pScreen->CopyWindow = exaCopyWindow; pExaScr->SavedPaintWindowBackground = pScreen->PaintWindowBackground; pScreen->PaintWindowBackground = exaPaintWindow; pExaScr->SavedPaintWindowBorder = pScreen->PaintWindowBorder; pScreen->PaintWindowBorder = exaPaintWindow; pScreen->BackingStoreFuncs.SaveAreas = ExaCheckSaveAreas; pScreen->BackingStoreFuncs.RestoreAreas = ExaCheckRestoreAreas; #ifdef RENDER if (ps) { pExaScr->SavedComposite = ps->Composite; ps->Composite = exaComposite; pExaScr->SavedRasterizeTrapezoid = ps->RasterizeTrapezoid; ps->RasterizeTrapezoid = exaRasterizeTrapezoid; pExaScr->SavedAddTriangles = ps->AddTriangles; ps->AddTriangles = exaAddTriangles; pExaScr->SavedGlyphs = ps->Glyphs; ps->Glyphs = exaGlyphs; pExaScr->SavedTrapezoids = ps->Trapezoids; ps->Trapezoids = exaTrapezoids; } #endif #ifdef MITSHM /* Re-register with the MI funcs, which don't allow shared pixmaps. * Shared pixmaps are almost always a performance loss for us, but this * still allows for SHM PutImage. */ ShmRegisterFuncs(pScreen, NULL); #endif /* * Hookup offscreen pixmaps */ if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) && pExaScr->info->offScreenBase < pExaScr->info->memorySize) { if (!AllocatePixmapPrivate(pScreen, exaPixmapPrivateIndex, sizeof (ExaPixmapPrivRec))) { LogMessage(X_WARNING, "EXA(%d): Failed to allocate pixmap private\n", pScreen->myNum); return FALSE; } pExaScr->SavedCreatePixmap = pScreen->CreatePixmap; pScreen->CreatePixmap = exaCreatePixmap; pExaScr->SavedDestroyPixmap = pScreen->DestroyPixmap; pScreen->DestroyPixmap = exaDestroyPixmap; LogMessage(X_INFO, "EXA(%d): Offscreen pixmap area of %d bytes\n", pScreen->myNum, pExaScr->info->memorySize - pExaScr->info->offScreenBase); } else { LogMessage(X_INFO, "EXA(%d): No offscreen pixmaps\n", pScreen->myNum); if (!AllocatePixmapPrivate(pScreen, exaPixmapPrivateIndex, 0)) return FALSE; } DBG_PIXMAP(("============== %ld < %ld\n", pExaScr->info->offScreenBase, pExaScr->info->memorySize)); if (pExaScr->info->offScreenBase < pExaScr->info->memorySize) { if (!exaOffscreenInit (pScreen)) { LogMessage(X_WARNING, "EXA(%d): Offscreen pixmap setup failed\n", pScreen->myNum); return FALSE; } } LogMessage(X_INFO, "EXA(%d): Driver registered support for the following" " operations:\n", pScreen->myNum); assert(pScreenInfo->PrepareSolid != NULL); LogMessage(X_INFO, " Solid\n"); assert(pScreenInfo->PrepareCopy != NULL); LogMessage(X_INFO, " Copy\n"); if (pScreenInfo->PrepareComposite != NULL) { LogMessage(X_INFO, " Composite (RENDER acceleration)\n"); } if (pScreenInfo->UploadToScreen != NULL) { LogMessage(X_INFO, " UploadToScreen\n"); } if (pScreenInfo->DownloadFromScreen != NULL) { LogMessage(X_INFO, " DownloadFromScreen\n"); } return TRUE; }
void ExaOffscreenSwapIn (ScreenPtr pScreen) { exaOffscreenInit (pScreen); }