summaryrefslogtreecommitdiff
path: root/hw/kdrive/ati/r128_blendtmp.h
diff options
context:
space:
mode:
Diffstat (limited to 'hw/kdrive/ati/r128_blendtmp.h')
-rw-r--r--hw/kdrive/ati/r128_blendtmp.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/hw/kdrive/ati/r128_blendtmp.h b/hw/kdrive/ati/r128_blendtmp.h
new file mode 100644
index 000000000..57eeb21eb
--- /dev/null
+++ b/hw/kdrive/ati/r128_blendtmp.h
@@ -0,0 +1,125 @@
+/*
+ * $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