diff options
Diffstat (limited to 'hw/kdrive/sis530/sisdraw.c')
-rw-r--r-- | hw/kdrive/sis530/sisdraw.c | 1726 |
1 files changed, 0 insertions, 1726 deletions
diff --git a/hw/kdrive/sis530/sisdraw.c b/hw/kdrive/sis530/sisdraw.c deleted file mode 100644 index 82618acab..000000000 --- a/hw/kdrive/sis530/sisdraw.c +++ /dev/null @@ -1,1726 +0,0 @@ -/* - * Id: sisdraw.c,v 1.1 1999/11/02 08:17:24 keithp Exp $ - * - * Copyright © 1999 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Keith Packard not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ -/* $RCSId: xc/programs/Xserver/hw/kdrive/sis530/sisdraw.c,v 1.5 2000/08/09 17:52:44 keithp Exp $ */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include "sis.h" -#include "sisdraw.h" - -#include "Xmd.h" -#include "gcstruct.h" -#include "scrnintstr.h" -#include "pixmapstr.h" -#include "regionstr.h" -#include "mistruct.h" -#include "fontstruct.h" -#include "dixfontstr.h" -#include "fb.h" -#include "migc.h" -#include "miline.h" - -CARD8 sisPatRop[16] = { - /* GXclear */ 0x00, /* 0 */ - /* GXand */ 0xa0, /* src AND dst */ - /* GXandReverse */ 0x50, /* src AND NOT dst */ - /* GXcopy */ 0xf0, /* src */ - /* GXandInverted*/ 0x0a, /* NOT src AND dst */ - /* GXnoop */ 0xaa, /* dst */ - /* GXxor */ 0x5a, /* src XOR dst */ - /* GXor */ 0xfa, /* src OR dst */ - /* GXnor */ 0x05, /* NOT src AND NOT dst */ - /* GXequiv */ 0xa5, /* NOT src XOR dst */ - /* GXinvert */ 0x55, /* NOT dst */ - /* GXorReverse */ 0xf5, /* src OR NOT dst */ - /* GXcopyInverted*/ 0x0f, /* NOT src */ - /* GXorInverted */ 0xaf, /* NOT src OR dst */ - /* GXnand */ 0x5f, /* NOT src OR NOT dst */ - /* GXset */ 0xff, /* 1 */ -}; - -CARD8 sisBltRop[16] = { - /* GXclear */ 0x00, /* 0 */ - /* GXand */ 0x88, /* src AND dst */ - /* GXandReverse */ 0x44, /* src AND NOT dst */ - /* GXcopy */ 0xcc, /* src */ - /* GXandInverted*/ 0x22, /* NOT src AND dst */ - /* GXnoop */ 0xaa, /* dst */ - /* GXxor */ 0x66, /* src XOR dst */ - /* GXor */ 0xee, /* src OR dst */ - /* GXnor */ 0x11, /* NOT src AND NOT dst */ - /* GXequiv */ 0x99, /* NOT src XOR dst */ - /* GXinvert */ 0x55, /* NOT dst */ - /* GXorReverse */ 0xdd, /* src OR NOT dst */ - /* GXcopyInverted*/ 0x33, /* NOT src */ - /* GXorInverted */ 0xbb, /* NOT src OR dst */ - /* GXnand */ 0x77, /* NOT src OR NOT dst */ - /* GXset */ 0xff, /* 1 */ -}; - -/* Align blts to this boundary or risk trashing an in-progress expand */ -#define SIS_MIN_PATTERN 8 - -/* Do plane bits in this increment to balance CPU and graphics engine */ -#define SIS_PATTERN_INC 1024 - -typedef struct _SisExpand { - SisCardInfo *sisc; - SisScreenInfo *siss; - CARD32 off; - int last; -} SisExpand; - -static void -sisExpandInit (ScreenPtr pScreen, - SisExpand *e) -{ - KdScreenPriv(pScreen); - sisCardInfo(pScreenPriv); - sisScreenInfo(pScreenPriv); - - e->sisc = sisc; - e->siss = siss; - e->off = siss->expand_off; - e->last = 0; -} - -static CARD32 * -sisExpandAlloc (SisExpand *e, - int nb) -{ - SisCardInfo *sisc = e->sisc; - SisScreenInfo *siss = e->siss; - SisPtr sis = sisc->sis; - CARD32 off; - - /* round up to alignment boundary */ - nb = (nb + SIS_MIN_PATTERN-1) & ~(SIS_MIN_PATTERN-1); - - off = e->off + e->last; - if (off + nb > siss->expand_off + siss->expand_len) - { - _sisWaitIdleEmpty (sis); - off = siss->expand_off; - } - e->off = off; - e->last = nb; - return (CARD32 *) (sisc->frameBuffer + off); -} - -void -sisGlyphBltClipped (DrawablePtr pDrawable, - GCPtr pGC, - int x, - int y, - unsigned int nglyph, - CharInfoPtr *ppciInit, - Bool imageBlt) -{ - SetupSis(pDrawable->pScreen); - FbGCPrivPtr fbPriv = fbGetGCPrivate(pGC); - int height; - int width; - int xBack, yBack; - int hBack, wBack; - int nb, bwidth, nl; - FontPtr pfont = pGC->font; - CharInfoPtr pci; - CARD8 *bits8, b; - CARD16 *bits16; - CARD32 *bits32; - BoxPtr extents; - BoxRec bbox; - unsigned char alu; - CARD32 cmd; - SisExpand expand; - CARD32 *dst, d; - int nbytes; - int shift; - int x1, y1, x2, y2; - RegionPtr pClip = fbGetCompositeClip(pGC); - BoxPtr pBox; - int nbox; - int rect_in; - int widthBlt; - CharInfoPtr *ppci; - - x += pDrawable->x; - y += pDrawable->y; - - if (imageBlt) - { - xBack = x; - yBack = y - FONTASCENT(pGC->font); - wBack = 0; - hBack = FONTASCENT(pGC->font) + FONTDESCENT(pGC->font); - if (hBack) - { - height = nglyph; - ppci = ppciInit; - while (height--) - wBack += (*ppci++)->metrics.characterWidth; - } - if (wBack < 0) - { - xBack = xBack + wBack; - wBack = -wBack; - } - if (hBack < 0) - { - yBack = yBack + hBack; - hBack = -hBack; - } - alu = GXcopy; - } - else - { - wBack = 0; - alu = pGC->alu; - } - - if (wBack) - { - _sisSetSolidRect (sis, pGC->bgPixel, GXcopy, cmd); - for (nbox = REGION_NUM_RECTS (pClip), - pBox = REGION_RECTS (pClip); - nbox--; - pBox++) - { - x1 = xBack; - x2 = xBack + wBack; - y1 = yBack; - y2 = yBack + hBack; - if (x1 < pBox->x1) x1 = pBox->x1; - if (x2 > pBox->x2) x2 = pBox->x2; - if (y1 < pBox->y1) y1 = pBox->y1; - if (y2 > pBox->y2) y2 = pBox->y2; - if (x1 < x2 && y1 < y2) - { - _sisRect (sis, x1, y1, x2 - x1, y2 - y1, cmd); - } - } - } - - sisExpandInit (pDrawable->pScreen, &expand); - - sis->u.general.src_fg = pGC->fgPixel; - sis->u.general.src_pitch = 0; - sis->u.general.src_x = 0; - sis->u.general.src_y = 0; - - cmd = (SIS_CMD_ENH_COLOR_EXPAND | - SIS_CMD_SRC_SCREEN | - SIS_CMD_PAT_FG | - (sisBltRop[alu] << 8) | - SIS_CMD_INC_X | - SIS_CMD_INC_Y | - SIS_CMD_RECT_CLIP_ENABLE | - SIS_CMD_TRANSPARENT); - - ppci = ppciInit; - while (nglyph--) - { - pci = *ppci++; - height = pci->metrics.ascent + pci->metrics.descent; - width = pci->metrics.rightSideBearing - pci->metrics.leftSideBearing; - widthBlt = (width + 31) & ~31; - nb = (widthBlt >> 3) * height; - if (nb) - { - x1 = x + pci->metrics.leftSideBearing; - y1 = y - pci->metrics.ascent; - bbox.x1 = x1; - bbox.y1 = y1; - bbox.x2 = x1 + width; - bbox.y2 = y1 + height; - rect_in = RECT_IN_REGION(pGC->pScreen, pClip, &bbox); - if (rect_in != rgnOUT) - { - dst = sisExpandAlloc (&expand, nb); - - sis->u.general.src_base = expand.off; - sis->u.general.dst_x = x1; - sis->u.general.dst_y = y1; - sis->u.general.rect_width = widthBlt; - sis->u.general.rect_height = height; - nb >>= 2; - bits32 = (CARD32 *) pci->bits; - while (nb--) - { - d = *bits32++; - SisInvertBits32 (d); - *dst++ = d; - } - if (rect_in == rgnPART) - { - for (nbox = REGION_NUM_RECTS (pClip), - pBox = REGION_RECTS (pClip); - nbox--; - pBox++) - { - _sisClip (sis, pBox->x1, pBox->y1, pBox->x2, pBox->y2); - sis->u.general.command = cmd; - } - } - else - { - _sisClip (sis, 0, 0, x1+width, pScreenPriv->screen->height); - sis->u.general.command = cmd; - } - } - } - x += pci->metrics.characterWidth; - } - _sisClip (sis, 0, 0, - pScreenPriv->screen->width, pScreenPriv->screen->height); - KdMarkSync (pDrawable->pScreen); -} - -Bool -sisTEGlyphBlt (DrawablePtr pDrawable, - GCPtr pGC, - int xInit, - int yInit, - unsigned int nglyph, - CharInfoPtr *ppci, - Bool imageBlt) -{ - SetupSis(pDrawable->pScreen); - int x, y; - int widthGlyphs, widthGlyph; - int widthBlt; - FbBits depthMask; - int glyphsPer; - FontPtr pfont = pGC->font; - unsigned long *char1, *char2, *char3, *char4, *char5; - CARD8 alu; - CARD32 *dst, tmp; - CARD8 *dst8, *bits8; - int nb; - int bwidth; - CARD32 cmd; - int h; - BoxRec bbox; - SisExpand expand; - int lwTmp, lw; - int extra, n; - - widthGlyph = FONTMAXBOUNDS(pfont,characterWidth); - if (!widthGlyph) - return TRUE; - - h = FONTASCENT(pfont) + FONTDESCENT(pfont); - if (!h) - return TRUE; - - x = xInit + FONTMAXBOUNDS(pfont,leftSideBearing) + pDrawable->x; - y = yInit - FONTASCENT(pfont) + pDrawable->y; - - bbox.x1 = x; - bbox.x2 = x + (widthGlyph * nglyph); - bbox.y1 = y; - bbox.y2 = y + h; - - switch (RECT_IN_REGION(pGC->pScreen, fbGetCompositeClip(pGC), &bbox)) - { - case rgnPART: - if (x < 0 || y < 0) - return FALSE; - sisGlyphBltClipped (pDrawable, pGC, xInit, yInit, nglyph, ppci, imageBlt); - case rgnOUT: - return TRUE; - } - - if (widthGlyph <= 6) - glyphsPer = 5; - else if (widthGlyph <= 8) - glyphsPer = 4; - else if (widthGlyph <= 10) - glyphsPer = 3; - else if (widthGlyph <= 16) - glyphsPer = 2; - else - glyphsPer = 1; - - widthGlyphs = widthGlyph * glyphsPer; - widthBlt = widthGlyphs; - - /* make sure scanlines are 32-bit aligned */ - if (widthGlyphs <= 24) - widthBlt = 25; - - cmd = (SIS_CMD_ENH_COLOR_EXPAND | - SIS_CMD_SRC_SCREEN | - SIS_CMD_PAT_FG | - SIS_CMD_INC_X | - SIS_CMD_INC_Y); - - if (imageBlt) - { - sis->u.general.clip_right = bbox.x2; - cmd |= ((sisBltRop[GXcopy] << 8) | - SIS_CMD_OPAQUE | - SIS_CMD_RECT_CLIP_ENABLE); - } - else - { - cmd |= ((sisBltRop[pGC->alu] << 8) | - SIS_CMD_TRANSPARENT | - SIS_CMD_RECT_CLIP_DISABLE); - } - - sisExpandInit (pDrawable->pScreen, &expand); - - sis->u.general.src_fg = pGC->fgPixel; - sis->u.general.src_bg = pGC->bgPixel; - - bwidth = (widthBlt + 7) >> 3; - - nb = bwidth * h; - -#define LoopIt(count, loadup, fetch) \ - while (nglyph >= count) \ - { \ - nglyph -= count; \ - dst = sisExpandAlloc (&expand, nb); \ - sis->u.general.src_base = expand.off; \ - sis->u.general.src_pitch = 0; \ - sis->u.general.src_x = 0; \ - sis->u.general.src_y = 0; \ - sis->u.general.dst_x = x; \ - sis->u.general.dst_y = y; \ - sis->u.general.rect_width = widthBlt; \ - sis->u.general.rect_height = h; \ - x += widthGlyphs; \ - loadup \ - lwTmp = h; \ - while (lwTmp--) { \ - tmp = fetch; \ - SisInvertBits32(tmp); \ - *dst++ = tmp; \ - } \ - sis->u.general.command = cmd; \ - } - - switch (glyphsPer) { - case 5: - LoopIt(5, - char1 = (unsigned long *) (*ppci++)->bits; - char2 = (unsigned long *) (*ppci++)->bits; - char3 = (unsigned long *) (*ppci++)->bits; - char4 = (unsigned long *) (*ppci++)->bits; - char5 = (unsigned long *) (*ppci++)->bits;, - (*char1++ | ((*char2++ | ((*char3++ | ((*char4++ | (*char5++ - << widthGlyph)) - << widthGlyph)) - << widthGlyph)) - << widthGlyph))); - break; - case 4: - LoopIt(4, - char1 = (unsigned long *) (*ppci++)->bits; - char2 = (unsigned long *) (*ppci++)->bits; - char3 = (unsigned long *) (*ppci++)->bits; - char4 = (unsigned long *) (*ppci++)->bits;, - (*char1++ | ((*char2++ | ((*char3++ | (*char4++ - << widthGlyph)) - << widthGlyph)) - << widthGlyph))); - break; - case 3: - LoopIt(3, - char1 = (unsigned long *) (*ppci++)->bits; - char2 = (unsigned long *) (*ppci++)->bits; - char3 = (unsigned long *) (*ppci++)->bits;, - (*char1++ | ((*char2++ | (*char3++ << widthGlyph)) << widthGlyph))); - break; - case 2: - LoopIt(2, - char1 = (unsigned long *) (*ppci++)->bits; - char2 = (unsigned long *) (*ppci++)->bits;, - (*char1++ | (*char2++ << widthGlyph))); - break; - } - - widthBlt = (widthGlyph + 31) & ~31; - - bwidth = widthBlt >> 3; - - nb = bwidth * h; - - lw = (widthBlt >> 5) * h; - - while (nglyph--) - { - dst = (CARD32 *) sisExpandAlloc (&expand, nb); - char1 = (CARD32 *) (*ppci++)->bits; - sis->u.general.src_base = expand.off; - sis->u.general.src_pitch = 0; - sis->u.general.src_x = 0; - sis->u.general.src_y = 0; - sis->u.general.dst_x = x; - sis->u.general.dst_y = y; - sis->u.general.rect_width = widthBlt; - sis->u.general.rect_height = h; - lwTmp = lw; - while (lwTmp--) - { - tmp = *char1++; - SisInvertBits32 (tmp); - *dst++ = tmp; - } - sis->u.general.command = cmd; - x += widthGlyph; - } - if (imageBlt) - sis->u.general.clip_right = pScreenPriv->screen->width; - KdMarkSync (pDrawable->pScreen); - return TRUE; -} - -Bool -sisGlyphBlt(DrawablePtr pDrawable, - GCPtr pGC, - int x, - int y, - unsigned int nglyph, - CharInfoPtr *ppciInit, - Bool imageBlt) -{ - SetupSis(pDrawable->pScreen); - int height; - int width; - int xBack, yBack; - int hBack, wBack; - int nb, bwidth, nl; - FontPtr pfont = pGC->font; - CharInfoPtr pci; - CARD8 *bits8, b; - CARD16 *bits16; - CARD32 *bits32; - BoxPtr extents; - BoxRec bbox; - CharInfoPtr *ppci; - unsigned char alu; - CARD32 cmd; - SisExpand expand; - CARD32 *dst, d; - int nbytes; - int shift; - - x += pDrawable->x; - y += pDrawable->y; - - /* compute an approximate (but covering) bounding box */ - ppci = ppciInit; - width = 0; - height = nglyph; - while (height--) - width += (*ppci++)->metrics.characterWidth; - if (width < 0) - { - bbox.x1 = x + width; - bbox.x2 = x; - } - else - { - bbox.x1 = x; - bbox.x2 = x + width; - } - width = FONTMINBOUNDS(pfont,leftSideBearing); - if (width < 0) - bbox.x1 += width; - width = FONTMAXBOUNDS(pfont, rightSideBearing) - FONTMINBOUNDS(pfont, characterWidth); - if (width > 0) - bbox.x2 += width; - bbox.y1 = y - FONTMAXBOUNDS(pfont,ascent); - bbox.y2 = y + FONTMAXBOUNDS(pfont,descent); - - switch (RECT_IN_REGION(pGC->pScreen, fbGetCompositeClip(pGC), &bbox)) - { - case rgnPART: - if (bbox.x1 < 0 || bbox.y1 < 0) - return FALSE; - sisGlyphBltClipped (pDrawable, pGC, - x - pDrawable->x, y - pDrawable->y, - nglyph, ppciInit, imageBlt); - case rgnOUT: - return TRUE; - } - - if (imageBlt) - { - xBack = x; - yBack = y - FONTASCENT(pGC->font); - wBack = 0; - hBack = FONTASCENT(pGC->font) + FONTDESCENT(pGC->font); - if (hBack) - { - height = nglyph; - ppci = ppciInit; - while (height--) - wBack += (*ppci++)->metrics.characterWidth; - } - if (wBack < 0) - { - xBack = xBack + wBack; - wBack = -wBack; - } - if (hBack < 0) - { - yBack = yBack + hBack; - hBack = -hBack; - } - alu = GXcopy; - } - else - { - wBack = 0; - alu = pGC->alu; - } - - if (wBack) - { - _sisSetSolidRect (sis, pGC->bgPixel, GXcopy, cmd); - _sisRect (sis, xBack, yBack, wBack, hBack, cmd); - } - - sisExpandInit (pDrawable->pScreen, &expand); - - sis->u.general.src_fg = pGC->fgPixel; - - cmd = (SIS_CMD_ENH_COLOR_EXPAND | - SIS_CMD_SRC_SCREEN | - SIS_CMD_PAT_FG | - (sisBltRop[alu] << 8) | - SIS_CMD_INC_X | - SIS_CMD_INC_Y | - SIS_CMD_RECT_CLIP_DISABLE | - SIS_CMD_TRANSPARENT); - - ppci = ppciInit; - while (nglyph--) - { - pci = *ppci++; - height = pci->metrics.ascent + pci->metrics.descent; - width = pci->metrics.rightSideBearing - pci->metrics.leftSideBearing; - /* - * For glyphs wider than 16 pixels, expand the blt to the nearest multiple - * of 32; this allows the scanlines to be padded to a 32-bit boundary - * instead of requiring byte packing - */ - if (width > 16) - width = (width + 31) & ~31; - bwidth = (width + 7) >> 3; - nb = bwidth * height; - if (nb) - { - dst = sisExpandAlloc (&expand, nb); - - sis->u.general.src_base = expand.off; - sis->u.general.src_pitch = 0; - sis->u.general.src_x = 0; - sis->u.general.src_y = 0; - sis->u.general.dst_x = x + pci->metrics.leftSideBearing; - sis->u.general.dst_y = y - pci->metrics.ascent; - sis->u.general.rect_width = width; - sis->u.general.rect_height = height; - switch (bwidth) { - case 1: - bits8 = (CARD8 *) pci->bits; - while (height >= 4) - { - d = (bits8[0] | (bits8[4] << 8) | - (bits8[8] << 16) | (bits8[12] << 24)); - SisInvertBits32(d); - *dst++ = d; - bits8 += 16; - height -= 4; - } - if (height) - { - switch (height) { - case 3: - d = bits8[0] | (bits8[4] << 8) | (bits8[8] << 16); - break; - case 2: - d = bits8[0] | (bits8[4] << 8); - break; - case 1: - d = bits8[0]; - break; - } - SisInvertBits32(d); - *dst++ = d; - } - break; - case 2: - bits16 = (CARD16 *) pci->bits; - while (height >= 2) - { - d = bits16[0] | (bits16[2] << 16); - SisInvertBits32(d); - *dst++ = d; - bits16 += 4; - height -= 2; - } - if (height) - { - d = bits16[0]; - SisInvertBits32(d); - *dst++ = d; - } - break; - default: - nb >>= 2; - bits32 = (CARD32 *) pci->bits; - while (nb--) - { - d = *bits32++; - SisInvertBits32 (d); - *dst++ = d; - } - } - sis->u.general.command = cmd; - } - x += pci->metrics.characterWidth; - } - KdMarkSync (pDrawable->pScreen); - return TRUE; -} -/* - * Blt glyphs using Sis image transfer register, this does both - * poly glyph blt and image glyph blt (when pglyphBase == 1) - */ - -void -sisPolyGlyphBlt (DrawablePtr pDrawable, - GCPtr pGC, - int x, int y, - unsigned int nglyph, - CharInfoPtr *ppci, - pointer pglyphBase) -{ - FbBits depthMask; - - depthMask = FbFullMask (pDrawable->depth); - if ((pGC->planemask & depthMask) == depthMask && - pGC->fillStyle == FillSolid) - { - if (TERMINALFONT(pGC->font)) - { - if (sisTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, FALSE)) - return; - } - else - { - if (sisGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, FALSE)) - return; - } - } - KdCheckPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); -} - -void -sisImageGlyphBlt (DrawablePtr pDrawable, - GCPtr pGC, - int x, int y, - unsigned int nglyph, - CharInfoPtr *ppci, - pointer pglyphBase) -{ - FbBits depthMask; - - depthMask = FbFullMask (pDrawable->depth); - if ((pGC->planemask & depthMask) == depthMask) - { - if (TERMINALFONT(pGC->font)) - { - if (sisTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, TRUE)) - return; - } - else - { - if (sisGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, TRUE)) - return; - } - } - KdCheckImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); -} - -#define sourceInvarient(alu) (((alu) & 3) == (((alu) >> 2) & 3)) - -#define sisPatternDimOk(d) ((d) <= 8 && (((d) & ((d) - 1)) == 0)) - -BOOL -sisFillOk (GCPtr pGC) -{ - FbBits depthMask; - - depthMask = FbFullMask(pGC->depth); - if ((pGC->planemask & depthMask) != depthMask) - return FALSE; - switch (pGC->fillStyle) { - case FillSolid: - return TRUE; - case FillTiled: - return (sisPatternDimOk (pGC->tile.pixmap->drawable.width) && - sisPatternDimOk (pGC->tile.pixmap->drawable.height)); - case FillStippled: - case FillOpaqueStippled: - return (sisPatternDimOk (pGC->stipple->drawable.width) && - sisPatternDimOk (pGC->stipple->drawable.height)); - } -} - -CARD32 -sisStipplePrepare (DrawablePtr pDrawable, GCPtr pGC) -{ - SetupSis(pGC->pScreen); - PixmapPtr pStip = pGC->stipple; - int stipHeight = pStip->drawable.height; - int xRot, yRot; - int rot, stipX, stipY; - FbStip *stip, *stipEnd, bits; - FbStride stipStride; - int stipBpp; - int stipXoff, stipYoff; /* XXX assumed to be zero */ - int y; - CARD32 cmd; - - xRot = pGC->patOrg.x + pDrawable->x; - yRot = pGC->patOrg.y + pDrawable->y; - modulus (- yRot, stipHeight, stipY); - modulus (- xRot, FB_UNIT, stipX); - rot = stipX; - - fbGetStipDrawable (&pStip->drawable, stip, stipStride, stipBpp, stipXoff, stipYoff); - for (y = 0; y < 8; y++) - { - bits = stip[stipY<<1]; - FbRotLeft(bits, rot); - SisInvertBits32(bits); - sis->u.general.mask[y] = (CARD8) bits; - stipY++; - if (stipY == stipHeight) - stipY = 0; - } - sis->u.general.pattern_fg = pGC->fgPixel; - - cmd = (SIS_CMD_BITBLT | - SIS_CMD_SRC_SCREEN | - SIS_CMD_PAT_MONO | - (sisPatRop[pGC->alu] << 8) | - SIS_CMD_INC_X | - SIS_CMD_INC_Y | - SIS_CMD_RECT_CLIP_DISABLE | - SIS_CMD_RECT_CLIP_DONT_MERGE); - if (pGC->fillStyle == FillOpaqueStippled) - { - sis->u.general.pattern_bg = pGC->bgPixel; - cmd |= SIS_CMD_OPAQUE; - } - else - cmd |= SIS_CMD_TRANSPARENT; - return cmd; -} - -CARD32 -sisTilePrepare (PixmapPtr pTile, int xRot, int yRot, CARD8 alu) -{ - SetupSis(pTile->drawable.pScreen); - int tileHeight = pTile->drawable.height; - int tileWidth = pTile->drawable.width; - FbBits *tile; - FbStride tileStride; - int tileBpp; - int tileXoff, tileYoff; /* XXX assumed to be zero */ - - fbGetDrawable (&pTile->drawable, tile, tileStride, tileBpp, tileXoff, tileYoff); - - /* - * Tile the pattern register - */ - fbTile ((FbBits *) sis->u.general.pattern, - (8 * tileBpp) >> FB_SHIFT, - 0, - - 8 * tileBpp, 8, - - tile, - tileStride, - tileWidth * tileBpp, - tileHeight, - GXcopy, FB_ALLONES, tileBpp, - xRot * tileBpp, - yRot); - - return (SIS_CMD_BITBLT | - SIS_CMD_SRC_SCREEN | - SIS_CMD_PAT_PATTERN | - (sisPatRop[alu] << 8) | - SIS_CMD_INC_X | - SIS_CMD_INC_Y | - SIS_CMD_RECT_CLIP_DISABLE | - SIS_CMD_RECT_CLIP_DONT_MERGE); -} - -void -sisFillBoxSolid (DrawablePtr pDrawable, int nBox, BoxPtr pBox, - unsigned long pixel, int alu) -{ - SetupSis(pDrawable->pScreen); - CARD32 cmd; - - _sisSetSolidRect(sis,pixel,alu,cmd); - - while (nBox--) - { - _sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd); - pBox++; - } - KdMarkSync (pDrawable->pScreen); -} - -void -sisFillBoxStipple (DrawablePtr pDrawable, GCPtr pGC, - int nBox, BoxPtr pBox) -{ - SetupSis(pDrawable->pScreen); - CARD32 cmd; - - cmd = sisStipplePrepare (pDrawable, pGC); - - while (nBox--) - { - _sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd); - pBox++; - } - KdMarkSync (pDrawable->pScreen); -} - -void -sisFillBoxTiled (DrawablePtr pDrawable, - int nBox, BoxPtr pBox, - PixmapPtr pTile, int xRot, int yRot, CARD8 alu) -{ - SetupSis (pDrawable->pScreen); - CARD32 cmd; - - cmd = sisTilePrepare (pTile, xRot, yRot, alu); - - while (nBox--) - { - _sisRect(sis,pBox->x1,pBox->y1,pBox->x2-pBox->x1,pBox->y2-pBox->y1,cmd); - pBox++; - } - KdMarkSync (pDrawable->pScreen); -} - -/* - sisDoBitBlt - ============= - Bit Blit for all window to window blits. -*/ - -void -sisCopyNtoN (DrawablePtr pSrcDrawable, - DrawablePtr pDstDrawable, - GCPtr pGC, - BoxPtr pbox, - int nbox, - int dx, - int dy, - Bool reverse, - Bool upsidedown, - Pixel bitplane, - void *closure) -{ - SetupSis(pDstDrawable->pScreen); - int srcX, srcY, dstX, dstY; - int w, h; - CARD32 flags; - CARD32 cmd; - CARD8 alu; - - if (pGC) - { - alu = pGC->alu; - if (sourceInvarient (pGC->alu)) - { - sisFillBoxSolid (pDstDrawable, nbox, pbox, 0, pGC->alu); - return; - } - } - else - alu = GXcopy; - - _sisSetBlt(sis,alu,cmd); - while (nbox--) - { - w = pbox->x2 - pbox->x1; - h = pbox->y2 - pbox->y1; - flags = 0; - if (reverse) - { - dstX = pbox->x2 - 1; - } - else - { - dstX = pbox->x1; - flags |= SIS_CMD_INC_X; - } - srcX = dstX + dx; - - if (upsidedown) - { - dstY = pbox->y2 - 1; - } - else - { - dstY = pbox->y1; - flags |= SIS_CMD_INC_Y; - } - srcY = dstY + dy; - - _sisBlt (sis, srcX, srcY, dstX, dstY, w, h, cmd|flags); - pbox++; - } - KdMarkSync (pDstDrawable->pScreen); -} - -RegionPtr -sisCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, - int srcx, int srcy, int width, int height, int dstx, int dsty) -{ - KdScreenPriv(pDstDrawable->pScreen); - FbBits depthMask; - - depthMask = FbFullMask (pDstDrawable->depth); - if ((pGC->planemask & depthMask) == depthMask && - pSrcDrawable->type == DRAWABLE_WINDOW && - pDstDrawable->type == DRAWABLE_WINDOW) - { - return fbDoCopy (pSrcDrawable, pDstDrawable, pGC, - srcx, srcy, width, height, - dstx, dsty, sisCopyNtoN, 0, 0); - } - return KdCheckCopyArea (pSrcDrawable, pDstDrawable, pGC, - srcx, srcy, width, height, dstx, dsty); -} - -typedef struct _sis1toNargs { - unsigned long copyPlaneFG, copyPlaneBG; -} sis1toNargs; - -void -_sisStipple (ScreenPtr pScreen, - FbStip *psrcBase, - FbStride widthSrc, - CARD8 alu, - int srcx, - int srcy, - int dstx, - int dsty, - int width, - int height) -{ - SetupSis(pScreen); - FbStip *psrcLine, *psrc; - FbStride widthRest; - FbStip bits, tmp, lastTmp; - int leftShift, rightShift; - int nl, nlMiddle; - int r; - SisExpand expand; - CARD32 *dst; - int hthis; - int hper; - int bwidth; - CARD32 cmd; - - sisExpandInit (pScreen, &expand); - - /* Compute blt address and parameters */ - psrc = psrcBase + srcy * widthSrc + (srcx >> 5); - nlMiddle = (width + 31) >> 5; - leftShift = srcx & 0x1f; - rightShift = 32 - leftShift; - widthRest = widthSrc - nlMiddle; - - cmd = (SIS_CMD_ENH_COLOR_EXPAND | - SIS_CMD_SRC_SCREEN | - SIS_CMD_PAT_FG | - (sisBltRop[alu] << 8) | - SIS_CMD_INC_X | - SIS_CMD_INC_Y | - SIS_CMD_OPAQUE | - SIS_CMD_RECT_CLIP_ENABLE); - - if (leftShift != 0) - widthRest--; - - sis->u.general.src_x = 0; - sis->u.general.src_y = 0; - sis->u.general.dst_x = dstx; - sis->u.general.rect_width = (width + 31) & ~31; - sis->u.general.clip_right = (dstx + width); - - bwidth = nlMiddle << 2; - hper = SIS_PATTERN_INC / bwidth; - if (hper == 0) - hper = 1; - - while (height) - { - hthis = hper; - if (hthis > height) - hthis = height; - dst = sisExpandAlloc (&expand, bwidth * hthis); - sis->u.general.src_base = expand.off; - sis->u.general.dst_y = dsty; - sis->u.general.rect_height = hthis; - - dsty += hthis; - height -= hthis; - - if (leftShift == 0) - { - while (hthis--) - { - nl = nlMiddle; - while (nl--) - { - tmp = *psrc++; - SisInvertBits32(tmp); - *dst++ = tmp; - } - psrc += widthRest; - } - } - else - { - while (hthis--) - { - bits = *psrc++; - nl = nlMiddle; - while (nl--) - { - tmp = FbStipLeft(bits, leftShift); - bits = *psrc++; - tmp |= FbStipRight(bits, rightShift); - SisInvertBits32(tmp); - *dst++ = tmp; - } - psrc += widthRest; - } - } - sis->u.general.command = cmd; - } - sis->u.general.clip_right = pScreenPriv->screen->width; -} - -void -sisCopy1toN (DrawablePtr pSrcDrawable, - DrawablePtr pDstDrawable, - GCPtr pGC, - BoxPtr pbox, - int nbox, - int dx, - int dy, - Bool reverse, - Bool upsidedown, - Pixel bitplane, - void *closure) -{ - SetupSis(pDstDrawable->pScreen); - - sis1toNargs *args = closure; - int dstx, dsty; - FbStip *psrcBase; - FbStride widthSrc; - int srcBpp; - int srcXoff, srcYoff; - - if (sourceInvarient (pGC->alu)) - { - sisFillBoxSolid (pDstDrawable, nbox, pbox, - pGC->bgPixel, pGC->alu); - return; - } - - fbGetStipDrawable (pSrcDrawable, psrcBase, widthSrc, srcBpp, srcXoff, srcYoff); - - sis->u.general.src_fg = args->copyPlaneFG; - sis->u.general.src_bg = args->copyPlaneBG; - - while (nbox--) - { - dstx = pbox->x1; - dsty = pbox->y1; - - _sisStipple (pDstDrawable->pScreen, - psrcBase, widthSrc, - pGC->alu, - dstx + dx - srcXoff, dsty + dy - srcYoff, - dstx, dsty, - pbox->x2 - dstx, pbox->y2 - dsty); - pbox++; - } - KdMarkSync (pDstDrawable->pScreen); -} - -RegionPtr -sisCopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, - int srcx, int srcy, int width, int height, - int dstx, int dsty, unsigned long bitPlane) -{ - KdScreenPriv (pDstDrawable->pScreen); - RegionPtr ret; - sis1toNargs args; - FbBits depthMask; - - depthMask = FbFullMask (pDstDrawable->depth); - if ((pGC->planemask & depthMask) == depthMask && - pDstDrawable->type == DRAWABLE_WINDOW && - pSrcDrawable->depth == 1) - { - args.copyPlaneFG = pGC->fgPixel; - args.copyPlaneBG = pGC->bgPixel; - return fbDoCopy (pSrcDrawable, pDstDrawable, pGC, - srcx, srcy, width, height, - dstx, dsty, sisCopy1toN, bitPlane, &args); - } - return KdCheckCopyPlane(pSrcDrawable, pDstDrawable, pGC, - srcx, srcy, width, height, - dstx, dsty, bitPlane); -} - -void -sisFillSpans (DrawablePtr pDrawable, GCPtr pGC, int n, - DDXPointPtr ppt, int *pwidth, int fSorted) -{ - SetupSis(pDrawable->pScreen); - DDXPointPtr pptFree; - FbGCPrivPtr fbPriv = fbGetGCPrivate(pGC); - int *pwidthFree;/* copies of the pointers to free */ - CARD32 cmd; - int nTmp; - INT16 x, y; - int width; - - if (!sisFillOk (pGC)) - { - KdCheckFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted); - return; - } - nTmp = n * miFindMaxBand(fbGetCompositeClip(pGC)); - pwidthFree = (int *)ALLOCATE_LOCAL(nTmp * sizeof(int)); - pptFree = (DDXPointRec *)ALLOCATE_LOCAL(nTmp * sizeof(DDXPointRec)); - if(!pptFree || !pwidthFree) - { - if (pptFree) DEALLOCATE_LOCAL(pptFree); - if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree); - return; - } - n = miClipSpans(fbGetCompositeClip(pGC), - ppt, pwidth, n, - pptFree, pwidthFree, fSorted); - pwidth = pwidthFree; - ppt = pptFree; - switch (pGC->fillStyle) { - case FillSolid: - _sisSetSolidRect(sis,pGC->fgPixel,pGC->alu,cmd); - break; - case FillTiled: - cmd = sisTilePrepare (pGC->tile.pixmap, - pGC->patOrg.x + pDrawable->x, - pGC->patOrg.y + pDrawable->y, - pGC->alu); - break; - default: - cmd = sisStipplePrepare (pDrawable, pGC); - break; - } - while (n--) - { - x = ppt->x; - y = ppt->y; - ppt++; - width = *pwidth++; - if (width) - { - _sisRect(sis,x,y,width,1,cmd); - } - } - KdMarkSync (pDrawable->pScreen); - DEALLOCATE_LOCAL(pptFree); - DEALLOCATE_LOCAL(pwidthFree); -} - -#define NUM_STACK_RECTS 1024 - -void -sisPolyFillRect (DrawablePtr pDrawable, GCPtr pGC, - int nrectFill, xRectangle *prectInit) -{ - SetupSis(pDrawable->pScreen); - xRectangle *prect; - RegionPtr prgnClip; - register BoxPtr pbox; - register BoxPtr pboxClipped; - BoxPtr pboxClippedBase; - BoxPtr pextent; - BoxRec stackRects[NUM_STACK_RECTS]; - FbGCPrivPtr fbPriv = fbGetGCPrivate (pGC); - int numRects; - int n; - int xorg, yorg; - int x, y; - - if (!sisFillOk (pGC)) - { - KdCheckPolyFillRect (pDrawable, pGC, nrectFill, prectInit); - return; - } - prgnClip = fbGetCompositeClip(pGC); - xorg = pDrawable->x; - yorg = pDrawable->y; - - if (xorg || yorg) - { - prect = prectInit; - n = nrectFill; - while(n--) - { - prect->x += xorg; - prect->y += yorg; - prect++; - } - } - - prect = prectInit; - - numRects = REGION_NUM_RECTS(prgnClip) * nrectFill; - if (numRects > NUM_STACK_RECTS) - { - pboxClippedBase = (BoxPtr)ALLOCATE_LOCAL(numRects * sizeof(BoxRec)); - if (!pboxClippedBase) - return; - } - else - pboxClippedBase = stackRects; - - pboxClipped = pboxClippedBase; - - if (REGION_NUM_RECTS(prgnClip) == 1) - { - int x1, y1, x2, y2, bx2, by2; - - pextent = REGION_RECTS(prgnClip); - x1 = pextent->x1; - y1 = pextent->y1; - x2 = pextent->x2; - y2 = pextent->y2; - while (nrectFill--) - { - if ((pboxClipped->x1 = prect->x) < x1) - pboxClipped->x1 = x1; - - if ((pboxClipped->y1 = prect->y) < y1) - pboxClipped->y1 = y1; - - bx2 = (int) prect->x + (int) prect->width; - if (bx2 > x2) - bx2 = x2; - pboxClipped->x2 = bx2; - - by2 = (int) prect->y + (int) prect->height; - if (by2 > y2) - by2 = y2; - pboxClipped->y2 = by2; - - prect++; - if ((pboxClipped->x1 < pboxClipped->x2) && - (pboxClipped->y1 < pboxClipped->y2)) - { - pboxClipped++; - } - } - } - else - { - int x1, y1, x2, y2, bx2, by2; - - pextent = REGION_EXTENTS(pGC->pScreen, prgnClip); - x1 = pextent->x1; - y1 = pextent->y1; - x2 = pextent->x2; - y2 = pextent->y2; - while (nrectFill--) - { - BoxRec box; - - if ((box.x1 = prect->x) < x1) - box.x1 = x1; - - if ((box.y1 = prect->y) < y1) - box.y1 = y1; - - bx2 = (int) prect->x + (int) prect->width; - if (bx2 > x2) - bx2 = x2; - box.x2 = bx2; - - by2 = (int) prect->y + (int) prect->height; - if (by2 > y2) - by2 = y2; - box.y2 = by2; - - prect++; - - if ((box.x1 >= box.x2) || (box.y1 >= box.y2)) - continue; - - n = REGION_NUM_RECTS (prgnClip); - pbox = REGION_RECTS(prgnClip); - - /* clip the rectangle to each box in the clip region - this is logically equivalent to calling Intersect() - */ - while(n--) - { - pboxClipped->x1 = max(box.x1, pbox->x1); - pboxClipped->y1 = max(box.y1, pbox->y1); - pboxClipped->x2 = min(box.x2, pbox->x2); - pboxClipped->y2 = min(box.y2, pbox->y2); - pbox++; - - /* see if clipping left anything */ - if(pboxClipped->x1 < pboxClipped->x2 && - pboxClipped->y1 < pboxClipped->y2) - { - pboxClipped++; - } - } - } - } - if (pboxClipped != pboxClippedBase) - { - switch (pGC->fillStyle) { - case FillSolid: - sisFillBoxSolid(pDrawable, - pboxClipped-pboxClippedBase, pboxClippedBase, - pGC->fgPixel, pGC->alu); - break; - case FillTiled: - sisFillBoxTiled(pDrawable, - pboxClipped-pboxClippedBase, pboxClippedBase, - pGC->tile.pixmap, - pGC->patOrg.x + pDrawable->x, - pGC->patOrg.y + pDrawable->y, - pGC->alu); - break; - case FillStippled: - case FillOpaqueStippled: - sisFillBoxStipple (pDrawable, pGC, - pboxClipped-pboxClippedBase, pboxClippedBase); - break; - } - } - if (pboxClippedBase != stackRects) - DEALLOCATE_LOCAL(pboxClippedBase); -} - -static const GCOps sisOps = { - sisFillSpans, - KdCheckSetSpans, - KdCheckPutImage, - sisCopyArea, - sisCopyPlane, - KdCheckPolyPoint, - KdCheckPolylines, - KdCheckPolySegment, - miPolyRectangle, - KdCheckPolyArc, - miFillPolygon, - sisPolyFillRect, - KdCheckPolyFillArc, - miPolyText8, - miPolyText16, - miImageText8, - miImageText16, - sisImageGlyphBlt, - sisPolyGlyphBlt, - KdCheckPushPixels, -#ifdef NEED_LINEHELPER - ,NULL -#endif -}; - -void -sisValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable) -{ - FbGCPrivPtr fbPriv = fbGetGCPrivate(pGC); - - fbValidateGC (pGC, changes, pDrawable); - - if (pDrawable->type == DRAWABLE_WINDOW) - pGC->ops = (GCOps *) &sisOps; - else - pGC->ops = (GCOps *) &kdAsyncPixmapGCOps; -} - -GCFuncs sisGCFuncs = { - sisValidateGC, - miChangeGC, - miCopyGC, - miDestroyGC, - miChangeClip, - miDestroyClip, - miCopyClip -}; - -int -sisCreateGC (GCPtr pGC) -{ - if (!fbCreateGC (pGC)) - return FALSE; - - if (pGC->depth != 1) - pGC->funcs = &sisGCFuncs; - - pGC->ops = (GCOps *) &kdAsyncPixmapGCOps; - - return TRUE; -} - -void -sisCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) -{ - ScreenPtr pScreen = pWin->drawable.pScreen; - KdScreenPriv(pScreen); - RegionRec rgnDst; - int dx, dy; - WindowPtr pwinRoot; - - pwinRoot = WindowTable[pWin->drawable.pScreen->myNum]; - - dx = ptOldOrg.x - pWin->drawable.x; - dy = ptOldOrg.y - pWin->drawable.y; - REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy); - - REGION_INIT (pWin->drawable.pScreen, &rgnDst, NullBox, 0); - - REGION_INTERSECT(pWin->drawable.pScreen, &rgnDst, &pWin->borderClip, prgnSrc); - - fbCopyRegion ((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot, - 0, - &rgnDst, dx, dy, sisCopyNtoN, 0, 0); - - REGION_UNINIT(pWin->drawable.pScreen, &rgnDst); -} - -void -sisPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what) -{ - KdScreenPriv(pWin->drawable.pScreen); - PixmapPtr pTile; - - if (!REGION_NUM_RECTS(pRegion)) - return; - switch (what) { - case PW_BACKGROUND: - switch (pWin->backgroundState) { - case None: - return; - case ParentRelative: - do { - pWin = pWin->parent; - } while (pWin->backgroundState == ParentRelative); - (*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion, - what); - return; - case BackgroundPixmap: - pTile = pWin->background.pixmap; - if (sisPatternDimOk (pTile->drawable.width) && - sisPatternDimOk (pTile->drawable.height)) - { - sisFillBoxTiled ((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pTile, - pWin->drawable.x, pWin->drawable.y, GXcopy); - return; - } - break; - case BackgroundPixel: - sisFillBoxSolid((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pWin->background.pixel, GXcopy); - return; - } - break; - case PW_BORDER: - if (pWin->borderIsPixel) - { - sisFillBoxSolid((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pWin->border.pixel, GXcopy); - return; - } - else - { - pTile = pWin->border.pixmap; - if (sisPatternDimOk (pTile->drawable.width) && - sisPatternDimOk (pTile->drawable.height)) - { - sisFillBoxTiled ((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pTile, - pWin->drawable.x, pWin->drawable.y, GXcopy); - return; - } - } - break; - } - KdCheckPaintWindow (pWin, pRegion, what); -} - -Bool -sisDrawInit (ScreenPtr pScreen) -{ - KdScreenPriv(pScreen); - sisScreenInfo(pScreenPriv); - - /* - * Hook up asynchronous drawing - */ - KdScreenInitAsync (pScreen); - /* - * Replace various fb screen functions - */ - pScreen->CreateGC = sisCreateGC; - pScreen->CopyWindow = sisCopyWindow; - pScreen->PaintWindowBackground = sisPaintWindow; - pScreen->PaintWindowBorder = sisPaintWindow; - - return TRUE; -} - -void -sisDrawEnable (ScreenPtr pScreen) -{ - SetupSis(pScreen); - sisScreenInfo(pScreenPriv); - CARD32 cmd; - CARD32 base; - CARD16 stride; - CARD16 op; - - base = pScreenPriv->screen->fb[0].frameBuffer - sisc->frameBuffer; - stride = pScreenPriv->screen->fb[0].byteStride; -#if 0 - sis->u.general.dst_base = base; - sis->u.general.dst_pitch = stride; - sis->u.general.src_pitch = stride; - sis->u.general._pad0 = stride; - sis->u.general.dst_height = pScreenPriv->screen->height; - _sisClip (sis, 0, 0, - pScreenPriv->screen->width, pScreenPriv->screen->height); - _sisSetSolidRect(sis, pScreen->blackPixel, GXcopy, cmd); - _sisRect (sis, 0, 0, - pScreenPriv->screen->width, pScreenPriv->screen->height, - cmd); -#endif - base = (CARD32) (pScreenPriv->screen->fb[0].frameBuffer); - fprintf (stderr, "src 0x%x\n", sis->u.accel.src_addr); - sis->u.accel.src_addr = (base & 0x3fffff); - fprintf (stderr, "src 0x%x\n", sis->u.accel.src_addr); - sis->u.accel.dst_addr = (base & 0x3fffff); - sis->u.accel.pitch = (stride << 16) | stride; - sis->u.accel.dimension = ((pScreenPriv->screen->height-1) << 16 | - (pScreenPriv->screen->width - 1)); - sis->u.accel.fg = (sisBltRop[GXcopy] << 24) | 0xf800; - sis->u.accel.bg = (sisBltRop[GXcopy] << 24) | 0x00; - -#define sisLEFT2RIGHT 0x10 -#define sisRIGHT2LEFT 0x00 -#define sisTOP2BOTTOM 0x20 -#define sisBOTTOM2TOP 0x00 - -#define sisSRCSYSTEM 0x03 -#define sisSRCVIDEO 0x02 -#define sisSRCFG 0x01 -#define sisSRCBG 0x00 - -#define sisCMDBLT 0x0000 -#define sisCMDBLTMSK 0x0100 -#define sisCMDCOLEXP 0x0200 -#define sisCMDLINE 0x0300 - -#define sisCMDENHCOLEXP 0x2000 - -#define sisXINCREASE 0x10 -#define sisYINCREASE 0x20 -#define sisCLIPENABL 0x40 -#define sisCLIPINTRN 0x80 -#define sisCLIPEXTRN 0x00 - - -#define sisPATREG 0x08 -#define sisPATFG 0x04 -#define sisPATBG 0x00 - -#define sisLASTPIX 0x0800 -#define sisXMAJOR 0x0400 - - op = sisCMDBLT | sisLEFT2RIGHT | sisTOP2BOTTOM | sisSRCFG | sisPATFG; - - sis->u.accel.cmd = op; - - KdMarkSync (pScreen); -} - -void -sisDrawSync (ScreenPtr pScreen) -{ - SetupSis(pScreen); - - _sisWaitIdleEmpty (sis); -} - -void -sisDrawDisable (ScreenPtr pScreen) -{ -} - -void -sisDrawFini (ScreenPtr pScreen) -{ -} |