Normalize the values returned by the texture state converter

This commit is contained in:
Anthony 2021-04-06 19:42:04 +12:00 committed by PatrickvL
parent 657a8ef7c3
commit 814b040ff1
2 changed files with 33 additions and 7 deletions

View File

@ -124,7 +124,6 @@ void XboxTextureStateConverter::BuildTextureStateMappingTable()
DWORD XboxTextureStateConverter::GetHostTextureOpValue(DWORD Value)
{
bool bOldOrder = g_LibVersion_D3D8 <= 3948; // Verified old order in 3944, new order in 4039
switch (Value) {
case xbox::X_D3DTOP_DISABLE: return D3DTOP_DISABLE;
case xbox::X_D3DTOP_SELECTARG1: return D3DTOP_SELECTARG1;
@ -138,10 +137,10 @@ DWORD XboxTextureStateConverter::GetHostTextureOpValue(DWORD Value)
case xbox::X_D3DTOP_SUBTRACT: return D3DTOP_SUBTRACT;
case xbox::X_D3DTOP_ADDSMOOTH: return D3DTOP_ADDSMOOTH;
case xbox::X_D3DTOP_BLENDDIFFUSEALPHA: return D3DTOP_BLENDDIFFUSEALPHA;
case 0x0D/*xbox::X_D3DTOP_BLENDCURRENTALPHA */: return bOldOrder ? D3DTOP_BLENDTEXTUREALPHA : D3DTOP_BLENDCURRENTALPHA;
case 0x0E/*xbox::X_D3DTOP_BLENDTEXTUREALPHA */: return bOldOrder ? D3DTOP_BLENDFACTORALPHA : D3DTOP_BLENDTEXTUREALPHA;
case 0x0F/*xbox::X_D3DTOP_BLENDFACTORALPHA */: return bOldOrder ? D3DTOP_BLENDTEXTUREALPHAPM : D3DTOP_BLENDFACTORALPHA;
case 0x10/*xbox::X_D3DTOP_BLENDTEXTUREALPHAPM*/: return bOldOrder ? D3DTOP_BLENDCURRENTALPHA : D3DTOP_BLENDTEXTUREALPHAPM;
case xbox::X_D3DTOP_BLENDCURRENTALPHA: return D3DTOP_BLENDCURRENTALPHA;
case xbox::X_D3DTOP_BLENDTEXTUREALPHA: return D3DTOP_BLENDTEXTUREALPHA;
case xbox::X_D3DTOP_BLENDFACTORALPHA: return D3DTOP_BLENDFACTORALPHA;
case xbox::X_D3DTOP_BLENDTEXTUREALPHAPM: return D3DTOP_BLENDTEXTUREALPHAPM;
case xbox::X_D3DTOP_PREMODULATE: return D3DTOP_PREMODULATE;
case xbox::X_D3DTOP_MODULATEALPHA_ADDCOLOR: return D3DTOP_MODULATEALPHA_ADDCOLOR;
case xbox::X_D3DTOP_MODULATECOLOR_ADDALPHA: return D3DTOP_MODULATECOLOR_ADDALPHA;
@ -180,7 +179,7 @@ void XboxTextureStateConverter::Apply()
for (int State = xbox::X_D3DTSS_FIRST; State <= xbox::X_D3DTSS_LAST; State++) {
// Read the value of the current stage/state from the Xbox data structure
DWORD XboxValue = Get(XboxStage, State); // OR D3D__TextureState[(XboxStage * xbox::X_D3DTS_STAGESIZE) + XboxTextureStateOffsets[State]];
DWORD XboxValue = Get(XboxStage, State);
DWORD PcValue = XboxValue;
// If the state hasn't changed, skip setting it
@ -337,6 +336,29 @@ void XboxTextureStateConverter::Apply()
}
}
// Normalize values which may have different mappings per XDK version
DWORD NormalizeValue(DWORD xboxState, DWORD value) {
if (g_LibVersion_D3D8 <= 3948) {
// D3DTOP verified old order in 3948, new order in 4039
switch (xboxState) {
case xbox::X_D3DTSS_COLOROP:
case xbox::X_D3DTSS_ALPHAOP:
switch (value) {
case 13:
return xbox::X_D3DTOP_BLENDTEXTUREALPHA;
case 14:
return xbox::X_D3DTOP_BLENDFACTORALPHA;
case 15:
return xbox::X_D3DTOP_BLENDTEXTUREALPHAPM;
case 16:
return xbox::X_D3DTOP_BLENDCURRENTALPHA;
}
}
}
return value;
}
uint32_t XboxTextureStateConverter::Get(int textureStage, DWORD xboxState) {
if (textureStage < 0 || textureStage > 3)
CxbxKrnlCleanup("Requested texture stage was out of range: %d", textureStage);
@ -344,5 +366,7 @@ uint32_t XboxTextureStateConverter::Get(int textureStage, DWORD xboxState) {
CxbxKrnlCleanup("Requested texture state was out of range: %d", xboxState);
// Read the value of the current stage/state from the Xbox data structure
return D3D__TextureState[(textureStage * xbox::X_D3DTS_STAGESIZE) + XboxTextureStateOffsets[xboxState]];
DWORD rawValue = D3D__TextureState[(textureStage * xbox::X_D3DTS_STAGESIZE) + XboxTextureStateOffsets[xboxState]];
return NormalizeValue(xboxState, rawValue);
}

View File

@ -45,6 +45,8 @@ private:
void BuildTextureStateMappingTable();
DWORD GetHostTextureOpValue(DWORD XboxTextureOp);
// Pointer to Xbox texture states
// Note mappings may change between XDK versions
uint32_t* D3D__TextureState = nullptr;
std::array<int, xbox::X_D3DTSS_LAST + 1> XboxTextureStateOffsets;
XboxRenderStateConverter* pXboxRenderStates;