📄 tsstate.c
字号:
*/
if (psLState->dwMaxMipLevel)
{
AdjustForMaxMipLevel(psLState);
}
/*
Put Context in Mapdetails for access to shadow texture
linked list from BlitTexture
*/
psMapDetails->psContext = psContext;
/*
Flag that this layer is enabled (in-case we previously disabled it
due to referenceing a texture when untextures - see PostProcessTSState)
*/
if (psLState->dwCOp != D3DMTOP_DISABLE)
{
psContext->dwFlags |= D3DM_CONTEXT_SWFLAGS_LAYER0ENABLED << dwStage;
}
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_TextureMap"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_ColourOp
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_ColourOp(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
DWORD dwValue;
DWORD dwStage;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_ColourOp"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_ColourOp : Stage %d: Op = %d", psState->Stage, psState->Value));
dwStage = (DWORD) psState->Stage;
dwValue = psState->Value;
psLState = &psContext->sTState.sLState[dwStage];
/*
Ensure we don't get any un-capped DX8 ops (which could cause a crash),
previously we used to just clamp the value to DOTPRODUCT3, but this is
likely to create an invalid layer. Now use MODULATE which will at least
be valid (works for 3D Windows XP screensaver, which doesn't check caps.)
*/
if (dwValue > D3DMTOP_DOTPRODUCT3)
{
D3DM_DPF((DPF_WARN,"D3DM_TSS_ColourOp: Stage %d: Op %d unsupported using MODULATE", psState->Stage, psState->Value));
dwValue = D3DMTOP_MODULATE;
}
/*
Store the new colour-op to use
*/
psLState->dwCOp = psState->Value;
/*
Enable/disable the stage if required
*/
if (dwValue <= D3DMTOP_DISABLE)
{
psContext->dwFlags &= ~(D3DM_CONTEXT_SWFLAGS_LAYER0ENABLED << dwStage);
}
else
{
psContext->dwFlags |= (D3DM_CONTEXT_SWFLAGS_LAYER0ENABLED << dwStage);
}
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_ColourOp"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_ColourArg1
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_ColourArg1(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
DWORD dwValue;
DWORD dwStage;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_ColourArg1"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_ColourArg1: Stage %d: Arg = %d", psState->Stage, psState->Value));
dwStage = (DWORD)psState->Stage;
dwValue = psState->Value;
psLState = &psContext->sTState.sLState[dwStage];
/*
Record the new D3D arg, removing any nonsense
*/
dwValue &= D3DMTA_SELECTMASK | D3DMTA_ALPHAREPLICATE | D3DMTA_COMPLEMENT | D3DMTA_OPTIONMASK;
psLState->dwCArg1 = dwValue;
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_ColourArg1"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_ColourArg2
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_ColourArg2(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
DWORD dwValue;
DWORD dwStage;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_ColourArg2"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_ColourArg2: Stage %d: Arg = %d", psState->Stage, psState->Value));
dwStage = (DWORD) psState->Stage;
psLState = &psContext->sTState.sLState[dwStage];
dwValue = psState->Value;
/*
Record the new D3D arg, removing any nonsense
*/
dwValue &= D3DMTA_SELECTMASK | D3DMTA_ALPHAREPLICATE | D3DMTA_COMPLEMENT | D3DMTA_OPTIONMASK;
psLState->dwCArg2 = dwValue;
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_ColourArg2"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_AlphaOp
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_AlphaOp(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
DWORD dwValue;
DWORD dwStage;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_AlphaOp"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_AlphaOp : Stage %d: Op = %d", psState->Stage, psState->Value));
dwStage = (DWORD) psState->Stage;
psLState = &psContext->sTState.sLState[dwStage];
dwValue = psState->Value;
/*
Record the D3D alpha op, limiting the range to things we can actually
do (our special token for legacy modulate blending is also allowed)
*/
if (dwValue > D3DMTOP_DOTPRODUCT3)
{
dwValue = D3DMTOP_DOTPRODUCT3;
}
psLState->dwAOp = dwValue;
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_AlphaOp"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_AlphaArg1
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_AlphaArg1(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
DWORD dwValue;
DWORD dwStage;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_AlphaArg1"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_AlphaArg1: Stage %d: Arg = %d", psState->Stage, psState->Value));
dwStage = (DWORD) psState->Stage;
psLState = &psContext->sTState.sLState[dwStage];
dwValue = psState->Value;
/*
Record the new D3D arg, removing any nonsense
*/
dwValue &= D3DMTA_SELECTMASK | D3DMTA_ALPHAREPLICATE | D3DMTA_COMPLEMENT | D3DMTA_OPTIONMASK;
psLState->dwAArg1 = dwValue;
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_AlphaArg1"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_AlphaArg2
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_AlphaArg2(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
DWORD dwValue;
DWORD dwStage;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_AlphaArg2"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_AlphaArg2: Stage %d: Arg = %d", psState->Stage, psState->Value));
dwStage = (DWORD) psState->Stage;
psLState = &psContext->sTState.sLState[dwStage];
dwValue = psState->Value;
/*
Record the new D3D arg, removing any nonsense
*/
dwValue &= D3DMTA_SELECTMASK | D3DMTA_ALPHAREPLICATE | D3DMTA_COMPLEMENT | D3DMTA_OPTIONMASK;
psLState->dwAArg2 = dwValue;
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_AlphaArg2"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_TexCoordIndex
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_TexCoordIndex(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
PSWTNLSTATE psSWTNLState;
DWORD dwValue;
DWORD dwStage;
DWORD dwCoordSet;
DWORD dwAutoGenMode;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_TexCoordIndex"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_TexCoordIndex: Stage %d: Coord Set = %d", psState->Stage, psState->Value));
dwStage = (DWORD)psState->Stage;
dwValue = psState->Value;
psLState = &psContext->sTState.sLState[dwStage];
psSWTNLState = &psContext->sTState.sSWTNLState;
/*
Get the new coordinate set to use for this stage
*/
dwCoordSet = dwValue & 0x0000ffff;
if (dwCoordSet > MBX1_MAXTEXTURE_LAYERS)
{
dwCoordSet = MBX1_MAXTEXTURE_LAYERS;
}
psLState->dwCoordSetNum = dwCoordSet;
/*
Update the texture coordinate generation mode for this stage, and
the overall count of how many stages need coordinate generation
*/
dwAutoGenMode = dwValue & (0xffff0000);
if (dwAutoGenMode == D3DMTSS_TCI_PASSTHRU)
{
if (psLState->dwCoordAutoGenMode != D3DMTSS_TCI_PASSTHRU)
{
psSWTNLState->dwTexTransformCount++;
}
}
else
{
if (psLState->dwCoordAutoGenMode == D3DMTSS_TCI_PASSTHRU)
{
psSWTNLState->dwTexTransformCount--;
}
}
psLState->dwCoordAutoGenMode = dwAutoGenMode;
/*
Flag that TNL texture coordinate generation needs updating
*/
psSWTNLState->dwTNLFlags2 |= PVRD3DTNL_FLAGS2_TEXGEN_CHANGED;
/*
Update the HW addresing mode to use for the U and V coordinates
NB: Also depends upon coordinate-wrap enable state for the texture-
coordinate set this state is currently using
*/
UpdateHWTexAddrMode(psContext, psLState, 0);
UpdateHWTexAddrMode(psContext, psLState, 1);
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_TexCoordIndex"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_AddressU
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_AddressU(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_AddressU"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_AddressU: Stage %d: Addr Mode = %d", psState->Stage, psState->Value));
psLState = &psContext->sTState.sLState[(DWORD) psState->Stage];
/*
Save the new D3D addresing mode
*/
psLState->pdwD3DAddrMode[0] = psState->Value;
/*
Update the HW addresing mode to use for the U coordinate
NB: Also depends upon coordinate-wrap enable state for the texture-
coordinate set this state is currently using
*/
UpdateHWTexAddrMode(psContext, psLState, 0);
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_AddressU"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_AddressV
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_AddressV(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_AddressV"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_AddressV: Stage %d: Addr Mode = %d", psState->Stage, psState->Value));
psLState = &psContext->sTState.sLState[(DWORD) psState->Stage];
/*
Save the new D3D addresing mode
*/
psLState->pdwD3DAddrMode[1] = psState->Value;
/*
Update the HW addresing mode to use for the U coordinate
NB: Also depends upon coordinate-wrap enable state for the texture-
coordinate set this state is currently using
*/
UpdateHWTexAddrMode(psContext, psLState, 1);
D3DM_DPF((DPF_EXIT, "<-D3DM_TSS_AddressV"));
}
/*----------------------------------------------------------------------------
<function>
FUNCTION : D3DM_TSS_MagFilter
PURPOSE :
PARAMETERS : psContext - Current D3D context
psLState - Layer state to be applied to...
dwValue - Value to set
RETURNS :
</function>
------------------------------------------------------------------------------*/
void D3DM_TSS_MagFilter(LPD3DM_CONTEXT psContext,LPD3DM_TEXTURESTAGESTATE psState)
{
PLAYER_TSTATE psLState;
DWORD dwValue;
DWORD dwTSPLCtl2;
D3DM_DPF((DPF_ENTRY, "->D3DM_TSS_MagFilter"));
D3DM_DPF((DPF_STATE, "D3DM_TSS_MagFilter: Stage %d: Filter = %d", psState->Stage, psState->Value));
psLState = &psContext->sTState.sLState[(DWORD) psState->Stage];
dwValue = psState->Value;
psLState->dwMagFilter = dwValue;
/* Get the max quality filter type between min and mag */
dwValue = max(psLState->dwMagFilter, psLState->dwMinFilter);
/*
Update the required map filtering mode
*/
dwTSPLCtl2 = psLState->sTSPLState.dwLCtl2;
psLState->dwLFlags &= ~LTSTATE_FLAGS_ANISOFILTERINGREQ;
dwTSPLCtl2 |= MBX1_TSPPL2_MAPFILTERENABLE;
switch (dwValue)
{
case D3DMTEXF_POINT:
{
/* Disable HW texture-filtering */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -