259 lines
7.5 KiB
C
259 lines
7.5 KiB
C
/*
|
|
* Copyright © 2000 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.
|
|
*/
|
|
|
|
#ifndef _IGSDRAW_H_
|
|
#define _IGSDRAW_H_
|
|
|
|
extern CARD8 igsPatRop[];
|
|
|
|
#define SetupIgs(s) KdScreenPriv(s); \
|
|
igsCardInfo(pScreenPriv); \
|
|
Cop5xxx *cop = igsc->cop; \
|
|
int cop_stride = pScreenPriv->screen->fb[0].pixelStride
|
|
|
|
#define _igsWaitLoop(cop,mask,value) { \
|
|
int __loop = 1000000; \
|
|
while (((cop)->control & (mask)) != (value)) { \
|
|
if (--__loop <= 0) { \
|
|
FatalError("Warning: igsWaitLoop 0x%x 0x%x failed\n", mask, value); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define _igsWaitDone(cop) _igsWaitLoop(cop, \
|
|
(IGS_CONTROL_BUSY| \
|
|
IGS_CONTROL_MALLWBEPTZ), \
|
|
0)
|
|
|
|
#if 1
|
|
#define _igsWaitFull(cop) _igsWaitLoop(cop, \
|
|
IGS_CONTROL_CMDFF, \
|
|
0)
|
|
#else
|
|
#define _igsWaitFull(cop) _igsWaitDone(cop)
|
|
#endif
|
|
|
|
#define _igsWaitIdleEmpty(cop) _igsWaitDone(cop)
|
|
#define _igsWaitHostBltAck(cop) _igsWaitLoop(cop, \
|
|
(IGS_CONTROL_HBACKZ| \
|
|
IGS_CONTROL_CMDFF), \
|
|
0)
|
|
|
|
#define _igsReset(cop) ((cop)->control = 0)
|
|
|
|
#define IgsInvertBits32(v) { \
|
|
v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555); \
|
|
v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333); \
|
|
v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f); \
|
|
}
|
|
|
|
#define IgsInvertBits16(v) { \
|
|
v = ((v & 0x5555) << 1) | ((v >> 1) & 0x5555); \
|
|
v = ((v & 0x3333) << 2) | ((v >> 2) & 0x3333); \
|
|
v = ((v & 0x0f0f) << 4) | ((v >> 4) & 0x0f0f); \
|
|
}
|
|
|
|
#define IgsInvertBits8(v) { \
|
|
v = ((v & 0x55) << 1) | ((v >> 1) & 0x55); \
|
|
v = ((v & 0x33) << 2) | ((v >> 2) & 0x33); \
|
|
v = ((v & 0x0f) << 4) | ((v >> 4) & 0x0f); \
|
|
}
|
|
|
|
#define IgsByteSwap32(x) ((x) = (((x) >> 24) | \
|
|
(((x) >> 8) & 0xff00) | \
|
|
(((x) << 8) & 0xff0000) | \
|
|
((x) << 24)))
|
|
|
|
#define IgsByteSwap16(x) ((x) = ((x) << 8) | ((x) >> 8))
|
|
|
|
#define igsPatternDimOk(d) ((d) <= IGS_PATTERN_WIDTH && (((d) & ((d) - 1)) == 0))
|
|
|
|
#if BITMAP_BIT_ORDER == LSBFirst
|
|
#define IgsAdjustBits32(b) IgsInvertBits32(b)
|
|
#define IgsAdjustBits16(x) IgsInvertBits16(x)
|
|
#else
|
|
#define IgsAdjustBits32(x) IgsByteSwap32(x)
|
|
#define IgsAdjustBits16(x) IgsByteSwap16(x)
|
|
#endif
|
|
|
|
#define _igsSetSolidRect(cop,alu,pm,pix,cmd) {\
|
|
_igsWaitFull(cop); \
|
|
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
|
(cop)->fg = (pix); \
|
|
(cmd) = (IGS_DRAW_T_B | \
|
|
IGS_DRAW_L_R | \
|
|
IGS_DRAW_ALL | \
|
|
IGS_PIXEL_FG | \
|
|
IGS_HBLT_DISABLE | \
|
|
IGS_SRC2_NORMAL | \
|
|
IGS_STEP_PXBLT | \
|
|
IGS_FGS_FG | \
|
|
IGS_BGS_BG); \
|
|
}
|
|
|
|
#define _igsSetTiledRect(cop,alu,pm,base,cmd) {\
|
|
_igsWaitFull(cop); \
|
|
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
|
(cop)->src1_stride = IGS_PATTERN_WIDTH - 1; \
|
|
(cop)->src1_start = (base); \
|
|
(cmd) = (IGS_DRAW_T_B | \
|
|
IGS_DRAW_L_R | \
|
|
IGS_DRAW_ALL | \
|
|
IGS_PIXEL_TILE | \
|
|
IGS_HBLT_DISABLE | \
|
|
IGS_SRC2_NORMAL | \
|
|
IGS_STEP_PXBLT | \
|
|
IGS_FGS_SRC | \
|
|
IGS_BGS_BG); \
|
|
}
|
|
|
|
#define _igsSetStippledRect(cop,alu,pm,pix,base,cmd) {\
|
|
_igsWaitFull(cop); \
|
|
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
|
(cop)->src1_start = (base); \
|
|
(cop)->fg = (pix); \
|
|
(cmd) = (IGS_DRAW_T_B | \
|
|
IGS_DRAW_L_R | \
|
|
IGS_DRAW_ALL | \
|
|
IGS_PIXEL_STIP_TRANS | \
|
|
IGS_HBLT_DISABLE | \
|
|
IGS_SRC2_NORMAL | \
|
|
IGS_STEP_PXBLT | \
|
|
IGS_FGS_FG | \
|
|
IGS_BGS_BG); \
|
|
}
|
|
|
|
#define _igsSetOpaqueStippledRect(cop,alu,pm,_fg,_bg,base,cmd) {\
|
|
_igsWaitFull(cop); \
|
|
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
|
(cop)->src1_start = (base); \
|
|
(cop)->fg = (_fg); \
|
|
(cop)->bg = (_bg); \
|
|
(cmd) = (IGS_DRAW_T_B | \
|
|
IGS_DRAW_L_R | \
|
|
IGS_DRAW_ALL | \
|
|
IGS_PIXEL_STIP_OPAQUE | \
|
|
IGS_HBLT_DISABLE | \
|
|
IGS_SRC2_NORMAL | \
|
|
IGS_STEP_PXBLT | \
|
|
IGS_FGS_FG | \
|
|
IGS_BGS_BG); \
|
|
}
|
|
|
|
#define _igsRect(cop,x,y,w,h,cmd) { \
|
|
_igsWaitFull(cop); \
|
|
(cop)->dst_start = (x) + (y) * (cop_stride); \
|
|
(cop)->dim = IGS_MAKE_DIM(w-1,h-1); \
|
|
(cop)->operation = (cmd); \
|
|
}
|
|
|
|
#define _igsPatRect(cop,x,y,w,h,cmd) { \
|
|
_igsWaitFull(cop); \
|
|
(cop)->dst_start = (x) + (y) * (cop_stride); \
|
|
(cop)->rotate = IGS_MAKE_ROTATE(x&7,y&7); \
|
|
(cop)->dim = IGS_MAKE_DIM(w-1,h-1); \
|
|
(cop)->operation = (cmd); \
|
|
}
|
|
|
|
#define _igsSetBlt(cop,alu,pm,backwards,upsidedown,cmd) { \
|
|
_igsWaitFull(cop); \
|
|
(cop)->mix = IGS_MAKE_MIX(alu,alu); \
|
|
(cop)->src1_stride = cop_stride - 1; \
|
|
(cmd) = (IGS_DRAW_ALL | \
|
|
IGS_PIXEL_FG | \
|
|
IGS_HBLT_DISABLE | \
|
|
IGS_SRC2_NORMAL | \
|
|
IGS_STEP_PXBLT | \
|
|
IGS_FGS_SRC | \
|
|
IGS_BGS_BG); \
|
|
if (backwards) (cmd) |= IGS_DRAW_R_L; \
|
|
if (upsidedown) (cmd) |= IGS_DRAW_B_T; \
|
|
}
|
|
|
|
#if 0
|
|
#define _igsPreparePlaneBlt(cop) { \
|
|
_igsReset(cop); \
|
|
(cop)->dst_stride = cop_stride - 1; \
|
|
(cop)->src1_stride = cop_stride - 1; \
|
|
(cop)->src2_stride = cop_stride - 1; \
|
|
(cop)->format = IGS_FORMAT_16BPP; \
|
|
(cop)->src1_start = 0; \
|
|
(cop)->src2_start = 0; \
|
|
}
|
|
#else
|
|
#define _igsPreparePlaneBlt(cop)
|
|
#endif
|
|
|
|
#define _igsSetTransparentPlaneBlt(cop,alu,pm,fg_pix,cmd) { \
|
|
_igsWaitIdleEmpty(cop); \
|
|
_igsPreparePlaneBlt(cop); \
|
|
(cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[alu]); \
|
|
(cop)->fg = (fg_pix); \
|
|
(cmd) = (IGS_DRAW_T_B | \
|
|
IGS_DRAW_L_R | \
|
|
IGS_DRAW_ALL | \
|
|
IGS_PIXEL_FG | \
|
|
IGS_HBLT_WRITE_2 | \
|
|
IGS_SRC2_MONO_TRANS | \
|
|
IGS_STEP_TERNARY_PXBLT | \
|
|
IGS_FGS_FG | \
|
|
IGS_BGS_BG); \
|
|
}
|
|
|
|
#define _igsSetOpaquePlaneBlt(cop,alu,pm,fg_pix,bg_pix,cmd) { \
|
|
_igsWaitIdleEmpty(cop); \
|
|
_igsPreparePlaneBlt(cop); \
|
|
(cop)->mix = IGS_MAKE_MIX(igsPatRop[alu],igsPatRop[alu]); \
|
|
(cop)->fg = (fg_pix); \
|
|
(cop)->bg = (bg_pix); \
|
|
(cmd) = (IGS_DRAW_T_B | \
|
|
IGS_DRAW_L_R | \
|
|
IGS_DRAW_ALL | \
|
|
IGS_PIXEL_FG | \
|
|
IGS_HBLT_WRITE_2 | \
|
|
IGS_SRC2_MONO_OPAQUE | \
|
|
IGS_STEP_TERNARY_PXBLT | \
|
|
IGS_FGS_FG | \
|
|
IGS_BGS_BG); \
|
|
}
|
|
|
|
#define _igsPlaneBlt(cop,x,y,w,h,cmd) { \
|
|
/* _igsWaitFull(cop); */ \
|
|
(cop)->dst_start = (x) + (y) * (cop_stride); \
|
|
(cop)->dim = IGS_MAKE_DIM((w)-1,(h)-1); \
|
|
(cop)->operation = (cmd); \
|
|
/* _igsWaitHostBltAck(cop); */ \
|
|
}
|
|
|
|
#define _igsBlt(cop,sx,sy,dx,dy,w,h,cmd) { \
|
|
_igsWaitFull(cop); \
|
|
(cop)->dst_start = (dx) + (dy) * cop_stride; \
|
|
(cop)->src1_start = (sx) + (sy) * cop_stride; \
|
|
(cop)->src1_stride = cop_stride - 1; \
|
|
(cop)->dim = IGS_MAKE_DIM(w-1,h-1); \
|
|
(cop)->operation = (cmd); \
|
|
}
|
|
|
|
#define sourceInvarient(alu) (((alu) & 3) == (((alu) >> 2) & 3))
|
|
|
|
#endif
|