df03e80ae9
- Add libdrm and libdri. Portions of the DRI extension are stubbed out. - Use the DRM in the ATI driver when available. This provides a minor performance improvement in x11perf, and opens the possibility of using the 3d hardware for acceleration in the future. - Implement solid fill acceleration for Composite in KAA. - Implement Blend hook for Composite and use it on r128. - Fix a bug of mine that resulted in overuse of offscreen memory. - Fix many miscellaneous bugs in ATI driver and add PCI IDs.
126 lines
3.9 KiB
C
126 lines
3.9 KiB
C
/*
|
|
* $Id$
|
|
*
|
|
* 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.
|
|
*/
|
|
/* $Header$ */
|
|
|
|
#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;
|
|
|
|
if (op >= sizeof(R128BlendOp)/sizeof(R128BlendOp[0]))
|
|
ATI_FALLBACK(("Unsupported op 0x%x\n", op));
|
|
if (pSrcPicture->repeat)
|
|
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? */
|
|
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;
|
|
|
|
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
|