Update MGA composite patch commit. (some files were missing in the previous
commit)
This commit is contained in:
parent
e56e24af25
commit
da78a4ddd8
192
hw/kdrive/mga/g400_common.h
Normal file
192
hw/kdrive/mga/g400_common.h
Normal file
|
@ -0,0 +1,192 @@
|
|||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright © 2004 Damien Ciabrini
|
||||
*
|
||||
* 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 Anders Carlsson not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. Anders Carlsson makes no
|
||||
* representations about the suitability of this software for any purpose. It
|
||||
* is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* DAMIEN CIABRINI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL ANDERS CARLSSON 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$ */
|
||||
|
||||
#ifndef __G400_COMMON_H__
|
||||
#define __G400_COMMON_H__
|
||||
|
||||
/* Color registers */
|
||||
#define MGA_REG_DR4 (0x1CD0)
|
||||
#define MGA_REG_DR6 (0x1CD8)
|
||||
#define MGA_REG_DR7 (0x1CDC)
|
||||
#define MGA_REG_DR8 (0x1CE0)
|
||||
#define MGA_REG_DR10 (0x1CE8)
|
||||
#define MGA_REG_DR11 (0x1CEC)
|
||||
#define MGA_REG_DR12 (0x1CF0)
|
||||
#define MGA_REG_DR14 (0x1CF8)
|
||||
#define MGA_REG_DR15 (0x1CFC)
|
||||
|
||||
/* Alpha registers */
|
||||
#define MGA_REG_ALPHASTART (0x2C70)
|
||||
#define MGA_REG_ALPHAXINC (0x2C74)
|
||||
#define MGA_REG_ALPHAYINC (0x2C78)
|
||||
#define MGA_REG_ALPHACTRL (0x2C7C)
|
||||
# define MGA_SRC_ZERO (0x00000000)
|
||||
# define MGA_SRC_ONE (0x00000001)
|
||||
# define MGA_SRC_DST_COLOR (0x00000002)
|
||||
# define MGA_SRC_ONE_MINUS_DST_COLOR (0x00000003)
|
||||
# define MGA_SRC_ALPHA (0x00000004)
|
||||
# define MGA_SRC_ONE_MINUS_SRC_ALPHA (0x00000005)
|
||||
# define MGA_SRC_DST_ALPHA (0x00000006)
|
||||
# define MGA_SRC_ONE_MINUS_DST_ALPHA (0x00000007)
|
||||
# define MGA_SRC_SRC_ALPHA_SATURATE (0x00000008)
|
||||
|
||||
# define MGA_DST_ZERO (0x00000000)
|
||||
# define MGA_DST_ONE (0x00000010)
|
||||
# define MGA_DST_SRC_COLOR (0x00000020)
|
||||
# define MGA_DST_ONE_MINUS_SRC_COLOR (0x00000030)
|
||||
# define MGA_DST_SRC_ALPHA (0x00000040)
|
||||
# define MGA_DST_ONE_MINUS_SRC_ALPHA (0x00000050)
|
||||
# define MGA_DST_DST_ALPHA (0x00000060)
|
||||
# define MGA_DST_ONE_MINUS_DST_ALPHA (0x00000070)
|
||||
|
||||
# define MGA_ALPHACHANNEL (0x00000100)
|
||||
# define MGA_VIDEOALPHA (0x00000200)
|
||||
# define MGA_DIFFUSEDALPHA (0x01000000)
|
||||
# define MGA_MODULATEDALPHA (0x02000000)
|
||||
|
||||
/* Textures registers */
|
||||
#define MGA_REG_TEXORG (0x2c24)
|
||||
#define MGA_REG_TEXORG1 (0x2ca4)
|
||||
#define MGA_REG_TEXWIDTH (0x2C28)
|
||||
#define MGA_REG_TEXHEIGHT (0x2C2C)
|
||||
#define MGA_REG_TMR0 (0x2C00)
|
||||
#define MGA_REG_TMR1 (0x2C04)
|
||||
#define MGA_REG_TMR2 (0x2C08)
|
||||
#define MGA_REG_TMR3 (0x2C0C)
|
||||
#define MGA_REG_TMR4 (0x2C10)
|
||||
#define MGA_REG_TMR5 (0x2C14)
|
||||
#define MGA_REG_TMR6 (0x2C18)
|
||||
#define MGA_REG_TMR7 (0x2C1C)
|
||||
#define MGA_REG_TMR8 (0x2C20)
|
||||
|
||||
/* Texture Control Registers */
|
||||
#define MGA_REG_TEXCTL (0x2C30)
|
||||
# define MGA_TW4 (0x00000000)
|
||||
# define MGA_TW8 (0x00000001)
|
||||
# define MGA_TW15 (0x00000002)
|
||||
# define MGA_TW16 (0x00000003)
|
||||
# define MGA_TW12 (0x00000004)
|
||||
# define MGA_TW32 (0x00000006)
|
||||
# define MGA_TW8A (0x00000007)
|
||||
# define MGA_TW8AL (0x00000008)
|
||||
# define MGA_TW422 (0x0000000A)
|
||||
# define MGA_TW422UYVY (0x0000000B)
|
||||
# define MGA_PITCHEXT (0x00000100)
|
||||
# define MGA_NOPERSPECTIVE (0x00200000)
|
||||
# define MGA_TAKEY (0x02000000)
|
||||
# define MGA_TAMASK (0x04000000)
|
||||
# define MGA_CLAMPUV (0x18000000)
|
||||
#define MGA_REG_TEXCTL2 (0x2C3C)
|
||||
# define MGA_G400_TC2_MAGIC (0x00008000)
|
||||
# define MGA_TC2_DECALBLEND (0x00000001)
|
||||
# define MGA_TC2_IDECAL (0x00000002)
|
||||
# define MGA_TC2_DECALDIS (0x00000004)
|
||||
# define MGA_TC2_CKSTRANSDIS (0x00000010)
|
||||
# define MGA_TC2_BORDEREN (0x00000020)
|
||||
# define MGA_TC2_SPECEN (0x00000040)
|
||||
# define MGA_TC2_DUALTEX (0x00000080)
|
||||
# define MGA_TC2_TABLEFOG (0x00000100)
|
||||
# define MGA_TC2_BUMPMAP (0x00000200)
|
||||
# define MGA_TC2_SELECT_TMU1 (0x80000000)
|
||||
#define MGA_REG_TEXFILTER (0x2C58)
|
||||
# define MGA_MIN_NRST (0x00000000)
|
||||
# define MGA_MIN_BILIN (0x00000002)
|
||||
# define MGA_MIN_ANISO (0x0000000D)
|
||||
# define MGA_MAG_NRST (0x00000000)
|
||||
# define MGA_MAG_BILIN (0x00000020)
|
||||
|
||||
/* Multi-Textures Control Registers */
|
||||
#define MGA_REG_TDUALSTAGE0 (0x2CF8)
|
||||
#define MGA_REG_TDUALSTAGE1 (0x2CFC)
|
||||
# define MGA_TDS_COLOR_ARG2_DIFFUSE (0x00000000)
|
||||
# define MGA_TDS_COLOR_ARG2_SPECULAR (0x00000001)
|
||||
# define MGA_TDS_COLOR_ARG2_FCOL (0x00000002)
|
||||
# define MGA_TDS_COLOR_ARG2_PREVSTAGE (0x00000003)
|
||||
# define MGA_TDS_COLOR_ALPHA_DIFFUSE (0x00000000)
|
||||
# define MGA_TDS_COLOR_ALPHA_FCOL (0x00000004)
|
||||
# define MGA_TDS_COLOR_ALPHA_CURRTEX (0x00000008)
|
||||
# define MGA_TDS_COLOR_ALPHA_PREVTEX (0x0000000c)
|
||||
# define MGA_TDS_COLOR_ALPHA_PREVSTAGE (0x00000010)
|
||||
# define MGA_TDS_COLOR_ARG1_REPLICATEALPHA (0x00000020)
|
||||
# define MGA_TDS_COLOR_ARG1_INV (0x00000040)
|
||||
# define MGA_TDS_COLOR_ARG2_REPLICATEALPHA (0x00000080)
|
||||
# define MGA_TDS_COLOR_ARG2_INV (0x00000100)
|
||||
# define MGA_TDS_COLOR_ALPHA1INV (0x00000200)
|
||||
# define MGA_TDS_COLOR_ALPHA2INV (0x00000400)
|
||||
# define MGA_TDS_COLOR_ARG1MUL_ALPHA1 (0x00000800)
|
||||
# define MGA_TDS_COLOR_ARG2MUL_ALPHA2 (0x00001000)
|
||||
# define MGA_TDS_COLOR_ARG1ADD_MULOUT (0x00002000)
|
||||
# define MGA_TDS_COLOR_ARG2ADD_MULOUT (0x00004000)
|
||||
# define MGA_TDS_COLOR_MODBRIGHT_2X (0x00008000)
|
||||
# define MGA_TDS_COLOR_MODBRIGHT_4X (0x00010000)
|
||||
# define MGA_TDS_COLOR_ADD_SUB (0x00000000)
|
||||
# define MGA_TDS_COLOR_ADD_ADD (0x00020000)
|
||||
# define MGA_TDS_COLOR_ADD2X (0x00040000)
|
||||
# define MGA_TDS_COLOR_ADDBIAS (0x00080000)
|
||||
# define MGA_TDS_COLOR_BLEND (0x00100000)
|
||||
# define MGA_TDS_COLOR_SEL_ARG1 (0x00000000)
|
||||
# define MGA_TDS_COLOR_SEL_ARG2 (0x00200000)
|
||||
# define MGA_TDS_COLOR_SEL_ADD (0x00400000)
|
||||
# define MGA_TDS_COLOR_SEL_MUL (0x00600000)
|
||||
# define MGA_TDS_ALPHA_ARG1_INV (0x00800000)
|
||||
# define MGA_TDS_ALPHA_ARG2_DIFFUSE (0x00000000)
|
||||
# define MGA_TDS_ALPHA_ARG2_FCOL (0x01000000)
|
||||
# define MGA_TDS_ALPHA_ARG2_PREVTEX (0x02000000)
|
||||
# define MGA_TDS_ALPHA_ARG2_PREVSTAGE (0x03000000)
|
||||
# define MGA_TDS_ALPHA_ARG2_INV (0x04000000)
|
||||
# define MGA_TDS_ALPHA_ADD (0x08000000)
|
||||
# define MGA_TDS_ALPHA_ADDBIAS (0x10000000)
|
||||
# define MGA_TDS_ALPHA_ADD2X (0x20000000)
|
||||
# define MGA_TDS_ALPHA_SEL_ARG1 (0x00000000)
|
||||
# define MGA_TDS_ALPHA_SEL_ARG2 (0x40000000)
|
||||
# define MGA_TDS_ALPHA_SEL_ADD (0x80000000)
|
||||
# define MGA_TDS_ALPHA_SEL_MUL (0xc0000000)
|
||||
|
||||
|
||||
|
||||
/* Composition Prototypes. MMIO Access */
|
||||
Bool
|
||||
mgaPrepareBlend(int op, PicturePtr pSrcPicture, PicturePtr pDstPicture,
|
||||
PixmapPtr pSrc, PixmapPtr pDst);
|
||||
|
||||
void
|
||||
mgaBlend(int srcX, int srcY, int dstX, int dstY, int width, int height);
|
||||
|
||||
void
|
||||
mgaDoneBlend(void);
|
||||
|
||||
Bool
|
||||
mgaPrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
|
||||
PicturePtr pDstPicture, PixmapPtr pSrc,
|
||||
PixmapPtr pMask, PixmapPtr pDst);
|
||||
|
||||
void
|
||||
mgaComposite(int srcX, int srcY, int maskX, int maskY,
|
||||
int dstX, int dstY, int w, int h);
|
||||
|
||||
void
|
||||
mgaDoneComposite(void);
|
||||
|
||||
#endif
|
306
hw/kdrive/mga/g400_composite.c
Normal file
306
hw/kdrive/mga/g400_composite.c
Normal file
|
@ -0,0 +1,306 @@
|
|||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright © 2004 Damien Ciabrini
|
||||
*
|
||||
* 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 Anders Carlsson not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. Anders Carlsson makes no
|
||||
* representations about the suitability of this software for any purpose. It
|
||||
* is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* DAMIEN CIABRINI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL ANDERS CARLSSON 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 HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "mga.h"
|
||||
#include "g400_common.h"
|
||||
|
||||
|
||||
static PixmapPtr currentSrc;
|
||||
static PixmapPtr currentMask;
|
||||
|
||||
static CARD32 mgaBlendOP[14] = {
|
||||
/* Clear */
|
||||
MGA_SRC_ZERO | MGA_DST_ZERO,
|
||||
/* Src */
|
||||
MGA_SRC_ONE | MGA_DST_ZERO,
|
||||
/* Dst */
|
||||
MGA_SRC_ZERO | MGA_DST_ONE,
|
||||
/* Over */
|
||||
MGA_SRC_ALPHA | MGA_DST_ONE_MINUS_SRC_ALPHA,
|
||||
/* OverReverse */
|
||||
MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_ONE,
|
||||
/* In */
|
||||
MGA_SRC_DST_ALPHA | MGA_DST_ZERO,
|
||||
/* InReverse */
|
||||
MGA_SRC_ZERO | MGA_DST_SRC_ALPHA,
|
||||
/* Out */
|
||||
MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_ZERO,
|
||||
/* OutReverse */
|
||||
MGA_SRC_ZERO | MGA_DST_ONE_MINUS_SRC_ALPHA,
|
||||
/* Atop */
|
||||
MGA_SRC_DST_ALPHA | MGA_DST_ONE_MINUS_SRC_ALPHA,
|
||||
/* AtopReverse */
|
||||
MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_SRC_ALPHA,
|
||||
/* Xor */
|
||||
MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_ONE_MINUS_SRC_ALPHA,
|
||||
/* Add */
|
||||
MGA_SRC_ONE | MGA_DST_ONE,
|
||||
/* Saturate */
|
||||
MGA_SRC_SRC_ALPHA_SATURATE | MGA_DST_ONE
|
||||
};
|
||||
|
||||
|
||||
static int MGA_LOG2( int val )
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
while (val >> ret)
|
||||
ret++;
|
||||
|
||||
return ((1 << (ret-1)) == val) ? (ret-1) : ret;
|
||||
}
|
||||
|
||||
|
||||
Bool
|
||||
mgaPrepareBlend (int op,
|
||||
PicturePtr pSrcPicture,
|
||||
PicturePtr pDstPicture,
|
||||
PixmapPtr pSrc,
|
||||
PixmapPtr pDst)
|
||||
{
|
||||
return mgaPrepareComposite (op, pSrcPicture, NULL, pDstPicture,
|
||||
pSrc, NULL, pDst);
|
||||
}
|
||||
|
||||
void
|
||||
mgaBlend (int srcX,
|
||||
int srcY,
|
||||
int dstX,
|
||||
int dstY,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
mgaComposite (srcX, srcY, 0, 0, dstX, dstY, width, height);
|
||||
}
|
||||
|
||||
void
|
||||
mgaDoneBlend (void)
|
||||
{
|
||||
mgaDoneComposite ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
static Bool
|
||||
PrepareSourceTexture (int tmu,
|
||||
PicturePtr pSrcPicture,
|
||||
PixmapPtr pSrc)
|
||||
{
|
||||
KdScreenPriv (pSrc->drawable.pScreen);
|
||||
int mem_base=(int)pScreenPriv->screen->memory_base;
|
||||
int pitch = pSrc->devKind / (pSrc->drawable.bitsPerPixel >> 3);
|
||||
|
||||
int w = pSrc->drawable.width;
|
||||
int h = pSrc->drawable.height;
|
||||
int w_log2 = MGA_LOG2(w);
|
||||
int h_log2 = MGA_LOG2(h);
|
||||
|
||||
int texctl=MGA_PITCHEXT | ((pitch&0x7ff)<<9) |
|
||||
MGA_TAKEY | MGA_CLAMPUV | MGA_NOPERSPECTIVE;
|
||||
int texctl2=MGA_G400_TC2_MAGIC;
|
||||
|
||||
if ((w > 2047) || (h > 2047))
|
||||
MGA_FALLBACK(("Picture too large for composition (%dx%d)\n", w, h));
|
||||
|
||||
switch (pSrcPicture->format) {
|
||||
case PICT_a8r8g8b8:
|
||||
case PICT_x8r8g8b8:
|
||||
case PICT_a8b8g8r8:
|
||||
case PICT_x8b8g8r8:
|
||||
texctl |= MGA_TW32;
|
||||
break;
|
||||
case PICT_r5g6b5:
|
||||
case PICT_b5g6r5:
|
||||
texctl |= MGA_TW16;
|
||||
break;
|
||||
case PICT_a8:
|
||||
texctl |= MGA_TW8A;
|
||||
break;
|
||||
default:
|
||||
MGA_FALLBACK(("unsupported Picture format for composition (%x)\n",
|
||||
pSrcPicture->format));
|
||||
}
|
||||
|
||||
if (tmu == 1) texctl2 |= MGA_TC2_DUALTEX | MGA_TC2_SELECT_TMU1;
|
||||
|
||||
mgaWaitAvail (6);
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXCTL2, texctl2);
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXCTL, texctl);
|
||||
/* Source (texture) address + pitch */
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXORG, ((int)pSrc->devPrivate.ptr - mem_base));
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXWIDTH, (w-1)<<18 | ((8-w_log2)&63)<<9 | w_log2);
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXHEIGHT, (h-1)<<18 | ((8-h_log2)&63)<<9 | h_log2);
|
||||
/* Disable filtering since we aren't doing stretch blit */
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXFILTER, (0x10<<21) | MGA_MAG_NRST | MGA_MIN_NRST);
|
||||
|
||||
if (tmu == 1) {
|
||||
mgaWaitAvail (1);
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXCTL2, MGA_G400_TC2_MAGIC | MGA_TC2_DUALTEX);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
mgaPrepareComposite (int op,
|
||||
PicturePtr pSrcPicture,
|
||||
PicturePtr pMaskPicture,
|
||||
PicturePtr pDstPicture,
|
||||
PixmapPtr pSrc,
|
||||
PixmapPtr pMask,
|
||||
PixmapPtr pDst)
|
||||
{
|
||||
KdScreenPriv (pSrc->drawable.pScreen);
|
||||
int mem_base=(int)pScreenPriv->screen->memory_base;
|
||||
int cmd;
|
||||
|
||||
/* sometimes mgaPrepareComposite is given the same pointer for Src
|
||||
* and Mask. PSrcPicture is an unsupported format (x8b8g8r8) whereas
|
||||
* pMaskPicture is supported (a8r8g8b8). We Choose to render a
|
||||
* simple blend and using pMaskPicture as the Source.
|
||||
*/
|
||||
if (pMask == pSrc) {
|
||||
pMask=NULL;
|
||||
pMaskPicture=NULL;
|
||||
}
|
||||
|
||||
mgaWaitIdle();
|
||||
/* Init MGA (clipping) */
|
||||
mgaSetup (pSrc->drawable.pScreen, pDst->drawable.bitsPerPixel, 5);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR1, 0);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR2, 0);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR3, 0);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR4, 0);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR5, 0);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR6, 0);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR7, 0);
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR8, 0x10000);
|
||||
|
||||
/* Destination flags */
|
||||
mgaWaitAvail (2);
|
||||
MGA_OUT32 (mmio, MGA_REG_DSTORG, ((int)pDst->devPrivate.ptr - mem_base));
|
||||
MGA_OUT32 (mmio, MGA_REG_PITCH,
|
||||
pDst->devKind / (pDst->drawable.bitsPerPixel >> 3));
|
||||
|
||||
/* Source(s) flags */
|
||||
if (!PrepareSourceTexture (0, pSrcPicture, pSrc)) return FALSE;
|
||||
if (pMask != NULL)
|
||||
if (!PrepareSourceTexture (1, pMaskPicture, pMask)) return FALSE;
|
||||
|
||||
/* MultiTexture modulation */
|
||||
mgaWaitAvail (2);
|
||||
MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE0, MGA_TDS_COLOR_SEL_ARG1);
|
||||
if (pMask != NULL) {
|
||||
if (PICT_FORMAT_A (pSrcPicture->format) == 0) {
|
||||
MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE1,
|
||||
MGA_TDS_COLOR_ARG2_PREVSTAGE | MGA_TDS_COLOR_SEL_ARG2 |
|
||||
MGA_TDS_ALPHA_SEL_ARG1);
|
||||
} else {
|
||||
MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE1,
|
||||
MGA_TDS_COLOR_ARG2_PREVSTAGE | MGA_TDS_COLOR_SEL_ARG2 |
|
||||
MGA_TDS_ALPHA_ARG2_PREVSTAGE | MGA_TDS_ALPHA_SEL_MUL);
|
||||
}
|
||||
} else {
|
||||
MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE1, 0);
|
||||
}
|
||||
|
||||
cmd = MGA_OPCOD_TEXTURE_TRAP | MGA_ATYPE_RSTR | 0x000c0000 |
|
||||
MGA_DWGCTL_SHIFTZERO | MGA_DWGCTL_SGNZERO | MGA_DWGCTL_ARZERO |
|
||||
MGA_ATYPE_I;
|
||||
|
||||
mgaWaitAvail (2);
|
||||
MGA_OUT32 (mmio, MGA_REG_DWGCTL, cmd);
|
||||
MGA_OUT32 (mmio, MGA_REG_ALPHACTRL, MGA_ALPHACHANNEL | mgaBlendOP[op]);
|
||||
|
||||
currentSrc=pSrc;
|
||||
currentMask=pMask;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
mgaComposite (int srcX,
|
||||
int srcY,
|
||||
int maskX,
|
||||
int maskY,
|
||||
int dstX,
|
||||
int dstY,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
int src_w2 = MGA_LOG2 (currentSrc->drawable.width);
|
||||
int src_h2 = MGA_LOG2 (currentSrc->drawable.height);
|
||||
|
||||
/* Source positions can be outside source textures' boundaries.
|
||||
* We clamp the values here to avoid rendering glitches.
|
||||
*/
|
||||
srcX=srcX % currentSrc->drawable.width;
|
||||
srcY=srcY % currentSrc->drawable.height;
|
||||
maskX=maskX % currentMask->drawable.width;
|
||||
maskY=maskY % currentMask->drawable.height;
|
||||
|
||||
mgaWaitAvail (4);
|
||||
/* Start position in the texture */
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR6, srcX<<(20-src_w2));
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR7, srcY<<(20-src_h2));
|
||||
/* Increments (1 since we aren't doing stretch blit) */
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR0, 1<<(20-src_w2));
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR3, 1<<(20-src_h2));
|
||||
|
||||
if (currentMask != NULL) {
|
||||
int mask_w2 = MGA_LOG2 (currentMask->drawable.width);
|
||||
int mask_h2 = MGA_LOG2 (currentMask->drawable.height);
|
||||
|
||||
mgaWaitAvail (6);
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXCTL2,
|
||||
MGA_G400_TC2_MAGIC | MGA_TC2_DUALTEX | MGA_TC2_SELECT_TMU1);
|
||||
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR6, maskX<<(20-mask_w2));
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR7, maskY<<(20-mask_h2));
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR0, 1<<(20-mask_w2));
|
||||
MGA_OUT32 (mmio, MGA_REG_TMR3, 1<<(20-mask_h2));
|
||||
|
||||
MGA_OUT32 (mmio, MGA_REG_TEXCTL2, MGA_G400_TC2_MAGIC | MGA_TC2_DUALTEX);
|
||||
}
|
||||
|
||||
/* Destination Bounding Box
|
||||
* (Boundary Right | Boundary Left, Y dest | Height)
|
||||
*/
|
||||
mgaWaitAvail (2);
|
||||
MGA_OUT32 (mmio, MGA_REG_FXBNDRY,
|
||||
((dstX + width) << 16) | (dstX & 0xffff));
|
||||
MGA_OUT32 (mmio, MGA_REG_YDSTLEN | MGA_REG_EXEC,
|
||||
(dstY << 16) | (height & 0xffff));
|
||||
}
|
||||
|
||||
void
|
||||
mgaDoneComposite (void)
|
||||
{
|
||||
|
||||
}
|
|
@ -134,7 +134,7 @@ mgaUnmapReg (KdCardInfo *card, MgaCardInfo *mgac)
|
|||
KD_MAPPED_MODE_REGISTERS);
|
||||
KdUnmapDevice ((void *) mgac->reg_base, MGA_REG_SIZE (card));
|
||||
mgac->reg_base = 0;
|
||||
// mgac->reg = 0;
|
||||
/* mgac->reg = 0; */
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ mgaSetup (ScreenPtr pScreen, int dest_bpp, int wait)
|
|||
return FALSE;
|
||||
|
||||
mgaWaitAvail (wait + 4);
|
||||
// Set the format of the destination pixmap
|
||||
/* Set the format of the destination pixmap */
|
||||
switch (dest_bpp) {
|
||||
case 8:
|
||||
MGA_OUT32 (mmio, MGA_REG_MACCESS, MGA_PW8);
|
||||
|
@ -112,7 +112,9 @@ mgaPrepareSolid (PixmapPtr pPixmap, int alu, Pixel pm, Pixel fg)
|
|||
KdScreenPriv(pPixmap->drawable.pScreen);
|
||||
int cmd;
|
||||
int dst_org;
|
||||
// We must pad pm and fg depending on the format of the destination pixmap
|
||||
/* We must pad pm and fg depending on the format of the
|
||||
* destination pixmap
|
||||
*/
|
||||
switch (pPixmap->drawable.bitsPerPixel) {
|
||||
case 16:
|
||||
fg |= fg << 16;
|
||||
|
@ -226,7 +228,7 @@ mgaDoneCopy (void)
|
|||
|
||||
static Bool
|
||||
mgaUploadToScreen(PixmapPtr pDst, char *src, int src_pitch) {
|
||||
//fprintf(stderr,"Upload to Screen %p [%d]\n",src,src_pitch);
|
||||
/* fprintf(stderr,"Upload to Screen %p [%d]\n",src,src_pitch); */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -259,7 +261,7 @@ mgaDrawInit (ScreenPtr pScreen)
|
|||
mgaKaa.Composite=mgaComposite;
|
||||
mgaKaa.DoneComposite=mgaDoneComposite;
|
||||
}
|
||||
//mgaKaa.UploadToScreen=mgaUploadToScreen;
|
||||
/*mgaKaa.UploadToScreen=mgaUploadToScreen;*/
|
||||
|
||||
if (!kaaDrawInit (pScreen, &mgaKaa))
|
||||
return FALSE;
|
||||
|
|
Loading…
Reference in New Issue
Block a user