135 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright © 2003 Eric Anholt, Anders Carlsson
 | 
						|
 *
 | 
						|
 * 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 Eric Anholt not be used in
 | 
						|
 * advertising or publicity pertaining to distribution of the software without
 | 
						|
 * specific, written prior permission.  Eric Anholt makes no
 | 
						|
 * representations about the suitability of this software for any purpose.  It
 | 
						|
 * is provided "as is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
						|
 * EVENT SHALL ERIC ANHOLT 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.
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef USE_DMA
 | 
						|
#define TAG(x)		x##DMA
 | 
						|
#define LOCALS		RING_LOCALS; \
 | 
						|
			(void)atic
 | 
						|
#define BEGIN(x)	BEGIN_RING(x * 2)
 | 
						|
#define OUT_REG(reg, val) OUT_RING_REG(reg, val)
 | 
						|
#define END()		ADVANCE_RING()
 | 
						|
#else
 | 
						|
#define TAG(x)		x##MMIO
 | 
						|
#define LOCALS		char *mmio = atic->reg_base
 | 
						|
#define BEGIN(x)	ATIWaitAvailMMIO(x)
 | 
						|
#define OUT_REG(reg, val) MMIO_OUT32(mmio, (reg), (val))
 | 
						|
#define END()
 | 
						|
#endif
 | 
						|
 | 
						|
static Bool
 | 
						|
TAG(R128PrepareBlend)(int op, PicturePtr pSrcPicture, PicturePtr pDstPicture,
 | 
						|
    PixmapPtr pSrc, PixmapPtr pDst)
 | 
						|
{
 | 
						|
	KdScreenPriv(pDst->drawable.pScreen);
 | 
						|
	ATIScreenInfo(pScreenPriv);
 | 
						|
	ATICardInfo(pScreenPriv);
 | 
						|
	CARD32 dstDatatype, srcDatatype;
 | 
						|
	LOCALS;
 | 
						|
 | 
						|
	accel_atis = atis;
 | 
						|
 | 
						|
	if (!TAG(ATISetup)(pDst, pSrc))
 | 
						|
		return FALSE;
 | 
						|
 | 
						|
	src_bpp = pSrc->drawable.bitsPerPixel;
 | 
						|
	is_repeat = pSrcPicture->repeat;
 | 
						|
 | 
						|
	if (op >= sizeof(R128BlendOp)/sizeof(R128BlendOp[0]))
 | 
						|
		ATI_FALLBACK(("Unsupported op 0x%x\n", op));
 | 
						|
	if (pSrcPicture->repeat && (pSrc->drawable.width != 1 ||
 | 
						|
	    pSrc->drawable.height != 1))
 | 
						|
		ATI_FALLBACK(("repeat unsupported\n"));
 | 
						|
	if (pSrcPicture->transform != NULL)
 | 
						|
		ATI_FALLBACK(("transform unsupported\n"));
 | 
						|
	if (!R128GetDatatypePict(pDstPicture->format, &dstDatatype))
 | 
						|
		ATI_FALLBACK(("Unsupported dest format 0x%x\n",
 | 
						|
		    pDstPicture->format));
 | 
						|
	if (!R128GetDatatypePict(pSrcPicture->format, &srcDatatype))
 | 
						|
		ATI_FALLBACK(("Unsupported src format 0x%x\n",
 | 
						|
		    pSrcPicture->format));
 | 
						|
 | 
						|
	BEGIN(11);
 | 
						|
	OUT_REG(RADEON_REG_DP_GUI_MASTER_CNTL,
 | 
						|
	    (dstDatatype << 8) |
 | 
						|
	    RADEON_GMC_SRC_DATATYPE_COLOR |
 | 
						|
	    RADEON_GMC_DST_PITCH_OFFSET_CNTL |
 | 
						|
	    RADEON_GMC_CLR_CMP_CNTL_DIS |
 | 
						|
	    RADEON_GMC_AUX_CLIP_DIS |
 | 
						|
	    (ATIBltRop[3] << 16) |
 | 
						|
	    RADEON_GMC_3D_FCN_EN);
 | 
						|
	OUT_REG(R128_REG_TEX_CNTL_C, R128_TEX_ALPHA_EN | R128_TEX_CACHE_FLUSH);
 | 
						|
	OUT_REG(R128_REG_PRIM_TEXTURE_COMBINE_CNTL_C, 0);
 | 
						|
	OUT_REG(R128_REG_SCALE_3D_CNTL,
 | 
						|
	    R128_SCALE_3D_SCALE |
 | 
						|
	    R128BlendOp[op] |
 | 
						|
	    R128_TEX_MAP_ALPHA_IN_TEXTURE);
 | 
						|
	OUT_REG(R128_REG_SCALE_3D_DATATYPE, srcDatatype);
 | 
						|
	OUT_REG(R128_REG_SCALE_PITCH, src_pitch / src_bpp);
 | 
						|
	/* 4.16 fixed point scaling factor? */
 | 
						|
	if (is_repeat) {
 | 
						|
		OUT_REG(R128_REG_SCALE_X_INC, 0);
 | 
						|
		OUT_REG(R128_REG_SCALE_Y_INC, 0);
 | 
						|
	} else {
 | 
						|
		OUT_REG(R128_REG_SCALE_X_INC, 65536);
 | 
						|
		OUT_REG(R128_REG_SCALE_Y_INC, 65536);
 | 
						|
	}
 | 
						|
	OUT_REG(R128_REG_SCALE_HACC, 0x00000000);
 | 
						|
	OUT_REG(R128_REG_SCALE_VACC, 0x00000000);
 | 
						|
	OUT_REG(RADEON_REG_DP_CNTL, 
 | 
						|
	    RADEON_DST_X_LEFT_TO_RIGHT | RADEON_DST_Y_TOP_TO_BOTTOM );
 | 
						|
	END();
 | 
						|
 | 
						|
	return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
TAG(R128Blend)(int srcX, int srcY, int dstX, int dstY, int width, int height)
 | 
						|
{
 | 
						|
	ATIScreenInfo *atis = accel_atis;
 | 
						|
	ATICardInfo *atic = atis->atic;
 | 
						|
	LOCALS;
 | 
						|
 | 
						|
	if (is_repeat) {
 | 
						|
		srcX = 0;
 | 
						|
		srcY = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	BEGIN(4);
 | 
						|
	OUT_REG(R128_REG_SCALE_OFFSET_0, src_offset + srcY * src_pitch + srcX *
 | 
						|
	    (src_bpp >> 3));
 | 
						|
	OUT_REG(R128_REG_SCALE_SRC_HEIGHT_WIDTH, (height << 16) | width);
 | 
						|
	OUT_REG(R128_REG_SCALE_DST_X_Y, (dstX << 16) | dstY);
 | 
						|
	OUT_REG(R128_REG_SCALE_DST_HEIGHT_WIDTH, (height << 16) | width);
 | 
						|
	END();
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
TAG(R128DoneBlend)(void)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
#undef TAG
 | 
						|
#undef LOCALS
 | 
						|
#undef BEGIN
 | 
						|
#undef OUT_REG
 | 
						|
#undef END
 |