📄 atiscreen.c
字号:
/* Re-initialise mi's visual list */ miClearVisualTypes(); if ((pATI->depth > 8) && (pATI->DAC == ATI_DAC_INTERNAL)) VisualMask = TrueColorMask; else VisualMask = miGetDefaultVisualMask(pATI->depth); if (!miSetVisualTypes(pATI->depth, VisualMask, pATI->rgbBits, pScreenInfo->defaultVisual)) return FALSE; if (!miSetPixmapDepths()) return FALSE; pFB = pATI->pMemory; pATI->FBPitch = PixmapBytePad(pATI->displayWidth, pATI->depth); if (pATI->OptionShadowFB) { pATI->FBBytesPerPixel = pATI->bitsPerPixel >> 3; pATI->FBPitch = PixmapBytePad(pATI->displayWidth, pATI->depth); if ((pATI->pShadow = xalloc(pATI->FBPitch * pScreenInfo->virtualY))) { pFB = pATI->pShadow; } else { xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "Insufficient virtual memory for shadow frame buffer.\n"); pATI->OptionShadowFB = FALSE; } }#ifdef XF86DRI_DEVEL /* Setup DRI after visuals have been established, but before * fbScreenInit is called. fbScreenInit will eventually call the * driver's InitGLXVisuals call back. */ /* According to atiregs.h, GTPro (3D Rage Pro) is the first chip type with * 3D triangle setup (the VERTEX_* registers) */ if (pATI->Chip < ATI_CHIP_264GTPRO) { xf86DrvMsg(iScreen, X_WARNING, "Direct rendering is not supported for ATI chips earlier than " "the ATI 3D Rage Pro.\n"); pATI->directRenderingEnabled = FALSE; } else { /* FIXME: When we move to dynamic allocation of back and depth * buffers, we will want to revisit the following check for 3 * times the virtual size (or 2.5 times for 24-bit depth) of the screen below. */ int cpp = pATI->bitsPerPixel >> 3; int maxY = pScreenInfo->videoRam * 1024 / (pATI->displayWidth * cpp); int requiredY; requiredY = pScreenInfo->virtualY * 2 /* front, back buffers */ + (pScreenInfo->virtualY * 2 / cpp); /* depth buffer (always 16-bit) */ if (!pATI->OptionAccel) { xf86DrvMsg(iScreen, X_WARNING, "Acceleration disabled, not initializing the DRI\n"); pATI->directRenderingEnabled = FALSE; } else if ( maxY > requiredY ) { pATI->directRenderingEnabled = ATIDRIScreenInit(pScreen); } else { xf86DrvMsg(iScreen, X_WARNING, "DRI static buffer allocation failed -- " "need at least %d kB video memory\n", (pScreenInfo->displayWidth * requiredY * cpp ) / 1024); pATI->directRenderingEnabled = FALSE; } }#endif /* XF86DRI_DEVEL */ /* Initialise framebuffer layer */ switch (pATI->bitsPerPixel) {#ifndef AVOID_CPIO case 1: pATI->Closeable = xf1bppScreenInit(pScreen, pFB, pScreenInfo->virtualX, pScreenInfo->virtualY, pScreenInfo->xDpi, pScreenInfo->yDpi, pATI->displayWidth); break; case 4: pATI->Closeable = xf4bppScreenInit(pScreen, pFB, pScreenInfo->virtualX, pScreenInfo->virtualY, pScreenInfo->xDpi, pScreenInfo->yDpi, pATI->displayWidth); break;#endif /* AVOID_CPIO */ case 8: case 16: case 24: case 32: pATI->Closeable = fbScreenInit(pScreen, pFB, pScreenInfo->virtualX, pScreenInfo->virtualY, pScreenInfo->xDpi, pScreenInfo->yDpi, pATI->displayWidth, pATI->bitsPerPixel); break; default: return FALSE; } if (!pATI->Closeable) return FALSE; /* Fixup RGB ordering */ if (pATI->depth > 8) { VisualPtr pVisual = pScreen->visuals + pScreen->numVisuals; while (--pVisual >= pScreen->visuals) { if ((pVisual->class | DynamicClass) != DirectColor) continue; pVisual->offsetRed = pScreenInfo->offset.red; pVisual->offsetGreen = pScreenInfo->offset.green; pVisual->offsetBlue = pScreenInfo->offset.blue; pVisual->redMask = pScreenInfo->mask.red; pVisual->greenMask = pScreenInfo->mask.green; pVisual->blueMask = pScreenInfo->mask.blue; } } /* If applicable, initialise RENDER extension */ if (pATI->bitsPerPixel > 4) { if (pATI->OptionShadowFB) { if (serverGeneration == 1) xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "RENDER extension not supported with a shadowed" " framebuffer.\n"); }#ifndef AVOID_CPIO else if (pATI->BankInfo.BankSize) { if (serverGeneration == 1) xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "RENDER extension not supported with a banked" " framebuffer.\n"); }#endif /* AVOID_CPIO */ else if (!fbPictureInit(pScreen, NULL, 0) && (serverGeneration == 1)) { xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, "RENDER extension initialisation failed.\n"); } } xf86SetBlackWhitePixels(pScreen);#ifndef AVOID_CPIO /* Initialise banking if needed */ if (!miInitializeBanking(pScreen, pScreenInfo->virtualX, pScreenInfo->virtualY, pATI->displayWidth, &pATI->BankInfo)) return FALSE;#endif /* AVOID_CPIO */#ifdef USE_XAA if (!pATI->useEXA) { /* Memory manager setup */#ifdef XF86DRI_DEVEL if (pATI->directRenderingEnabled) { if (!ATIMach64SetupMemXAA(iScreen, pScreen)) return FALSE; } else#endif /* XF86DRI_DEVEL */ { if (!ATIMach64SetupMemXAA_NoDRI(iScreen, pScreen)) return FALSE; } /* Setup acceleration */ if (!ATIInitializeAcceleration(pScreen, pScreenInfo, pATI)) return FALSE; }#endif /* USE_XAA */#ifdef USE_EXA if (pATI->useEXA) { /* EXA setups both memory manager and acceleration here */ if (pATI->OptionAccel && !ATIMach64ExaInit(pScreen)) return FALSE; }#endif /* USE_EXA */#ifndef AVOID_DGA /* Initialise DGA support */ (void)ATIDGAInit(pScreen, pScreenInfo, pATI);#endif /* AVOID_DGA */ /* Initialise backing store */ miInitializeBackingStore(pScreen); xf86SetBackingStore(pScreen); /* Initialise cursor */ if (!ATIInitializeCursor(pScreen, pATI)) return FALSE; /* Create default colourmap */ if (!miCreateDefColormap(pScreen)) return FALSE;#ifdef AVOID_CPIO if (!xf86HandleColormaps(pScreen, 256, pATI->rgbBits, ATILoadPalette, NULL, CMAP_PALETTED_TRUECOLOR | CMAP_LOAD_EVEN_IF_OFFSCREEN)) return FALSE;#else /* AVOID_CPIO */ if (pATI->depth > 1) if (!xf86HandleColormaps(pScreen, (pATI->depth == 4) ? 16 : 256, pATI->rgbBits, ATILoadPalette, NULL, CMAP_PALETTED_TRUECOLOR | CMAP_LOAD_EVEN_IF_OFFSCREEN)) return FALSE;#endif /* AVOID_CPIO */ /* Initialise shadow framebuffer */ if (pATI->OptionShadowFB && !ShadowFBInit(pScreen, ATIRefreshArea)) return FALSE; /* Initialise DPMS support */ (void)xf86DPMSInit(pScreen, ATISetDPMSMode, 0); /* Initialise XVideo support */ (void)ATIInitializeXVideo(pScreen, pScreenInfo, pATI); /* Set pScreen->SaveScreen and wrap CloseScreen vector */ pScreen->SaveScreen = ATISaveScreen; pATI->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = ATICloseScreen; if (serverGeneration == 1) xf86ShowUnusedOptions(pScreenInfo->scrnIndex, pScreenInfo->options);#ifdef TV_OUT /* Fix-up TV out after ImpacTV probe */ if (pATI->OptionTvOut && pATI->Chip < ATI_CHIP_264GTPRO) ATISwitchMode(0, pScreenInfo->currentMode, 0);#endif /* TV_OUT */#ifdef XF86DRI_DEVEL /* DRI finalization */ if (pATI->directRenderingEnabled) { /* Now that mi, fb, drm and others have done their thing, * complete the DRI setup. */ pATI->directRenderingEnabled = ATIDRIFinishScreenInit(pScreen); } if (pATI->directRenderingEnabled) { xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "Direct rendering enabled\n"); } else { /* FIXME: Release unused offscreen mem here? */ xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO, "Direct rendering disabled\n"); }#endif /* XF86DRI_DEVEL */ return TRUE;}/* * ATICloseScreen -- * * This function is called by DIX to close the screen. */BoolATICloseScreen( int iScreen, ScreenPtr pScreen){ ScrnInfoPtr pScreenInfo = xf86Screens[iScreen]; ATIPtr pATI = ATIPTR(pScreenInfo); Bool Closed = TRUE;#ifdef XF86DRI_DEVEL /* Disable direct rendering */ if (pATI->directRenderingEnabled) { ATIDRICloseScreen(pScreen); pATI->directRenderingEnabled = FALSE; }#endif /* XF86DRI_DEVEL */ ATICloseXVideo(pScreen, pScreenInfo, pATI);#ifdef USE_EXA if (pATI->pExa) { exaDriverFini(pScreen); xfree(pATI->pExa); pATI->pExa = NULL; }#endif#ifdef USE_XAA if (pATI->pXAAInfo) { XAADestroyInfoRec(pATI->pXAAInfo); pATI->pXAAInfo = NULL; }#endif if ((pScreen->CloseScreen = pATI->CloseScreen)) { pATI->CloseScreen = NULL; Closed = (*pScreen->CloseScreen)(iScreen, pScreen); } pATI->Closeable = FALSE; if (pATI->pCursorInfo) { xf86DestroyCursorInfoRec(pATI->pCursorInfo); pATI->pCursorInfo = NULL; } ATILeaveGraphics(pScreenInfo, pATI);#ifdef USE_XAA if (!pATI->useEXA) { xfree(pATI->ExpansionBitmapScanlinePtr[1]); pATI->ExpansionBitmapScanlinePtr[0] = NULL; pATI->ExpansionBitmapScanlinePtr[1] = NULL; }#endif xfree(pATI->pShadow); pATI->pShadow = NULL; pScreenInfo->pScreen = NULL; return Closed;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -