📄 radeon.h
字号:
#ifdef USE_EXA XF86ModReqInfo exaReq;#endif#ifdef USE_XAA XF86ModReqInfo xaaReq;#endif#endif /* X itself has the 3D context */ Bool XInited3D; /* merged fb stuff, also covers clone modes */ Bool MergedFB; RADEONScrn2Rel CRT2Position; char * CRT2HSync; char * CRT2VRefresh; char * MetaModes; ScrnInfoPtr CRT2pScrn; DisplayModePtr CRT1Modes; DisplayModePtr CRT1CurrentMode; int CRT1frameX0; int CRT1frameY0; int CRT1frameX1; int CRT1frameY1; RADEONMonitorType MergeType; RADEONDDCType MergeDDCType; void (*PointerMoved)(int index, int x, int y); /* pseudo xinerama support for mergedfb */ int maxCRT1_X1, maxCRT1_X2, maxCRT1_Y1, maxCRT1_Y2; int maxCRT2_X1, maxCRT2_X2, maxCRT2_Y1, maxCRT2_Y2; int maxClone_X1, maxClone_X2, maxClone_Y1, maxClone_Y2; Bool UseRADEONXinerama; Bool CRT2IsScrn0; ExtensionEntry *XineramaExtEntry; int RADEONXineramaVX, RADEONXineramaVY; Bool AtLeastOneNonClone; int MergedFBXDPI, MergedFBYDPI; Bool NoVirtual; int CRT1XOffs, CRT1YOffs, CRT2XOffs, CRT2YOffs; int MBXNR1XMAX, MBXNR1YMAX, MBXNR2XMAX, MBXNR2YMAX; Bool NonRect, HaveNonRect, HaveOffsRegions, MouseRestrictions; region NonRectDead, OffDead1, OffDead2; int constantDPI; /* -1 = auto, 0 = off, 1 = on */ int RADEONDPIVX, RADEONDPIVY; RADEONScrn2Rel MergedDPISRel; int RADEONMergedDPIVX, RADEONMergedDPIVY, RADEONMergedDPIRot; /* special handlings for DELL triple-head server */ Bool IsDellServer; /* enable bios hotkey output switching */ Bool BiosHotkeys; Bool VGAAccess; int MaxSurfaceWidth; int MaxLines;} RADEONInfoRec, *RADEONInfoPtr;#define RADEONWaitForFifo(pScrn, entries) \do { \ if (info->fifo_slots < entries) \ RADEONWaitForFifoFunction(pScrn, entries); \ info->fifo_slots -= entries; \} while (0)extern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn);extern void RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries);extern void RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn);#ifdef XF86DRIextern void RADEONWaitForIdleCP(ScrnInfoPtr pScrn);#endifextern void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, int clone);extern void RADEONEngineReset(ScrnInfoPtr pScrn);extern void RADEONEngineFlush(ScrnInfoPtr pScrn);extern void RADEONEngineRestore(ScrnInfoPtr pScrn);extern unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr);extern void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, CARD32 data);extern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn);extern void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn);extern void RADEONChangeSurfaces(ScrnInfoPtr pScrn);extern Bool RADEONAccelInit(ScreenPtr pScreen);#ifdef USE_EXAextern Bool RADEONSetupMemEXA (ScreenPtr pScreen);extern Bool RADEONDrawInitMMIO(ScreenPtr pScreen);#ifdef XF86DRIextern Bool RADEONDrawInitCP(ScreenPtr pScreen);#endif#endif#ifdef USE_XAAextern void RADEONAccelInitMMIO(ScreenPtr pScreen, XAAInfoRecPtr a);#endifextern void RADEONEngineInit(ScrnInfoPtr pScrn);extern Bool RADEONCursorInit(ScreenPtr pScreen);extern Bool RADEONDGAInit(ScreenPtr pScreen);extern void RADEONInit3DEngine(ScrnInfoPtr pScrn);extern int RADEONMinBits(int val);extern void RADEONInitVideo(ScreenPtr pScreen);extern void RADEONResetVideo(ScrnInfoPtr pScrn);extern void R300CGWorkaround(ScrnInfoPtr pScrn);extern void RADEONPllErrataAfterIndex(RADEONInfoPtr info);extern void RADEONPllErrataAfterData(RADEONInfoPtr info);extern Bool RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10);extern Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn);extern Bool RADEONGetClockInfoFromBIOS (ScrnInfoPtr pScrn);extern Bool RADEONGetLVDSInfoFromBIOS (ScrnInfoPtr pScrn);extern Bool RADEONGetTMDSInfoFromBIOS (ScrnInfoPtr pScrn);extern Bool RADEONGetHardCodedEDIDFromBIOS (ScrnInfoPtr pScrn);#ifdef XF86DRI#ifdef USE_XAAextern void RADEONAccelInitCP(ScreenPtr pScreen, XAAInfoRecPtr a);#endifextern Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn);extern Bool RADEONDRIScreenInit(ScreenPtr pScreen);extern void RADEONDRICloseScreen(ScreenPtr pScreen);extern void RADEONDRIResume(ScreenPtr pScreen);extern Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen);extern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen);extern void RADEONDRIInitPageFlip(ScreenPtr pScreen);extern void RADEONDRIStop(ScreenPtr pScreen);extern drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn);extern void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard);extern void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn);extern int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info);extern void RADEONHostDataParams(ScrnInfoPtr pScrn, CARD8 *dst, CARD32 pitch, int cpp, CARD32 *dstPitchOffset, int *x, int *y);extern CARD8* RADEONHostDataBlit(ScrnInfoPtr pScrn, unsigned int cpp, unsigned int w, CARD32 dstPitchOff, CARD32 *bufPitch, int x, int *y, unsigned int *h, unsigned int *hpass);extern void RADEONHostDataBlitCopyPass(ScrnInfoPtr pScrn, unsigned int bpp, CARD8 *dst, CARD8 *src, unsigned int hpass, unsigned int dstPitch, unsigned int srcPitch);extern void RADEONCopySwap(CARD8 *dst, CARD8 *src, unsigned int size, int swap);#define RADEONCP_START(pScrn, info) \do { \ int _ret = drmCommandNone(info->drmFD, DRM_RADEON_CP_START); \ if (_ret) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "%s: CP start %d\n", __FUNCTION__, _ret); \ } \ info->CPStarted = TRUE; \} while (0)#define RADEONCP_STOP(pScrn, info) \do { \ int _ret; \ if (info->CPStarted) { \ _ret = RADEONCPStop(pScrn, info); \ if (_ret) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "%s: CP stop %d\n", __FUNCTION__, _ret); \ } \ info->CPStarted = FALSE; \ } \ RADEONEngineRestore(pScrn); \ info->CPRuns = FALSE; \} while (0)#define RADEONCP_RESET(pScrn, info) \do { \ if (RADEONCP_USE_RING_BUFFER(info->CPMode)) { \ int _ret = drmCommandNone(info->drmFD, DRM_RADEON_CP_RESET); \ if (_ret) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "%s: CP reset %d\n", __FUNCTION__, _ret); \ } \ } \} while (0)#define RADEONCP_REFRESH(pScrn, info) \do { \ if (!info->CPInUse) { \ RADEON_WAIT_UNTIL_IDLE(); \ BEGIN_RING(6); \ OUT_RING_REG(RADEON_RE_TOP_LEFT, info->re_top_left); \ OUT_RING_REG(RADEON_RE_WIDTH_HEIGHT, info->re_width_height); \ OUT_RING_REG(RADEON_AUX_SC_CNTL, info->aux_sc_cntl); \ ADVANCE_RING(); \ info->CPInUse = TRUE; \ } \} while (0)#define CP_PACKET0(reg, n) \ (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))#define CP_PACKET1(reg0, reg1) \ (RADEON_CP_PACKET1 | (((reg1) >> 2) << 11) | ((reg0) >> 2))#define CP_PACKET2() \ (RADEON_CP_PACKET2)#define CP_PACKET3(pkt, n) \ (RADEON_CP_PACKET3 | (pkt) | ((n) << 16))#define RADEON_VERBOSE 0#define RING_LOCALS CARD32 *__head = NULL; int __expected; int __count = 0#define BEGIN_RING(n) do { \ if (RADEON_VERBOSE) { \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ } \ if (++info->dma_begin_count != 1) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "BEGIN_RING without end at %s:%d\n", \ info->dma_debug_func, info->dma_debug_lineno); \ info->dma_begin_count = 1; \ } \ info->dma_debug_func = __FILE__; \ info->dma_debug_lineno = __LINE__; \ if (!info->indirectBuffer) { \ info->indirectBuffer = RADEONCPGetBuffer(pScrn); \ info->indirectStart = 0; \ } else if (info->indirectBuffer->used + (n) * (int)sizeof(CARD32) > \ info->indirectBuffer->total) { \ RADEONCPFlushIndirect(pScrn, 1); \ } \ __expected = n; \ __head = (pointer)((char *)info->indirectBuffer->address + \ info->indirectBuffer->used); \ __count = 0; \} while (0)#define ADVANCE_RING() do { \ if (info->dma_begin_count-- != 1) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "ADVANCE_RING without begin at %s:%d\n", \ __FILE__, __LINE__); \ info->dma_begin_count = 0; \ } \ if (__count != __expected) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \ __count, __expected, __FILE__, __LINE__); \ } \ if (RADEON_VERBOSE) { \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ "ADVANCE_RING() start: %d used: %d count: %d\n", \ info->indirectStart, \ info->indirectBuffer->used, \ __count * (int)sizeof(CARD32)); \ } \ info->indirectBuffer->used += __count * (int)sizeof(CARD32); \} while (0)#define OUT_RING(x) do { \ if (RADEON_VERBOSE) { \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ } \ __head[__count++] = (x); \} while (0)#define OUT_RING_REG(reg, val) \do { \ OUT_RING(CP_PACKET0(reg, 0)); \ OUT_RING(val); \} while (0)#define FLUSH_RING() \do { \ if (RADEON_VERBOSE) \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ "FLUSH_RING in %s\n", __FUNCTION__); \ if (info->indirectBuffer) { \ RADEONCPFlushIndirect(pScrn, 0); \ } \} while (0)#define RADEON_WAIT_UNTIL_2D_IDLE() \do { \ BEGIN_RING(2); \ OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ RADEON_WAIT_HOST_IDLECLEAN)); \ ADVANCE_RING(); \} while (0)#define RADEON_WAIT_UNTIL_3D_IDLE() \do { \ BEGIN_RING(2); \ OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ OUT_RING((RADEON_WAIT_3D_IDLECLEAN | \ RADEON_WAIT_HOST_IDLECLEAN)); \ ADVANCE_RING(); \} while (0)#define RADEON_WAIT_UNTIL_IDLE() \do { \ if (RADEON_VERBOSE) { \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ "WAIT_UNTIL_IDLE() in %s\n", __FUNCTION__); \ } \ BEGIN_RING(2); \ OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0)); \ OUT_RING((RADEON_WAIT_2D_IDLECLEAN | \ RADEON_WAIT_3D_IDLECLEAN | \ RADEON_WAIT_HOST_IDLECLEAN)); \ ADVANCE_RING(); \} while (0)#define RADEON_FLUSH_CACHE() \do { \ BEGIN_RING(2); \ OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ OUT_RING(RADEON_RB3D_DC_FLUSH); \ ADVANCE_RING(); \} while (0)#define RADEON_PURGE_CACHE() \do { \ BEGIN_RING(2); \ OUT_RING(CP_PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0)); \ OUT_RING(RADEON_RB3D_DC_FLUSH_ALL); \ ADVANCE_RING(); \} while (0)#endif /* XF86DRI */static __inline__ void RADEON_MARK_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn){#ifdef USE_EXA if (info->useEXA) exaMarkSync(pScrn->pScreen);#endif#ifdef USE_XAA if (!info->useEXA) SET_SYNC_FLAG(info->accel);#endif}static __inline__ void RADEON_SYNC(RADEONInfoPtr info, ScrnInfoPtr pScrn){#ifdef USE_EXA if (info->useEXA) exaWaitSync(pScrn->pScreen);#endif#ifdef USE_XAA if (!info->useEXA && info->accel) info->accel->Sync(pScrn);#endif}#endif /* _RADEON_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -