diff options
Diffstat (limited to 'src/amd_lx_accel.c')
-rw-r--r-- | src/amd_lx_accel.c | 1563 |
1 files changed, 0 insertions, 1563 deletions
diff --git a/src/amd_lx_accel.c b/src/amd_lx_accel.c deleted file mode 100644 index 4f72d63..0000000 --- a/src/amd_lx_accel.c +++ /dev/null @@ -1,1563 +0,0 @@ -/* - * Copyright (c) 2006 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Neither the name of the Advanced Micro Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - */ - -/* - * File Contents: This file is consists of main Xfree - * acceleration supported routines like solid fill used - * here. - * Project: Geode Xfree Frame buffer device driver. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <sys/types.h> - -/* Xfree86 header files */ - -#include "vgaHW.h" -#include "xf86.h" -#include "xf86_ansic.h" -#include "xaalocal.h" -#include "xf86fbman.h" -#include "miline.h" -#include "xf86_libc.h" -#include "xaarop.h" -#include "amd.h" - -typedef unsigned char uchar; -typedef unsigned int uint; -typedef unsigned short ushort; - -#if DEBUGLVL>0 -extern FILE *zdfp; - -#if DEBUGTIM>0 -#ifndef USE_RDTSC -#define DBLOG(n,s...) do { if((DEBUGLVL)>=(n)) { long secs,usecs; \ - getsecs(&secs,&usecs); fprintf(zdfp,"%d,%d ",secs,usecs); \ - fprintf(zdfp,s); } } while(0) -#else -#define tsc(n) __asm__ __volatile__ ( \ - " rdtsc" \ - : "=a" (((int*)(&(n)))[0]), "=d" (((int*)(&(n)))[1]) \ - : ) -#define DBLOG(n,s...) do { if((DEBUGLVL)>=(n)) { long long t; \ - tsc(t); fprintf(zdfp,"%lld ",t); \ - fprintf(zdfp,s); } } while(0) -#endif -#else -#define DBLOG(n,s...) do { if((DEBUGLVL)>=(n)) fprintf(zdfp,s); } while(0) -#endif -#else -#define DBLOG(n,s...) do {} while(0) -#endif - -#define CALC_FBOFFSET(x, y) (((ulong)(y) << gu3_yshift) | \ - ((ulong)(x) << gu3_xshift)) - -#define OS_UDELAY 0 -#if OS_UDELAY > 0 -#define OS_USLEEP(usec) usleep(usec); -#else -#define OS_USLEEP(usec) -#endif - -#define HOOK(fn) localRecPtr->fn = LX##fn - -static int lx0 = -1, ly0 = -1; -static int lx1 = -1, ly1 = -1; -static int ROP; - -/* #define ENABLE_PREFETCH CIMGP_ENABLE_PREFETCH */ -#define ENABLE_PREFETCH 0 -#define BLTFLAGS_HAZARD CIMGP_BLTFLAGS_HAZARD - -/* specify dst bounding box, upper left/lower right */ -static int -lx_flags0(int x0, int y0, int x1, int y1) -{ - int n = ((ROP ^ (ROP >> 1)) & 0x55) == 0 || /* no dst */ - x0 >= lx1 || y0 >= ly1 || /* rght/below */ - x1 <= lx0 || y1 <= ly0 ? /* left/above */ - ENABLE_PREFETCH : BLTFLAGS_HAZARD; - - lx0 = x0; - ly0 = y0; - lx1 = x1; - ly1 = y1; - return n; -} - -/* specify dst bounding box, upper left/WxH */ -static int -lx_flags1(int x0, int y0, int w, int h) -{ - return lx_flags0(x0, y0, x0 + w, y0 + h); -} - -/* specify dst bounding box, two points */ -static int -lx_flags2(int x0, int y0, int x1, int y1) -{ - int n; - - if (x0 >= x1) { - n = x0; - x0 = x1 - 1; - x1 = n + 1; - } - if (y0 >= y1) { - n = y0; - y0 = y1 - 1; - y1 = n + 1; - } - - return lx_flags0(x0, y0, x1, y1); -} - -/* specify src/dst bounding box, upper left/WxH */ -static int -lx_flags3(int x0, int y0, int x1, int y1, int w, int h) -{ - int x2 = x1 + w, y2 = y1 + h; - - /* dst not hazzard and src not hazzard */ - int n = (((ROP ^ (ROP >> 1)) & 0x55) == 0 || - x1 >= lx1 || y1 >= ly1 || - x2 <= lx0 || y2 <= ly0) && - (((ROP ^ (ROP >> 2)) & 0x33) == 0 || - x0 >= lx1 || y0 >= ly1 || x0 + w <= lx0 || y0 + h <= ly0) - ? ENABLE_PREFETCH : BLTFLAGS_HAZARD; - - lx0 = x1; - ly0 = y1; - lx1 = x2; - ly1 = y2; - - return n; -} - -static void -lx_endpt(int x, int y, int len, int mag, int min, int err, int oct, int *px, - int *py) -{ - int u = len - 1; - int v = (u * min - err) / mag; - - switch (oct) { - default: - case 0: - x += u; - y += v; - break; - case 1: - x += v; - y += u; - break; - case 2: - x += u; - y -= v; - break; - case 3: - x += v; - y -= u; - break; - case 4: - x -= u; - y += v; - break; - case 5: - x -= v; - y += u; - break; - case 6: - x -= u; - y -= v; - break; - case 7: - x -= v; - y -= u; - break; - } - - *px = x; - *py = y; -} - -/* static storage declarations */ - -typedef struct sGBltBox -{ - ulong x, y; - ulong w, h; - ulong color; - int bpp, transparent; -} GBltBox; - -static GBltBox giwr; -static GBltBox gc2s; - -typedef struct sGDashLine -{ - ulong pat; - int len; - int fg; - int bg; -} GDashLine; - -static GDashLine gdln; - -static uint gu3_xshift = 1; -static uint gu3_yshift = 1; -static uint gu3_img_fmt = 0; - -#if !LX_USE_OFFSCRN_MEM -static uint ImgBufOffset; -#else -static uchar *ImgLnsBuffers; -#endif -static uchar *ClrLnsBuffers; -static XAAInfoRecPtr localRecPtr; - -static int lx_src_fmt[4] = { - CIMGP_SOURCE_FMT_8BPP_INDEXED, - CIMGP_SOURCE_FMT_0_5_6_5, - CIMGP_SOURCE_FMT_24BPP, - CIMGP_SOURCE_FMT_8_8_8_8 -}; - -/* pat 0xF0 */ -/* src 0xCC */ -/* dst 0xAA */ - -/* (src FUNC dst) */ - -static const int SDfn[16] = { - 0x00, 0x88, 0x44, 0xCC, 0x22, 0xAA, 0x66, 0xEE, - 0x11, 0x99, 0x55, 0xDD, 0x33, 0xBB, 0x77, 0xFF -}; - -/* ((src FUNC dst) AND pat-mask) OR (dst AND (NOT pat-mask)) */ - -static const int SDfn_PM[16] = { - 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, - 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA -}; - -/* (pat FUNC dst) */ - -static int PDfn[16] = { - 0x00, 0xA0, 0x50, 0xF0, 0x0A, 0xAA, 0x5A, 0xFA, - 0x05, 0xA5, 0x55, 0xF5, 0x0F, 0xAF, 0x5F, 0xFF -}; - -/* ((pat FUNC dst) AND src-mask) OR (dst AND (NOT src-mask)) */ - -static int PDfn_SM[16] = { - 0x22, 0xA2, 0x62, 0xE2, 0x2A, 0xAA, 0x6A, 0xEA, - 0x26, 0xA6, 0x66, 0xE6, 0x2E, 0xAE, 0x6E, 0xEE -}; - -/*---------------------------------------------------------------------------- - * LXAccelSync. - * - * Description :This function is called to synchronize with the graphics - * engine and it waits until the graphic engine is idle. - * This is required before allowing direct access to the - * framebuffer. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * - * Returns :none - *---------------------------------------------------------------------------*/ -void -LXAccelSync(ScrnInfoPtr pScrni) -{ - DBLOG(3, "LXAccelSync()\n"); - while (gp_test_blt_busy() != 0) { - OS_USLEEP(OS_UDELAY) - } -} - -#if LX_FILL_RECT_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForSolidFill. - * - * Description :The SetupFor and Subsequent SolidFill(Rect) provide - * filling rectangular areas of the screen with a - * foreground color. - * - * Parameters. - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * color int foreground fill color - * rop int unmapped raster op - * planemask uint -1 (fill) or pattern data - * - * Returns :none - *--------------------------------------------------------------------------*/ -static void -LXSetupForSolidFill(ScrnInfoPtr pScrni, int color, int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForSolidFill(%#x,%#x,%#x)\n", color, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { /* fill with color */ - gp_set_raster_operation(ROP = SDfn[rop]); - } else { /* select rop that uses source data for planemask */ - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_solid_source(color); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - - /*---------------------------------------------------------------------------- - * LXSubsequentSolidFillRect. - * - * Description :see LXSetupForSolidFill. - * - * Parameters. - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * - * Returns :none - * - * Sample application uses: - * - Window backgrounds. - * - pull down highlighting. - * - x11perf: rectangle tests (-rect500). - * - x11perf: fill trapezoid tests (-trap100). - * - x11perf: horizontal line segments (-hseg500). - *---------------------------------------------------------------------------*/ -static void -LXSubsequentSolidFillRect(ScrnInfoPtr pScrni, int x, int y, int w, int h) -{ - int flags; - - DBLOG(2, "LXSubsequentSolidFillRect() at %d,%d %dx%d\n", x, y, w, h); - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_pattern_fill(CALC_FBOFFSET(x, y), w, h); -} - -/* LX_FILL_RECT_SUPPORT */ -#endif - -#if LX_CLREXP_8X8_PAT_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForColor8x8PatternFill - * - * Description :8x8 color pattern data is 64 pixels of full color data - * stored linearly in offscreen video memory. These patterns - * are useful as a substitute for 8x8 mono patterns when tiling, - * doing opaque stipples, or regular stipples. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int x offset to pattern data - * paty int y offset to pattern data - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * trans_color int -1 (copy) or transparent color (not enabled) - * trans color only supported on source channel - * or in monochrome pattern channel - * - * Returns :none. - * - *---------------------------------------------------------------------------*/ - -static void -LXSetupForColor8x8PatternFill(ScrnInfoPtr pScrni, int patx, int paty, int rop, - uint planemask, int trans_color) -{ - unsigned long *pat_8x8; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForColor8x8PatternFill() pat %#x,%#x rop %#x %#x %#x\n", - patx, paty, rop, planemask, trans_color); - pat_8x8 = (unsigned long *)(pGeode->FBBase + CALC_FBOFFSET(patx, paty)); - /* since the cache may be loaded by blt, we must wait here */ - LXAccelSync(pScrni); - gp_set_color_pattern(pat_8x8, gu3_img_fmt, 0, 0); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { /* fill with pattern */ - gp_set_raster_operation(ROP = PDfn[rop]); - } else { /* select rop that uses source data for planemask */ - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source((ulong) planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*---------------------------------------------------------------------------- - * LXSubsequentColor8x8PatternFillRect - * - * Description :see LXSetupForColor8x8PatternFill. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int pattern phase x offset - * paty int pattern phase y offset - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * - * Returns :none - * - * Sample application uses: - * - Patterned desktops - * - x11perf: stippled rectangle tests (-srect500). - * - x11perf: opaque stippled rectangle tests (-osrect500). - *--------------------------------------------------------------------------*/ -static void -LXSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrni, int patx, int paty, - int x, int y, int w, int h) -{ - int flags; - - DBLOG(2, - "LXSubsequentColor8x8PatternFillRect() patxy %d,%d at %d,%d %dsx%d\n", - patx, paty, x, y, w, h); - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_set_pattern_origin(patx, paty); - gp_pattern_fill(CALC_FBOFFSET(x, y), w, h); -} - -/* LX_CLREXP_8X8_PAT_SUPPORT */ -#endif - -#if LX_MONO_8X8_PAT_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForMono8x8PatternFill - * - * Description :8x8 mono pattern data is 64 bits of color expansion data - * with ones indicating the foreground color and zeros - * indicating the background color. These patterns are - * useful when tiling, doing opaque stipples, or regular - * stipples. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int x offset to pattern data - * paty int y offset to pattern data - * fg int foreground color - * bg int -1 (transparent) or background color - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * - * Returns :none. - * - * Comments :none. - * - *--------------------------------------------------------------------------*/ -static void -LXSetupForMono8x8PatternFill(ScrnInfoPtr pScrni, int patx, int paty, - int fg, int bg, int rop, uint planemask) -{ - int trans; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForMono8x8PatternFill() pat %#x,%#x fg %#x bg %#x %#x %#x\n", - patx, paty, fg, bg, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { /* fill with pattern */ - gp_set_raster_operation(ROP = PDfn[rop]); - } else { /* select rop that uses source data for planemask */ - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source((ulong) planemask); - } - trans = bg == -1 ? 1 : 0; - gp_set_mono_pattern(bg, fg, patx, paty, trans, 0, 0); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*---------------------------------------------------------------------------- - * LXSubsequentMono8x8PatternFillRect - * - * Description :see LXSetupForMono8x8PatternFill - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * patx int pattern phase x offset - * paty int pattern phase y offset - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - - * Returns :none - * - * Sample application uses: - * - Patterned desktops - * - x11perf: stippled rectangle tests (-srect500). - * - x11perf: opaque stippled rectangle tests (-osrect500). - *--------------------------------------------------------------------------*/ -static void -LXSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrni, int patx, int paty, - int x, int y, int w, int h) -{ - int flags; - - DBLOG(2, - "LXSubsequentMono8x8PatternFillRect() pat %#x,%#x at %d,%d %dx%d\n", - patx, paty, x, y, w, h); - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_set_pattern_origin(patx, paty); - gp_pattern_fill(CALC_FBOFFSET(x, y), w, h); -} - -/* LX_MONO_8X8_PAT_SUPPORT */ -#endif - -#if LX_SCR2SCRCPY_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForScreenToScreenCopy - * - * Description :SetupFor and Subsequent ScreenToScreenCopy functions - * provide an interface for copying rectangular areas from - * video memory to video memory. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * xdir int x copy direction (up/dn) - * ydir int y copy direction (up/dn) - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * trans_color int -1 (copy) or transparent color - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSetupForScreenToScreenCopy(ScrnInfoPtr pScrni, int xdir, int ydir, int rop, - uint planemask, int trans_color) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForScreenToScreenCopy() xd%d yd%d rop %#x %#x %#x\n", - xdir, ydir, rop, planemask, trans_color); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern((ulong) planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); - gc2s.transparent = (trans_color == -1) ? 0 : 1; - gc2s.color = trans_color; -} - -/*---------------------------------------------------------------------------- - * LXSubsquentScreenToScreenCopy - * - * Description :see LXSetupForScreenToScreenCopy. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x1 int source x offset - * y1 int source y offset - * x2 int destination x offset - * y2 int destination y offset - * w int copy area width (pixels) - * h int copy area height (pixels) - * - * Returns :none - * - * Sample application uses (non-transparent): - * - Moving windows. - * - x11perf: scroll tests (-scroll500). - * - x11perf: copy from window to window (-copywinwin500). - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrni, - int x1, int y1, int x2, int y2, int w, int h) -{ - int flags; - - DBLOG(2, "LXSubsequentScreenToScreenCopy() from %d,%d to %d,%d %dx%d\n", - x1, y1, x2, y2, w, h); - - flags = lx_flags3(x1, y1, x2, y2, w, h); - gp_declare_blt(flags); - - if (gc2s.transparent) { - gp_set_source_transparency(gc2s.color, ~0); - } - - flags = 0; - - if (x2 > x1) - flags |= 1; - if (y2 > y1) - flags |= 2; - - gp_screen_to_screen_blt(CALC_FBOFFSET(x2, y2), CALC_FBOFFSET(x1, y1), w, - h, flags); -} - -/* LX_SCR2SCRCPY_SUPPORT */ -#endif - -#if LX_SCANLINE_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForScanlineImageWrite - * - * Description :SetupFor/Subsequent ScanlineImageWrite and ImageWriteScanline - * transfer full color pixel data from system memory to video - * memory. This is useful for dealing with alignment issues and - * performing raster ops on the data. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * bpp int bits per pixel (unused) - * depth int color depth (unused) - * - * Returns :none - * - * x11perf -putimage10 - * x11perf -putimage100 - * x11perf -putimage500 -*---------------------------------------------------------------------------- -*/ -static void -LXSetupForScanlineImageWrite(ScrnInfoPtr pScrni, int rop, uint planemask, - int trans_color, int bpp, int depth) -{ - int Bpp = (bpp + 7) >> 3; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForScanlineImageWrite() rop %#x %#x %#x %d %d\n", - rop, planemask, trans_color, bpp, depth); - rop &= 0x0F; - gp_set_source_format(lx_src_fmt[Bpp - 1]); - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); - giwr.transparent = (trans_color == -1) ? 0 : 1; - giwr.color = trans_color; -} - -/*---------------------------------------------------------------------------- - * LXSubsequentScanlineImageWriteRect - * - * Description : see LXSetupForScanlineImageWrite. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int copy area width (pixels) - * h int copy area height (pixels) - * skipleft int x margin (pixels) to skip (not enabled) - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrni, - int x, int y, int w, int h, int skipleft) -{ - DBLOG(2, "LXSubsequentScanlineImageWriteRect() rop %d,%d %dx%d %d\n", x, - y, w, h, skipleft); - giwr.x = x; - giwr.y = y; - giwr.w = w; - giwr.h = h; - /* since the image buffer must be not busy (it may be busy from - * a previous ScanlineWriteImage), we must add a Sync here */ -#if !LX_USE_OFFSCRN_MEM - LXAccelSync(pScrni); -#endif -} - -/*---------------------------------------------------------------------------- - * LXSubsquentImageWriteScanline - * - * Description : see LXSetupForScanlineImageWrite. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * bufno int scanline number in write group - * - * Returns :none - * - * Sample application uses (non-transparent): - * - Moving windows. - * - x11perf: scroll tests (-scroll500). - * - x11perf: copy from window to window (-copywinwin500). - * - *---------------------------------------------------------------------------*/ -static void -LXSubsequentImageWriteScanline(ScrnInfoPtr pScrni, int bufno) -{ - GeodeRec *pGeode; - int blt_height = 0; - - DBLOG(3, "LXSubsequentImageWriteScanline() %d\n", bufno); - pGeode = GEODEPTR(pScrni); - - if ((blt_height = pGeode->NoOfImgBuffers) > giwr.h) - blt_height = giwr.h; - if (++bufno < blt_height) - return; - - gp_declare_blt(ENABLE_PREFETCH); - if (giwr.transparent) { - gp_set_source_transparency(giwr.color, ~0); - } -#if !LX_USE_OFFSCRN_MEM - gp_screen_to_screen_blt(CALC_FBOFFSET(giwr.x, giwr.y), ImgBufOffset, - giwr.w, blt_height, 0); - LXAccelSync(pScrni); -#else - gp_color_bitmap_to_screen_blt(CALC_FBOFFSET(giwr.x, giwr.y), 0, - giwr.w, blt_height, ImgLnsBuffers, pGeode->AccelPitch); -#endif - giwr.h -= blt_height; - giwr.y += blt_height; -} - -/* LX_SCANLINE_SUPPORT */ -#endif - -#if LX_CPU2SCREXP_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForScanlineCPUToScreenColorExpandFill - * - * Description :SetupFor/Subsequent CPUToScreenColorExpandFill and - * ColorExpandScanline routines provide an interface for - * doing expansion blits from source patterns stored in - * system memory. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * fg int foreground color - * bg int -1 (transparent) or background color - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * - * Returns :none. - *---------------------------------------------------------------------------*/ - -static void -LXSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni, - int fg, int bg, int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForScanlineCPUToScreenColorExpandFill() " - "fg %#x bg %#x rop %#x %#x\n", fg, bg, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_mono_source(bg, fg, (bg == -1)); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); - gc2s.bpp = 1; - gc2s.transparent = 0; - gc2s.color = 0; -} - -/*---------------------------------------------------------------------------- - * LXSubsequentScanlineCPUToScreenColorExpandFill - * - * Description :see LXSetupForScanlineCPUToScreenColorExpandFill - * - * Parameters: - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * - * Returns :none - * - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrni, - int x, int y, int w, int h, int skipleft) -{ - DBLOG(2, - "LXSubsequentScanlineCPUToScreenColorExpandFill() %d,%d %dx%d %d\n", - x, y, w, h, skipleft); - gc2s.x = x; - gc2s.y = y; - gc2s.w = w; - gc2s.h = h; -} - -/*---------------------------------------------------------------------------- - * LXSubsequentColorExpandScanline - * - * Description :see LXSetupForScanlineCPUToScreenColorExpandFill - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * bufno int scanline number in write group - * - * Returns :none -*---------------------------------------------------------------------------- -*/ -static void -LXSubsequentColorExpandScanline(ScrnInfoPtr pScrni, int bufno) -{ - GeodeRec *pGeode; - ulong srcpitch; - int blt_height = 0; - - DBLOG(3, "LXSubsequentColorExpandScanline() %d\n", bufno); - pGeode = GEODEPTR(pScrni); - - if ((blt_height = pGeode->NoOfImgBuffers) > gc2s.h) - blt_height = gc2s.h; - if (++bufno < blt_height) - return; - - gp_declare_blt(ENABLE_PREFETCH); - /* convert from bits to dwords */ - srcpitch = ((pGeode->AccelPitch + 31) >> 5) << 2; - gp_mono_bitmap_to_screen_blt(CALC_FBOFFSET(gc2s.x, gc2s.y), 0, gc2s.w, - blt_height, ClrLnsBuffers, srcpitch); - gc2s.h -= blt_height; - gc2s.y += blt_height; -} - -/* LX_CPU2SCREXP_SUPPORT */ -#endif - -#if LX_SCR2SCREXP_SUPPORT - -/*---------------------------------------------------------------------------- - * LXSetupForScreenToScreenColorExpandFill - * - * Description :SetupFor/Subsequent ScreenToScreenColorExpandFill and - * ColorExpandScanline routines provide an interface for - * doing expansion blits from source patterns stored in - * video memory. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * fg int foreground color - * bg int -1 (transparent) or background color - * rop int unmapped raster operation - * planemask uint -1 (copy) or pattern data - * - * Returns :none. - *---------------------------------------------------------------------------*/ - -static void -LXSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, int fg, int bg, - int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForScreenToScreenColorExpandFill() " - "fg %#x bg %#x rop %#x %#x\n", fg, bg, rop, planemask); - rop &= 0x0F; - gp_declare_blt(0); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = SDfn[rop]); - } else { - gp_set_raster_operation(ROP = SDfn_PM[rop]); - gp_set_solid_pattern(planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_set_mono_source(bg, fg, (bg == -1)); - gp_write_parameters(); -} - -/*---------------------------------------------------------------------------- - * LXSubsequentScreenToScreenColorExpandFill - * - * Description :see LXSetupForScreenToScreenColorExpandFill - * - * Parameters: - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * w int fill area width (pixels) - * h int fill area height (pixels) - * offset int initial x offset - * - * Returns :none - * - *---------------------------------------------------------------------------*/ -static void -LXSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrni, - int x, int y, int w, int h, int srcx, int srcy, int offset) -{ - int flags; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSubsequentScreenToScreenColorExpandFill() %d,%d %dx%d %d,%d %d\n", - x, y, w, h, srcx, srcy, offset); - flags = lx_flags3(srcx, srcy, x, y, w, h); - gp_declare_blt(flags); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_mono_expand_blt(CALC_FBOFFSET(x, y), CALC_FBOFFSET(srcx, srcy), offset, - w, h, 0); -} - -/* LX_SCR2SCREXP_SUPPORT */ -#endif - -#define VM_X_MAJOR 0 -#define VM_Y_MAJOR 1 -#define VM_MAJOR_INC 2 -#define VM_MAJOR_DEC 0 -#define VM_MINOR_INC 4 -#define VM_MINOR_DEC 0 - -static ushort vmode[] = { - VM_X_MAJOR | VM_MAJOR_INC | VM_MINOR_INC, /* !XDECR !YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_INC | VM_MINOR_INC, /* !XDECR !YDECR YMAJOR */ - VM_X_MAJOR | VM_MAJOR_INC | VM_MINOR_DEC, /* !XDECR YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_DEC | VM_MINOR_INC, /* !XDECR YDECR YMAJOR */ - VM_X_MAJOR | VM_MAJOR_DEC | VM_MINOR_INC, /* XDECR !YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_INC | VM_MINOR_DEC, /* XDECR !YDECR YMAJOR */ - VM_X_MAJOR | VM_MAJOR_DEC | VM_MINOR_DEC, /* XDECR YDECR !YMAJOR */ - VM_Y_MAJOR | VM_MAJOR_DEC | VM_MINOR_DEC, /* XDECR YDECR YMAJOR */ -}; - -#define ABS(_val1, _val2) (((_val1) > (_val2)) ? \ - ((_val1)-(_val2)) : ((_val2) - (_val1))) - -#if LX_BRES_LINE_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForSolidLine - * - * Description :SetupForSolidLine and Subsequent HorVertLine TwoPointLine - * BresenhamLine provides an interface for drawing thin - * solid lines. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * color int foreground fill color - * rop int unmapped raster op - * planemask uint -1 (fill) or pattern data (not enabled) - * - * Returns :none -*---------------------------------------------------------------------------*/ -static void -LXSetupForSolidLine(ScrnInfoPtr pScrni, int color, int rop, uint planemask) -{ - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXSetupForSolidLine() %#x %#x %#x\n", color, rop, planemask); - rop &= 0x0F; - gp_declare_vector(CIMGP_BLTFLAGS_HAZARD); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = PDfn[rop]); - } else { - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source(planemask); - } - gp_set_solid_pattern((ulong) color); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentSolidBresenhamLine - * - * Description :see LXSetupForSolidLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x1 int destination x offset - * y1 int destination y offset - * absmaj int Bresenman absolute major - * absmin int Bresenman absolute minor - * err int Bresenman initial error term - * len int length of the vector (pixels) - * octant int specifies sign and magnitude relationships - * used to determine axis of magor rendering - * and direction of vector progress. - * - * Returns :none - * - * - Window outlines on window move. - * - x11perf: line segments (-line500). - * - x11perf: line segments (-seg500). - *---------------------------------------------------------------------------*/ -static void -LXSubsequentSolidBresenhamLine(ScrnInfoPtr pScrni, int x1, int y1, - int absmaj, int absmin, int err, int len, int octant) -{ - int x2, y2, flags; - long axial, diagn; - - DBLOG(2, "LXSubsequentSolidBresenhamLine() %d,%d %d %d, %d %d, %d\n", - x1, y1, absmaj, absmin, err, len, octant); - if (len <= 0) - return; - lx_endpt(x1, y1, len, absmaj, absmin, err, octant, &x2, &y2); - flags = lx_flags2(x1, y1, x2 + 1, y2 + 1); - gp_declare_vector(flags); - axial = absmin; - err += axial; - diagn = absmin - absmaj; - gp_bresenham_line(CALC_FBOFFSET(x1, y1), len, err, axial, diagn, - vmode[octant]); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentSolidTwoPointLine - * - * Description :see LXSetupForSolidLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x0 int destination x start offset - * y0 int destination y start offset - * x1 int destination x end offset - * y1 int destination y end offset - * flags int OMIT_LAST, dont draw last pixel (not used) - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentSolidTwoPointLine(ScrnInfoPtr pScrni, int x0, int y0, - int x1, int y1, int flags) -{ - long dx, dy, dmaj, dmin, octant, bias; - long axial, diagn, err, len; - - DBLOG(2, "LXSubsequentSolidTwoPointLine() %d,%d %d,%d, %#x\n", - x0, y0, x1, y1, flags); - - if ((dx = x1 - x0) < 0) - dx = -dx; - if ((dy = y1 - y0) < 0) - dy = -dy; - - if (dy >= dx) { - dmaj = dy; - dmin = dx; - octant = YMAJOR; - } else { - dmaj = dx; - dmin = dy; - octant = 0; - } - len = dmaj; - if ((flags & OMIT_LAST) == 0) - ++len; - if (len <= 0) - return; - if (x1 < x0) - octant |= XDECREASING; - if (y1 < y0) - octant |= YDECREASING; - - flags = lx_flags2(x0, y0, x1 + 1, y1 + 1); - gp_declare_vector(flags); - axial = dmin << 1; - bias = miGetZeroLineBias(pScrni->pScreen); - err = axial - dmaj - ((bias >> octant) & 1); - diagn = (dmin - dmaj) << 1; - gp_bresenham_line(CALC_FBOFFSET(x0, y0), len, err, axial, diagn, - vmode[octant]); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentSolidHorVertLine - * - * Description :see LXSetupForSolidLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x int destination x offset - * y int destination y offset - * len int length of the vector (pixels) - * dir int DEGREES_270 or DEGREES_0 line direction - * - * Sample application uses: - * - Window outlines on window move. - * - x11perf: line segments (-hseg500). - * - x11perf: line segments (-vseg500). - *--------------------------------------------------------------------------- - */ -static void -LXSubsequentSolidHorVertLine(ScrnInfoPtr pScrni, - int x, int y, int len, int dir) -{ - int flags, w, h; - - DBLOG(2, "LXSubsequentHorVertLine() %d,%d %d %d\n", x, y, len, dir); - gp_declare_blt(0); - if (dir == DEGREES_0) { - w = len; - h = 1; - } else { - w = 1; - h = len; - } - flags = lx_flags1(x, y, w, h); - gp_declare_blt(flags); - gp_pattern_fill(CALC_FBOFFSET(x, y), ((dir == DEGREES_0) ? len : 1), - ((dir == DEGREES_0) ? 1 : len)); -} - -/* LX_BRES_LINE_SUPPORT */ -#endif - -#if LX_DASH_LINE_SUPPORT -/*---------------------------------------------------------------------------- - * LXSetupForDashedLine - * - * Description :SetupForDashedLine and Subsequent TwoPointLine - * BresenhamLine provides an interface for drawing thin - * dashed lines. - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * fg int foreground fill color - * bg int -1 (transp) or background fill color - * rop int unmapped raster op - * planemask uint -1 (fill) or pattern data (not enabled) - * length int pattern length (bits) - * pattern uchar* dash pattern mask - * - * Returns :none -*---------------------------------------------------------------------------*/ -static void -LXSetupForDashedLine(ScrnInfoPtr pScrni, - int fg, int bg, int rop, uint planemask, int length, uchar * pattern) -{ - int n; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, - "LXSetupForDashedLine() " - "fg %#x bg %#x rop %#x pm %#x len %d, pat %#x\n", - fg, bg, rop, planemask, length, *(ulong *) pattern); - gdln.fg = fg; - gdln.bg = bg; - gdln.len = length; - n = (length + 7) / 8; - if (n > sizeof(gdln.pat)) - n = sizeof(gdln.pat); - memcpy(&gdln.pat, pattern, n); - rop &= 0x0F; - gp_declare_vector(CIMGP_BLTFLAGS_HAZARD); - if (planemask == ~0U) { - gp_set_raster_operation(ROP = PDfn[rop]); - } else { - gp_set_raster_operation(ROP = PDfn_SM[rop]); - gp_set_solid_source(planemask); - } - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - gp_write_parameters(); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentDashedBresenhamLine - * - * Description :see LXSetupForDashedLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x1 int destination x offset - * y1 int destination y offset - * absmaj int Bresenman absolute major - * absmin int Bresenman absolute minor - * err int Bresenman initial error term - * len int length of the vector (pixels) - * octant int specifies sign and magnitude relationships - * used to determine axis of magor rendering - * and direction of vector progress. - * phase int initial pattern offset at x1,y1 - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentDashedBresenhamLine(ScrnInfoPtr pScrni, int x1, int y1, - int absmaj, int absmin, int err, int len, int octant, int phase) -{ - int x2, y2, flags; - long axial, diagn; - ulong pattern; - - DBLOG(2, "LXSubsequentDashedBresenhamLine() %d,%d %d %d, %d %d, %d %d\n", - x1, y1, absmaj, absmin, err, len, octant, phase); - if (len <= 0) - return; - pattern = gdln.pat; - if (phase > 0) { - int n = gdln.len - phase; - - pattern = ((pattern >> phase) & ((1UL << n) - 1)) | (pattern << n); - } - gp_set_vector_pattern(pattern, gdln.fg, gdln.len); - lx_endpt(x1, y1, len, absmaj, absmin, err, octant, &x2, &y2); - flags = lx_flags2(x1, y1, x2 + 1, y2 + 1); - gp_declare_vector(flags); - axial = absmin; - err += axial; - diagn = absmin - absmaj; - gp_bresenham_line(CALC_FBOFFSET(x1, y1), len, err, axial, diagn, - vmode[octant]); -} - -/*--------------------------------------------------------------------------- - * LXSubsequentDashedTwoPointLine - * - * Description :see LXSetupForDashedLine - * - * Arg Type Comment - * pScrni ScrnInfoPtr pointer to Screeen info - * x0 int destination x start offset - * y0 int destination y start offset - * x1 int destination x end offset - * y1 int destination y end offset - * flags int OMIT_LAST, dont draw last pixel (not used) - * phase int initial pattern offset at x1,y1 - * - * Returns :none - *---------------------------------------------------------------------------*/ -static void -LXSubsequentDashedTwoPointLine(ScrnInfoPtr pScrni, int x0, int y0, - int x1, int y1, int flags, int phase) -{ - ulong pattern; - long dx, dy, dmaj, dmin, octant, bias; - long axial, diagn, err, len; - - DBLOG(2, "LXSubsequentDashedTwoPointLine() %d,%d %d,%d, %#x %d\n", - x0, y0, x1, y1, flags, phase); - - if ((dx = x1 - x0) < 0) - dx = -dx; - if ((dy = y1 - y0) < 0) - dy = -dy; - if (dy >= dx) { - dmaj = dy; - dmin = dx; - octant = YMAJOR; - } else { - dmaj = dx; - dmin = dy; - octant = 0; - } - len = dmaj; - if ((flags & OMIT_LAST) == 0) - ++len; - if (len <= 0) - return; - if (x1 < x0) - octant |= XDECREASING; - if (y1 < y0) - octant |= YDECREASING; - - pattern = gdln.pat; - if (phase > 0) { - int n = gdln.len - phase; - - pattern = ((pattern >> phase) & ((1UL << n) - 1)) | (pattern << n); - } - gp_set_vector_pattern(pattern, gdln.fg, gdln.len); - flags = lx_flags2(x0, y0, x1 + 1, y1 + 1); - gp_declare_vector(flags); - - axial = dmin << 1; - bias = miGetZeroLineBias(pScrni->pScreen); - err = axial - dmaj - ((bias >> octant) & 1); - diagn = (dmin - dmaj) << 1; - gp_bresenham_line(CALC_FBOFFSET(x0, y0), len, err, axial, diagn, - vmode[octant]); -} - -/* LX_DASH_LINE_SUPPORT */ -#endif - -#if LX_WRITE_PIXMAP_SUPPORT -void -LXWritePixmap(ScrnInfoPtr pScrni, int x, int y, int w, int h, - unsigned char *src, int srcwidth, int rop, - unsigned int planemask, int trans, int bpp, int depth) -{ - int flags, dx, dy; - int Bpp = (bpp + 7) >> 3; - unsigned long offset; - GeodeRec *pGeode = GEODEPTR(pScrni); - - DBLOG(2, "LXWritePixmap() %d,%d %dx%d, s%#x sp%d %#x %#x %#x %d %d\n", - x, y, w, h, src, srcwidth, rop, planemask, trans, bpp, depth); - - rop &= 0x0F; - gp_set_source_format(lx_src_fmt[Bpp - 1]); - /* must assign before lx_flags */ - ROP = planemask == ~0U ? SDfn[rop] : SDfn_PM[rop]; - - if (src >= pGeode->FBBase && src < pGeode->FBBase + pGeode->FBSize) { - offset = src - pGeode->FBBase; - dx = (offset & ((1 << gu3_yshift) - 1)) >> Bpp; - dy = offset >> gu3_yshift; - flags = lx_flags3(x, y, dx, dy, w, h); - } else - flags = ENABLE_PREFETCH; - - gp_declare_blt(flags); - gp_set_raster_operation(ROP); - if (planemask != ~0U) - gp_set_solid_pattern(planemask); - gp_set_strides(pGeode->AccelPitch, pGeode->AccelPitch); - if (trans != -1) { - gp_set_source_transparency(trans, ~0); - } - - gp_color_bitmap_to_screen_blt(CALC_FBOFFSET(x, y), 0, w, h, src, - srcwidth); - SET_SYNC_FLAG(pGeode->AccelInfoRec); -} -#endif - -/*---------------------------------------------------------------------------- - * LXAccelInit. - * - * Description :Create and initialize XAAInfoRec structure. - * The XAAInfoRec structure contains many fields, most of - * which are primitive function pointers and flags. Each - * primitive will have two or more functions and a set of - * associated associated flags. These functions can be - * classified into two principle classes, the "SetupFor" - * and "Subsequent" functions. The "SetupFor" function tells - * the driver that the hardware should be initialized for - * a particular type of graphics operation. After the - * "SetupFor" function, one or more calls to the "Subsequent" - * function will be made to indicate that an instance of the - * particular primitive should be rendered by the hardware. - * - * Arg Type Comment - * pScrn ScreenPtr pointer to active Screen data - * - * Returns :TRUE on success and FALSE on Failure - * - * Comments :This function is called in LXScreenInit in - * amd_lx_driver.c to initialize acceleration. - *---------------------------------------------------------------------------*/ -Bool -LXAccelInit(ScreenPtr pScrn) -{ - GeodeRec *pGeode; - ScrnInfoPtr pScrni; - -#if DEBUGLVL>0 - if (zdfp == NULL) { - zdfp = fopen("/tmp/xwin.log", "w"); - setbuf(zdfp, NULL); - } -#endif - DBLOG(2, "LXAccelInit()\n"); - - pScrni = xf86Screens[pScrn->myNum]; - pGeode = GEODEPTR(pScrni); - - switch (pScrni->bitsPerPixel) { - case 8: - gu3_img_fmt = CIMGP_SOURCE_FMT_3_3_2; - break; - case 16: - gu3_img_fmt = CIMGP_SOURCE_FMT_0_5_6_5; - break; - case 32: - gu3_img_fmt = CIMGP_SOURCE_FMT_8_8_8_8; - break; - } - - gu3_xshift = pScrni->bitsPerPixel >> 4; - - switch (pGeode->AccelPitch) { - case 1024: - gu3_yshift = 10; - break; - case 2048: - gu3_yshift = 11; - break; - case 4096: - gu3_yshift = 12; - break; - case 8192: - gu3_yshift = 13; - break; - } - - /* Getting the pointer for acceleration Inforecord */ - pGeode->AccelInfoRec = localRecPtr = XAACreateInfoRec(); - - /* SET ACCELERATION FLAGS */ - localRecPtr->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS | - LINEAR_FRAMEBUFFER; - - /* HOOK SYNCRONIZARION ROUTINE */ - localRecPtr->Sync = LXAccelSync; - -#if LX_FILL_RECT_SUPPORT - /* HOOK FILLED RECTANGLES */ - HOOK(SetupForSolidFill); - HOOK(SubsequentSolidFillRect); - localRecPtr->SolidFillFlags = 0; -#endif - -#if LX_MONO_8X8_PAT_SUPPORT - /* HOOK 8x8 Mono EXPAND PATTERNS */ - HOOK(SetupForMono8x8PatternFill); - HOOK(SubsequentMono8x8PatternFillRect); - localRecPtr->Mono8x8PatternFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD | - HARDWARE_PATTERN_PROGRAMMED_BITS | HARDWARE_PATTERN_PROGRAMMED_ORIGIN; -#endif - -#if LX_CLREXP_8X8_PAT_SUPPORT - /* Color expansion */ - HOOK(SetupForColor8x8PatternFill); - HOOK(SubsequentColor8x8PatternFillRect); - localRecPtr->Color8x8PatternFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD | - NO_TRANSPARENCY | HARDWARE_PATTERN_PROGRAMMED_ORIGIN; -#endif - -#if LX_SCR2SCRCPY_SUPPORT - /* HOOK SCREEN TO SCREEN COPIES - * Set flag to only allow copy if transparency is enabled. - */ - HOOK(SetupForScreenToScreenCopy); - HOOK(SubsequentScreenToScreenCopy); - localRecPtr->ScreenToScreenCopyFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif - -#if LX_BRES_LINE_SUPPORT - /* HOOK BRESENHAM SOLID LINES */ - localRecPtr->SolidLineFlags = NO_PLANEMASK; - HOOK(SetupForSolidLine); - HOOK(SubsequentSolidBresenhamLine); - HOOK(SubsequentSolidHorVertLine); - HOOK(SubsequentSolidTwoPointLine); - localRecPtr->SolidBresenhamLineErrorTermBits = 15; -#endif - -#if LX_DASH_LINE_SUPPORT - /* HOOK BRESENHAM DASHED LINES */ - localRecPtr->DashedLineFlags = NO_PLANEMASK | TRANSPARENCY_ONLY | - LINE_PATTERN_LSBFIRST_LSBJUSTIFIED | SCANLINE_PAD_DWORD; - HOOK(SetupForDashedLine); - HOOK(SubsequentDashedBresenhamLine); - HOOK(SubsequentDashedTwoPointLine); - localRecPtr->DashedBresenhamLineErrorTermBits = 15; - localRecPtr->DashPatternMaxLength = 32; -#endif - -#if LX_SCR2SCREXP_SUPPORT - /* Color expansion */ - HOOK(SetupForScreenToScreenColorExpandFill); - HOOK(SubsequentScreenToScreenColorExpandFill); - localRecPtr->ScreenToScreenColorExpandFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif - - if (pGeode->AccelImageWriteBuffers) { -#if LX_SCANLINE_SUPPORT - localRecPtr->ScanlineImageWriteBuffers = - pGeode->AccelImageWriteBuffers; - localRecPtr->NumScanlineImageWriteBuffers = pGeode->NoOfImgBuffers; - HOOK(SetupForScanlineImageWrite); - HOOK(SubsequentScanlineImageWriteRect); - HOOK(SubsequentImageWriteScanline); - localRecPtr->ScanlineImageWriteFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif -#if !LX_USE_OFFSCRN_MEM - ImgBufOffset = pGeode->AccelImageWriteBuffers[0] - pGeode->FBBase; -#else - ImgLnsBuffers = (uchar *) pGeode->AccelImageWriteBuffers[0]; -#endif - } else { - localRecPtr->PixmapCacheFlags = DO_NOT_BLIT_STIPPLES; - } - - if (pGeode->AccelColorExpandBuffers) { -#if LX_CPU2SCREXP_SUPPORT - /* Color expansion */ - localRecPtr->ScanlineColorExpandBuffers = - pGeode->AccelColorExpandBuffers; - localRecPtr->NumScanlineColorExpandBuffers = - pGeode->NoOfColorExpandLines; - HOOK(SetupForScanlineCPUToScreenColorExpandFill); - HOOK(SubsequentScanlineCPUToScreenColorExpandFill); - HOOK(SubsequentColorExpandScanline); - localRecPtr->ScanlineCPUToScreenColorExpandFillFlags = - BIT_ORDER_IN_BYTE_MSBFIRST | SCANLINE_PAD_DWORD; -#endif - ClrLnsBuffers = (uchar *) pGeode->AccelColorExpandBuffers[0]; - } -#if LX_WRITE_PIXMAP_SUPPORT - HOOK(WritePixmap); -#endif - - return (XAAInit(pScrn, localRecPtr)); -} - -/* END OF FILE */ |