158 lines
4.5 KiB
C
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;
|
||
|
}
|
||
|
|