ast_2dtool.c revision de78e416
115fb4814Smrg/* 215fb4814Smrg * Copyright (c) 2005 ASPEED Technology Inc. 315fb4814Smrg * 415fb4814Smrg * Permission to use, copy, modify, distribute, and sell this software and its 515fb4814Smrg * documentation for any purpose is hereby granted without fee, provided that 615fb4814Smrg * the above copyright notice appear in all copies and that both that 715fb4814Smrg * copyright notice and this permission notice appear in supporting 815fb4814Smrg * documentation, and that the name of the authors not be used in 915fb4814Smrg * advertising or publicity pertaining to distribution of the software without 1015fb4814Smrg * specific, written prior permission. The authors makes no representations 1115fb4814Smrg * about the suitability of this software for any purpose. It is provided 1215fb4814Smrg * "as is" without express or implied warranty. 1315fb4814Smrg * 1415fb4814Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1515fb4814Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 1615fb4814Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1715fb4814Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1815fb4814Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1915fb4814Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2015fb4814Smrg * PERFORMANCE OF THIS SOFTWARE. 2115fb4814Smrg */ 2215fb4814Smrg 2315fb4814Smrg#ifdef HAVE_CONFIG_H 2415fb4814Smrg#include <config.h> 2515fb4814Smrg#endif 2615fb4814Smrg#include "xf86.h" 2715fb4814Smrg#include "xf86_OSproc.h" 2815fb4814Smrg#include "xf86Resources.h" 2915fb4814Smrg#include "xf86RAC.h" 3015fb4814Smrg#include "xf86cmap.h" 3115fb4814Smrg#include "compiler.h" 3215fb4814Smrg#include "mibstore.h" 3315fb4814Smrg#include "vgaHW.h" 3415fb4814Smrg#include "mipointer.h" 3515fb4814Smrg#include "micmap.h" 3615fb4814Smrg 3715fb4814Smrg#include "fb.h" 3815fb4814Smrg#include "regionstr.h" 3915fb4814Smrg#include "xf86xv.h" 4015fb4814Smrg#include <X11/extensions/Xv.h> 4115fb4814Smrg#include "vbe.h" 4215fb4814Smrg 4315fb4814Smrg#include "xf86PciInfo.h" 4415fb4814Smrg#include "xf86Pci.h" 4515fb4814Smrg 4615fb4814Smrg/* framebuffer offscreen manager */ 4715fb4814Smrg#include "xf86fbman.h" 4815fb4814Smrg 4915fb4814Smrg/* include xaa includes */ 5015fb4814Smrg#include "xaa.h" 5115fb4814Smrg#include "xaarop.h" 5215fb4814Smrg 5315fb4814Smrg/* H/W cursor support */ 5415fb4814Smrg#include "xf86Cursor.h" 5515fb4814Smrg 5615fb4814Smrg/* Driver specific headers */ 5715fb4814Smrg#include "ast.h" 5815fb4814Smrg 5915fb4814Smrg#ifdef Accel_2D 6015fb4814Smrg 6115fb4814Smrg/* Prototype type declaration */ 6215fb4814SmrgBool bInitCMDQInfo(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6315fb4814SmrgBool bEnableCMDQ(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6415fb4814SmrgBool bEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6515fb4814Smrgvoid vDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6615fb4814Smrgvoid vWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST); 6715fb4814SmrgUCHAR *pjRequestCMDQ(ASTRecPtr pAST, ULONG ulDataLen); 6815fb4814SmrgBool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam); 6915fb4814Smrg 7015fb4814SmrgBool 7115fb4814SmrgbInitCMDQInfo(ScrnInfoPtr pScrn, ASTRecPtr pAST) 7215fb4814Smrg{ 7315fb4814Smrg 7415fb4814Smrg ScreenPtr pScreen; 7515fb4814Smrg 7615fb4814Smrg pAST->CMDQInfo.pjCmdQBasePort = pAST->MMIOVirtualAddr+ 0x8044; 7715fb4814Smrg pAST->CMDQInfo.pjWritePort = pAST->MMIOVirtualAddr+ 0x8048; 7815fb4814Smrg pAST->CMDQInfo.pjReadPort = pAST->MMIOVirtualAddr+ 0x804C; 7915fb4814Smrg pAST->CMDQInfo.pjEngStatePort = pAST->MMIOVirtualAddr+ 0x804C; 8015fb4814Smrg 8115fb4814Smrg /* CMDQ mode Init */ 8215fb4814Smrg if (!pAST->MMIO2D) { 8315fb4814Smrg pAST->CMDQInfo.ulCMDQType = VM_CMD_QUEUE; 8415fb4814Smrg 8515fb4814Smrg pScreen = screenInfo.screens[pScrn->scrnIndex]; 8615fb4814Smrg 8715fb4814Smrg do { 8815fb4814Smrg pAST->pCMDQPtr = xf86AllocateOffscreenLinear (pScreen, pAST->CMDQInfo.ulCMDQSize, 8, NULL, NULL, NULL); 8915fb4814Smrg 9015fb4814Smrg if (pAST->pCMDQPtr) break; 9115fb4814Smrg 9215fb4814Smrg pAST->CMDQInfo.ulCMDQSize >>= 1; 9315fb4814Smrg 9415fb4814Smrg } while (pAST->CMDQInfo.ulCMDQSize >= MIN_CMDQ_SIZE); 9515fb4814Smrg 9615fb4814Smrg if (pAST->pCMDQPtr) 9715fb4814Smrg { 9815fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO,"Allocate CMDQ size is %ld kbyte \n", (unsigned long) (pAST->CMDQInfo.ulCMDQSize/1024)); 9915fb4814Smrg 10015fb4814Smrg pAST->CMDQInfo.ulCMDQOffsetAddr = pAST->pCMDQPtr->offset*((pScrn->bitsPerPixel + 1) / 8); 10115fb4814Smrg pAST->CMDQInfo.pjCMDQVirtualAddr = pAST->FBVirtualAddr + pAST->CMDQInfo.ulCMDQOffsetAddr; 10215fb4814Smrg 10315fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = pAST->CMDQInfo.ulCMDQSize - CMD_QUEUE_GUARD_BAND; 10415fb4814Smrg pAST->CMDQInfo.ulCMDQMask = pAST->CMDQInfo.ulCMDQSize - 1 ; 10515fb4814Smrg 10615fb4814Smrg } 10715fb4814Smrg else 10815fb4814Smrg { 10915fb4814Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Allocate CMDQ failed \n"); 11015fb4814Smrg pAST->MMIO2D = TRUE; /* set to MMIO mode if CMDQ allocate failed */ 11115fb4814Smrg } 11215fb4814Smrg 11315fb4814Smrg } 11415fb4814Smrg 11515fb4814Smrg /* MMIO mode init */ 11615fb4814Smrg if (pAST->MMIO2D) { 11715fb4814Smrg pAST->CMDQInfo.ulCMDQType = VM_CMD_MMIO; 11815fb4814Smrg } 11915fb4814Smrg 12015fb4814Smrg return (TRUE); 12115fb4814Smrg} 12215fb4814Smrg 12315fb4814SmrgBool 12415fb4814SmrgbEnableCMDQ(ScrnInfoPtr pScrn, ASTRecPtr pAST) 12515fb4814Smrg{ 12615fb4814Smrg ULONG ulVMCmdQBasePort = 0; 12715fb4814Smrg 12815fb4814Smrg vWaitEngIdle(pScrn, pAST); 12915fb4814Smrg 13015fb4814Smrg /* set DBG Select Info */ 13115fb4814Smrg if (pAST->DBGSelect) 13215fb4814Smrg { 13315fb4814Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x804C) = (ULONG) (pAST->DBGSelect); 13415fb4814Smrg } 13515fb4814Smrg 13615fb4814Smrg /* set CMDQ base */ 13715fb4814Smrg switch (pAST->CMDQInfo.ulCMDQType) 13815fb4814Smrg { 13915fb4814Smrg case VM_CMD_QUEUE: 14015fb4814Smrg ulVMCmdQBasePort = (pAST->CMDQInfo.ulCMDQOffsetAddr - 0) >> 3; 14115fb4814Smrg 14215fb4814Smrg /* set CMDQ Threshold */ 14315fb4814Smrg ulVMCmdQBasePort |= 0xF0000000; 14415fb4814Smrg 14515fb4814Smrg /* set CMDQ Size */ 14615fb4814Smrg switch (pAST->CMDQInfo.ulCMDQSize) 14715fb4814Smrg { 14815fb4814Smrg case CMD_QUEUE_SIZE_256K: 14915fb4814Smrg ulVMCmdQBasePort |= 0x00000000; 15015fb4814Smrg break; 15115fb4814Smrg 15215fb4814Smrg case CMD_QUEUE_SIZE_512K: 15315fb4814Smrg ulVMCmdQBasePort |= 0x04000000; 15415fb4814Smrg break; 15515fb4814Smrg 15615fb4814Smrg case CMD_QUEUE_SIZE_1M: 15715fb4814Smrg ulVMCmdQBasePort |= 0x08000000; 15815fb4814Smrg break; 15915fb4814Smrg 16015fb4814Smrg case CMD_QUEUE_SIZE_2M: 16115fb4814Smrg ulVMCmdQBasePort |= 0x0C000000; 16215fb4814Smrg break; 16315fb4814Smrg 16415fb4814Smrg default: 16515fb4814Smrg return(FALSE); 16615fb4814Smrg break; 16715fb4814Smrg } 16815fb4814Smrg 16915fb4814Smrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 170de78e416Smrg pAST->CMDQInfo.ulWritePointer = *(ULONG *) (pAST->CMDQInfo.pjWritePort) << 3; 17115fb4814Smrg break; 17215fb4814Smrg 17315fb4814Smrg case VM_CMD_MMIO: 17415fb4814Smrg /* set CMDQ Threshold */ 17515fb4814Smrg ulVMCmdQBasePort |= 0xF0000000; 17615fb4814Smrg 17715fb4814Smrg ulVMCmdQBasePort |= 0x02000000; /* MMIO mode */ 17815fb4814Smrg *(ULONG *) (pAST->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; 17915fb4814Smrg break; 18015fb4814Smrg 18115fb4814Smrg default: 18215fb4814Smrg return (FALSE); 18315fb4814Smrg break; 18415fb4814Smrg } 18515fb4814Smrg 18615fb4814Smrg return (TRUE); 18715fb4814Smrg} 18815fb4814Smrg 18915fb4814SmrgBool 19015fb4814SmrgbEnable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST) 19115fb4814Smrg{ 192de78e416Smrg ULONG ulData; 193de78e416Smrg 194de78e416Smrg switch (pAST->jChipType) 195de78e416Smrg { 196de78e416Smrg case AST2100: 197de78e416Smrg case AST1100: 198de78e416Smrg case AST2200: 199de78e416Smrg case AST2150: 200de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000; 201de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; 202de78e416Smrg 203de78e416Smrg ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c); 204de78e416Smrg *(ULONG *) (pAST->MMIOVirtualAddr + 0x1200c) = (ulData & 0xFFFFFFFD); 205de78e416Smrg break; 206de78e416Smrg } 207de78e416Smrg 20815fb4814Smrg SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01); /* enable 2D */ 20915fb4814Smrg 21015fb4814Smrg if (!bInitCMDQInfo(pScrn, pAST)) 21115fb4814Smrg { 21215fb4814Smrg vDisable2D(pScrn, pAST); 21315fb4814Smrg return (FALSE); 21415fb4814Smrg } 21515fb4814Smrg 21615fb4814Smrg if (!bEnableCMDQ(pScrn, pAST)) 21715fb4814Smrg { 21815fb4814Smrg vDisable2D(pScrn, pAST); 21915fb4814Smrg return (FALSE); 22015fb4814Smrg } 22115fb4814Smrg 22215fb4814Smrg return (TRUE); 22315fb4814Smrg} 22415fb4814Smrg 22515fb4814Smrgvoid 22615fb4814SmrgvDisable2D(ScrnInfoPtr pScrn, ASTRecPtr pAST) 22715fb4814Smrg{ 22815fb4814Smrg 22915fb4814Smrg vWaitEngIdle(pScrn, pAST); 23015fb4814Smrg vWaitEngIdle(pScrn, pAST); 23115fb4814Smrg 23215fb4814Smrg SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x00); 23315fb4814Smrg 23415fb4814Smrg} 23515fb4814Smrg 23615fb4814Smrg 23715fb4814Smrgvoid 23815fb4814SmrgvWaitEngIdle(ScrnInfoPtr pScrn, ASTRecPtr pAST) 23915fb4814Smrg{ 24015fb4814Smrg ULONG ulEngState, ulEngState2; 24115fb4814Smrg UCHAR jReg; 24215fb4814Smrg ULONG ulEngCheckSetting; 24315fb4814Smrg 24415fb4814Smrg if (pAST->MMIO2D) 24515fb4814Smrg ulEngCheckSetting = 0x10000000; 24615fb4814Smrg else 24715fb4814Smrg ulEngCheckSetting = 0x80000000; 24815fb4814Smrg 24915fb4814Smrg /* 2D disable if 0xA4 D[0] = 1 */ 25015fb4814Smrg GetIndexRegMask(CRTC_PORT, 0xA4, 0x01, jReg); 25115fb4814Smrg if (!jReg) goto Exit_vWaitEngIdle; 25215fb4814Smrg 25315fb4814Smrg /* 2D not work if in std. mode */ 25415fb4814Smrg GetIndexRegMask(CRTC_PORT, 0xA3, 0x0F, jReg); 25515fb4814Smrg if (!jReg) goto Exit_vWaitEngIdle; 25615fb4814Smrg 25715fb4814Smrg do 25815fb4814Smrg { 25915fb4814Smrg ulEngState = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 26015fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 26115fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 26215fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 26315fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 26415fb4814Smrg ulEngState2 = (*(volatile ULONG *)(pAST->CMDQInfo.pjEngStatePort)) & 0xFFFC0000; 26515fb4814Smrg 26615fb4814Smrg } while ((ulEngState & ulEngCheckSetting) || (ulEngState != ulEngState2)); 26715fb4814Smrg 26815fb4814SmrgExit_vWaitEngIdle: 26915fb4814Smrg ; 27015fb4814Smrg} 27115fb4814Smrg 27215fb4814Smrg/* ULONG ulGetCMDQLength() */ 273de78e416Smrgstatic __inline ULONG ulGetCMDQLength(ASTRecPtr pAST, ULONG ulWritePointer, ULONG ulCMDQMask) 27415fb4814Smrg{ 27515fb4814Smrg ULONG ulReadPointer, ulReadPointer2; 27615fb4814Smrg 27715fb4814Smrg do { 27815fb4814Smrg ulReadPointer = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 27915fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 28015fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 28115fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 28215fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 28315fb4814Smrg ulReadPointer2 = *((volatile ULONG *)(pAST->CMDQInfo.pjReadPort)) & 0x0003FFFF; 28415fb4814Smrg } while (ulReadPointer != ulReadPointer2); 28515fb4814Smrg 28615fb4814Smrg return ((ulReadPointer << 3) - ulWritePointer - CMD_QUEUE_GUARD_BAND) & ulCMDQMask; 28715fb4814Smrg} 28815fb4814Smrg 28915fb4814SmrgUCHAR *pjRequestCMDQ( 29015fb4814SmrgASTRecPtr pAST, ULONG ulDataLen) 29115fb4814Smrg{ 29215fb4814Smrg UCHAR *pjBuffer; 29315fb4814Smrg ULONG i, ulWritePointer, ulCMDQMask, ulCurCMDQLen, ulContinueCMDQLen; 29415fb4814Smrg 29515fb4814Smrg ulWritePointer = pAST->CMDQInfo.ulWritePointer; 29615fb4814Smrg ulContinueCMDQLen = pAST->CMDQInfo.ulCMDQSize - ulWritePointer; 29715fb4814Smrg ulCMDQMask = pAST->CMDQInfo.ulCMDQMask; 29815fb4814Smrg 29915fb4814Smrg if (ulContinueCMDQLen >= ulDataLen) 30015fb4814Smrg { 30115fb4814Smrg /* Get CMDQ Buffer */ 30215fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen) 30315fb4814Smrg { 30415fb4814Smrg ; 30515fb4814Smrg } 30615fb4814Smrg else 30715fb4814Smrg { 30815fb4814Smrg 30915fb4814Smrg do 31015fb4814Smrg { 31115fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 31215fb4814Smrg } while (ulCurCMDQLen < ulDataLen); 31315fb4814Smrg 31415fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 31515fb4814Smrg 31615fb4814Smrg } 31715fb4814Smrg 31815fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 31915fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; 32015fb4814Smrg pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; 32115fb4814Smrg return pjBuffer; 32215fb4814Smrg } 32315fb4814Smrg else 32415fb4814Smrg { 32515fb4814Smrg 32615fb4814Smrg /* Fill NULL CMD to the last of the CMDQ */ 32715fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulContinueCMDQLen) 32815fb4814Smrg { 32915fb4814Smrg ; 33015fb4814Smrg } 33115fb4814Smrg else 33215fb4814Smrg { 33315fb4814Smrg 33415fb4814Smrg do 33515fb4814Smrg { 33615fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 33715fb4814Smrg } while (ulCurCMDQLen < ulContinueCMDQLen); 33815fb4814Smrg 33915fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 34015fb4814Smrg 34115fb4814Smrg } 34215fb4814Smrg 34315fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 34415fb4814Smrg for (i = 0; i<ulContinueCMDQLen/8; i++, pjBuffer+=8) 34515fb4814Smrg { 34615fb4814Smrg *(ULONG *)pjBuffer = (ULONG) PKT_NULL_CMD; 34715fb4814Smrg *(ULONG *) (pjBuffer+4) = 0; 34815fb4814Smrg 34915fb4814Smrg } 35015fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulContinueCMDQLen; 35115fb4814Smrg pAST->CMDQInfo.ulWritePointer = ulWritePointer = 0; 35215fb4814Smrg 35315fb4814Smrg /* Get CMDQ Buffer */ 35415fb4814Smrg if (pAST->CMDQInfo.ulCurCMDQueueLen >= ulDataLen) 35515fb4814Smrg { 35615fb4814Smrg ; 35715fb4814Smrg } 35815fb4814Smrg else 35915fb4814Smrg { 36015fb4814Smrg 36115fb4814Smrg do 36215fb4814Smrg { 36315fb4814Smrg ulCurCMDQLen = ulGetCMDQLength(pAST, ulWritePointer, ulCMDQMask); 36415fb4814Smrg } while (ulCurCMDQLen < ulDataLen); 36515fb4814Smrg 36615fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; 36715fb4814Smrg 36815fb4814Smrg } 36915fb4814Smrg 37015fb4814Smrg pAST->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; 37115fb4814Smrg pjBuffer = pAST->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; 37215fb4814Smrg pAST->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; 37315fb4814Smrg return pjBuffer; 37415fb4814Smrg 37515fb4814Smrg } 37615fb4814Smrg 37715fb4814Smrg} /* end of pjRequestCmdQ() */ 37815fb4814Smrg 37915fb4814SmrgBool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam) 38015fb4814Smrg{ 38115fb4814Smrg LONG GAbsX, GAbsY, GXInc, GYInc, GXMajor; 38215fb4814Smrg LONG MM, mm, Error0, K1, K2; 38315fb4814Smrg 38415fb4814Smrg /* Init */ 38515fb4814Smrg#ifdef LONG64 38615fb4814Smrg GAbsX = abs (LineInfo->X1 - LineInfo->X2); 38715fb4814Smrg GAbsY = abs (LineInfo->Y1 - LineInfo->Y2); 38815fb4814Smrg#else 38915fb4814Smrg GAbsX = labs (LineInfo->X1 - LineInfo->X2); 39015fb4814Smrg GAbsY = labs (LineInfo->Y1 - LineInfo->Y2); 39115fb4814Smrg#endif 39215fb4814Smrg 39315fb4814Smrg GXInc = (LineInfo->X1 < LineInfo->X2) ? 1:0; 39415fb4814Smrg GYInc = (LineInfo->Y1 < LineInfo->Y2) ? 1:0; 39515fb4814Smrg GXMajor = (GAbsX >= GAbsY) ? 1:0; 39615fb4814Smrg 39715fb4814Smrg /* Calculate */ 39815fb4814Smrg if (GXMajor) 39915fb4814Smrg { 40015fb4814Smrg MM = GAbsX; 40115fb4814Smrg mm = GAbsY; 40215fb4814Smrg } 40315fb4814Smrg else 40415fb4814Smrg { 40515fb4814Smrg MM = GAbsY; 40615fb4814Smrg mm = GAbsX; 40715fb4814Smrg } 40815fb4814Smrg 40915fb4814Smrg Error0 = (signed) (2*mm - MM); 41015fb4814Smrg 41115fb4814Smrg K1 = 2* mm; 41215fb4814Smrg K2 = (signed) (2*mm - 2*MM); 41315fb4814Smrg 41415fb4814Smrg /*save the Param to dsLineParam */ 41515fb4814Smrg dsLineParam->dsLineX = (USHORT) LineInfo->X1; 41615fb4814Smrg dsLineParam->dsLineY = (USHORT) LineInfo->Y1; 41715fb4814Smrg dsLineParam->dsLineWidth = (USHORT) MM; 41815fb4814Smrg dsLineParam->dwErrorTerm = (ULONG) Error0; 41915fb4814Smrg dsLineParam->dwK1Term = K1; 42015fb4814Smrg dsLineParam->dwK2Term = K2; 42115fb4814Smrg 42215fb4814Smrg dsLineParam->dwLineAttributes = 0; 42315fb4814Smrg if (GXMajor) dsLineParam->dwLineAttributes |= LINEPARAM_XM; 42415fb4814Smrg if (!GXInc) dsLineParam->dwLineAttributes |= LINEPARAM_X_DEC; 42515fb4814Smrg if (!GYInc) dsLineParam->dwLineAttributes |= LINEPARAM_Y_DEC; 42615fb4814Smrg 42715fb4814Smrg return(TRUE); 42815fb4814Smrg 42915fb4814Smrg} 43015fb4814Smrg#endif /* end of Accel_2D */ 43115fb4814Smrg 43215fb4814Smrg 433