diff --git a/src/core/hle/D3D8/Direct3D9/TextureStates.cpp b/src/core/hle/D3D8/Direct3D9/TextureStates.cpp index 1aea580ef..15182a217 100644 --- a/src/core/hle/D3D8/Direct3D9/TextureStates.cpp +++ b/src/core/hle/D3D8/Direct3D9/TextureStates.cpp @@ -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); } diff --git a/src/core/hle/D3D8/Direct3D9/TextureStates.h b/src/core/hle/D3D8/Direct3D9/TextureStates.h index d9f6e3742..0859eb893 100644 --- a/src/core/hle/D3D8/Direct3D9/TextureStates.h +++ b/src/core/hle/D3D8/Direct3D9/TextureStates.h @@ -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 XboxTextureStateOffsets; XboxRenderStateConverter* pXboxRenderStates;