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
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')
|
|
|