Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

175 lines
5.6 KiB

//-----------------------------------------------------------------------------
//
// This file contains texture addressing functions.
//
// Copyright (C) Microsoft Corporation, 1997.
//
// WARNING WARNING WARNING
// This cpp file generated from mcp file.
// EDIT THE MCP FILE.
// I warned you.
// WARNING WARNING WARNING
//
//-----------------------------------------------------------------------------
include(`m4hdr.mh')dnl
#include "pch.cpp"
#pragma hdrstop
#include "mtest_mh.h"
dnl
dnl d_StencilOp
dnl
dnl Macro to do stencil operation test routine
dnl
dnl $1 is one of STENCILFUNC
dnl returns new stencil value in uS
dnl
define(`d_StencilOp', `
switch($1)
{
case D3DSTENCILOP_KEEP:
uS = uSB;
break;
case D3DSTENCILOP_ZERO:
uS = 0;
break;
case D3DSTENCILOP_REPLACE:
uS = uSR;
break;
case D3DSTENCILOP_INCRSAT:
uS = min(uSB + 1, 0xff);
break;
case D3DSTENCILOP_DECRSAT:
uS = (UINT32)max((INT32)uSB - 1, 0x00);
break;
case D3DSTENCILOP_INVERT:
uS = ~uSB;
break;
case D3DSTENCILOP_INCR:
uS = uSB + 1;
break;
case D3DSTENCILOP_DECR:
uS = uSB - 1;
break;
}
// do write mask, do not let stencil mess up Z bits
uS &= pCtx->pdwRenderState[D3DRENDERSTATE_STENCILWRITEMASK];
uSB &= ~(pCtx->pdwRenderState[D3DRENDERSTATE_STENCILWRITEMASK]);
uS |= uSB;
uS &= 0xff;
')dnl
dnl
dnl
dnl d_Test
dnl
dnl Macro to build test routine
dnl
dnl $1 is one of 16 32
dnl $2 is one of ZWrite NoZWrite
dnl $3 is one of ZAll ZNeverAlways ZLessGreaterEqual ZEqualNotEqual ZGreaterLessEqual
dnl $4 is one of NoStipple Stipple
dnl $5 is one of NoStencil Stencil
dnl
define(`d_Test', `
void CMMX_Test_$1_$2_$3_$4_$5(PD3DI_RASTCTX pCtx, PD3DI_RASTPRIM pP,
PD3DI_RASTSPAN pS)
{
ifelse(eval((d_index(`$1', `16') == 0) && (d_index(`$5', `Stencil') == 0)), `1', `
DPF(0, "16 bit Z with stencil should never be called");
DDASSERT(0);
', eval((d_index(`$3', `ZAll') == 0) && (d_index(`$4', `NoStipple') == 0) && (d_index(`$5', `NoStencil') == 0)), `1', `
DPF(0, "ZAll AND NoStipple AND NoStencil, more optimal code should be called");
DDASSERT(0);
', `
ifelse(`$1', `16', `
// 16 bit unsigned format
UINT16 uZ = (UINT16)(pS->uZ>>15);
UINT16 uZB = *((UINT16*)pS->pZ);', `
// 24S8 bit unsigned format
UINT32 uZ = pS->uZ;
UINT32 uZB = *((UINT32*)pS->pZ);
ifelse(eval((d_index(`$3', `ZNeverAlways') == 0) && (d_index(`$5', `NoStencil') == 0)), `1', `', `
UINT32 uZBS = uZB >> 1;')')
pS->uZ += pP->iDZDX;
dnl
ifelse(`$4', `Stipple', `
// ATTENTION stippling unimplemented
DPF(0, "stippling unimplemented");')
dnl
ifelse(`$5', `Stencil', `
UINT32 uSB = uZB & 0xff;
uZ &= ~0x7f; // clear stencil region
uZB &= ~0xff;
UINT32 uS; // holds final stencil value
UINT32 uSR = pCtx->pdwRenderState[D3DRENDERSTATE_STENCILREF];
UINT32 uMask = pCtx->pdwRenderState[D3DRENDERSTATE_STENCILMASK];
if (SCMP(pCtx, uSR&uMask, uSB&uMask))
{
if (ZCMP32(pCtx, uZ, uZBS))
{
d_StencilOp(pCtx->pdwRenderState[D3DRENDERSTATE_STENCILPASS])
ifelse(`$2', `ZWrite', `*((UINT32*)pS->pZ) = (uZ<<1) | uS;',
`*((UINT32*)pS->pZ) = uZB | uS; // write stencil unconditionally
pCtx->SI.uZDeferred = (uZ<<1) | uS;')
pCtx->pfnTestPassEnd(pCtx, pP, pS);
}
else
{
d_StencilOp(pCtx->pdwRenderState[D3DRENDERSTATE_STENCILZFAIL])
*((UINT32*)pS->pZ) = uZB | uS; // write stencil only
ifelse(`$2', `NoZWrite', `pCtx->SI.uZDeferred = uZB | uS;')
pCtx->pfnTestFailEnd(pCtx, pP, pS);
}
}
else
{
d_StencilOp(pCtx->pdwRenderState[D3DRENDERSTATE_STENCILFAIL])
*((UINT32*)pS->pZ) = uZB | uS; // write stencil only
pCtx->pfnTestFailEnd(pCtx, pP, pS);
}
', `
dnl
ifelse(eval((d_index(`$3', `ZNeverAlways') != 0) && (d_index(`$1', `16') != 0)), `1', `
uZ &= ~0x7f; // clear stencil bits so equal compare will work
uZBS &= ~0x7f;')
ifelse(`$3', `ZAll', `
ifelse(`$1', `16', `if (ZCMP16(pCtx, uZ, uZB))', `if (ZCMP32(pCtx, uZ, uZBS))')',
`$3', `ZNeverAlways', `
if (!(pCtx->iZXorMask))',
`$3', `ZLessGreaterEqual', `
// using bitwise XOR for logical op, OK since all bits of mask are set
if ((pCtx->iZXorMask)^(uZ >= ifelse(`$1', `16', `uZB', `uZBS')))',
`$3', `ZEqualNotEqual', `
if ((pCtx->iZXorMask)^(uZ != ifelse(`$1', `16', `uZB', `uZBS')))',
`$3', `ZGreaterLessEqual', `
if ((pCtx->iZXorMask)^(uZ > ifelse(`$1', `16', `uZB', `uZBS')))', `
#error Invalid arg to d_Test')
{
ifelse(`$2', `ZWrite', `ifelse(`$1', `16',
`*((UINT16*)pS->pZ) = uZ;', `*((UINT32*)pS->pZ) = (uZ << 1);')',
`pCtx->SI.uZDeferred = ifelse(`$1', `16', `uZ', `(uZ << 1)');')
pCtx->pfnTestPassEnd(pCtx, pP, pS);
}
else
{
ifelse(`$2', `NoZWrite', `pCtx->SI.uZDeferred = uZB;')
pCtx->pfnTestFailEnd(pCtx, pP, pS);
}
')')}')dnl
dnl
d_RepStr(`d_RepStr(`d_RepStr(`d_Test(AA, BB, CC, NoStipple, NoStencil)',
`AA', `16', `32')',
`BB', `ZWrite', `NoZWrite')',
`CC', `ZNeverAlways', `ZLessGreaterEqual', `ZEqualNotEqual', `ZGreaterLessEqual')
d_RepStr(`d_RepStr(`d_RepStr(`d_RepStr(`d_Test(AA, BB, ZAll, CC, DD)',
`AA', `16', `32')',
`BB', `ZWrite', `NoZWrite')',
`CC', `NoStipple', `Stipple')',
`DD', `NoStencil', `Stencil')