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