windows-nt/Source/XPSP1/NT/drivers/video/matrox/mga/disp/mcdpoint.c
2020-09-26 16:20:57 +08:00

158 lines
4.5 KiB
C

/******************************Module*Header*******************************\
* Module Name: mcdpoint.c
*
* Contains the point-rendering routines for the Millenium MCD driver.
*
* Copyright (c) 1996 Microsoft Corporation
\**************************************************************************/
#include "precomp.h"
#include "mcdhw.h"
#include "mcdutil.h"
#include "mcdmath.h"
#define TRUNCCOORD(value, intValue)\
intValue = __MCD_VERTEX_FIXED_TO_INT(__MCD_VERTEX_FLOAT_TO_FIXED(value))
VOID FASTCALL __MCDPointBegin(DEVRC *pRc)
{
BYTE *pjBase = ((PDEV *)pRc->ppdev)->pjBase;
if ((pRc->pEnumClip->c) <= 1) {
CHECK_FIFO_FREE(pjBase, pRc->cFifo, 1);
CP_WRITE(pjBase, DWG_DWGCTL, pRc->hwLineFunc);
} else {
CHECK_FIFO_FREE(pjBase, pRc->cFifo, 9);
CP_WRITE(pjBase, DWG_DWGCTL, pRc->hwLineFunc);
// ?? Theoretically just need to clear y deltas, not both:
CP_WRITE(pjBase, DWG_DR6, 0);
CP_WRITE(pjBase, DWG_DR7, 0);
CP_WRITE(pjBase, DWG_DR10, 0);
CP_WRITE(pjBase, DWG_DR11, 0);
CP_WRITE(pjBase, DWG_DR14, 0);
CP_WRITE(pjBase, DWG_DR15, 0);
CP_WRITE(pjBase, DWG_DR2, 0);
CP_WRITE(pjBase, DWG_DR3, 0);
}
}
VOID FASTCALL __MCDRenderPoint(DEVRC *pRc, MCDVERTEX *a)
{
PDEV *ppdev = pRc->ppdev;
BYTE *pjBase = ppdev->pjBase;
LONG ix, iy;
LONG iRStart, iGStart, iBStart;
LARGE_INTEGER iZStart;
ULONG clipNum;
RECTL *pClip;
MCDCOLOR *ac;
if ((clipNum = pRc->pEnumClip->c) > 1) {
pClip = &pRc->pEnumClip->arcl[0];
(*pRc->HWSetupClipRect)(pRc, pClip++);
}
if (pRc->privateEnables & __MCDENABLE_Z) {
#if _X86_ && ASM_ACCEL
_asm {
mov ecx, a
mov edx, pRc
lea eax, [OFFSET(MCDVERTEX.colors) + ecx]
fld DWORD PTR [OFFSET(DEVRC.rScale)][edx]
fmul DWORD PTR [OFFSET(MCDCOLOR.r)][eax]
fld DWORD PTR [OFFSET(DEVRC.gScale)][edx]
fmul DWORD PTR [OFFSET(MCDCOLOR.g)][eax]
fld DWORD PTR [OFFSET(DEVRC.bScale)][edx]
fmul DWORD PTR [OFFSET(MCDCOLOR.b)][eax]
fld DWORD PTR [OFFSET(MCDVERTEX.windowCoord.z)][ecx]
fmul DWORD PTR [OFFSET(DEVRC.zScale)][edx] // z b g r
fxch ST(3) // r b g z
fistp iRStart
fistp iBStart
fistp iGStart
fistp iZStart
}
#else
ac = &a->colors[0];
iRStart = FTOL(ac->r * pRc->rScale);
iGStart = FTOL(ac->g * pRc->gScale);
iBStart = FTOL(ac->b * pRc->bScale);
iZStart.LowPart = FTOL(a->windowCoord.z * pRc->zScale);
#endif
CHECK_FIFO_FREE(pjBase, pRc->cFifo, 6);
CP_WRITE(pjBase, DWG_DR0, iZStart.LowPart);
} else {
#if _X86_ && ASM_ACCEL
_asm{
mov eax, a
mov edx, pRc
lea eax, [OFFSET(MCDVERTEX.colors) + eax]
fld DWORD PTr [OFFSET(DEVRC.rScale)][edx]
fmul DWORD PTR [OFFSET(MCDCOLOR.r)][eax]
fld DWORD PTr [OFFSET(DEVRC.gScale)][edx]
fmul DWORD PTR [OFFSET(MCDCOLOR.g)][eax]
fld DWORD PTr [OFFSET(DEVRC.bScale)][edx] // b g r
fmul DWORD PTR [OFFSET(MCDCOLOR.b)][eax]
fxch ST(2) // r g b
fistp iRStart
fistp iGStart
fistp iBStart
}
#else
ac = &a->colors[0];
iRStart = FTOL(ac->r * pRc->rScale);
iGStart = FTOL(ac->g * pRc->gScale);
iBStart = FTOL(ac->b * pRc->bScale);
#endif
CHECK_FIFO_FREE(pjBase, pRc->cFifo, 5);
}
TRUNCCOORD(a->windowCoord.x, ix);
TRUNCCOORD(a->windowCoord.y, iy);
CP_WRITE(pjBase, DWG_XDST, (ix + pRc->xOffset) & 0xffff);
CP_WRITE(pjBase, DWG_YDSTLEN, ((iy + pRc->yOffset) << 16) + 1);
CP_WRITE(pjBase, DWG_DR4, iRStart);
CP_WRITE(pjBase, DWG_DR8, iGStart);
CP_START(pjBase, DWG_DR12, iBStart);
while (--clipNum) {
(*pRc->HWSetupClipRect)(pRc, pClip++);
CHECK_FIFO_FREE(pjBase, pRc->cFifo, 2);
CP_WRITE(pjBase, DWG_XDST, (ix + pRc->xOffset) & 0xffff);
CP_START(pjBase, DWG_YDSTLEN, ((iy + pRc->yOffset) << 16) + 1);
}
}
VOID FASTCALL __MCDRenderGenPoint(DEVRC *pRc, MCDVERTEX *pv)
{
MCDBG_PRINT("__MCDRenderGenPoint");
}
VOID FASTCALL __MCDRenderFogPoint(DEVRC *pRc, MCDVERTEX *pv)
{
MCDCOLOR c;
c = pv->colors[0];
__MCDCalcFogColor(pRc, pv, &pv->colors[0], &c);
(*pRc->renderPointX)(pRc, pv);
pv->colors[0] = c;
}