172b676d7Smrg/* 272b676d7Smrg * 2D Acceleration for SiS 315, 330 and 340 series 372b676d7Smrg * 472b676d7Smrg * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria 572b676d7Smrg * 672b676d7Smrg * Redistribution and use in source and binary forms, with or without 772b676d7Smrg * modification, are permitted provided that the following conditions 872b676d7Smrg * are met: 972b676d7Smrg * 1) Redistributions of source code must retain the above copyright 1072b676d7Smrg * notice, this list of conditions and the following disclaimer. 1172b676d7Smrg * 2) Redistributions in binary form must reproduce the above copyright 1272b676d7Smrg * notice, this list of conditions and the following disclaimer in the 1372b676d7Smrg * documentation and/or other materials provided with the distribution. 1472b676d7Smrg * 3) The name of the author may not be used to endorse or promote products 1572b676d7Smrg * derived from this software without specific prior written permission. 1672b676d7Smrg * 1772b676d7Smrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1872b676d7Smrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1972b676d7Smrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2072b676d7Smrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2172b676d7Smrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2272b676d7Smrg * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2372b676d7Smrg * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2472b676d7Smrg * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2572b676d7Smrg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2672b676d7Smrg * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2772b676d7Smrg * 2872b676d7Smrg * 2972b676d7Smrg * Author: Thomas Winischhofer <thomas@winischhofer.net> 3072b676d7Smrg * 3172b676d7Smrg * 2003/08/18: Rewritten for using VRAM command queue 3272b676d7Smrg * 3372b676d7Smrg */ 3472b676d7Smrg 3572b676d7Smrg#ifdef HAVE_CONFIG_H 3672b676d7Smrg#include "config.h" 3772b676d7Smrg#endif 3872b676d7Smrg 3972b676d7Smrg#include "sis.h" 4072b676d7Smrg#define SIS_NEED_MYMMIO 4172b676d7Smrg#define SIS_NEED_ACCELBUF 4272b676d7Smrg#include "sis_regs.h" 4372b676d7Smrg#include "sis310_accel.h" 4472b676d7Smrg 4572b676d7Smrg#if 0 4672b676d7Smrg#define ACCELDEBUG 4772b676d7Smrg#endif 4872b676d7Smrg 4972b676d7Smrg#define FBOFFSET (pSiS->dhmOffset) 5072b676d7Smrg 5172b676d7Smrg#define DEV_HEIGHT 0xfff /* "Device height of destination bitmap" */ 5272b676d7Smrg 5372b676d7Smrg#undef SIS_NEED_ARRAY 5472b676d7Smrg 5572b676d7Smrg/* For XAA */ 5672b676d7Smrg 5772b676d7Smrg#ifdef SIS_USE_XAA 5872b676d7Smrg 5972b676d7Smrg#undef TRAP /* Use/Don't use Trapezoid Fills 6072b676d7Smrg * DOES NOT WORK. XAA sometimes provides illegal 6172b676d7Smrg * trapezoid data (left and right edges cross each 6272b676d7Smrg * other) which causes drawing errors. Since 6372b676d7Smrg * checking the trapezoid for such a case is very 6472b676d7Smrg * time-intensive, it is faster to let it be done 6572b676d7Smrg * by the generic polygon functions. 6672b676d7Smrg * Does not work on 330 series at all, hangs the engine. 6772b676d7Smrg * Even with correct trapezoids, this is slower than 6872b676d7Smrg * doing it by the CPU. 6972b676d7Smrg */ 7072b676d7Smrg 7172b676d7Smrg#undef CTSCE /* Use/Don't use CPUToScreenColorExpand. Disabled 7272b676d7Smrg * because it is slower than doing it by the CPU. 7372b676d7Smrg * Indirect mode does not work in VRAM queue mode. 7472b676d7Smrg * Does not work on 330 series (even in MMIO mode). 7572b676d7Smrg */ 7672b676d7Smrg#undef CTSCE_DIRECT /* Use direct method - This works (on both 315 and 330 at 7772b676d7Smrg * least in VRAM queue mode) but we don't use this either, 7872b676d7Smrg * because it's slower than doing it by the CPU. (Using it 7972b676d7Smrg * would require defining CTSCE) 8072b676d7Smrg */ 8172b676d7Smrg 8272b676d7Smrg#undef STSCE /* Use/Don't use ScreenToScreenColorExpand - does not work, 8372b676d7Smrg * see comments below. 8472b676d7Smrg */ 8572b676d7Smrg 8672b676d7Smrg#define INCL_RENDER /* Use/Don't use RENDER extension acceleration */ 8772b676d7Smrg 8872b676d7Smrg#ifdef INCL_RENDER 8972b676d7Smrg# ifdef RENDER 9072b676d7Smrg# include "mipict.h" 9172b676d7Smrg# include "dixstruct.h" 9272b676d7Smrg# define SIS_NEED_ARRAY 9372b676d7Smrg# undef SISNEWRENDER 9472b676d7Smrg# ifdef XORG_VERSION_CURRENT 9572b676d7Smrg# if XORG_VERSION_CURRENT > XORG_VERSION_NUMERIC(6,7,0,0,0) 9672b676d7Smrg# define SISNEWRENDER 9772b676d7Smrg# endif 9872b676d7Smrg# endif 9972b676d7Smrg# endif 10072b676d7Smrg#endif 10172b676d7Smrg 10272b676d7Smrg#endif /* XAA */ 10372b676d7Smrg 10472b676d7Smrg/* For EXA */ 10572b676d7Smrg 10672b676d7Smrg#ifdef SIS_USE_EXA 10772b676d7Smrg#if 0 10872b676d7Smrg#define SIS_HAVE_COMPOSITE /* Have our own EXA composite */ 10972b676d7Smrg#endif 11072b676d7Smrg#ifdef SIS_HAVE_COMPOSITE 11172b676d7Smrg#ifndef SIS_NEED_ARRAY 11272b676d7Smrg#define SIS_NEED_ARRAY 11372b676d7Smrg#endif 11472b676d7Smrg#endif 11572b676d7Smrg#endif 11672b676d7Smrg 11772b676d7Smrg#ifdef SIS_USE_XAA /* XAA */ 11872b676d7Smrg#ifdef INCL_RENDER 11972b676d7Smrg#ifdef RENDER 12072b676d7Smrgstatic CARD32 SiSAlphaTextureFormats[2] = { PICT_a8 , 0 }; 12172b676d7Smrgstatic CARD32 SiSTextureFormats[2] = { PICT_a8r8g8b8, 0 }; 12272b676d7Smrg#ifdef SISNEWRENDER 12372b676d7Smrgstatic CARD32 SiSDstTextureFormats16[2] = { PICT_r5g6b5 , 0 }; 12472b676d7Smrgstatic CARD32 SiSDstTextureFormats32[3] = { PICT_x8r8g8b8, PICT_a8r8g8b8, 0 }; 12572b676d7Smrg#endif 12672b676d7Smrg#endif /* RENDER */ 12772b676d7Smrg#endif /* INCL_RENDER */ 12872b676d7Smrg#endif /* XAA */ 12972b676d7Smrg 13072b676d7Smrg#ifdef SIS_USE_EXA /* EXA */ 13172b676d7Smrgvoid SiSScratchSave(ScreenPtr pScreen, ExaOffscreenArea *area); 13272b676d7SmrgBool SiSUploadToScratch(PixmapPtr pSrc, PixmapPtr pDst); 13372b676d7Smrg#endif /* EXA */ 13472b676d7Smrg 13572b676d7Smrg#ifdef INCL_YUV_BLIT_ADAPTOR 13672b676d7Smrgvoid SISWriteBlitPacket(SISPtr pSiS, CARD32 *packet); 13772b676d7Smrg#endif 13872b676d7Smrg 13972b676d7Smrgextern unsigned char SiSGetCopyROP(int rop); 14072b676d7Smrgextern unsigned char SiSGetPatternROP(int rop); 14172b676d7Smrg 14272b676d7SmrgCARD32 dummybuf; 14372b676d7Smrg 14472b676d7Smrg#ifdef SIS_NEED_ARRAY 14572b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,0,0,0) 14672b676d7Smrg#define SiSRenderOpsMAX 0x2b 14772b676d7Smrg#else 14872b676d7Smrg#define SiSRenderOpsMAX 0x0f 14972b676d7Smrg#endif 15072b676d7Smrgstatic const CARD8 SiSRenderOps[] = { /* PictOpXXX 1 = supported, 0 = unsupported */ 15172b676d7Smrg 1, 1, 1, 1, 15272b676d7Smrg 0, 0, 0, 0, 15372b676d7Smrg 0, 0, 0, 0, 15472b676d7Smrg 0, 0, 0, 0, 15572b676d7Smrg 1, 1, 1, 0, 15672b676d7Smrg 0, 0, 0, 0, 15772b676d7Smrg 0, 0, 0, 0, 15872b676d7Smrg 0, 0, 0, 0, 15972b676d7Smrg 1, 1, 1, 0, 16072b676d7Smrg 0, 0, 0, 0, 16172b676d7Smrg 0, 0, 0, 0, 16272b676d7Smrg 0, 0, 0, 0 16372b676d7Smrg}; 16472b676d7Smrg#endif /* NEED ARRAY */ 16572b676d7Smrg 16672b676d7Smrg#ifdef SIS_NEED_ARRAY 16772b676d7Smrgstatic void 16872b676d7SmrgSiSCalcRenderAccelArray(ScrnInfoPtr pScrn) 16972b676d7Smrg{ 17072b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 17172b676d7Smrg#ifdef SISDUALHEAD 17272b676d7Smrg SISEntPtr pSiSEnt = pSiS->entityPrivate;; 17372b676d7Smrg#endif 17472b676d7Smrg 17572b676d7Smrg if(((pScrn->bitsPerPixel == 16) || (pScrn->bitsPerPixel == 32)) && pSiS->doRender) { 17672b676d7Smrg int i, j; 17772b676d7Smrg#ifdef SISDUALHEAD 17872b676d7Smrg if(pSiSEnt) pSiS->RenderAccelArray = pSiSEnt->RenderAccelArray; 17972b676d7Smrg#endif 18072b676d7Smrg if(!pSiS->RenderAccelArray) { 18172b676d7Smrg if((pSiS->RenderAccelArray = xnfcalloc(65536, 1))) { 18272b676d7Smrg#ifdef SISDUALHEAD 18372b676d7Smrg if(pSiSEnt) pSiSEnt->RenderAccelArray = pSiS->RenderAccelArray; 18472b676d7Smrg#endif 18572b676d7Smrg for(i = 0; i < 256; i++) { 18672b676d7Smrg for(j = 0; j < 256; j++) { 18772b676d7Smrg pSiS->RenderAccelArray[(i << 8) + j] = (i * j) / 255; 18872b676d7Smrg } 18972b676d7Smrg } 19072b676d7Smrg } 19172b676d7Smrg } 19272b676d7Smrg } 19372b676d7Smrg} 19472b676d7Smrg#endif 19572b676d7Smrg 19672b676d7Smrg#ifdef SIS_USE_EXA 19772b676d7Smrgvoid 19872b676d7SmrgSiSScratchSave(ScreenPtr pScreen, ExaOffscreenArea *area) 19972b676d7Smrg{ 20074c14cd6Smrg SISPtr pSiS = SISPTR(xf86ScreenToScrn(pScreen)); 20172b676d7Smrg 20272b676d7Smrg pSiS->exa_scratch = NULL; 20372b676d7Smrg} 20472b676d7Smrg#endif 20572b676d7Smrg 20672b676d7Smrgstatic void 20772b676d7SmrgSiSSync(ScrnInfoPtr pScrn) 20872b676d7Smrg{ 20972b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 21072b676d7Smrg 21172b676d7Smrg#ifdef SIS_USE_XAA 21272b676d7Smrg if(!pSiS->useEXA) { 21372b676d7Smrg#ifdef CTSCE 21472b676d7Smrg#ifdef CTSCE_DIRECT 21572b676d7Smrg if(pSiS->DoColorExpand) { 21672b676d7Smrg SiSDoCMD 21772b676d7Smrg pSiS->ColorExpandBusy = TRUE; 21872b676d7Smrg } 21972b676d7Smrg#endif 22072b676d7Smrg#endif 22172b676d7Smrg pSiS->DoColorExpand = FALSE; 22272b676d7Smrg } 22372b676d7Smrg#endif 22472b676d7Smrg 22572b676d7Smrg pSiS->alphaBlitBusy = FALSE; 22672b676d7Smrg 22772b676d7Smrg SiSIdle 22872b676d7Smrg} 22972b676d7Smrg 23072b676d7Smrgstatic void 23172b676d7SmrgSiSSyncAccel(ScrnInfoPtr pScrn) 23272b676d7Smrg{ 23372b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 23472b676d7Smrg 23572b676d7Smrg if(!pSiS->NoAccel) SiSSync(pScrn); 23672b676d7Smrg} 23772b676d7Smrg 23872b676d7Smrgstatic void 23972b676d7SmrgSiSInitializeAccelerator(ScrnInfoPtr pScrn) 24072b676d7Smrg{ 24172b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 24272b676d7Smrg 24372b676d7Smrg#ifdef SIS_USE_XAA 24472b676d7Smrg pSiS->DoColorExpand = FALSE; 24572b676d7Smrg#endif 24672b676d7Smrg pSiS->alphaBlitBusy = FALSE; 24772b676d7Smrg 24872b676d7Smrg if(!pSiS->NoAccel) { 24972b676d7Smrg 25072b676d7Smrg#ifndef SISVRAMQ 25172b676d7Smrg if(pSiS->ChipFlags & SiSCF_Integrated) { 25272b676d7Smrg CmdQueLen = 0; 25372b676d7Smrg } else { 25472b676d7Smrg CmdQueLen = ((128 * 1024) / 4) - 64; 25572b676d7Smrg } 25672b676d7Smrg#endif 25772b676d7Smrg 25872b676d7Smrg#ifdef SISVRAMQ 25972b676d7Smrg if(pSiS->ChipType == XGI_40) { 26072b676d7Smrg SiSSync(pScrn); 26172b676d7Smrg SiSDualPipe(1); /* 1 = disable, 0 = enable */ 26272b676d7Smrg SiSSync(pScrn); 26372b676d7Smrg } 26472b676d7Smrg#endif 26572b676d7Smrg 26672b676d7Smrg } 26772b676d7Smrg} 26872b676d7Smrg 26972b676d7Smrgstatic void 27072b676d7SmrgSiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, 27172b676d7Smrg int xdir, int ydir, int rop, 27272b676d7Smrg unsigned int planemask, int trans_color) 27372b676d7Smrg{ 27472b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 27572b676d7Smrg 27672b676d7Smrg#ifdef SISVRAMQ 27772b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 27872b676d7Smrg SiSCheckQueue(16 * 2); 27972b676d7Smrg SiSSetupSRCPitchDSTRect(pSiS->scrnOffset, pSiS->scrnOffset, DEV_HEIGHT) 28072b676d7Smrg#else 28172b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 28272b676d7Smrg SiSSetupSRCPitch(pSiS->scrnOffset) 28372b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 28472b676d7Smrg#endif 28572b676d7Smrg 28672b676d7Smrg if(trans_color != -1) { 28772b676d7Smrg SiSSetupROP(0x0A) 28872b676d7Smrg SiSSetupSRCTrans(trans_color) 28972b676d7Smrg SiSSetupCMDFlag(TRANSPARENT_BITBLT) 29072b676d7Smrg } else { 29172b676d7Smrg SiSSetupROP(SiSGetCopyROP(rop)) 29272b676d7Smrg /* Set command - not needed, both 0 */ 29372b676d7Smrg /* SiSSetupCMDFlag(BITBLT | SRCVIDEO) */ 29472b676d7Smrg } 29572b676d7Smrg 29672b676d7Smrg#ifndef SISVRAMQ 29772b676d7Smrg SiSSetupCMDFlag(pSiS->SiS310_AccelDepth) 29872b676d7Smrg#endif 29972b676d7Smrg 30072b676d7Smrg#ifdef SISVRAMQ 30172b676d7Smrg SiSSyncWP 30272b676d7Smrg#endif 30372b676d7Smrg 30472b676d7Smrg /* The chip is smart enough to know the direction */ 30572b676d7Smrg} 30672b676d7Smrg 30772b676d7Smrgstatic void 30872b676d7SmrgSiSSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, 30972b676d7Smrg int src_x, int src_y, int dst_x, int dst_y, 31072b676d7Smrg int width, int height) 31172b676d7Smrg{ 31272b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 31372b676d7Smrg CARD32 srcbase, dstbase; 31472b676d7Smrg int mymin, mymax; 31572b676d7Smrg 31672b676d7Smrg srcbase = dstbase = 0; 31772b676d7Smrg mymin = min(src_y, dst_y); 31872b676d7Smrg mymax = max(src_y, dst_y); 31972b676d7Smrg 32072b676d7Smrg /* Libxaa.a has a bug: The tilecache cannot operate 32172b676d7Smrg * correctly if there are 512x512 slots, but no 256x256 32272b676d7Smrg * slots. This leads to catastrophic data fed to us. 32372b676d7Smrg * Filter this out here and warn the user. 32472b676d7Smrg * Fixed in 4.3.99.10 (?) and Debian's 4.3.0.1 32572b676d7Smrg */ 32672b676d7Smrg#if (XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,10,0)) && (XF86_VERSION_CURRENT != XF86_VERSION_NUMERIC(4,3,0,1,0)) 32772b676d7Smrg if((src_x < 0) || 32872b676d7Smrg (dst_x < 0) || 32972b676d7Smrg (src_y < 0) || 33072b676d7Smrg (dst_y < 0) || 33172b676d7Smrg (width <= 0) || 33272b676d7Smrg (height <= 0)) { 33372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 33472b676d7Smrg "BitBlit fatal error: Illegal coordinates:\n"); 33572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 33672b676d7Smrg "Source x %d y %d, dest x %d y %d, width %d height %d\n", 33772b676d7Smrg src_x, src_y, dst_x, dst_y, width, height); 33872b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 33972b676d7Smrg "This is very probably caused by a known bug in libxaa.a.\n"); 34072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 34172b676d7Smrg "Please update libxaa.a to avoid this error.\n"); 34272b676d7Smrg return; 34372b676d7Smrg } 34472b676d7Smrg#endif 34572b676d7Smrg 34672b676d7Smrg /* Although the chip knows the direction to use 34772b676d7Smrg * if the source and destination areas overlap, 34872b676d7Smrg * that logic fails if we fiddle with the bitmap 34972b676d7Smrg * addresses. Therefore, we check if the source 35072b676d7Smrg * and destination blitting areas overlap and 35172b676d7Smrg * adapt the bitmap addresses synchronously 35272b676d7Smrg * if the coordinates exceed the valid range. 35372b676d7Smrg * The the areas do not overlap, we do our 35472b676d7Smrg * normal check. 35572b676d7Smrg */ 35672b676d7Smrg if((mymax - mymin) < height) { 35772b676d7Smrg if((src_y >= 2048) || (dst_y >= 2048)) { 35872b676d7Smrg srcbase = pSiS->scrnOffset * mymin; 35972b676d7Smrg dstbase = pSiS->scrnOffset * mymin; 36072b676d7Smrg src_y -= mymin; 36172b676d7Smrg dst_y -= mymin; 36272b676d7Smrg } 36372b676d7Smrg } else { 36472b676d7Smrg if(src_y >= 2048) { 36572b676d7Smrg srcbase = pSiS->scrnOffset * src_y; 36672b676d7Smrg src_y = 0; 36772b676d7Smrg } 36872b676d7Smrg if((dst_y >= pScrn->virtualY) || (dst_y >= 2048)) { 36972b676d7Smrg dstbase = pSiS->scrnOffset * dst_y; 37072b676d7Smrg dst_y = 0; 37172b676d7Smrg } 37272b676d7Smrg } 37372b676d7Smrg 37472b676d7Smrg srcbase += FBOFFSET; 37572b676d7Smrg dstbase += FBOFFSET; 37672b676d7Smrg 37772b676d7Smrg#ifdef SISVRAMQ 37872b676d7Smrg SiSCheckQueue(16 * 3); 37972b676d7Smrg SiSSetupSRCDSTBase(srcbase, dstbase) 38072b676d7Smrg SiSSetupSRCDSTXY(src_x, src_y, dst_x, dst_y) 38172b676d7Smrg SiSSetRectDoCMD(width,height) 38272b676d7Smrg#else 38372b676d7Smrg SiSSetupSRCBase(srcbase); 38472b676d7Smrg SiSSetupDSTBase(dstbase); 38572b676d7Smrg SiSSetupRect(width, height) 38672b676d7Smrg SiSSetupSRCXY(src_x, src_y) 38772b676d7Smrg SiSSetupDSTXY(dst_x, dst_y) 38872b676d7Smrg SiSDoCMD 38972b676d7Smrg#endif 39072b676d7Smrg} 39172b676d7Smrg 39272b676d7Smrgstatic void 39372b676d7SmrgSiSSetupForSolidFill(ScrnInfoPtr pScrn, int color, 39472b676d7Smrg int rop, unsigned int planemask) 39572b676d7Smrg{ 39672b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 39772b676d7Smrg 39872b676d7Smrg if(pSiS->disablecolorkeycurrent) { 39972b676d7Smrg if((CARD32)color == pSiS->colorKey) { 40072b676d7Smrg rop = 5; /* NOOP */ 40172b676d7Smrg } 40272b676d7Smrg } 40372b676d7Smrg 40472b676d7Smrg#ifdef SISVRAMQ 40572b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 40672b676d7Smrg SiSCheckQueue(16 * 1); 40772b676d7Smrg SiSSetupPATFGDSTRect(color, pSiS->scrnOffset, DEV_HEIGHT) 40872b676d7Smrg SiSSetupROP(SiSGetPatternROP(rop)) 40972b676d7Smrg SiSSetupCMDFlag(PATFG) 41072b676d7Smrg SiSSyncWP 41172b676d7Smrg#else 41272b676d7Smrg SiSSetupPATFG(color) 41372b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 41472b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 41572b676d7Smrg SiSSetupROP(SiSGetPatternROP(rop)) 41672b676d7Smrg SiSSetupCMDFlag(PATFG | pSiS->SiS310_AccelDepth) 41772b676d7Smrg#endif 41872b676d7Smrg} 41972b676d7Smrg 42072b676d7Smrgstatic void 42172b676d7SmrgSiSSubsequentSolidFillRect(ScrnInfoPtr pScrn, 42272b676d7Smrg int x, int y, int w, int h) 42372b676d7Smrg{ 42472b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 42572b676d7Smrg CARD32 dstbase = 0; 42672b676d7Smrg 42772b676d7Smrg if(y >= 2048) { 42872b676d7Smrg dstbase = pSiS->scrnOffset * y; 42972b676d7Smrg y = 0; 43072b676d7Smrg } 43172b676d7Smrg 43272b676d7Smrg dstbase += FBOFFSET; 43372b676d7Smrg 43472b676d7Smrg pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR | 43572b676d7Smrg T_L_X_INC | T_L_Y_INC | 43672b676d7Smrg T_R_X_INC | T_R_Y_INC | 43772b676d7Smrg TRAPAZOID_FILL); 43872b676d7Smrg 43972b676d7Smrg /* SiSSetupCMDFlag(BITBLT) - BITBLT = 0 */ 44072b676d7Smrg 44172b676d7Smrg#ifdef SISVRAMQ 44272b676d7Smrg SiSCheckQueue(16 * 2) 44372b676d7Smrg SiSSetupDSTXYRect(x, y, w, h) 44472b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 44572b676d7Smrg#else 44672b676d7Smrg SiSSetupDSTBase(dstbase) 44772b676d7Smrg SiSSetupDSTXY(x, y) 44872b676d7Smrg SiSSetupRect(w, h) 44972b676d7Smrg SiSDoCMD 45072b676d7Smrg#endif 45172b676d7Smrg} 45272b676d7Smrg 45372b676d7Smrg#ifdef SIS_USE_XAA /* ---------------------------- XAA -------------------------- */ 45472b676d7Smrg 45572b676d7Smrg/* Trapezoid */ 45672b676d7Smrg/* This would work better if XAA would provide us with valid trapezoids. 45772b676d7Smrg * In fact, with small trapezoids the left and the right edge often cross 45872b676d7Smrg * each other which causes drawing errors (filling over whole scanline). 45972b676d7Smrg * DOES NOT WORK ON 330 SERIES, HANGS THE ENGINE. 46072b676d7Smrg */ 46172b676d7Smrg#ifdef TRAP 46272b676d7Smrgstatic void 46372b676d7SmrgSiSSubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h, 46472b676d7Smrg int left, int dxL, int dyL, int eL, 46572b676d7Smrg int right, int dxR, int dyR, int eR ) 46672b676d7Smrg{ 46772b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 46872b676d7Smrg CARD32 dstbase = 0; 46972b676d7Smrg 47072b676d7Smrg if(y >= 2048) { 47172b676d7Smrg dstbase = pSiS->scrnOffset * y; 47272b676d7Smrg y = 0; 47372b676d7Smrg } 47472b676d7Smrg 47572b676d7Smrg dstbase += FBOFFSET; 47672b676d7Smrg 47772b676d7Smrg#ifdef SISVRAMQ /* Not optimized yet */ 47872b676d7Smrg SiSCheckQueue(16 * 10) 47972b676d7Smrg#else 48072b676d7Smrg SiSSetupDSTBase(dstbase) 48172b676d7Smrg#endif 48272b676d7Smrg 48372b676d7Smrg#if 1 48472b676d7Smrg SiSSetupPATFG(0xff0000) /* FOR TESTING */ 48572b676d7Smrg#endif 48672b676d7Smrg 48772b676d7Smrg /* Clear CommandReg because SetUp can be used for Rect and Trap */ 48872b676d7Smrg pSiS->CommandReg &= ~(T_L_X_INC | T_L_Y_INC | 48972b676d7Smrg T_R_X_INC | T_R_Y_INC | 49072b676d7Smrg T_XISMAJORL | T_XISMAJORR | 49172b676d7Smrg BITBLT); 49272b676d7Smrg 49372b676d7Smrg xf86DrvMsg(0, X_INFO, "Trap (%d %d %d %d) dxL %d dyL %d eL %d dxR %d dyR %d eR %d\n", 49472b676d7Smrg left, right, y, h, dxL, dyL, eL, dxR, dyR, eR); 49572b676d7Smrg 49672b676d7Smrg /* Determine egde angles */ 49772b676d7Smrg if(dxL < 0) { dxL = -dxL; } 49872b676d7Smrg else { SiSSetupCMDFlag(T_L_X_INC) } 49972b676d7Smrg if(dxR < 0) { dxR = -dxR; } 50072b676d7Smrg else { SiSSetupCMDFlag(T_R_X_INC) } 50172b676d7Smrg 50272b676d7Smrg /* (Y direction always positive - do this anyway) */ 50372b676d7Smrg if(dyL < 0) { dyL = -dyL; } 50472b676d7Smrg else { SiSSetupCMDFlag(T_L_Y_INC) } 50572b676d7Smrg if(dyR < 0) { dyR = -dyR; } 50672b676d7Smrg else { SiSSetupCMDFlag(T_R_Y_INC) } 50772b676d7Smrg 50872b676d7Smrg /* Determine major axis */ 50972b676d7Smrg if(dxL >= dyL) { SiSSetupCMDFlag(T_XISMAJORL) } 51072b676d7Smrg if(dxR >= dyR) { SiSSetupCMDFlag(T_XISMAJORR) } 51172b676d7Smrg 51272b676d7Smrg SiSSetupCMDFlag(TRAPAZOID_FILL); 51372b676d7Smrg 51472b676d7Smrg#ifdef SISVRAMQ 51572b676d7Smrg SiSSetupYHLR(y, h, left, right) 51672b676d7Smrg SiSSetupdLdR(dxL, dyL, dxR, dyR) 51772b676d7Smrg SiSSetupELER(eL, eR) 51872b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 51972b676d7Smrg#else 52072b676d7Smrg /* Set up deltas */ 52172b676d7Smrg SiSSetupdL(dxL, dyL) 52272b676d7Smrg SiSSetupdR(dxR, dyR) 52372b676d7Smrg /* Set up y, h, left, right */ 52472b676d7Smrg SiSSetupYH(y, h) 52572b676d7Smrg SiSSetupLR(left, right) 52672b676d7Smrg /* Set up initial error term */ 52772b676d7Smrg SiSSetupEL(eL) 52872b676d7Smrg SiSSetupER(eR) 52972b676d7Smrg SiSDoCMD 53072b676d7Smrg#endif 53172b676d7Smrg} 53272b676d7Smrg#endif 53372b676d7Smrg 53472b676d7Smrgstatic void 53572b676d7SmrgSiSSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop, 53672b676d7Smrg unsigned int planemask) 53772b676d7Smrg{ 53872b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 53972b676d7Smrg 54072b676d7Smrg#ifdef SISVRAMQ 54172b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 54272b676d7Smrg SiSCheckQueue(16 * 3); 54372b676d7Smrg SiSSetupLineCountPeriod(1, 1) 54472b676d7Smrg SiSSetupPATFGDSTRect(color, pSiS->scrnOffset, DEV_HEIGHT) 54572b676d7Smrg SiSSetupROP(SiSGetPatternROP(rop)) 54672b676d7Smrg SiSSetupCMDFlag(PATFG | LINE) 54772b676d7Smrg SiSSyncWP 54872b676d7Smrg#else 54972b676d7Smrg SiSSetupLineCount(1) 55072b676d7Smrg SiSSetupPATFG(color) 55172b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 55272b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor) 55372b676d7Smrg SiSSetupROP(SiSGetPatternROP(rop)) 55472b676d7Smrg SiSSetupCMDFlag(PATFG | LINE | pSiS->SiS310_AccelDepth) 55572b676d7Smrg#endif 55672b676d7Smrg} 55772b676d7Smrg 55872b676d7Smrgstatic void 55972b676d7SmrgSiSSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, 56072b676d7Smrg int x1, int y1, int x2, int y2, int flags) 56172b676d7Smrg{ 56272b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 56372b676d7Smrg int miny, maxy; 56472b676d7Smrg CARD32 dstbase = 0; 56572b676d7Smrg 56672b676d7Smrg miny = (y1 > y2) ? y2 : y1; 56772b676d7Smrg maxy = (y1 > y2) ? y1 : y2; 56872b676d7Smrg if(maxy >= 2048) { 56972b676d7Smrg dstbase = pSiS->scrnOffset*miny; 57072b676d7Smrg y1 -= miny; 57172b676d7Smrg y2 -= miny; 57272b676d7Smrg } 57372b676d7Smrg 57472b676d7Smrg dstbase += FBOFFSET; 57572b676d7Smrg 57672b676d7Smrg if(flags & OMIT_LAST) { 57772b676d7Smrg SiSSetupCMDFlag(NO_LAST_PIXEL) 57872b676d7Smrg } else { 57972b676d7Smrg pSiS->CommandReg &= ~(NO_LAST_PIXEL); 58072b676d7Smrg } 58172b676d7Smrg 58272b676d7Smrg#ifdef SISVRAMQ 58372b676d7Smrg SiSCheckQueue(16 * 2); 58472b676d7Smrg SiSSetupX0Y0X1Y1(x1, y1, x2, y2) 58572b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 58672b676d7Smrg#else 58772b676d7Smrg SiSSetupDSTBase(dstbase) 58872b676d7Smrg SiSSetupX0Y0(x1, y1) 58972b676d7Smrg SiSSetupX1Y1(x2, y2) 59072b676d7Smrg SiSDoCMD 59172b676d7Smrg#endif 59272b676d7Smrg} 59372b676d7Smrg 59472b676d7Smrgstatic void 59572b676d7SmrgSiSSubsequentSolidHorzVertLine(ScrnInfoPtr pScrn, 59672b676d7Smrg int x, int y, int len, int dir) 59772b676d7Smrg{ 59872b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 59972b676d7Smrg CARD32 dstbase = 0; 60072b676d7Smrg 60172b676d7Smrg len--; /* starting point is included! */ 60272b676d7Smrg 60372b676d7Smrg if((y >= 2048) || ((y + len) >= 2048)) { 60472b676d7Smrg dstbase = pSiS->scrnOffset * y; 60572b676d7Smrg y = 0; 60672b676d7Smrg } 60772b676d7Smrg 60872b676d7Smrg dstbase += FBOFFSET; 60972b676d7Smrg 61072b676d7Smrg#ifdef SISVRAMQ 61172b676d7Smrg SiSCheckQueue(16 * 2); 61272b676d7Smrg if(dir == DEGREES_0) { 61372b676d7Smrg SiSSetupX0Y0X1Y1(x, y, (x + len), y) 61472b676d7Smrg } else { 61572b676d7Smrg SiSSetupX0Y0X1Y1(x, y, x, (y + len)) 61672b676d7Smrg } 61772b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 61872b676d7Smrg#else 61972b676d7Smrg SiSSetupDSTBase(dstbase) 62072b676d7Smrg SiSSetupX0Y0(x,y) 62172b676d7Smrg if(dir == DEGREES_0) { 62272b676d7Smrg SiSSetupX1Y1(x + len, y); 62372b676d7Smrg } else { 62472b676d7Smrg SiSSetupX1Y1(x, y + len); 62572b676d7Smrg } 62672b676d7Smrg SiSDoCMD 62772b676d7Smrg#endif 62872b676d7Smrg} 62972b676d7Smrg 63072b676d7Smrgstatic void 63172b676d7SmrgSiSSetupForDashedLine(ScrnInfoPtr pScrn, 63272b676d7Smrg int fg, int bg, int rop, unsigned int planemask, 63372b676d7Smrg int length, unsigned char *pattern) 63472b676d7Smrg{ 63572b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 63672b676d7Smrg 63772b676d7Smrg#ifdef SISVRAMQ 63872b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 63972b676d7Smrg SiSCheckQueue(16 * 3); 64072b676d7Smrg SiSSetupLineCountPeriod(1, (length - 1)) 64172b676d7Smrg SiSSetupStyle(*pattern,*(pattern + 4)) 64272b676d7Smrg SiSSetupPATFGDSTRect(fg, pSiS->scrnOffset, DEV_HEIGHT) 64372b676d7Smrg#else 64472b676d7Smrg SiSSetupLineCount(1) 64572b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 64672b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 64772b676d7Smrg SiSSetupStyleLow(*pattern) 64872b676d7Smrg SiSSetupStyleHigh(*(pattern + 4)) 64972b676d7Smrg SiSSetupStylePeriod(length - 1); 65072b676d7Smrg SiSSetupPATFG(fg) 65172b676d7Smrg#endif 65272b676d7Smrg 65372b676d7Smrg SiSSetupROP(SiSGetPatternROP(rop)) 65472b676d7Smrg 65572b676d7Smrg SiSSetupCMDFlag(LINE | LINE_STYLE) 65672b676d7Smrg 65772b676d7Smrg if(bg != -1) { 65872b676d7Smrg SiSSetupPATBG(bg) 65972b676d7Smrg } else { 66072b676d7Smrg SiSSetupCMDFlag(TRANSPARENT) 66172b676d7Smrg } 66272b676d7Smrg#ifndef SISVRAMQ 66372b676d7Smrg SiSSetupCMDFlag(pSiS->SiS310_AccelDepth) 66472b676d7Smrg#endif 66572b676d7Smrg 66672b676d7Smrg#ifdef SISVRAMQ 66772b676d7Smrg SiSSyncWP 66872b676d7Smrg#endif 66972b676d7Smrg} 67072b676d7Smrg 67172b676d7Smrgstatic void 67272b676d7SmrgSiSSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, 67372b676d7Smrg int x1, int y1, int x2, int y2, 67472b676d7Smrg int flags, int phase) 67572b676d7Smrg{ 67672b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 67772b676d7Smrg CARD32 dstbase, miny, maxy; 67872b676d7Smrg 67972b676d7Smrg dstbase = 0; 68072b676d7Smrg miny = (y1 > y2) ? y2 : y1; 68172b676d7Smrg maxy = (y1 > y2) ? y1 : y2; 68272b676d7Smrg if(maxy >= 2048) { 68372b676d7Smrg dstbase = pSiS->scrnOffset * miny; 68472b676d7Smrg y1 -= miny; 68572b676d7Smrg y2 -= miny; 68672b676d7Smrg } 68772b676d7Smrg 68872b676d7Smrg dstbase += FBOFFSET; 68972b676d7Smrg 69072b676d7Smrg if(flags & OMIT_LAST) { 69172b676d7Smrg SiSSetupCMDFlag(NO_LAST_PIXEL) 69272b676d7Smrg } else { 69372b676d7Smrg pSiS->CommandReg &= ~(NO_LAST_PIXEL); 69472b676d7Smrg } 69572b676d7Smrg 69672b676d7Smrg#ifdef SISVRAMQ 69772b676d7Smrg SiSCheckQueue(16 * 2); 69872b676d7Smrg SiSSetupX0Y0X1Y1(x1, y1, x2, y2) 69972b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 70072b676d7Smrg#else 70172b676d7Smrg SiSSetupDSTBase(dstbase) 70272b676d7Smrg SiSSetupX0Y0(x1, y1) 70372b676d7Smrg SiSSetupX1Y1(x2, y2) 70472b676d7Smrg SiSDoCMD 70572b676d7Smrg#endif 70672b676d7Smrg} 70772b676d7Smrg 70872b676d7Smrgstatic void 70972b676d7SmrgSiSSetupForMonoPatternFill(ScrnInfoPtr pScrn, 71072b676d7Smrg int patx, int paty, int fg, int bg, 71172b676d7Smrg int rop, unsigned int planemask) 71272b676d7Smrg{ 71372b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 71472b676d7Smrg 71572b676d7Smrg#ifdef SISVRAMQ 71672b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 71772b676d7Smrg SiSCheckQueue(16 * 3); 71872b676d7Smrg SiSSetupPATFGDSTRect(fg, pSiS->scrnOffset, DEV_HEIGHT) 71972b676d7Smrg#else 72072b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 72172b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 72272b676d7Smrg#endif 72372b676d7Smrg 72472b676d7Smrg SiSSetupMONOPAT(patx,paty) 72572b676d7Smrg 72672b676d7Smrg SiSSetupROP(SiSGetPatternROP(rop)) 72772b676d7Smrg 72872b676d7Smrg#ifdef SISVRAMQ 72972b676d7Smrg SiSSetupCMDFlag(PATMONO) 73072b676d7Smrg#else 73172b676d7Smrg SiSSetupPATFG(fg) 73272b676d7Smrg SiSSetupCMDFlag(PATMONO | pSiS->SiS310_AccelDepth) 73372b676d7Smrg#endif 73472b676d7Smrg 73572b676d7Smrg if(bg != -1) { 73672b676d7Smrg SiSSetupPATBG(bg) 73772b676d7Smrg } else { 73872b676d7Smrg SiSSetupCMDFlag(TRANSPARENT) 73972b676d7Smrg } 74072b676d7Smrg 74172b676d7Smrg#ifdef SISVRAMQ 74272b676d7Smrg SiSSyncWP 74372b676d7Smrg#endif 74472b676d7Smrg} 74572b676d7Smrg 74672b676d7Smrgstatic void 74772b676d7SmrgSiSSubsequentMonoPatternFill(ScrnInfoPtr pScrn, 74872b676d7Smrg int patx, int paty, 74972b676d7Smrg int x, int y, int w, int h) 75072b676d7Smrg{ 75172b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 75272b676d7Smrg CARD32 dstbase = 0; 75372b676d7Smrg 75472b676d7Smrg if(y >= 2048) { 75572b676d7Smrg dstbase = pSiS->scrnOffset * y; 75672b676d7Smrg y = 0; 75772b676d7Smrg } 75872b676d7Smrg 75972b676d7Smrg dstbase += FBOFFSET; 76072b676d7Smrg 76172b676d7Smrg /* Clear commandReg because Setup can be used for Rect and Trap */ 76272b676d7Smrg pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR | 76372b676d7Smrg T_L_X_INC | T_L_Y_INC | 76472b676d7Smrg T_R_X_INC | T_R_Y_INC | 76572b676d7Smrg TRAPAZOID_FILL); 76672b676d7Smrg 76772b676d7Smrg#ifdef SISVRAMQ 76872b676d7Smrg SiSCheckQueue(16 * 2); 76972b676d7Smrg SiSSetupDSTXYRect(x,y,w,h) 77072b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 77172b676d7Smrg#else 77272b676d7Smrg SiSSetupDSTBase(dstbase) 77372b676d7Smrg SiSSetupDSTXY(x,y) 77472b676d7Smrg SiSSetupRect(w,h) 77572b676d7Smrg SiSDoCMD 77672b676d7Smrg#endif 77772b676d7Smrg} 77872b676d7Smrg 77972b676d7Smrg/* --- Trapezoid --- */ 78072b676d7Smrg 78172b676d7Smrg/* Does not work at all on 330 series */ 78272b676d7Smrg 78372b676d7Smrg#ifdef TRAP 78472b676d7Smrgstatic void 78572b676d7SmrgSiSSubsequentMonoPatternFillTrap(ScrnInfoPtr pScrn, 78672b676d7Smrg int patx, int paty, 78772b676d7Smrg int y, int h, 78872b676d7Smrg int left, int dxL, int dyL, int eL, 78972b676d7Smrg int right, int dxR, int dyR, int eR) 79072b676d7Smrg{ 79172b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 79272b676d7Smrg CARD32 dstbase = 0; 79372b676d7Smrg 79472b676d7Smrg if(y >= 2048) { 79572b676d7Smrg dstbase=pSiS->scrnOffset*y; 79672b676d7Smrg y = 0; 79772b676d7Smrg } 79872b676d7Smrg 79972b676d7Smrg dstbase += FBOFFSET; 80072b676d7Smrg 80172b676d7Smrg#ifdef SISVRAMQ 80272b676d7Smrg SiSCheckQueue(16 * 4); 80372b676d7Smrg#else 80472b676d7Smrg SiSSetupDSTBase(dstbase) 80572b676d7Smrg#endif 80672b676d7Smrg 80772b676d7Smrg /* Clear CommandReg because SetUp can be used for Rect and Trap */ 80872b676d7Smrg pSiS->CommandReg &= ~(T_XISMAJORL | T_XISMAJORR | 80972b676d7Smrg T_L_X_INC | T_L_Y_INC | 81072b676d7Smrg T_R_X_INC | T_R_Y_INC | 81172b676d7Smrg BITBLT); 81272b676d7Smrg 81372b676d7Smrg if(dxL < 0) { dxL = -dxL; } 81472b676d7Smrg else { SiSSetupCMDFlag(T_L_X_INC) } 81572b676d7Smrg if(dxR < 0) { dxR = -dxR; } 81672b676d7Smrg else { SiSSetupCMDFlag(T_R_X_INC) } 81772b676d7Smrg 81872b676d7Smrg if(dyL < 0) { dyL = -dyL; } 81972b676d7Smrg else { SiSSetupCMDFlag(T_L_Y_INC) } 82072b676d7Smrg if(dyR < 0) { dyR = -dyR; } 82172b676d7Smrg else { SiSSetupCMDFlag(T_R_Y_INC) } 82272b676d7Smrg 82372b676d7Smrg /* Determine major axis */ 82472b676d7Smrg if(dxL >= dyL) { SiSSetupCMDFlag(T_XISMAJORL) } 82572b676d7Smrg if(dxR >= dyR) { SiSSetupCMDFlag(T_XISMAJORR) } 82672b676d7Smrg 82772b676d7Smrg SiSSetupCMDFlag(TRAPAZOID_FILL); 82872b676d7Smrg 82972b676d7Smrg#ifdef SISVRAMQ 83072b676d7Smrg SiSSetupYHLR(y, h, left, right) 83172b676d7Smrg SiSSetupdLdR(dxL, dyL, dxR, dyR) 83272b676d7Smrg SiSSetupELER(eL, eR) 83372b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 83472b676d7Smrg#else 83572b676d7Smrg SiSSetupYH(y, h) 83672b676d7Smrg SiSSetupLR(left, right) 83772b676d7Smrg SiSSetupdL(dxL, dyL) 83872b676d7Smrg SiSSetupdR(dxR, dyR) 83972b676d7Smrg SiSSetupEL(eL) 84072b676d7Smrg SiSSetupER(eR) 84172b676d7Smrg SiSDoCMD 84272b676d7Smrg#endif 84372b676d7Smrg} 84472b676d7Smrg#endif 84572b676d7Smrg 84672b676d7Smrg/* Color 8x8 pattern */ 84772b676d7Smrg 84872b676d7Smrg#ifdef SISVRAMQ 84972b676d7Smrgstatic void 85072b676d7SmrgSiSSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patternx, int patterny, 85172b676d7Smrg int rop, unsigned int planemask, int trans_col) 85272b676d7Smrg{ 85372b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 85472b676d7Smrg int j = pScrn->bitsPerPixel >> 3; 85572b676d7Smrg CARD32 *patadr = (CARD32 *)(pSiS->FbBase + (patterny * pSiS->scrnOffset) + 85672b676d7Smrg (patternx * j)); 85772b676d7Smrg 85872b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 85972b676d7Smrg SiSCheckQueue(16 * 3); 86072b676d7Smrg 86172b676d7Smrg SiSSetupDSTRectBurstHeader(pSiS->scrnOffset, DEV_HEIGHT, PATTERN_REG, (pScrn->bitsPerPixel << 1)) 86272b676d7Smrg 86372b676d7Smrg while(j--) { 86472b676d7Smrg SiSSetupPatternRegBurst(patadr[0], patadr[1], patadr[2], patadr[3]); 86572b676d7Smrg SiSSetupPatternRegBurst(patadr[4], patadr[5], patadr[6], patadr[7]); 86672b676d7Smrg SiSSetupPatternRegBurst(patadr[8], patadr[9], patadr[10], patadr[11]); 86772b676d7Smrg SiSSetupPatternRegBurst(patadr[12], patadr[13], patadr[14], patadr[15]); 86872b676d7Smrg patadr += 16; /* = 64 due to (CARD32 *) */ 86972b676d7Smrg } 87072b676d7Smrg 87172b676d7Smrg SiSSetupROP(SiSGetPatternROP(rop)) 87272b676d7Smrg 87372b676d7Smrg SiSSetupCMDFlag(PATPATREG) 87472b676d7Smrg 87572b676d7Smrg SiSSyncWP 87672b676d7Smrg} 87772b676d7Smrg 87872b676d7Smrgstatic void 87972b676d7SmrgSiSSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patternx, 88072b676d7Smrg int patterny, int x, int y, int w, int h) 88172b676d7Smrg{ 88272b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 88372b676d7Smrg CARD32 dstbase = 0; 88472b676d7Smrg 88572b676d7Smrg if(y >= 2048) { 88672b676d7Smrg dstbase = pSiS->scrnOffset * y; 88772b676d7Smrg y = 0; 88872b676d7Smrg } 88972b676d7Smrg 89072b676d7Smrg dstbase += FBOFFSET; 89172b676d7Smrg 89272b676d7Smrg /* SiSSetupCMDFlag(BITBLT) - BITBLT = 0 */ 89372b676d7Smrg 89472b676d7Smrg SiSCheckQueue(16 * 2) 89572b676d7Smrg SiSSetupDSTXYRect(x, y, w, h) 89672b676d7Smrg SiSSetupDSTBaseDoCMD(dstbase) 89772b676d7Smrg} 89872b676d7Smrg#endif 89972b676d7Smrg 90072b676d7Smrg/* ---- CPUToScreen Color Expand --- */ 90172b676d7Smrg 90272b676d7Smrg#ifdef CTSCE 90372b676d7Smrg 90472b676d7Smrg#ifdef CTSCE_DIRECT 90572b676d7Smrg 90672b676d7Smrg/* Direct method */ 90772b676d7Smrg 90872b676d7Smrg/* This is somewhat a fake. We let XAA copy its data not to an 90972b676d7Smrg * aperture, but to video RAM, and then do a ScreenToScreen 91072b676d7Smrg * color expansion. 91172b676d7Smrg * Since the data is sent AFTER the call to Subsequent, we 91272b676d7Smrg * don't execute the command here, but set a flag and do 91372b676d7Smrg * that in the (subsequent) call to Sync() 91472b676d7Smrg */ 91572b676d7Smrg 91672b676d7Smrgstatic void 91772b676d7SmrgSiSSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 91872b676d7Smrg int fg, int bg, int rop, unsigned int planemask) 91972b676d7Smrg{ 92072b676d7Smrg SISPtr pSiS=SISPTR(pScrn); 92172b676d7Smrg 92272b676d7Smrg#ifdef SISVRAMQ 92372b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 92472b676d7Smrg SiSSetupROP(SiSGetCopyROP(rop)); 92572b676d7Smrg SiSSetupSRCFGDSTRect(fg, pSiS->scrnOffset, DEV_HEIGHT) 92672b676d7Smrg if(bg == -1) { 92772b676d7Smrg SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO); 92872b676d7Smrg } else { 92972b676d7Smrg SiSSetupSRCBG(bg); 93072b676d7Smrg SiSSetupCMDFlag(ENCOLOREXP | SRCVIDEO); 93172b676d7Smrg } 93272b676d7Smrg SiSSyncWP 93372b676d7Smrg#else 93472b676d7Smrg SiSSetupSRCXY(0,0); 93572b676d7Smrg SiSSetupROP(SiSGetCopyROP(rop)); 93672b676d7Smrg SiSSetupSRCFG(fg); 93772b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT); 93872b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 93972b676d7Smrg if(bg == -1) { 94072b676d7Smrg SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO 94172b676d7Smrg | pSiS->SiS310_AccelDepth); 94272b676d7Smrg } else { 94372b676d7Smrg SiSSetupSRCBG(bg); 94472b676d7Smrg SiSSetupCMDFlag(ENCOLOREXP | SRCVIDEO | pSiS->SiS310_AccelDepth); 94572b676d7Smrg } 94672b676d7Smrg#endif 94772b676d7Smrg} 94872b676d7Smrg 94972b676d7Smrgstatic void 95072b676d7SmrgSiSSubsequentCPUToScreenColorExpandFill( 95172b676d7Smrg ScrnInfoPtr pScrn, int x, int y, int w, 95272b676d7Smrg int h, int skipleft) 95372b676d7Smrg{ 95472b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 95572b676d7Smrg int _x0, _y0, _x1, _y1; 95672b676d7Smrg CARD32 srcbase, dstbase; 95772b676d7Smrg 95872b676d7Smrg srcbase = pSiS->ColorExpandBase; 95972b676d7Smrg 96072b676d7Smrg dstbase = 0; 96172b676d7Smrg if(y >= 2048) { 96272b676d7Smrg dstbase = pSiS->scrnOffset*y; 96372b676d7Smrg y = 0; 96472b676d7Smrg } 96572b676d7Smrg 96672b676d7Smrg srcbase += FBOFFSET; 96772b676d7Smrg dstbase += FBOFFSET; 96872b676d7Smrg 96972b676d7Smrg#ifdef SISVRAMQ 97072b676d7Smrg SiSSetupSRCDSTBase(srcbase,dstbase); 97172b676d7Smrg#else 97272b676d7Smrg SiSSetupSRCBase(srcbase); 97372b676d7Smrg SiSSetupDSTBase(dstbase) 97472b676d7Smrg#endif 97572b676d7Smrg 97672b676d7Smrg if(skipleft > 0) { 97772b676d7Smrg _x0 = x + skipleft; 97872b676d7Smrg _y0 = y; 97972b676d7Smrg _x1 = x + w; 98072b676d7Smrg _y1 = y + h; 98172b676d7Smrg#ifdef SISVRAMQ 98272b676d7Smrg SiSSetupClip(_x0, _y0, _x1, _y1); 98372b676d7Smrg#else 98472b676d7Smrg SiSSetupClipLT(_x0, _y0); 98572b676d7Smrg SiSSetupClipRB(_x1, _y1); 98672b676d7Smrg#endif 98772b676d7Smrg SiSSetupCMDFlag(CLIPENABLE); 98872b676d7Smrg } else { 98972b676d7Smrg pSiS->CommandReg &= (~CLIPENABLE); 99072b676d7Smrg } 99172b676d7Smrg 99272b676d7Smrg#ifdef SISVRAMQ 99372b676d7Smrg SiSSetupRectSRCPitch(w, h, ((((w + 7) >> 3) + 3) >> 2) << 2); 99472b676d7Smrg SiSSetupSRCDSTXY(0, 0, x, y); 99572b676d7Smrg#else 99672b676d7Smrg SiSSetupRect(w, h); 99772b676d7Smrg SiSSetupSRCPitch(((((w+7)/8)+3) >> 2) * 4); 99872b676d7Smrg SiSSetupDSTXY(x, y); 99972b676d7Smrg#endif 100072b676d7Smrg 100172b676d7Smrg if(pSiS->ColorExpandBusy) { 100272b676d7Smrg pSiS->ColorExpandBusy = FALSE; 100372b676d7Smrg SiSIdle 100472b676d7Smrg } 100572b676d7Smrg 100672b676d7Smrg pSiS->DoColorExpand = TRUE; 100772b676d7Smrg} 100872b676d7Smrg 100972b676d7Smrg#else 101072b676d7Smrg 101172b676d7Smrg/* Indirect method */ 101272b676d7Smrg 101372b676d7Smrg/* This is SLOW, slower than the CPU on most chipsets */ 101472b676d7Smrg/* Does not work in VRAM queue mode. */ 101572b676d7Smrg 101672b676d7Smrgstatic void 101772b676d7SmrgSiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, 101872b676d7Smrg int fg, int bg, int rop, unsigned int planemask) 101972b676d7Smrg{ 102072b676d7Smrg SISPtr pSiS=SISPTR(pScrn); 102172b676d7Smrg 102272b676d7Smrg#ifdef SISVRAMQ 102372b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 102472b676d7Smrg#endif 102572b676d7Smrg 102672b676d7Smrg /* !!! DOES NOT WORK IN VRAM QUEUE MODE !!! */ 102772b676d7Smrg 102872b676d7Smrg /* (hence this is not optimized for VRAM mode) */ 102972b676d7Smrg#ifndef SISVRAMQ 103072b676d7Smrg SiSIdle 103172b676d7Smrg#endif 103272b676d7Smrg SiSSetupSRCXY(0,0); 103372b676d7Smrg 103472b676d7Smrg SiSSetupROP(SiSGetCopyROP(rop)); 103572b676d7Smrg SiSSetupSRCFG(fg); 103672b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT); 103772b676d7Smrg#ifndef SISVRAMQ 103872b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 103972b676d7Smrg#endif 104072b676d7Smrg if(bg == -1) { 104172b676d7Smrg#ifdef SISVRAMQ 104272b676d7Smrg SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO); 104372b676d7Smrg#else 104472b676d7Smrg SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCCPUBLITBUF 104572b676d7Smrg | pSiS->SiS310_AccelDepth); 104672b676d7Smrg#endif 104772b676d7Smrg } else { 104872b676d7Smrg SiSSetupSRCBG(bg); 104972b676d7Smrg#ifdef SISVRAMQ 105072b676d7Smrg SiSSetupCMDFlag(ENCOLOREXP | SRCCPUBLITBUF); 105172b676d7Smrg#else 105272b676d7Smrg SiSSetupCMDFlag(ENCOLOREXP | SRCCPUBLITBUF | pSiS->SiS310_AccelDepth); 105372b676d7Smrg#endif 105472b676d7Smrg }; 105572b676d7Smrg 105672b676d7Smrg} 105772b676d7Smrg 105872b676d7Smrgstatic void 105972b676d7SmrgSiSSubsequentScanlineCPUToScreenColorExpandFill( 106072b676d7Smrg ScrnInfoPtr pScrn, int x, int y, int w, 106172b676d7Smrg int h, int skipleft) 106272b676d7Smrg{ 106372b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 106472b676d7Smrg int _x0, _y0, _x1, _y1; 106572b676d7Smrg CARD32 dstbase = 0; 106672b676d7Smrg 106772b676d7Smrg if(y >= 2048) { 106872b676d7Smrg dstbase = pSiS->scrnOffset*y; 106972b676d7Smrg y = 0; 107072b676d7Smrg } 107172b676d7Smrg 107272b676d7Smrg dstbase += FBOFFSET; 107372b676d7Smrg 107472b676d7Smrg#ifndef SISVRAMQ 107572b676d7Smrg if((SIS_MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) { 107672b676d7Smrg SiSIdle; 107772b676d7Smrg } 107872b676d7Smrg#endif 107972b676d7Smrg 108072b676d7Smrg SiSSetupDSTBase(dstbase) 108172b676d7Smrg 108272b676d7Smrg if(skipleft > 0) { 108372b676d7Smrg _x0 = x+skipleft; 108472b676d7Smrg _y0 = y; 108572b676d7Smrg _x1 = x+w; 108672b676d7Smrg _y1 = y+h; 108772b676d7Smrg#ifdef SISVRAMQ 108872b676d7Smrg SiSSetupClip(_x0, _y0, _x1, _y1); 108972b676d7Smrg#else 109072b676d7Smrg SiSSetupClipLT(_x0, _y0); 109172b676d7Smrg SiSSetupClipRB(_x1, _y1); 109272b676d7Smrg#endif 109372b676d7Smrg SiSSetupCMDFlag(CLIPENABLE); 109472b676d7Smrg } else { 109572b676d7Smrg pSiS->CommandReg &= (~CLIPENABLE); 109672b676d7Smrg } 109772b676d7Smrg SiSSetupRect(w, 1); 109872b676d7Smrg SiSSetupSRCPitch(((((w+7)/8)+3) >> 2) * 4); 109972b676d7Smrg pSiS->ycurrent = y; 110072b676d7Smrg pSiS->xcurrent = x; 110172b676d7Smrg 110272b676d7Smrg} 110372b676d7Smrg 110472b676d7Smrgstatic void 110572b676d7SmrgSiSSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) 110672b676d7Smrg{ 110772b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 110872b676d7Smrg CARD32 cbo; 110972b676d7Smrg 111072b676d7Smrg cbo = pSiS->ColorExpandBufferScreenOffset[bufno]; 111172b676d7Smrg cbo += FBOFFSET; 111272b676d7Smrg 111372b676d7Smrg#ifndef SISVRAMQ 111472b676d7Smrg if((SIS_MMIO_IN16(pSiS->IOBase, Q_STATUS+2) & 0x8000) != 0x8000) { 111572b676d7Smrg SiSIdle; 111672b676d7Smrg } 111772b676d7Smrg#endif 111872b676d7Smrg 111972b676d7Smrg SiSSetupSRCBase(cbo); 112072b676d7Smrg 112172b676d7Smrg SiSSetupDSTXY(pSiS->xcurrent, pSiS->ycurrent); 112272b676d7Smrg 112372b676d7Smrg SiSDoCMD 112472b676d7Smrg 112572b676d7Smrg pSiS->ycurrent++; 112672b676d7Smrg#ifndef SISVRAMQ 112772b676d7Smrg SiSIdle 112872b676d7Smrg#endif 112972b676d7Smrg} 113072b676d7Smrg#endif 113172b676d7Smrg#endif 113272b676d7Smrg 113372b676d7Smrg/* --- Screen To Screen Color Expand --- */ 113472b676d7Smrg 113572b676d7Smrg/* This method blits in a single task; this does not work because 113672b676d7Smrg * the hardware does not use the source pitch as scanline offset 113772b676d7Smrg * but to calculate pattern address from source X and Y and to 113872b676d7Smrg * limit the drawing width (similar to width set by SetupRect). 113972b676d7Smrg * XAA provides the pattern bitmap with scrnOffset (displayWidth * bpp/8) 114072b676d7Smrg * offset, but this is not supported by the hardware. 114172b676d7Smrg * DOES NOT WORK ON 330 SERIES, HANGS ENGINE. 114272b676d7Smrg */ 114372b676d7Smrg 114472b676d7Smrg#ifdef STSCE 114572b676d7Smrgstatic void 114672b676d7SmrgSiSSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn, 114772b676d7Smrg int fg, int bg, 114872b676d7Smrg int rop, unsigned int planemask) 114972b676d7Smrg{ 115072b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 115172b676d7Smrg 115272b676d7Smrg#ifdef SISVRAMQ 115372b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 115472b676d7Smrg#else 115572b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor) 115672b676d7Smrg#endif 115772b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 115872b676d7Smrg SiSSetupROP(SiSGetCopyROP(rop)) 115972b676d7Smrg SiSSetupSRCFG(fg) 116072b676d7Smrg /* SiSSetupSRCXY(0,0) */ 116172b676d7Smrg 116272b676d7Smrg if(bg == -1) { 116372b676d7Smrg SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO); 116472b676d7Smrg } else { 116572b676d7Smrg SiSSetupSRCBG(bg); 116672b676d7Smrg SiSSetupCMDFlag(ENCOLOREXP | SRCVIDEO); 116772b676d7Smrg }; 116872b676d7Smrg 116972b676d7Smrg#ifdef SISVRAMQ 117072b676d7Smrg SiSSyncWP 117172b676d7Smrg#endif 117272b676d7Smrg} 117372b676d7Smrg 117472b676d7Smrg/* For testing, these are the methods: (use only one at a time!) */ 117572b676d7Smrg 117672b676d7Smrg#undef npitch /* Normal: Use srcx/y as srcx/y, use scrnOffset as source pitch 117772b676d7Smrg * Does not work on 315 series, because the hardware does not 117872b676d7Smrg * regard the src x and y. Apart from this problem: 117972b676d7Smrg * This would work if the hareware used the source pitch for 118072b676d7Smrg * incrementing the source address after each scanline - but 118172b676d7Smrg * it doesn't do this! The first line of the area is correctly 118272b676d7Smrg * color expanded, but since the source pitch is ignored and 118372b676d7Smrg * the source address not incremented correctly, the following 118472b676d7Smrg * lines are color expanded with any bit pattern that is left 118572b676d7Smrg * in the unused space of the source bitmap (which is organized 118672b676d7Smrg * with the depth of the screen framebuffer hence with a pitch 118772b676d7Smrg * of scrnOffset). 118872b676d7Smrg */ 118972b676d7Smrg 119072b676d7Smrg#undef pitchdw /* Use source pitch "displayWidth / 8" instead 119172b676d7Smrg * of scrnOffset (=displayWidth * bpp / 8) 119272b676d7Smrg * This can't work, because the pitch of the source 119372b676d7Smrg * bitmap is scrnoffset! 119472b676d7Smrg */ 119572b676d7Smrg 119672b676d7Smrg#define nopitch /* Calculate srcbase with srcx and srcy, set the 119772b676d7Smrg * pitch to scrnOffset (which IS the correct pitch 119872b676d7Smrg * for the source bitmap) and set srcx and srcy both 119972b676d7Smrg * to 0. 120072b676d7Smrg * This would work if the hareware used the source pitch for 120172b676d7Smrg * incrementing the source address after each scanline - but 120272b676d7Smrg * it doesn't do this! Again: The first line of the area is 120372b676d7Smrg * correctly color expanded, but since the source pitch is 120472b676d7Smrg * ignored for scanline address incremention, the following 120572b676d7Smrg * lines are not correctly color expanded. 120672b676d7Smrg * This is the only way it works (apart from the problem 120772b676d7Smrg * described above). The hardware does not regard the src 120872b676d7Smrg * x and y values in any way. 120972b676d7Smrg */ 121072b676d7Smrg 121172b676d7Smrgstatic void 121272b676d7SmrgSiSSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn, 121372b676d7Smrg int x, int y, int w, int h, 121472b676d7Smrg int srcx, int srcy, int skipleft) 121572b676d7Smrg{ 121672b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 121772b676d7Smrg CARD32 srcbase, dstbase; 121872b676d7Smrg#if 0 121972b676d7Smrg int _x0, _y0, _x1, _y1; 122072b676d7Smrg#endif 122172b676d7Smrg#ifdef pitchdw 122272b676d7Smrg int newsrcx, newsrcy; 122372b676d7Smrg 122472b676d7Smrg /* srcx and srcy are provided based on a scrnOffset pitch ( = displayWidth * bpp / 8 ) 122572b676d7Smrg * We recalulate srcx and srcy based on pitch = displayWidth / 8 122672b676d7Smrg */ 122772b676d7Smrg newsrcy = ((pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8))) / 122872b676d7Smrg (pScrn->displayWidth/8); 122972b676d7Smrg newsrcx = ((pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8))) % 123072b676d7Smrg (pScrn->displayWidth/8); 123172b676d7Smrg#endif 123272b676d7Smrg xf86DrvMsg(0, X_INFO, "Sub ScreenToScreen ColorExp(%d,%d, %d,%d, %d,%d, %d)\n", 123372b676d7Smrg x, y, w, h, srcx, srcy, skipleft); 123472b676d7Smrg 123572b676d7Smrg srcbase = dstbase = 0; 123672b676d7Smrg 123772b676d7Smrg#ifdef pitchdw 123872b676d7Smrg if(newsrcy >= 2048) { 123972b676d7Smrg srcbase = (pScrn->displayWidth / 8) * newsrcy; 124072b676d7Smrg newsrcy = 0; 124172b676d7Smrg } 124272b676d7Smrg#endif 124372b676d7Smrg#ifdef nopitch 124472b676d7Smrg srcbase = (pSiS->scrnOffset * srcy) + (srcx * ((pScrn->bitsPerPixel+7)/8)); 124572b676d7Smrg#endif 124672b676d7Smrg#ifdef npitch 124772b676d7Smrg if(srcy >= 2048) { 124872b676d7Smrg srcbase = pSiS->scrnOffset * srcy; 124972b676d7Smrg srcy = 0; 125072b676d7Smrg } 125172b676d7Smrg#endif 125272b676d7Smrg if(y >= 2048) { 125372b676d7Smrg dstbase = pSiS->scrnOffset * y; 125472b676d7Smrg y = 0; 125572b676d7Smrg } 125672b676d7Smrg 125772b676d7Smrg srcbase += FBOFFSET; 125872b676d7Smrg dstbase += FBOFFSET; 125972b676d7Smrg 126072b676d7Smrg SiSSetupSRCBase(srcbase) 126172b676d7Smrg SiSSetupDSTBase(dstbase) 126272b676d7Smrg 126372b676d7Smrg /* 315 series seem to treat the src pitch as 126472b676d7Smrg * a "drawing limit", but still (as 300 series) 126572b676d7Smrg * does not use it for incrementing the 126672b676d7Smrg * address pointer for the next scanline. ARGH! 126772b676d7Smrg */ 126872b676d7Smrg 126972b676d7Smrg#ifdef pitchdw 127072b676d7Smrg SiSSetupSRCPitch(pScrn->displayWidth/8) 127172b676d7Smrg#endif 127272b676d7Smrg#ifdef nopitch 127372b676d7Smrg SiSSetupSRCPitch(pScrn->displayWidth/8) 127472b676d7Smrg /* SiSSetupSRCPitch(1024/8) */ /* For test */ 127572b676d7Smrg#endif 127672b676d7Smrg#ifdef npitch 127772b676d7Smrg SiSSetupSRCPitch(pScrn->displayWidth/8) 127872b676d7Smrg /* SiSSetupSRCPitch(pSiS->scrnOffset) */ 127972b676d7Smrg#endif 128072b676d7Smrg 128172b676d7Smrg SiSSetupRect(w,h) 128272b676d7Smrg 128372b676d7Smrg#if 0 /* How do I implement the offset? Not this way, that's for sure.. */ 128472b676d7Smrg if (skipleft > 0) { 128572b676d7Smrg _x0 = x+skipleft; 128672b676d7Smrg _y0 = y; 128772b676d7Smrg _x1 = x+w; 128872b676d7Smrg _y1 = y+h; 128972b676d7Smrg SiSSetupClipLT(_x0, _y0); 129072b676d7Smrg SiSSetupClipRB(_x1, _y1); 129172b676d7Smrg SiSSetupCMDFlag(CLIPENABLE); 129272b676d7Smrg } 129372b676d7Smrg#endif 129472b676d7Smrg#ifdef pitchdw 129572b676d7Smrg SiSSetupSRCXY(newsrcx, newsrcy) 129672b676d7Smrg#endif 129772b676d7Smrg#ifdef nopitch 129872b676d7Smrg SiSSetupSRCXY(0,0) 129972b676d7Smrg#endif 130072b676d7Smrg#ifdef npitch 130172b676d7Smrg SiSSetupSRCXY(srcx, srcy) 130272b676d7Smrg#endif 130372b676d7Smrg 130472b676d7Smrg SiSSetupDSTXY(x,y) 130572b676d7Smrg 130672b676d7Smrg SiSDoCMD 130772b676d7Smrg#ifdef SISVRAMQ 130872b676d7Smrg /* We MUST sync here, there must not be 2 or more color expansion commands in the queue */ 130972b676d7Smrg SiSIdle 131072b676d7Smrg#endif 131172b676d7Smrg} 131272b676d7Smrg#endif 131372b676d7Smrg 131472b676d7Smrg#ifdef SISDUALHEAD 131572b676d7Smrgstatic void 131672b676d7SmrgSiSRestoreAccelState(ScrnInfoPtr pScrn) 131772b676d7Smrg{ 131872b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 131972b676d7Smrg 132072b676d7Smrg pSiS->ColorExpandBusy = FALSE; 132172b676d7Smrg pSiS->alphaBlitBusy = FALSE; 132272b676d7Smrg SiSIdle 132372b676d7Smrg} 132472b676d7Smrg#endif 132572b676d7Smrg 132672b676d7Smrg/* ---- RENDER ---- */ 132772b676d7Smrg 132872b676d7Smrg#ifdef INCL_RENDER 132972b676d7Smrg#ifdef RENDER 133072b676d7Smrgstatic void 133172b676d7SmrgSiSRenderCallback(ScrnInfoPtr pScrn) 133272b676d7Smrg{ 133372b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 133472b676d7Smrg 133572b676d7Smrg if((currentTime.milliseconds > pSiS->RenderTime) && pSiS->AccelLinearScratch) { 133672b676d7Smrg xf86FreeOffscreenLinear(pSiS->AccelLinearScratch); 133772b676d7Smrg pSiS->AccelLinearScratch = NULL; 133872b676d7Smrg } 133972b676d7Smrg 134072b676d7Smrg if(!pSiS->AccelLinearScratch) { 134172b676d7Smrg pSiS->RenderCallback = NULL; 134272b676d7Smrg } 134372b676d7Smrg} 134472b676d7Smrg 134572b676d7Smrg#define RENDER_DELAY 15000 134672b676d7Smrg 134772b676d7Smrgstatic Bool 134872b676d7SmrgSiSAllocateLinear(ScrnInfoPtr pScrn, int sizeNeeded) 134972b676d7Smrg{ 135072b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 135172b676d7Smrg 135272b676d7Smrg pSiS->RenderTime = currentTime.milliseconds + RENDER_DELAY; 135372b676d7Smrg pSiS->RenderCallback = SiSRenderCallback; 135472b676d7Smrg 135572b676d7Smrg if(pSiS->AccelLinearScratch) { 135672b676d7Smrg if(pSiS->AccelLinearScratch->size >= sizeNeeded) { 135772b676d7Smrg return TRUE; 135872b676d7Smrg } else { 135972b676d7Smrg if(pSiS->alphaBlitBusy) { 136072b676d7Smrg pSiS->alphaBlitBusy = FALSE; 136172b676d7Smrg SiSIdle 136272b676d7Smrg } 136372b676d7Smrg if(xf86ResizeOffscreenLinear(pSiS->AccelLinearScratch, sizeNeeded)) { 136472b676d7Smrg return TRUE; 136572b676d7Smrg } 136672b676d7Smrg xf86FreeOffscreenLinear(pSiS->AccelLinearScratch); 136772b676d7Smrg pSiS->AccelLinearScratch = NULL; 136872b676d7Smrg } 136972b676d7Smrg } 137072b676d7Smrg 137172b676d7Smrg pSiS->AccelLinearScratch = xf86AllocateOffscreenLinear( 137272b676d7Smrg pScrn->pScreen, sizeNeeded, 32, 137372b676d7Smrg NULL, NULL, NULL); 137472b676d7Smrg 137572b676d7Smrg return(pSiS->AccelLinearScratch != NULL); 137672b676d7Smrg} 137772b676d7Smrg 137872b676d7Smrgstatic Bool 137972b676d7SmrgSiSSetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn, 138072b676d7Smrg int op, CARD16 red, CARD16 green, 138172b676d7Smrg CARD16 blue, CARD16 alpha, 138272b676d7Smrg#ifdef SISNEWRENDER 138372b676d7Smrg CARD32 alphaType, CARD32 dstType, 138472b676d7Smrg#else 138572b676d7Smrg int alphaType, 138672b676d7Smrg#endif 138772b676d7Smrg CARD8 *alphaPtr, 138872b676d7Smrg int alphaPitch, int width, 138972b676d7Smrg int height, int flags) 139072b676d7Smrg{ 139172b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 139272b676d7Smrg unsigned char *renderaccelarray; 139372b676d7Smrg CARD32 *dstPtr; 139472b676d7Smrg int x, pitch, sizeNeeded; 139572b676d7Smrg int sbpp = pSiS->CurrentLayout.bitsPerPixel >> 3; 139672b676d7Smrg int sbppshift = sbpp >> 1; /* 8->0, 16->1, 32->2 */ 139772b676d7Smrg CARD8 myalpha; 139872b676d7Smrg Bool docopy = TRUE; 139972b676d7Smrg 140072b676d7Smrg#ifdef ACCELDEBUG 140172b676d7Smrg xf86DrvMsg(0, X_INFO, "AT(1): op %d t %x ARGB %x %x %x %x, w %d h %d pch %d\n", 140272b676d7Smrg op, alphaType, /*dstType, */alpha, red, green, blue, width, height, alphaPitch); 140372b676d7Smrg#endif 140472b676d7Smrg 140572b676d7Smrg if((width > 2048) || (height > 2048)) return FALSE; 140672b676d7Smrg 140772b676d7Smrg#ifdef SISVRAMQ 140872b676d7Smrg if(op > SiSRenderOpsMAX) return FALSE; 140972b676d7Smrg if(!SiSRenderOps[op]) return FALSE; 141072b676d7Smrg#else 141172b676d7Smrg if(op != PictOpOver) return FALSE; 141272b676d7Smrg#endif 141372b676d7Smrg 141472b676d7Smrg if(!((renderaccelarray = pSiS->RenderAccelArray))) 141572b676d7Smrg return FALSE; 141672b676d7Smrg 141772b676d7Smrg#ifdef ACCELDEBUG 141872b676d7Smrg xf86DrvMsg(0, X_INFO, "AT(2): op %d t %x ARGB %x %x %x %x, w %d h %d pch %d\n", 141972b676d7Smrg op, alphaType, alpha, red, green, blue, width, height, alphaPitch); 142072b676d7Smrg#endif 142172b676d7Smrg 142272b676d7Smrg pitch = (width + 31) & ~31; 142372b676d7Smrg sizeNeeded = (pitch << 2) * height; /* Source a8 (=8bit), expand to A8R8G8B8 (=32bit) */ 142472b676d7Smrg 142572b676d7Smrg if(!SiSAllocateLinear(pScrn, (sizeNeeded + sbpp - 1) >> sbppshift)) 142672b676d7Smrg return FALSE; 142772b676d7Smrg 142872b676d7Smrg red &= 0xff00; 142972b676d7Smrg green &= 0xff00; 143072b676d7Smrg blue &= 0xff00; 143172b676d7Smrg 143272b676d7Smrg#ifdef SISVRAMQ 143372b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 143472b676d7Smrg switch(op) { 143572b676d7Smrg case PictOpClear: 143672b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,0,0,0) 143772b676d7Smrg case PictOpDisjointClear: 143872b676d7Smrg case PictOpConjointClear: 143972b676d7Smrg#endif 144072b676d7Smrg SiSSetupPATFGDSTRect(0, pSiS->scrnOffset, DEV_HEIGHT) 144172b676d7Smrg /* SiSSetupROP(0x00) - is already 0 */ 144272b676d7Smrg SiSSetupCMDFlag(PATFG) 144372b676d7Smrg docopy = FALSE; 144472b676d7Smrg break; 144572b676d7Smrg case PictOpSrc: 144672b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,0,0,0) 144772b676d7Smrg case PictOpDisjointSrc: 144872b676d7Smrg case PictOpConjointSrc: 144972b676d7Smrg#endif 145072b676d7Smrg SiSSetupSRCPitchDSTRect((pitch << 2), pSiS->scrnOffset, DEV_HEIGHT); 145172b676d7Smrg SiSSetupAlpha(0xff) 145272b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_NODESTALPHA) 145372b676d7Smrg break; 145472b676d7Smrg case PictOpDst: 145572b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,0,0,0) 145672b676d7Smrg case PictOpDisjointDst: 145772b676d7Smrg case PictOpConjointDst: 145872b676d7Smrg#endif 145972b676d7Smrg SiSSetupSRCPitchDSTRect((pitch << 2), pSiS->scrnOffset, DEV_HEIGHT); 146072b676d7Smrg SiSSetupAlpha(0x00) 146172b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_CONSTANTALPHA) 146272b676d7Smrg docopy = FALSE; 146372b676d7Smrg break; 146472b676d7Smrg case PictOpOver: 146572b676d7Smrg SiSSetupSRCPitchDSTRect((pitch << 2), pSiS->scrnOffset, DEV_HEIGHT); 146672b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA) 146772b676d7Smrg break; 146872b676d7Smrg } 146972b676d7Smrg SiSSyncWP 147072b676d7Smrg#else 147172b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 147272b676d7Smrg SiSSetupSRCPitch((pitch << 2)); 147372b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 147472b676d7Smrg SiSSetupROP(0) 147572b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA | pSiS->SiS310_AccelDepth) 147672b676d7Smrg#endif 147772b676d7Smrg 147872b676d7Smrg /* Don't need source for clear and dest */ 147972b676d7Smrg if(!docopy) return TRUE; 148072b676d7Smrg 148172b676d7Smrg dstPtr = (CARD32*)(pSiS->FbBase + (pSiS->AccelLinearScratch->offset << sbppshift)); 148272b676d7Smrg 148372b676d7Smrg if(pSiS->alphaBlitBusy) { 148472b676d7Smrg pSiS->alphaBlitBusy = FALSE; 148572b676d7Smrg SiSIdle 148672b676d7Smrg } 148772b676d7Smrg 148872b676d7Smrg if(alpha == 0xffff) { 148972b676d7Smrg 149072b676d7Smrg while(height--) { 149172b676d7Smrg for(x = 0; x < width; x++) { 149272b676d7Smrg myalpha = alphaPtr[x]; 149372b676d7Smrg dstPtr[x] = (renderaccelarray[red + myalpha] << 16) | 149472b676d7Smrg (renderaccelarray[green + myalpha] << 8) | 149572b676d7Smrg renderaccelarray[blue + myalpha] | 149672b676d7Smrg myalpha << 24; 149772b676d7Smrg } 149872b676d7Smrg dstPtr += pitch; 149972b676d7Smrg alphaPtr += alphaPitch; 150072b676d7Smrg } 150172b676d7Smrg 150272b676d7Smrg } else { 150372b676d7Smrg 150472b676d7Smrg alpha &= 0xff00; 150572b676d7Smrg 150672b676d7Smrg while(height--) { 150772b676d7Smrg for(x = 0; x < width; x++) { 150872b676d7Smrg myalpha = alphaPtr[x]; 150972b676d7Smrg dstPtr[x] = (renderaccelarray[alpha + myalpha] << 24) | 151072b676d7Smrg (renderaccelarray[red + myalpha] << 16) | 151172b676d7Smrg (renderaccelarray[green + myalpha] << 8) | 151272b676d7Smrg renderaccelarray[blue + myalpha]; 151372b676d7Smrg } 151472b676d7Smrg dstPtr += pitch; 151572b676d7Smrg alphaPtr += alphaPitch; 151672b676d7Smrg } 151772b676d7Smrg 151872b676d7Smrg } 151972b676d7Smrg 152072b676d7Smrg return TRUE; 152172b676d7Smrg} 152272b676d7Smrg 152372b676d7Smrgstatic Bool 152472b676d7SmrgSiSSetupForCPUToScreenTexture(ScrnInfoPtr pScrn, 152572b676d7Smrg int op, 152672b676d7Smrg#ifdef SISNEWRENDER 152772b676d7Smrg CARD32 texType, CARD32 dstType, 152872b676d7Smrg#else 152972b676d7Smrg int texType, 153072b676d7Smrg#endif 153172b676d7Smrg CARD8 *texPtr, 153272b676d7Smrg int texPitch, int width, 153372b676d7Smrg int height, int flags) 153472b676d7Smrg{ 153572b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 153672b676d7Smrg CARD8 *dst; 153772b676d7Smrg int pitch, sizeNeeded; 153872b676d7Smrg int sbpp = pSiS->CurrentLayout.bitsPerPixel >> 3; 153972b676d7Smrg int sbppshift = sbpp >> 1; /* 8->0, 16->1, 32->2 */ 154072b676d7Smrg int bppshift = PICT_FORMAT_BPP(texType) >> 4; /* 8->0, 16->1, 32->2 */ 154172b676d7Smrg Bool docopy = TRUE; 154272b676d7Smrg 154372b676d7Smrg#ifdef ACCELDEBUG 154472b676d7Smrg xf86DrvMsg(0, X_INFO, "T: type %x op %d w %d h %d T-pitch %d\n", 154572b676d7Smrg texType, op, width, height, texPitch); 154672b676d7Smrg#endif 154772b676d7Smrg 154872b676d7Smrg#ifdef SISVRAMQ 154972b676d7Smrg if(op > SiSRenderOpsMAX) return FALSE; 155072b676d7Smrg if(!SiSRenderOps[op]) return FALSE; 155172b676d7Smrg#else 155272b676d7Smrg if(op != PictOpOver) return FALSE; 155372b676d7Smrg#endif 155472b676d7Smrg 155572b676d7Smrg if((width > 2048) || (height > 2048)) return FALSE; 155672b676d7Smrg 155772b676d7Smrg pitch = (width + 31) & ~31; 155872b676d7Smrg sizeNeeded = (pitch << bppshift) * height; 155972b676d7Smrg 156072b676d7Smrg#ifdef ACCELDEBUG 156172b676d7Smrg xf86DrvMsg(0, X_INFO, "T: %x op %x w %d h %d T-pitch %d size %d (%d %d %d)\n", 156272b676d7Smrg texType, op, width, height, texPitch, sizeNeeded, sbpp, sbppshift, bppshift); 156372b676d7Smrg#endif 156472b676d7Smrg 156572b676d7Smrg if(!SiSAllocateLinear(pScrn, (sizeNeeded + sbpp - 1) >> sbppshift)) 156672b676d7Smrg return FALSE; 156772b676d7Smrg 156872b676d7Smrg width <<= bppshift; /* -> bytes (for engine and memcpy) */ 156972b676d7Smrg pitch <<= bppshift; /* -> bytes */ 157072b676d7Smrg 157172b676d7Smrg#ifdef SISVRAMQ 157272b676d7Smrg SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth); 157372b676d7Smrg switch(op) { 157472b676d7Smrg case PictOpClear: 157572b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,0,0,0) 157672b676d7Smrg case PictOpDisjointClear: 157772b676d7Smrg case PictOpConjointClear: 157872b676d7Smrg#endif 157972b676d7Smrg SiSSetupPATFGDSTRect(0, pSiS->scrnOffset, DEV_HEIGHT) 158072b676d7Smrg /* SiSSetupROP(0x00) - is already zero */ 158172b676d7Smrg SiSSetupCMDFlag(PATFG) 158272b676d7Smrg docopy = FALSE; 158372b676d7Smrg break; 158472b676d7Smrg case PictOpSrc: 158572b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,0,0,0) 158672b676d7Smrg case PictOpDisjointSrc: 158772b676d7Smrg case PictOpConjointSrc: 158872b676d7Smrg#endif 158972b676d7Smrg SiSSetupSRCPitchDSTRect(pitch, pSiS->scrnOffset, DEV_HEIGHT); 159072b676d7Smrg SiSSetupAlpha(0xff) 159172b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_NODESTALPHA) 159272b676d7Smrg break; 159372b676d7Smrg case PictOpDst: 159472b676d7Smrg#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,0,0,0) 159572b676d7Smrg case PictOpDisjointDst: 159672b676d7Smrg case PictOpConjointDst: 159772b676d7Smrg#endif 159872b676d7Smrg SiSSetupSRCPitchDSTRect(pitch, pSiS->scrnOffset, DEV_HEIGHT); 159972b676d7Smrg SiSSetupAlpha(0x00) 160072b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_CONSTANTALPHA) 160172b676d7Smrg docopy = FALSE; 160272b676d7Smrg break; 160372b676d7Smrg case PictOpOver: 160472b676d7Smrg SiSSetupSRCPitchDSTRect(pitch, pSiS->scrnOffset, DEV_HEIGHT); 160572b676d7Smrg SiSSetupAlpha(0x00) 160672b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA) 160772b676d7Smrg break; 160872b676d7Smrg default: 160972b676d7Smrg return FALSE; 161072b676d7Smrg } 161172b676d7Smrg SiSSyncWP 161272b676d7Smrg#else 161372b676d7Smrg SiSSetupDSTColorDepth(pSiS->DstColor); 161472b676d7Smrg SiSSetupSRCPitch(pitch); 161572b676d7Smrg SiSSetupDSTRect(pSiS->scrnOffset, DEV_HEIGHT) 161672b676d7Smrg SiSSetupAlpha(0x00) 161772b676d7Smrg SiSSetupCMDFlag(ALPHA_BLEND | SRCVIDEO | A_PERPIXELALPHA | pSiS->SiS310_AccelDepth) 161872b676d7Smrg#endif 161972b676d7Smrg 162072b676d7Smrg /* Don't need source for clear and dest */ 162172b676d7Smrg if(!docopy) return TRUE; 162272b676d7Smrg 162372b676d7Smrg dst = (CARD8*)(pSiS->FbBase + (pSiS->AccelLinearScratch->offset << sbppshift)); 162472b676d7Smrg 162572b676d7Smrg if(pSiS->alphaBlitBusy) { 162672b676d7Smrg pSiS->alphaBlitBusy = FALSE; 162772b676d7Smrg SiSIdle 162872b676d7Smrg } 162972b676d7Smrg 163072b676d7Smrg while(height--) { 163172b676d7Smrg memcpy(dst, texPtr, width); 163272b676d7Smrg texPtr += texPitch; 163372b676d7Smrg dst += pitch; 163472b676d7Smrg } 163572b676d7Smrg 163672b676d7Smrg return TRUE; 163772b676d7Smrg} 163872b676d7Smrg 163972b676d7Smrgstatic void 164072b676d7SmrgSiSSubsequentCPUToScreenTexture(ScrnInfoPtr pScrn, 164172b676d7Smrg int dst_x, int dst_y, 164272b676d7Smrg int src_x, int src_y, 164372b676d7Smrg int width, int height) 164472b676d7Smrg{ 164572b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 164672b676d7Smrg CARD32 srcbase, dstbase; 164772b676d7Smrg 164872b676d7Smrg srcbase = pSiS->AccelLinearScratch->offset << 1; 164972b676d7Smrg if(pScrn->bitsPerPixel == 32) srcbase <<= 1; 165072b676d7Smrg 165172b676d7Smrg#ifdef ACCELDEBUG 165272b676d7Smrg xf86DrvMsg(0, X_INFO, "FIRE: scrbase %x dx %d dy %d w %d h %d\n", 165372b676d7Smrg srcbase, dst_x, dst_y, width, height); 165472b676d7Smrg#endif 165572b676d7Smrg 165672b676d7Smrg dstbase = 0; 165772b676d7Smrg if((dst_y >= pScrn->virtualY) || (dst_y >= 2048)) { 165872b676d7Smrg dstbase = pSiS->scrnOffset * dst_y; 165972b676d7Smrg dst_y = 0; 166072b676d7Smrg } 166172b676d7Smrg 166272b676d7Smrg srcbase += FBOFFSET; 166372b676d7Smrg dstbase += FBOFFSET; 166472b676d7Smrg 166572b676d7Smrg#ifdef SISVRAMQ 166672b676d7Smrg SiSCheckQueue(16 * 3) 166772b676d7Smrg SiSSetupSRCDSTBase(srcbase,dstbase); 166872b676d7Smrg SiSSetupSRCDSTXY(src_x, src_y, dst_x, dst_y) 166972b676d7Smrg SiSSetRectDoCMD(width,height) 167072b676d7Smrg#else 167172b676d7Smrg SiSSetupSRCBase(srcbase); 167272b676d7Smrg SiSSetupDSTBase(dstbase); 167372b676d7Smrg SiSSetupRect(width, height) 167472b676d7Smrg SiSSetupSRCXY(src_x, src_y) 167572b676d7Smrg SiSSetupDSTXY(dst_x, dst_y) 167672b676d7Smrg SiSDoCMD 167772b676d7Smrg#endif 167872b676d7Smrg pSiS->alphaBlitBusy = TRUE; 167972b676d7Smrg} 168072b676d7Smrg#endif 168172b676d7Smrg#endif 168272b676d7Smrg 168372b676d7Smrg#endif /* XAA */ 168472b676d7Smrg 168572b676d7Smrg#ifdef SIS_USE_EXA /* ---------------------------- EXA -------------------------- */ 168672b676d7Smrg 168772b676d7Smrgstatic void 168872b676d7SmrgSiSEXASync(ScreenPtr pScreen, int marker) 168972b676d7Smrg{ 169074c14cd6Smrg SISPtr pSiS = SISPTR(xf86ScreenToScrn(pScreen)); 169172b676d7Smrg 169272b676d7Smrg SiSIdle 169372b676d7Smrg} 169472b676d7Smrg 169572b676d7Smrgstatic Bool 169672b676d7SmrgSiSPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg) 169772b676d7Smrg{ 169874c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); 169972b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 170072b676d7Smrg 170172b676d7Smrg /* Planemask not supported */ 170272b676d7Smrg if((planemask & ((1 << pPixmap->drawable.depth) - 1)) != 170372b676d7Smrg (1 << pPixmap->drawable.depth) - 1) { 170472b676d7Smrg return FALSE; 170572b676d7Smrg } 170672b676d7Smrg 170772b676d7Smrg if((pPixmap->drawable.bitsPerPixel != 8) && 170872b676d7Smrg (pPixmap->drawable.bitsPerPixel != 16) && 170972b676d7Smrg (pPixmap->drawable.bitsPerPixel != 32)) 171072b676d7Smrg return FALSE; 171172b676d7Smrg 171272b676d7Smrg if(pSiS->disablecolorkeycurrent) { 171372b676d7Smrg if((CARD32)fg == pSiS->colorKey) { 171472b676d7Smrg alu = 5; /* NOOP */ 171572b676d7Smrg } 171672b676d7Smrg } 171772b676d7Smrg 171872b676d7Smrg /* Check that the pitch matches the hardware's requirements. Should 171972b676d7Smrg * never be a problem due to pixmapPitchAlign and fbScreenInit. 172072b676d7Smrg */ 172172b676d7Smrg if(exaGetPixmapPitch(pPixmap) & 3) 172272b676d7Smrg return FALSE; 172372b676d7Smrg 172472b676d7Smrg SiSSetupDSTColorDepth((pPixmap->drawable.bitsPerPixel >> 4) << 16); 172572b676d7Smrg SiSCheckQueue(16 * 1); 172672b676d7Smrg SiSSetupPATFGDSTRect(fg, exaGetPixmapPitch(pPixmap), DEV_HEIGHT) 172772b676d7Smrg SiSSetupROP(SiSGetPatternROP(alu)) 172872b676d7Smrg SiSSetupCMDFlag(PATFG) 172972b676d7Smrg SiSSyncWP 173072b676d7Smrg 173172b676d7Smrg pSiS->fillDstBase = (CARD32)exaGetPixmapOffset(pPixmap) + FBOFFSET; 173272b676d7Smrg 173372b676d7Smrg return TRUE; 173472b676d7Smrg} 173572b676d7Smrg 173672b676d7Smrgstatic void 173772b676d7SmrgSiSSolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2) 173872b676d7Smrg{ 173974c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); 174072b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 174172b676d7Smrg 174272b676d7Smrg /* SiSSetupCMDFlag(BITBLT) - BITBLT = 0 */ 174372b676d7Smrg 174472b676d7Smrg SiSCheckQueue(16 * 2) 174572b676d7Smrg SiSSetupDSTXYRect(x1, y1, x2-x1, y2-y1) 174672b676d7Smrg SiSSetupDSTBaseDoCMD(pSiS->fillDstBase) 174772b676d7Smrg} 174872b676d7Smrg 174972b676d7Smrgstatic void 175072b676d7SmrgSiSDoneSolid(PixmapPtr pPixmap) 175172b676d7Smrg{ 175272b676d7Smrg} 175372b676d7Smrg 175472b676d7Smrgstatic Bool 175572b676d7SmrgSiSPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, int ydir, 175672b676d7Smrg int alu, Pixel planemask) 175772b676d7Smrg{ 175874c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); 175972b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 176072b676d7Smrg CARD32 srcbase, dstbase; 176172b676d7Smrg 176272b676d7Smrg /* Planemask not supported */ 176372b676d7Smrg if((planemask & ((1 << pSrcPixmap->drawable.depth) - 1)) != 176472b676d7Smrg (1 << pSrcPixmap->drawable.depth) - 1) { 176572b676d7Smrg return FALSE; 176672b676d7Smrg } 176772b676d7Smrg 176872b676d7Smrg if((pDstPixmap->drawable.bitsPerPixel != 8) && 176972b676d7Smrg (pDstPixmap->drawable.bitsPerPixel != 16) && 177072b676d7Smrg (pDstPixmap->drawable.bitsPerPixel != 32)) 177172b676d7Smrg return FALSE; 177272b676d7Smrg 177372b676d7Smrg /* Check that the pitch matches the hardware's requirements. Should 177472b676d7Smrg * never be a problem due to pixmapPitchAlign and fbScreenInit. 177572b676d7Smrg */ 177672b676d7Smrg if(exaGetPixmapPitch(pSrcPixmap) & 3) 177772b676d7Smrg return FALSE; 177872b676d7Smrg if(exaGetPixmapPitch(pDstPixmap) & 3) 177972b676d7Smrg return FALSE; 178072b676d7Smrg 178172b676d7Smrg srcbase = (CARD32)exaGetPixmapOffset(pSrcPixmap) + FBOFFSET; 178272b676d7Smrg 178372b676d7Smrg dstbase = (CARD32)exaGetPixmapOffset(pDstPixmap) + FBOFFSET; 178472b676d7Smrg 178572b676d7Smrg /* TODO: Will there eventually be overlapping blits? 178672b676d7Smrg * If so, good night. Then we must calculate new base addresses 178772b676d7Smrg * which are identical for source and dest, otherwise 178872b676d7Smrg * the chips direction-logic will fail. Certainly funny 178972b676d7Smrg * to re-calculate x and y then... 179072b676d7Smrg */ 179172b676d7Smrg 179272b676d7Smrg SiSSetupDSTColorDepth((pDstPixmap->drawable.bitsPerPixel >> 4) << 16); 179372b676d7Smrg SiSCheckQueue(16 * 3); 179472b676d7Smrg SiSSetupSRCPitchDSTRect(exaGetPixmapPitch(pSrcPixmap), 179572b676d7Smrg exaGetPixmapPitch(pDstPixmap), DEV_HEIGHT) 179672b676d7Smrg SiSSetupROP(SiSGetCopyROP(alu)) 179772b676d7Smrg SiSSetupSRCDSTBase(srcbase, dstbase) 179872b676d7Smrg SiSSyncWP 179972b676d7Smrg 180072b676d7Smrg return TRUE; 180172b676d7Smrg} 180272b676d7Smrg 180372b676d7Smrgstatic void 180472b676d7SmrgSiSCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, int width, int height) 180572b676d7Smrg{ 180674c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); 180772b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 180872b676d7Smrg 180972b676d7Smrg SiSCheckQueue(16 * 2); 181072b676d7Smrg SiSSetupSRCDSTXY(srcX, srcY, dstX, dstY) 181172b676d7Smrg SiSSetRectDoCMD(width, height) 181272b676d7Smrg} 181372b676d7Smrg 181472b676d7Smrgstatic void 181572b676d7SmrgSiSDoneCopy(PixmapPtr pDstPixmap) 181672b676d7Smrg{ 181772b676d7Smrg} 181872b676d7Smrg 181972b676d7Smrg#ifdef SIS_HAVE_COMPOSITE 182072b676d7Smrgstatic Bool 182172b676d7SmrgSiSCheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, 182272b676d7Smrg PicturePtr pDstPicture) 182372b676d7Smrg{ 182474c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPicture->pDrawable->pScreen); 182572b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 182672b676d7Smrg 182772b676d7Smrg xf86DrvMsg(0, 0, "CC: %d Src %x (fi %d ca %d) Msk %x (%d %d) Dst %x (%d %d)\n", 182872b676d7Smrg op, pSrcPicture->format, pSrcPicture->filter, pSrcPicture->componentAlpha, 182972b676d7Smrg pMaskPicture ? pMaskPicture->format : 0x2011, pMaskPicture ? pMaskPicture->filter : -1, 183072b676d7Smrg pMaskPicture ? pMaskPicture->componentAlpha : -1, 183172b676d7Smrg pDstPicture->format, pDstPicture->filter, pDstPicture->componentAlpha); 183272b676d7Smrg 183372b676d7Smrg if(pSrcPicture->transform || (pMaskPicture && pMaskPicture->transform) || pDstPicture->transform) { 183472b676d7Smrg xf86DrvMsg(0, 0, "CC: src tr %p msk %p dst %p !!!!!!!!!!!!!!!\n", 183572b676d7Smrg pSrcPicture->transform, 183672b676d7Smrg pMaskPicture ? pMaskPicture->transform : 0, 183772b676d7Smrg pDstPicture->transform); 183872b676d7Smrg } 183972b676d7Smrg 184072b676d7Smrg return FALSE; 184172b676d7Smrg} 184272b676d7Smrg 184372b676d7Smrgstatic Bool 184472b676d7SmrgSiSPrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, 184572b676d7Smrg PicturePtr pDstPicture, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) 184672b676d7Smrg{ 184772b676d7Smrg#if 0 184874c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); 184972b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 185072b676d7Smrg#endif 185172b676d7Smrg return FALSE; 185272b676d7Smrg} 185372b676d7Smrg 185472b676d7Smrgstatic void 185572b676d7SmrgSiSComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, 185672b676d7Smrg int width, int height) 185772b676d7Smrg{ 185872b676d7Smrg#if 0 185974c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); 186072b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 186172b676d7Smrg#endif 186272b676d7Smrg} 186372b676d7Smrg 186472b676d7Smrgstatic void 186572b676d7SmrgSiSDoneComposite(PixmapPtr pDst) 186672b676d7Smrg{ 186772b676d7Smrg} 186872b676d7Smrg#endif 186972b676d7Smrg 187072b676d7SmrgBool 187172b676d7SmrgSiSUploadToScratch(PixmapPtr pSrc, PixmapPtr pDst) 187272b676d7Smrg{ 187374c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pSrc->drawable.pScreen); 187472b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 187572b676d7Smrg unsigned char *src, *dst; 187672b676d7Smrg int src_pitch = exaGetPixmapPitch(pSrc); 187774fcc364Smrg int dst_pitch, size, w, h; 187872b676d7Smrg 187972b676d7Smrg w = pSrc->drawable.width; 188072b676d7Smrg 188172b676d7Smrg dst_pitch = ((w * (pSrc->drawable.bitsPerPixel >> 3)) + 188272b676d7Smrg pSiS->EXADriverPtr->pixmapPitchAlign - 1) & 188372b676d7Smrg ~(pSiS->EXADriverPtr->pixmapPitchAlign - 1); 188472b676d7Smrg 188572b676d7Smrg size = dst_pitch * pSrc->drawable.height; 188672b676d7Smrg 188772b676d7Smrg if(size > pSiS->exa_scratch->size) 188872b676d7Smrg return FALSE; 188972b676d7Smrg 189072b676d7Smrg pSiS->exa_scratch_next = (pSiS->exa_scratch_next + 189172b676d7Smrg pSiS->EXADriverPtr->pixmapOffsetAlign - 1) & 189272b676d7Smrg ~(pSiS->EXADriverPtr->pixmapOffsetAlign - 1); 189372b676d7Smrg 189472b676d7Smrg if(pSiS->exa_scratch_next + size > 189572b676d7Smrg pSiS->exa_scratch->offset + pSiS->exa_scratch->size) { 189672b676d7Smrg (pSiS->EXADriverPtr->WaitMarker)(pSrc->drawable.pScreen, 0); 189772b676d7Smrg pSiS->exa_scratch_next = pSiS->exa_scratch->offset; 189872b676d7Smrg } 189972b676d7Smrg 190072b676d7Smrg memcpy(pDst, pSrc, sizeof(*pDst)); 190172b676d7Smrg pDst->devKind = dst_pitch; 190272b676d7Smrg pDst->devPrivate.ptr = pSiS->EXADriverPtr->memoryBase + pSiS->exa_scratch_next; 190372b676d7Smrg 190472b676d7Smrg pSiS->exa_scratch_next += size; 190572b676d7Smrg 190672b676d7Smrg src = pSrc->devPrivate.ptr; 190772b676d7Smrg src_pitch = exaGetPixmapPitch(pSrc); 190872b676d7Smrg dst = pDst->devPrivate.ptr; 190972b676d7Smrg 191072b676d7Smrg h = pSrc->drawable.height; 191172b676d7Smrg 191272b676d7Smrg (pSiS->SyncAccel)(pScrn); 191372b676d7Smrg 191472b676d7Smrg while(h--) { 191572b676d7Smrg SiSMemCopyToVideoRam(pSiS, dst, src, size); 191672b676d7Smrg src += src_pitch; 191772b676d7Smrg dst += dst_pitch; 191872b676d7Smrg } 191972b676d7Smrg 192072b676d7Smrg return TRUE; 192172b676d7Smrg} 192272b676d7Smrg#endif /* EXA */ 192372b676d7Smrg 192472b676d7Smrg/* Helper for xv video blitter */ 192572b676d7Smrg 192672b676d7Smrg#ifdef INCL_YUV_BLIT_ADAPTOR 192772b676d7Smrgvoid 192872b676d7SmrgSISWriteBlitPacket(SISPtr pSiS, CARD32 *packet) 192972b676d7Smrg{ 193072b676d7Smrg CARD32 dummybuf; 193172b676d7Smrg 193272b676d7Smrg SiSWritePacketPart(packet[0], packet[1], packet[2], packet[3]); 193372b676d7Smrg SiSWritePacketPart(packet[4], packet[5], packet[6], packet[7]); 193472b676d7Smrg SiSWritePacketPart(packet[8], packet[9], packet[10], packet[11]); 193572b676d7Smrg SiSWritePacketPart(packet[12], packet[13], packet[14], packet[15]); 193672b676d7Smrg SiSWritePacketPart(packet[16], packet[17], packet[18], packet[19]); 193772b676d7Smrg SiSSyncWP; 193872b676d7Smrg (void)dummybuf; /* Suppress compiler warning */ 193972b676d7Smrg} 194072b676d7Smrg#endif 194172b676d7Smrg 194272b676d7Smrg/* For DGA usage */ 194372b676d7Smrg 194472b676d7Smrgstatic void 194572b676d7SmrgSiSDGAFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h, int color) 194672b676d7Smrg{ 194772b676d7Smrg SiSSetupForSolidFill(pScrn, color, GXcopy, ~0); 194872b676d7Smrg SiSSubsequentSolidFillRect(pScrn, x, y, w, h); 194972b676d7Smrg} 195072b676d7Smrg 195172b676d7Smrgstatic void 195272b676d7SmrgSiSDGABlitRect(ScrnInfoPtr pScrn, int srcx, int srcy, int dstx, int dsty, int w, int h, int color) 195372b676d7Smrg{ 195472b676d7Smrg /* Don't need xdir, ydir */ 195572b676d7Smrg SiSSetupForScreenToScreenCopy(pScrn, 0, 0, GXcopy, (CARD32)~0, color); 195672b676d7Smrg SiSSubsequentScreenToScreenCopy(pScrn, srcx, srcy, dstx, dsty, w, h); 195772b676d7Smrg} 195872b676d7Smrg 195972b676d7Smrg/* Initialisation */ 196072b676d7Smrg 196172b676d7SmrgBool 196272b676d7SmrgSiS315AccelInit(ScreenPtr pScreen) 196372b676d7Smrg{ 196474c14cd6Smrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 196572b676d7Smrg SISPtr pSiS = SISPTR(pScrn); 196672b676d7Smrg#ifdef SIS_USE_XAA 196772b676d7Smrg XAAInfoRecPtr infoPtr = NULL; 196872b676d7Smrg int topFB, reservedFbSize, usableFbSize; 196972b676d7Smrg BoxRec Avail; 197072b676d7Smrg#ifdef CTSCE 197172b676d7Smrg unsigned char *AvailBufBase; 197272b676d7Smrg#ifndef CTSCE_DIRECT 197372b676d7Smrg int i; 197472b676d7Smrg#endif 197572b676d7Smrg#endif 197672b676d7Smrg#endif /* XAA */ 197772b676d7Smrg 197872b676d7Smrg pSiS->ColorExpandBufferNumber = 0; 197972b676d7Smrg pSiS->PerColorExpandBufferSize = 0; 198072b676d7Smrg pSiS->RenderAccelArray = NULL; 198172b676d7Smrg#ifdef SIS_USE_XAA 198272b676d7Smrg pSiS->AccelInfoPtr = NULL; 198372b676d7Smrg#endif 198472b676d7Smrg#ifdef SIS_USE_EXA 198572b676d7Smrg pSiS->EXADriverPtr = NULL; 198672b676d7Smrg pSiS->exa_scratch = NULL; 198772b676d7Smrg#endif 198872b676d7Smrg 198972b676d7Smrg if((pScrn->bitsPerPixel != 8) && 199072b676d7Smrg (pScrn->bitsPerPixel != 16) && 199172b676d7Smrg (pScrn->bitsPerPixel != 32)) { 199272b676d7Smrg pSiS->NoAccel = TRUE; 199372b676d7Smrg } 199472b676d7Smrg 199572b676d7Smrg if(!pSiS->NoAccel) { 199672b676d7Smrg#ifdef SIS_USE_XAA 199772b676d7Smrg if(!pSiS->useEXA) { 199872b676d7Smrg pSiS->AccelInfoPtr = infoPtr = XAACreateInfoRec(); 199972b676d7Smrg if(!infoPtr) pSiS->NoAccel = TRUE; 200072b676d7Smrg } 200172b676d7Smrg#endif 200272b676d7Smrg#ifdef SIS_USE_EXA 200372b676d7Smrg if(pSiS->useEXA) { 200472b676d7Smrg if(!(pSiS->EXADriverPtr = exaDriverAlloc())) { 200572b676d7Smrg pSiS->NoAccel = TRUE; 200672b676d7Smrg pSiS->NoXvideo = TRUE; /* No fbmem manager -> no xv */ 200772b676d7Smrg } 200872b676d7Smrg } 200972b676d7Smrg#endif 201072b676d7Smrg } 201172b676d7Smrg 201272b676d7Smrg if(!pSiS->NoAccel) { 201372b676d7Smrg 201472b676d7Smrg SiSInitializeAccelerator(pScrn); 201572b676d7Smrg 201672b676d7Smrg pSiS->InitAccel = SiSInitializeAccelerator; 201772b676d7Smrg pSiS->SyncAccel = SiSSyncAccel; 201872b676d7Smrg pSiS->FillRect = SiSDGAFillRect; 201972b676d7Smrg pSiS->BlitRect = SiSDGABlitRect; 202072b676d7Smrg 202172b676d7Smrg#ifdef SIS_USE_XAA /* ----------------------- XAA ----------------------- */ 202272b676d7Smrg if(!pSiS->useEXA) { 202372b676d7Smrg 202472b676d7Smrg infoPtr->Flags = LINEAR_FRAMEBUFFER | 202572b676d7Smrg OFFSCREEN_PIXMAPS | 202672b676d7Smrg PIXMAP_CACHE; 202772b676d7Smrg 202872b676d7Smrg /* sync */ 202972b676d7Smrg infoPtr->Sync = SiSSync; 203072b676d7Smrg 203172b676d7Smrg /* BitBlt */ 203272b676d7Smrg infoPtr->SetupForScreenToScreenCopy = SiSSetupForScreenToScreenCopy; 203372b676d7Smrg infoPtr->SubsequentScreenToScreenCopy = SiSSubsequentScreenToScreenCopy; 203472b676d7Smrg infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK | TRANSPARENCY_GXCOPY_ONLY; 203572b676d7Smrg 203672b676d7Smrg /* solid fills */ 203772b676d7Smrg infoPtr->SetupForSolidFill = SiSSetupForSolidFill; 203872b676d7Smrg infoPtr->SubsequentSolidFillRect = SiSSubsequentSolidFillRect; 203972b676d7Smrg#ifdef TRAP 204072b676d7Smrg if((pSiS->Chipset != PCI_CHIP_SIS660) && 204172b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS330) && 204272b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS340) && 204372b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG20) && 204472b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG40)) { 204572b676d7Smrg infoPtr->SubsequentSolidFillTrap = SiSSubsequentSolidFillTrap; 204672b676d7Smrg } 204772b676d7Smrg#endif 204872b676d7Smrg infoPtr->SolidFillFlags = NO_PLANEMASK; 204972b676d7Smrg 205072b676d7Smrg /* solid line */ 205172b676d7Smrg infoPtr->SetupForSolidLine = SiSSetupForSolidLine; 205272b676d7Smrg infoPtr->SubsequentSolidTwoPointLine = SiSSubsequentSolidTwoPointLine; 205372b676d7Smrg infoPtr->SubsequentSolidHorVertLine = SiSSubsequentSolidHorzVertLine; 205472b676d7Smrg infoPtr->SolidLineFlags = NO_PLANEMASK; 205572b676d7Smrg 205672b676d7Smrg /* dashed line */ 205772b676d7Smrg infoPtr->SetupForDashedLine = SiSSetupForDashedLine; 205872b676d7Smrg infoPtr->SubsequentDashedTwoPointLine = SiSSubsequentDashedTwoPointLine; 205972b676d7Smrg infoPtr->DashPatternMaxLength = 64; 206072b676d7Smrg infoPtr->DashedLineFlags = NO_PLANEMASK | 206172b676d7Smrg LINE_PATTERN_MSBFIRST_LSBJUSTIFIED; 206272b676d7Smrg 206372b676d7Smrg /* 8x8 mono pattern fill */ 206472b676d7Smrg infoPtr->SetupForMono8x8PatternFill = SiSSetupForMonoPatternFill; 206572b676d7Smrg infoPtr->SubsequentMono8x8PatternFillRect = SiSSubsequentMonoPatternFill; 206672b676d7Smrg#ifdef TRAP 206772b676d7Smrg if((pSiS->Chipset != PCI_CHIP_SIS660) && 206872b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS330) && 206972b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS340) && 207072b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG20) && 207172b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG40)) { 207272b676d7Smrg infoPtr->SubsequentMono8x8PatternFillTrap = SiSSubsequentMonoPatternFillTrap; 207372b676d7Smrg } 207472b676d7Smrg#endif 207572b676d7Smrg infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | 207672b676d7Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 207772b676d7Smrg HARDWARE_PATTERN_PROGRAMMED_BITS | 207872b676d7Smrg BIT_ORDER_IN_BYTE_MSBFIRST; 207972b676d7Smrg 208072b676d7Smrg#ifdef SISVRAMQ 208172b676d7Smrg /* 8x8 color pattern fill (MMIO support not implemented) */ 208272b676d7Smrg infoPtr->SetupForColor8x8PatternFill = SiSSetupForColor8x8PatternFill; 208372b676d7Smrg infoPtr->SubsequentColor8x8PatternFillRect = SiSSubsequentColor8x8PatternFillRect; 208472b676d7Smrg infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK | 208572b676d7Smrg HARDWARE_PATTERN_SCREEN_ORIGIN | 208672b676d7Smrg NO_TRANSPARENCY; 208772b676d7Smrg#endif 208872b676d7Smrg 208972b676d7Smrg#ifdef STSCE 209072b676d7Smrg /* Screen To Screen Color Expand */ 209172b676d7Smrg /* The hardware does not support this the way we need it, because 209272b676d7Smrg * the mono-bitmap is not provided with a pitch of (width), but 209372b676d7Smrg * with a pitch of scrnOffset (= width * bpp / 8). 209472b676d7Smrg */ 209572b676d7Smrg infoPtr->SetupForScreenToScreenColorExpandFill = 209672b676d7Smrg SiSSetupForScreenToScreenColorExpand; 209772b676d7Smrg infoPtr->SubsequentScreenToScreenColorExpandFill = 209872b676d7Smrg SiSSubsequentScreenToScreenColorExpand; 209972b676d7Smrg infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK | 210072b676d7Smrg BIT_ORDER_IN_BYTE_MSBFIRST ; 210172b676d7Smrg#endif 210272b676d7Smrg 210372b676d7Smrg#ifdef CTSCE 210472b676d7Smrg#ifdef CTSCE_DIRECT 210572b676d7Smrg /* CPU color expansion - direct method 210672b676d7Smrg * 210772b676d7Smrg * We somewhat fake this function here in the following way: 210872b676d7Smrg * XAA copies its mono-bitmap data not into an aperture, but 210972b676d7Smrg * into our video RAM buffer. We then do a ScreenToScreen 211072b676d7Smrg * color expand. 211172b676d7Smrg * Unfortunately, XAA sends the data to the aperture AFTER 211272b676d7Smrg * the call to Subsequent(), therefore we do not execute the 211372b676d7Smrg * command in Subsequent, but in the following call to Sync(). 211472b676d7Smrg * (Hence, the SYNC_AFTER_COLOR_EXPAND flag MUST BE SET) 211572b676d7Smrg * 211672b676d7Smrg * This is slower than doing it by the CPU. 211772b676d7Smrg */ 211872b676d7Smrg 211972b676d7Smrg pSiS->ColorExpandBufferNumber = 48; 212072b676d7Smrg pSiS->PerColorExpandBufferSize = ((pScrn->virtualX + 31)/32) * 4; 212172b676d7Smrg infoPtr->SetupForCPUToScreenColorExpandFill = SiSSetupForCPUToScreenColorExpandFill; 212272b676d7Smrg infoPtr->SubsequentCPUToScreenColorExpandFill = SiSSubsequentCPUToScreenColorExpandFill; 212372b676d7Smrg infoPtr->ColorExpandRange = pSiS->ColorExpandBufferNumber * pSiS->PerColorExpandBufferSize; 212472b676d7Smrg infoPtr->CPUToScreenColorExpandFillFlags = 212572b676d7Smrg NO_PLANEMASK | 212672b676d7Smrg CPU_TRANSFER_PAD_DWORD | 212772b676d7Smrg SCANLINE_PAD_DWORD | 212872b676d7Smrg BIT_ORDER_IN_BYTE_MSBFIRST | 212972b676d7Smrg LEFT_EDGE_CLIPPING | 213072b676d7Smrg SYNC_AFTER_COLOR_EXPAND; 213172b676d7Smrg#else 213272b676d7Smrg /* CPU color expansion - per-scanline / indirect method 213372b676d7Smrg * 213472b676d7Smrg * SLOW! SLOWER! SLOWEST! 213572b676d7Smrg * 213672b676d7Smrg * Does not work on 330 series, hangs the engine (both VRAM and MMIO). 213772b676d7Smrg * Does not work in VRAM queue mode. 213872b676d7Smrg */ 213972b676d7Smrg#ifndef SISVRAMQ 214072b676d7Smrg if((pSiS->Chipset != PCI_CHIP_SIS650) && 214172b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS660) && 214272b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS330) && 214372b676d7Smrg (pSiS->Chipset != PCI_CHIP_SIS340) && 214472b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG20) && 214572b676d7Smrg (pSiS->Chipset != PCI_CHIP_XGIXG40)) { 214672b676d7Smrg pSiS->ColorExpandBufferNumber = 16; 214772b676d7Smrg pSiS->ColorExpandBufferCountMask = 0x0F; 214872b676d7Smrg pSiS->PerColorExpandBufferSize = ((pScrn->virtualX + 31)/32) * 4; 214972b676d7Smrg infoPtr->NumScanlineColorExpandBuffers = pSiS->ColorExpandBufferNumber; 215072b676d7Smrg infoPtr->ScanlineColorExpandBuffers = (unsigned char **)&pSiS->ColorExpandBufferAddr[0]; 215172b676d7Smrg infoPtr->SetupForScanlineCPUToScreenColorExpandFill = SiSSetupForScanlineCPUToScreenColorExpandFill; 215272b676d7Smrg infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = SiSSubsequentScanlineCPUToScreenColorExpandFill; 215372b676d7Smrg infoPtr->SubsequentColorExpandScanline = SiSSubsequentColorExpandScanline; 215472b676d7Smrg infoPtr->ScanlineCPUToScreenColorExpandFillFlags = 215572b676d7Smrg NO_PLANEMASK | 215672b676d7Smrg CPU_TRANSFER_PAD_DWORD | 215772b676d7Smrg SCANLINE_PAD_DWORD | 215872b676d7Smrg BIT_ORDER_IN_BYTE_MSBFIRST | 215972b676d7Smrg LEFT_EDGE_CLIPPING; 216072b676d7Smrg } 216172b676d7Smrg#endif 216272b676d7Smrg#endif 216372b676d7Smrg#endif 216472b676d7Smrg 216572b676d7Smrg#ifdef INCL_RENDER 216672b676d7Smrg#ifdef RENDER 216772b676d7Smrg /* Render */ 216872b676d7Smrg SiSCalcRenderAccelArray(pScrn); 216972b676d7Smrg 217072b676d7Smrg if(pSiS->RenderAccelArray) { 217172b676d7Smrg pSiS->AccelLinearScratch = NULL; 217272b676d7Smrg 217372b676d7Smrg#ifdef SISNEWRENDER 217472b676d7Smrg infoPtr->SetupForCPUToScreenAlphaTexture2 = SiSSetupForCPUToScreenAlphaTexture; 217572b676d7Smrg infoPtr->CPUToScreenAlphaTextureDstFormats = (pScrn->bitsPerPixel == 16) ? 217672b676d7Smrg SiSDstTextureFormats16 : SiSDstTextureFormats32; 217772b676d7Smrg#else 217872b676d7Smrg infoPtr->SetupForCPUToScreenAlphaTexture = SiSSetupForCPUToScreenAlphaTexture; 217972b676d7Smrg#endif 218072b676d7Smrg infoPtr->SubsequentCPUToScreenAlphaTexture = SiSSubsequentCPUToScreenTexture; 218172b676d7Smrg infoPtr->CPUToScreenAlphaTextureFormats = SiSAlphaTextureFormats; 218272b676d7Smrg infoPtr->CPUToScreenAlphaTextureFlags = XAA_RENDER_NO_TILE; 218372b676d7Smrg 218472b676d7Smrg#ifdef SISNEWRENDER 218572b676d7Smrg infoPtr->SetupForCPUToScreenTexture2 = SiSSetupForCPUToScreenTexture; 218672b676d7Smrg infoPtr->CPUToScreenTextureDstFormats = (pScrn->bitsPerPixel == 16) ? 218772b676d7Smrg SiSDstTextureFormats16 : SiSDstTextureFormats32; 218872b676d7Smrg#else 218972b676d7Smrg infoPtr->SetupForCPUToScreenTexture = SiSSetupForCPUToScreenTexture; 219072b676d7Smrg#endif 219172b676d7Smrg infoPtr->SubsequentCPUToScreenTexture = SiSSubsequentCPUToScreenTexture; 219272b676d7Smrg infoPtr->CPUToScreenTextureFormats = SiSTextureFormats; 219372b676d7Smrg infoPtr->CPUToScreenTextureFlags = XAA_RENDER_NO_TILE; 219472b676d7Smrg 219572b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, "RENDER acceleration enabled\n"); 219672b676d7Smrg } 219772b676d7Smrg#endif 219872b676d7Smrg#endif 219972b676d7Smrg 220072b676d7Smrg#ifdef SISDUALHEAD 220172b676d7Smrg if(pSiS->DualHeadMode) { 220272b676d7Smrg infoPtr->RestoreAccelState = SiSRestoreAccelState; 220372b676d7Smrg } 220472b676d7Smrg#endif 220572b676d7Smrg } /* !EXA */ 220672b676d7Smrg#endif /* XAA */ 220772b676d7Smrg 220872b676d7Smrg#ifdef SIS_USE_EXA /* ----------------------- EXA ----------------------- */ 220972b676d7Smrg if(pSiS->useEXA) { 221072b676d7Smrg pSiS->EXADriverPtr->exa_major = 2; 221172b676d7Smrg pSiS->EXADriverPtr->exa_minor = 0; 221272b676d7Smrg 221372b676d7Smrg /* data */ 221472b676d7Smrg pSiS->EXADriverPtr->memoryBase = pSiS->FbBase; 221572b676d7Smrg pSiS->EXADriverPtr->memorySize = pSiS->maxxfbmem; 221672b676d7Smrg pSiS->EXADriverPtr->offScreenBase = pScrn->virtualX * pScrn->virtualY 221772b676d7Smrg * ((pScrn->bitsPerPixel + 7) / 8); 221872b676d7Smrg if(pSiS->EXADriverPtr->memorySize > pSiS->EXADriverPtr->offScreenBase) { 221972b676d7Smrg pSiS->EXADriverPtr->flags = EXA_OFFSCREEN_PIXMAPS; 222072b676d7Smrg } else { 222172b676d7Smrg pSiS->NoXvideo = TRUE; 222272b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 222372b676d7Smrg "Not enough video RAM for offscreen memory manager. Xv disabled\n"); 222472b676d7Smrg } 222572b676d7Smrg pSiS->EXADriverPtr->pixmapOffsetAlign = 16; /* src/dst: double quad word boundary */ 222672b676d7Smrg pSiS->EXADriverPtr->pixmapPitchAlign = 4; /* pitch: double word boundary */ 222772b676d7Smrg pSiS->EXADriverPtr->maxX = 4095; 222872b676d7Smrg pSiS->EXADriverPtr->maxY = 4095; 222972b676d7Smrg 223072b676d7Smrg /* Sync */ 223172b676d7Smrg pSiS->EXADriverPtr->WaitMarker = SiSEXASync; 223272b676d7Smrg 223372b676d7Smrg /* Solid fill */ 223472b676d7Smrg pSiS->EXADriverPtr->PrepareSolid = SiSPrepareSolid; 223572b676d7Smrg pSiS->EXADriverPtr->Solid = SiSSolid; 223672b676d7Smrg pSiS->EXADriverPtr->DoneSolid = SiSDoneSolid; 223772b676d7Smrg 223872b676d7Smrg /* Copy */ 223972b676d7Smrg pSiS->EXADriverPtr->PrepareCopy = SiSPrepareCopy; 224072b676d7Smrg pSiS->EXADriverPtr->Copy = SiSCopy; 224172b676d7Smrg pSiS->EXADriverPtr->DoneCopy = SiSDoneCopy; 224272b676d7Smrg 224372b676d7Smrg /* Composite */ 224472b676d7Smrg#ifdef SIS_HAVE_COMPOSITE 224572b676d7Smrg SiSCalcRenderAccelArray(pScrn); 224672b676d7Smrg if(pSiS->RenderAccelArray) { 224772b676d7Smrg pSiS->EXADriverPtr->CheckComposite = SiSCheckComposite; 224872b676d7Smrg pSiS->EXADriverPtr->PrepareComposite = SiSPrepareComposite; 224972b676d7Smrg pSiS->EXADriverPtr->Composite = SiSComposite; 225072b676d7Smrg pSiS->EXADriverPtr->DoneComposite = SiSDoneComposite; 225172b676d7Smrg } 225272b676d7Smrg#endif 225372b676d7Smrg 225472b676d7Smrg } 225572b676d7Smrg#endif 225672b676d7Smrg 225772b676d7Smrg } /* NoAccel */ 225872b676d7Smrg 225972b676d7Smrg /* Init framebuffer memory manager */ 226072b676d7Smrg 226172b676d7Smrg /* Traditional layout: 226272b676d7Smrg * |-----------------++++++++++++++++++++^************==========~~~~~~~~~~~~| 226372b676d7Smrg * | UsableFbSize ColorExpandBuffers | DRI-Heap HWCursor CommandQueue 226472b676d7Smrg * FbBase topFB 226572b676d7Smrg * +-------------maxxfbmem---------------+ 226672b676d7Smrg * 226772b676d7Smrg * On SiS76x with UMA+LFB: 226872b676d7Smrg * |UUUUUUUUUUUUUUU--------------++++++++++++++++++++^==========~~~~~~~~~~~~| 226972b676d7Smrg * DRI heap |UsableFbSize ColorExpandBuffers | HWCursor CommandQueue 227072b676d7Smrg * (in UMA and FbBase topFB 227172b676d7Smrg * eventually +---------- maxxfbmem ------------+ 227272b676d7Smrg * beginning of 227372b676d7Smrg * LFB) 227472b676d7Smrg */ 227572b676d7Smrg 227672b676d7Smrg#ifdef SIS_USE_XAA 227772b676d7Smrg if(!pSiS->useEXA) { 227872b676d7Smrg 227972b676d7Smrg topFB = pSiS->maxxfbmem; /* relative to FbBase */ 228072b676d7Smrg 228172b676d7Smrg reservedFbSize = pSiS->ColorExpandBufferNumber * pSiS->PerColorExpandBufferSize; 228272b676d7Smrg 228372b676d7Smrg usableFbSize = topFB - reservedFbSize; 228472b676d7Smrg 228572b676d7Smrg#ifdef CTSCE 228672b676d7Smrg AvailBufBase = pSiS->FbBase + usableFbSize; 228772b676d7Smrg if(pSiS->ColorExpandBufferNumber) { 228872b676d7Smrg#ifdef CTSCE_DIRECT 228972b676d7Smrg infoPtr->ColorExpandBase = (unsigned char *)AvailBufBase; 229072b676d7Smrg pSiS->ColorExpandBase = usableFbSize; 229172b676d7Smrg#else 229272b676d7Smrg for(i = 0; i < pSiS->ColorExpandBufferNumber; i++) { 229372b676d7Smrg pSiS->ColorExpandBufferAddr[i] = AvailBufBase + 229472b676d7Smrg i * pSiS->PerColorExpandBufferSize; 229572b676d7Smrg pSiS->ColorExpandBufferScreenOffset[i] = usableFbSize + 229672b676d7Smrg i * pSiS->PerColorExpandBufferSize; 229772b676d7Smrg } 229872b676d7Smrg#endif 229972b676d7Smrg } 230072b676d7Smrg#endif 230172b676d7Smrg 230272b676d7Smrg Avail.x1 = 0; 230372b676d7Smrg Avail.y1 = 0; 230472b676d7Smrg Avail.x2 = pScrn->displayWidth; 230572b676d7Smrg Avail.y2 = (usableFbSize / (pScrn->displayWidth * pScrn->bitsPerPixel/8)) - 1; 230672b676d7Smrg 230772b676d7Smrg if(Avail.y2 < 0) Avail.y2 = 32767; 230872b676d7Smrg 230972b676d7Smrg if(Avail.y2 < pScrn->currentMode->VDisplay) { 231072b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 231172b676d7Smrg "Not enough video RAM for accelerator. At least " 231272b676d7Smrg "%dKB needed, %dKB available\n", 231372b676d7Smrg ((((pScrn->displayWidth * pScrn->bitsPerPixel/8) /* +8 for make it sure */ 231472b676d7Smrg * pScrn->currentMode->VDisplay) + reservedFbSize) / 1024) + 8, 231572b676d7Smrg pSiS->maxxfbmem/1024); 231672b676d7Smrg pSiS->NoAccel = TRUE; 231772b676d7Smrg pSiS->NoXvideo = TRUE; 231872b676d7Smrg XAADestroyInfoRec(pSiS->AccelInfoPtr); 231972b676d7Smrg pSiS->AccelInfoPtr = NULL; 232072b676d7Smrg return FALSE; /* Don't even init fb manager */ 232172b676d7Smrg } 232272b676d7Smrg 232372b676d7Smrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 232472b676d7Smrg "Framebuffer from (%d,%d) to (%d,%d)\n", 232572b676d7Smrg Avail.x1, Avail.y1, Avail.x2 - 1, Avail.y2 - 1); 232672b676d7Smrg 232772b676d7Smrg xf86InitFBManager(pScreen, &Avail); 232872b676d7Smrg 232972b676d7Smrg if(!pSiS->NoAccel) { 233072b676d7Smrg return XAAInit(pScreen, infoPtr); 233172b676d7Smrg } 233272b676d7Smrg } /* !EXA */ 233372b676d7Smrg#endif /* XAA */ 233472b676d7Smrg 233572b676d7Smrg#ifdef SIS_USE_EXA 233672b676d7Smrg if(pSiS->useEXA) { 233772b676d7Smrg 233872b676d7Smrg if(!pSiS->NoAccel) { 233972b676d7Smrg 234072b676d7Smrg if(!exaDriverInit(pScreen, pSiS->EXADriverPtr)) { 234172b676d7Smrg pSiS->NoAccel = TRUE; 234272b676d7Smrg pSiS->NoXvideo = TRUE; /* No fbmem manager -> no xv */ 234372b676d7Smrg return FALSE; 234472b676d7Smrg } 234572b676d7Smrg 234672b676d7Smrg /* Reserve locked offscreen scratch area of 128K for glyph data */ 234772b676d7Smrg pSiS->exa_scratch = exaOffscreenAlloc(pScreen, 128 * 1024, 16, TRUE, 234872b676d7Smrg SiSScratchSave, pSiS); 234972b676d7Smrg if(pSiS->exa_scratch) { 235072b676d7Smrg pSiS->exa_scratch_next = pSiS->exa_scratch->offset; 235172b676d7Smrg pSiS->EXADriverPtr->UploadToScratch = SiSUploadToScratch; 235272b676d7Smrg } 235372b676d7Smrg 235472b676d7Smrg } else { 235572b676d7Smrg 235672b676d7Smrg pSiS->NoXvideo = TRUE; /* No fbmem manager -> no xv */ 235772b676d7Smrg 235872b676d7Smrg } 235972b676d7Smrg 236072b676d7Smrg } 236172b676d7Smrg#endif /* EXA */ 236272b676d7Smrg 236372b676d7Smrg return TRUE; 236472b676d7Smrg} 236572b676d7Smrg 236672b676d7Smrg 236772b676d7Smrg 236872b676d7Smrg 2369