diff --git a/include/xref/d3d8.def b/include/xref/d3d8.def index 6ecd722d..8c66ca26 100644 --- a/include/xref/d3d8.def +++ b/include/xref/d3d8.def @@ -257,6 +257,7 @@ XREF_SYMBOL(D3DDevice_SetTextureStageStateNotInline) XREF_SYMBOL(D3DDevice_SetTextureState_BorderColor) XREF_SYMBOL(D3DDevice_SetTextureState_BumpEnv) XREF_SYMBOL(D3DDevice_SetTextureState_ColorKeyColor) +XREF_SYMBOL(D3DDevice_SetTextureState_Deferred) XREF_SYMBOL(D3DDevice_SetTextureState_TexCoordIndex) XREF_SYMBOL(D3DDevice_SetTile) XREF_SYMBOL(D3DDevice_SetTransform) diff --git a/src/OOVPADatabase/D3D8/3911.inl b/src/OOVPADatabase/D3D8/3911.inl index 236367e3..971e4287 100644 --- a/src/OOVPADatabase/D3D8/3911.inl +++ b/src/OOVPADatabase/D3D8/3911.inl @@ -4239,15 +4239,23 @@ OOVPA_SIG_MATCH( OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor, 3911) OOVPA_SIG_MATCH( + // push esi + OV_MATCH(0x00, 0x56), - { 0x00, 0x56 }, - { 0x07, 0x56 }, - { 0x0D, 0x8B }, - { 0x13, 0x8D }, - { 0x1A, 0x8B }, - { 0x21, 0x83 }, - { 0x28, 0x07 }, - { 0x2F, 0x5E }, + // mov e??, [esp + param_1] + OV_MATCH(0x0D, 0x8B), + OV_MATCH(0x0F, 0x24, 0x08), + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x11, 0x8D), + OV_MATCH(0x14, 0xE0, 0x0A, 0x04, 0x00), + + // mov e??, [esp + param_2] + OV_MATCH(0x1A, 0x8B), + OV_MATCH(0x1C, 0x24, 0x0C), + + // This is an optional OV pair to tell the difference from the (symbol)_(LTCG variant) signature. + // retn 0x08 + OV_MATCH(0x30, 0xC2, 0x08), // ); @@ -5174,17 +5182,16 @@ OOVPA_SIG_MATCH( OOVPA_SIG_HEADER_NO_XREF(D3D_BlockOnResource, 3911) OOVPA_SIG_MATCH( + // mov eax, [D3D_g_pDevice] + OV_MATCH(0x00, 0xA1), - { 0x00, 0xA1 }, - { 0x34, 0x8B }, // mov edx, [ecx+0x1C] - { 0x35, 0x51 }, - { 0x36, 0x1C }, - { 0x41, 0xC2 }, // retn 4 - { 0x42, 0x04 }, - { 0x43, 0x00 }, - { 0x7E, 0xC2 }, // retn 4 - { 0x7F, 0x04 }, - { 0x80, 0x00 }, + // mov esi, [esp + param_1] + OV_MATCH(0x0A, 0x8B, 0x74, 0x24, 0x08), + + // and eax, 0x70000 + OV_MATCH(0x10, 0x25, 0x00, 0x00, 0x07, 0x00), + // cmp eax, 0x50000 + OV_MATCH(0x15, 0x3D, 0x00, 0x00, 0x05, 0x00), // ); @@ -6028,3 +6035,29 @@ OOVPA_SIG_MATCH( OV_MATCH(0x2C, 0x24), // ); + +// ****************************************************************** +// * D3DDevice_SetTextureState_Deferred +// ****************************************************************** +// Generic OOVPA as of 3911 and newer. +OOVPA_SIG_HEADER_XREF(D3DDevice_SetTextureState_Deferred, + 3911, + XRefOne) +OOVPA_SIG_MATCH( + // mov [ecx * 0x04 + D3D_g_DeferredTextureState],edx + XREF_ENTRY(0x22, XREF_D3D_g_DeferredTextureState), + + // mov eax, [edx * 0x04 + ????] + OV_MATCH(0x00, 0x8B, 0x04, 0x95), + + // shl param_1, 0x05 + OV_MATCH(0x0E, 0xC1, 0xE1, 0x05), + + // add param_1, param_2 + // mov edx, [esp + param_3] + OV_MATCH(0x13, 0x03, 0xCA, 0x8B, 0x54, 0x24, 0x08), + + // mov [ecx * 0x04 + D3D_g_DeferredTextureState], edx + OV_MATCH(0x1F, 0x89, 0x14, 0x8D), + // +); diff --git a/src/OOVPADatabase/D3D8/4034.inl b/src/OOVPADatabase/D3D8/4034.inl index 30364453..2274a112 100644 --- a/src/OOVPADatabase/D3D8/4034.inl +++ b/src/OOVPADatabase/D3D8/4034.inl @@ -369,18 +369,27 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** +// Generic OOVPA as of 4034 and newer. OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor, 4034) OOVPA_SIG_MATCH( + // push esi + OV_MATCH(0x00, 0x56), - { 0x00, 0x56 }, - { 0x07, 0x8B }, - { 0x0E, 0xE8 }, - { 0x16, 0x08 }, - { 0x1E, 0x89 }, - { 0x26, 0x04 }, - { 0x2E, 0x07 }, - { 0x36, 0xC2 }, + // mov e??, [esp + param_1] + OV_MATCH(0x13, 0x8B), + OV_MATCH(0x15, 0x24, 0x08), + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x17, 0x8D), + OV_MATCH(0x1A, 0xE0, 0x0A, 0x04, 0x00), + + // mov e??, [esp + param_2] + OV_MATCH(0x20, 0x8B), + OV_MATCH(0x22, 0x24, 0x0C), + + // This is an optional OV pair to tell the difference from the (symbol)_(LTCG variant) signature. + // retn 0x08 + OV_MATCH(0x36, 0xC2, 0x08), // ); @@ -1288,22 +1297,20 @@ OOVPA_END; // ****************************************************************** // * D3D::BlockOnResource // ****************************************************************** +// Generic OOVPA as of 4034 and newer OOVPA_SIG_HEADER_NO_XREF(D3D_BlockOnResource, 4034) OOVPA_SIG_MATCH( + // mov eax, [D3D_g_pDevice] + OV_MATCH(0x00, 0xA1), - { 0x00, 0xA1 }, - { 0x05, 0x85 }, - { 0x18, 0x00 }, - { 0x19, 0x05 }, - { 0x1A, 0x00 }, - { 0x1B, 0x56 }, - { 0x1C, 0x75 }, - { 0x1D, 0x28 }, - { 0x1E, 0x8B }, - { 0x1F, 0x70 }, - { 0x40, 0x5E }, - { 0x4A, 0xE8 }, + // mov eax, [esp + param_1] + OV_MATCH(0x09, 0x8B, 0x44, 0x24, 0x04), + + // and ecx, 0x70000 + OV_MATCH(0x0F, 0x81, 0xE1, 0x00, 0x00, 0x07, 0x00), + // cmp ecx, 0x50000 + OV_MATCH(0x15, 0x81, 0xF9, 0x00, 0x00, 0x05, 0x00), // ); diff --git a/src/OOVPADatabase/D3D8LTCG/3911.inl b/src/OOVPADatabase/D3D8LTCG/3911.inl index 049873bc..443c1114 100644 --- a/src/OOVPADatabase/D3D8LTCG/3911.inl +++ b/src/OOVPADatabase/D3D8LTCG/3911.inl @@ -193,22 +193,27 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** -//83C008C1E707890689 ...C3 -OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_esi1_ebx2, - 2024) +OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_eax1_ebx2, + 3911) OOVPA_SIG_MATCH( - { 0x01, 0x8B }, + // push esi + OV_MATCH(0x00, 0x56), + + // mov edi, param_1 + // mov eax, [e??] + OV_MATCH(0x0B, 0x8B, 0xF8, 0x8B), + // cmp eax, ecx + // jne +0x07 + OV_MATCH(0x0F, 0x3B, 0xC1, 0x72, 0x07), + + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x1A, 0x8D), + OV_MATCH(0x1D, 0xE0, 0x0A, 0x04, 0x00), - { 0x26, 0x83 }, - { 0x27, 0xC0 }, - { 0x28, 0x08 }, - { 0x29, 0xC1 }, - { 0x2A, 0xE7 }, - { 0x2B, 0x07 }, - { 0x2C, 0x89 }, - { 0x2D, 0x06 }, - { 0x2E, 0x89 }, + // This is required OV pair to tell the difference from the (symbol)_4__LTCG_eax1 signature. + // ret + OV_MATCH(0x36, 0xC3), // ); @@ -1139,23 +1144,20 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3D_BlockOnResource // ****************************************************************** -//00007800750C85 ...C3 OOVPA_SIG_HEADER_NO_XREF(D3D_BlockOnResource_0__LTCG_eax1, - 2024) + 3911) OOVPA_SIG_MATCH( + // mov edx, [D3D_g_pDevice] + OV_MATCH(0x00, 0x8B, 0x15), - { 0x00, 0x8B }, - { 0x01, 0x15 }, - - { 0x28, 0xF7 }, - { 0x29, 0xC1 }, - { 0x2A, 0x00 }, - { 0x2B, 0x00 }, - { 0x2C, 0x78 }, - { 0x2D, 0x00 }, - { 0x2E, 0x75 }, - { 0x2F, 0x0C }, - { 0x30, 0x85 }, + // mov esi, param_1 + OV_MATCH(0x09, 0x8B, 0xF0), + + // test ecx, 0x780000 + OV_MATCH(0x28, 0xF7, 0xC1, 0x00, 0x00, 0x78, 0x00), + // jnz +0x0C + // test e??, e?? + OV_MATCH(0x2E, 0x75, 0x0C, 0x085), // ); diff --git a/src/OOVPADatabase/D3D8LTCG/4039.inl b/src/OOVPADatabase/D3D8LTCG/4039.inl index 542bd5eb..269bef3b 100644 --- a/src/OOVPADatabase/D3D8LTCG/4039.inl +++ b/src/OOVPADatabase/D3D8LTCG/4039.inl @@ -399,19 +399,26 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** -//E00A040089 ...C20400 OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_4__LTCG_eax1, - 2048) + 4039) OOVPA_SIG_MATCH( + // push ebx + OV_MATCH(0x00, 0x53), - { 0x00, 0x53 }, - { 0x01, 0x8B }, + // mov esi, param_1 + // mov eax, [e??] + OV_MATCH(0x10, 0x8B, 0xF0, 0x8B), + // cmp eax, ecx + // jne +0x0B + OV_MATCH(0x14, 0x3B, 0xC1, 0x72, 0x0B), + + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x23, 0x8D), + OV_MATCH(0x26, 0xE0, 0x0A, 0x04, 0x00), - { 0x26, 0xE0 }, - { 0x27, 0x0A }, - { 0x28, 0x04 }, - { 0x29, 0x00 }, - { 0x2A, 0x89 }, + // This is required OV pair to tell the difference from the (symbol)_4__LTCG_eax1_ebx2 signature. + // retn 0x04 + OV_MATCH(0x40, 0xC2, 0x04), // ); @@ -824,21 +831,42 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3D_BlockOnResource // ****************************************************************** -//F7C20000780075 ...C3 +// Generic OOVPA as of 4039 and newer +OOVPA_SIG_HEADER_NO_XREF(D3D_BlockOnResource_0__LTCG_ecx1, + 4039) +OOVPA_SIG_MATCH( + // mov esi, [D3D_g_pDevice] + OV_MATCH(0x01, 0x8B, 0x35), + + // mov edx, param_1 + OV_MATCH(0x0B, 0x8B, 0x11), + + // test edx, 0x780000 + OV_MATCH(0x22, 0xF7, 0xC2, 0x00, 0x00, 0x78, 0x00), + // jnz +0x?? + OV_MATCH(0x28, 0x75), + // +); + +// ****************************************************************** +// * D3D_BlockOnResource +// ****************************************************************** +// TODO: Lowest build detected is 4627, find if any other titles are +// detected by this signature or missing detection. +// Generic OOVPA as of 4039 and newer OOVPA_SIG_HEADER_NO_XREF(D3D_BlockOnResource_0__LTCG_eax1, - 2036) + 4039) OOVPA_SIG_MATCH( + // mov esi, [D3D_g_pDevice] + OV_MATCH(0x01, 0x8B, 0x35), - { 0x01, 0x8B }, - { 0x02, 0x35 }, - - { 0x22, 0xF7 }, - { 0x23, 0xC2 }, - { 0x24, 0x00 }, - { 0x25, 0x00 }, - { 0x26, 0x78 }, - { 0x27, 0x00 }, - { 0x28, 0x75 }, + // mov edx, param_1 + OV_MATCH(0x0B, 0x8B, 0x10), + + // test edx, 0x780000 + OV_MATCH(0x24, 0xF7, 0xC2, 0x00, 0x00, 0x78, 0x00), + // jnz +0x?? + OV_MATCH(0x2A, 0x75), // ); diff --git a/src/OOVPADatabase/D3D8LTCG/4432.inl b/src/OOVPADatabase/D3D8LTCG/4432.inl index da62a96c..7b49f7c7 100644 --- a/src/OOVPADatabase/D3D8LTCG/4432.inl +++ b/src/OOVPADatabase/D3D8LTCG/4432.inl @@ -287,19 +287,32 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** -//E00A040089 OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor, - 1036) + 4432) OOVPA_SIG_MATCH( + // push esi + OV_MATCH(0x00, 0x56), - { 0x01, 0x8B }, - { 0x1D, 0x4C }, + // mov eax, [e??] + OV_MATCH(0x07, 0x8B), + // cmp eax, [esi + 0x04] + // jne +0x0E + OV_MATCH(0x09, 0x3B, 0x46, 0x04, 0x72, 0x0E), + + // mov e??, [esp + param_1] + OV_MATCH(0x1C, 0x8B), + OV_MATCH(0x1E, 0x24, 0x08), + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x20, 0x8D), + OV_MATCH(0x23, 0xE0, 0x0A, 0x04, 0x00), + + // mov e??, [esp + param_2] + OV_MATCH(0x29, 0x8B), + OV_MATCH(0x2B, 0x24, 0x0C), - { 0x23, 0xE0 }, - { 0x24, 0x0A }, - { 0x25, 0x04 }, - { 0x26, 0x00 }, - { 0x27, 0x89 }, + // This is an optional OV pair to tell the difference from the (symbol)_(LTCG variant) signature. + // retn 0x08 + OV_MATCH(0x3F, 0xC2, 0x08), // ); diff --git a/src/OOVPADatabase/D3D8LTCG/4531.inl b/src/OOVPADatabase/D3D8LTCG/4531.inl index 0e2ba312..14ee71e0 100644 --- a/src/OOVPADatabase/D3D8LTCG/4531.inl +++ b/src/OOVPADatabase/D3D8LTCG/4531.inl @@ -51,22 +51,27 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** -//8D0CB5E00A0400 ...C20400 +// Generic OOVPA as of 4531 and newer OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_4__LTCG_eax1, - 2060) + 4531) OOVPA_SIG_MATCH( - - { 0x00, 0x53 }, - - { 0x26, 0x8D }, - { 0x27, 0x0C }, - { 0x28, 0xB5 }, - { 0x29, 0xE0 }, - { 0x2A, 0x0A }, - { 0x2B, 0x04 }, - { 0x2C, 0x00 }, - - { 0x43, 0xC2 }, + // push ebx + OV_MATCH(0x00, 0x53), + + // mov esi, param_1 + // mov eax, [e??] + OV_MATCH(0x10, 0x8B, 0xF0, 0x8B), + // cmp eax, ecx + // jne +0x0E + OV_MATCH(0x14, 0x3B, 0xC1, 0x72, 0x0E), + + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x26, 0x8D), + OV_MATCH(0x29, 0xE0, 0x0A, 0x04, 0x00), + + // This is required OV pair to tell the difference from the (symbol)_4__LTCG_eax1_ebx2 signature. + // retn 0x04 + OV_MATCH(0x43, 0xC2, 0x04), // ); diff --git a/src/OOVPADatabase/D3D8LTCG/4627.inl b/src/OOVPADatabase/D3D8LTCG/4627.inl index e4296dab..96544b9c 100644 --- a/src/OOVPADatabase/D3D8LTCG/4627.inl +++ b/src/OOVPADatabase/D3D8LTCG/4627.inl @@ -952,27 +952,6 @@ OOVPA_SIG_MATCH( // ); -// ****************************************************************** -// * D3D_BlockOnResource -// ****************************************************************** -//F7C20000780075 ...C3 -OOVPA_SIG_HEADER_NO_XREF(D3D_BlockOnResource_0__LTCG_eax1, - 2048) -OOVPA_SIG_MATCH( - - { 0x01, 0x8B }, - { 0x02, 0x35 }, - - { 0x24, 0xF7 }, - { 0x25, 0xC2 }, - { 0x26, 0x00 }, - { 0x27, 0x00 }, - { 0x28, 0x78 }, - { 0x29, 0x00 }, - { 0x2A, 0x75 }, - // -); - // ****************************************************************** // * D3D_BlockOnTime // ****************************************************************** diff --git a/src/OOVPADatabase/D3D8LTCG/5233.inl b/src/OOVPADatabase/D3D8LTCG/5233.inl index 3d00fff3..1f0abe46 100644 --- a/src/OOVPADatabase/D3D8LTCG/5233.inl +++ b/src/OOVPADatabase/D3D8LTCG/5233.inl @@ -115,22 +115,27 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** -//8D0CB5E00A0400 ...C3 -OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_esi1_ebx2, - 2036) +OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_eax1_ebx2, + 5233) OOVPA_SIG_MATCH( - { 0x00, 0x56 }, + // push esi + OV_MATCH(0x00, 0x56), - { 0x21, 0x8D }, - { 0x22, 0x0C }, - { 0x23, 0xB5 }, - { 0x24, 0xE0 }, - { 0x25, 0x0A }, - { 0x26, 0x04 }, - { 0x27, 0x00 }, + // mov esi, param_1 + // mov eax, [e??] + OV_MATCH(0x0B, 0x8B, 0xF0, 0x8B), + // cmp eax, ecx + // jne +0x0E + OV_MATCH(0x0F, 0x3B, 0xC1, 0x72, 0x0E), - { 0x3D, 0xC3 }, + // lea e??, [e?? * 0x4 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x21, 0x8D), + OV_MATCH(0x24, 0xE0, 0x0A, 0x04, 0x00), + + // This is required OV pair to tell the difference from the (symbol)_4__LTCG_eax1 signature. + // ret + OV_MATCH(0x3D, 0xC3), // ); diff --git a/src/OOVPADatabase/D3D8LTCG/5455.inl b/src/OOVPADatabase/D3D8LTCG/5455.inl index b838249e..8997b927 100644 --- a/src/OOVPADatabase/D3D8LTCG/5455.inl +++ b/src/OOVPADatabase/D3D8LTCG/5455.inl @@ -227,21 +227,21 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3D_BlockOnResource // ****************************************************************** -//F7C20000780075 ...C3 +// Test case: +// - Freaky Flyers OOVPA_SIG_HEADER_NO_XREF(D3D_BlockOnResource_0__LTCG_eax1, - 2060) + 5455) OOVPA_SIG_MATCH( + // mov esi, [D3D_g_pDevice] + OV_MATCH(0x01, 0x8B, 0x35), - { 0x01, 0x8B }, - { 0x02, 0x35 }, + // mov edx, param_1 + OV_MATCH(0x0F, 0x8B, 0x10), - { 0x28, 0xF7 }, - { 0x29, 0xC2 }, - { 0x2A, 0x00 }, - { 0x2B, 0x00 }, - { 0x2C, 0x78 }, - { 0x2D, 0x00 }, - { 0x2E, 0x75 }, + // test edx, 0x780000 + OV_MATCH(0x28, 0xF7, 0xC2, 0x00, 0x00, 0x78, 0x00), + // jnz +0x?? + OV_MATCH(0x2E, 0x75), // ); diff --git a/src/OOVPADatabase/D3D8LTCG/5788.inl b/src/OOVPADatabase/D3D8LTCG/5788.inl index a3a555c3..67d3d4db 100644 --- a/src/OOVPADatabase/D3D8LTCG/5788.inl +++ b/src/OOVPADatabase/D3D8LTCG/5788.inl @@ -462,40 +462,61 @@ OOVPA_SIG_MATCH( // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** -//E00A040089 +// Generic OOVPA as of 5788 and newer OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor, - 1024) + 5788) OOVPA_SIG_MATCH( + // push esi + OV_MATCH(0x00, 0x56), - { 0x01, 0x8B }, - { 0x18, 0xE8 }, - { 0x1E, 0x4C }, + // mov eax, [e??] + OV_MATCH(0x07, 0x8B), + // cmp eax, [esi + 0x04] + // jne +0x0F + OV_MATCH(0x09, 0x3B, 0x46, 0x04, 0x72, 0x0F), - { 0x24, 0xE0 }, - { 0x25, 0x0A }, - { 0x26, 0x04 }, - { 0x27, 0x00 }, - { 0x28, 0x89 }, + // mov e??, [esp + param_1] + OV_MATCH(0x1D, 0x8B), + OV_MATCH(0x1F, 0x24, 0x08), + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x21, 0x8D), + OV_MATCH(0x24, 0xE0, 0x0A, 0x04, 0x00), + + // mov e??, [esp + param_2] + OV_MATCH(0x2A, 0x8B), + OV_MATCH(0x2C, 0x24, 0x0C), + + // This is an optional OV pair to tell the difference from the (symbol)_(LTCG variant) signature. + // retn 0x08 + OV_MATCH(0x40, 0xC2, 0x08), // ); // ****************************************************************** // * D3DDevice_SetTextureState_ColorKeyColor // ****************************************************************** -//E00A040089 ...C3 -OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_esi1_ebx2, - 2048) +// Generic OOVPA as of 5788 and newer +OOVPA_SIG_HEADER_NO_XREF(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_eax1_ebx2, + 5788) OOVPA_SIG_MATCH( - { 0x01, 0x57 }, - { 0x0B, 0x8B }, - { 0x1D, 0xE8 }, - - { 0x25, 0xE0 }, - { 0x26, 0x0A }, - { 0x27, 0x04 }, - { 0x28, 0x00 }, - { 0x29, 0x89 }, + // push esi + OV_MATCH(0x00, 0x56), + + // mov esi, param_1 + // mov eax, [e??] + OV_MATCH(0x0B, 0x8B, 0xF0, 0x8B), + // cmp eax, ecx + // jne +0x0F + OV_MATCH(0x0F, 0x3B, 0xC1, 0x72, 0x0F), + + // lea e??, [e?? * 0x04 + 0x40AE0] // 0x40AE0 is a reliable hardcoded value across all builds. + OV_MATCH(0x22, 0x8D), + OV_MATCH(0x25, 0xE0, 0x0A, 0x04, 0x00), + + // This is required OV pair to tell the difference from the (symbol)_4__LTCG_eax1 signature. + // ret + OV_MATCH(0x3E, 0xC3), // ); diff --git a/src/OOVPADatabase/D3D8LTCG_OOVPA.c b/src/OOVPADatabase/D3D8LTCG_OOVPA.c index b3525974..9a048aaf 100644 --- a/src/OOVPADatabase/D3D8LTCG_OOVPA.c +++ b/src/OOVPADatabase/D3D8LTCG_OOVPA.c @@ -27,6 +27,7 @@ // * D3DDevice_Reset (4034 ... < 4432) // NOTE: Unknown if any signatures need to be lower. // * D3DDevice_Reset_0__LTCG_edi1 (4034 ... < 4039) // NOTE: Unknown if 4039 signature needs to be lower. // * D3DDevice_Reset_0__LTCG_ebx1 (... < 5344) // NOTE: Unknown if signature needs to be lower, and may have appeared at the same time when CDevice_InitializeFrameBuffers_4__LTCG_edi1 was introduced. +// * D3D_BlockOnResource_0__LTCG_eax1 (4039 ... < 4627) // NOTE: Lowest build detected is 4627, I had not found any older titles able to detect this signature yet. But it seems to be able lower down to 4039, according to D3D_BlockOnResource_0__LTCG_ecx1 variant. #include "OOVPA_databases.h" @@ -338,11 +339,11 @@ static OOVPATable D3D8LTCG_OOVPA_Table[] = { REGISTER_OOVPAS(SYM_FUN_LTCG(D3DDevice_SetTextureState_BumpEnv, CALL(unk), STACK(8), PARAMS(PARAM(eax, Stage), PARAM(psh, Type), PARAM(psh, Value))), SYM_SIG(2024)), REGISTER_OOVPAS(SYM_FUN(D3DDevice_SetTextureState_ColorKeyColor, CALL(std), STACK(/*default*/), PARAMS(PARAM(psh, Stage), PARAM(psh, Value))), - SYM_SIG(1024, 1036)), - REGISTER_OOVPAS(SYM_FUN_LTCG(D3DDevice_SetTextureState_ColorKeyColor, CALL(unk), STACK(0), PARAMS(PARAM(esi, Stage), PARAM(ebx, Value))), - SYM_SIG(2024, 2036, 2048)), + SYM_SIG(4432, 5788)), + REGISTER_OOVPAS(SYM_FUN_LTCG(D3DDevice_SetTextureState_ColorKeyColor, CALL(unk), STACK(0), PARAMS(PARAM(eax, Stage), PARAM(ebx, Value))), + SYM_SIG(3911, 5233, 5788)), REGISTER_OOVPAS(SYM_FUN_LTCG(D3DDevice_SetTextureState_ColorKeyColor, CALL(unk), STACK(4), PARAMS(PARAM(eax, Stage), PARAM(psh, Value))), - SYM_SIG(2048, 2060)), + SYM_SIG(4039, 4531)), REGISTER_OOVPAS_M(SYM_FUN(D3DDevice_SetTextureState_TexCoordIndex, CALL(std), STACK(/*default*/), PARAMS(PARAM(psh, Stage), PARAM(psh, Value))), SYM_SIG(1944, 1958)), REGISTER_OOVPAS_M(SYM_FUN_LTCG(D3DDevice_SetTextureState_TexCoordIndex, CALL(unk), STACK(0), PARAMS(PARAM(edi, Stage), PARAM(eax, Value))), @@ -418,7 +419,9 @@ static OOVPATable D3D8LTCG_OOVPA_Table[] = { REGISTER_OOVPAS(SYM_FUN(D3DVertexBuffer_Lock2, CALL(std), STACK(/*default*/), PARAMS(PARAM(psh, pVertexBuffer), PARAM(psh, Flags))), SYM_SIG(1024)), REGISTER_OOVPAS(SYM_FUN_LTCG(D3D_BlockOnResource, CALL(unk), STACK(0), PARAMS(PARAM(eax, pResource))), - SYM_SIG(2024, 2036, 2048, 2060)), + SYM_SIG(3911, 4039, 5455)), + REGISTER_OOVPAS(SYM_FUN_LTCG(D3D_BlockOnResource, CALL(fas), STACK(0), PARAMS(PARAM(ecx, pResource))), + SYM_SIG(4039)), REGISTER_OOVPAS(SYM_FUN_LTCG(D3D_DestroyResource, CALL(unk), STACK(0), PARAMS(PARAM(edi, pResource))), SYM_SIG(3911)), REGISTER_OOVPAS(SYM_FUN(D3D_CommonSetRenderTarget, CALL(std), STACK(/*default*/), PARAMS(PARAM(psh, pRenderTarget), PARAM(psh, pNewZStencil), PARAM(psh, unknown3))), diff --git a/src/OOVPADatabase/D3D8_OOVPA.c b/src/OOVPADatabase/D3D8_OOVPA.c index ee862488..f4ec9350 100644 --- a/src/OOVPADatabase/D3D8_OOVPA.c +++ b/src/OOVPADatabase/D3D8_OOVPA.c @@ -548,6 +548,8 @@ static OOVPATable D3D8_OOVPA_Table[] = { SYM_SIG(3911, 4034)), REGISTER_OOVPAS(SYM_FUN(D3DDevice_SetTextureState_ColorKeyColor, CALL(std), STACK(/*default*/), PARAMS(PARAM(psh, Stage), PARAM(psh, Value))), SYM_SIG(3911, 4034)), + REGISTER_OOVPAS(SYM_FUN(D3DDevice_SetTextureState_Deferred, CALL(fas), STACK(/*default*/), PARAMS(PARAM(ecx, Stage), PARAM(edx, Type), PARAM(psh, Value))), + SYM_SIG(3911)), REGISTER_OOVPAS_M(SYM_FUN(D3DDevice_SetTextureState_TexCoordIndex, CALL(std), STACK(/*default*/), PARAMS(PARAM(psh, Stage), PARAM(psh, Value))), SYM_SIG(3911, 4034, 4242, 4627)), REGISTER_OOVPAS(SYM_FUN(D3DDevice_SetTile, CALL(std), STACK(/*default*/), PARAMS(PARAM(psh, Index), PARAM(psh, pTile))), diff --git a/src/test/libverify/D3D8.cpp b/src/test/libverify/D3D8.cpp index dc79fec3..38642584 100644 --- a/src/test/libverify/D3D8.cpp +++ b/src/test/libverify/D3D8.cpp @@ -244,7 +244,7 @@ static const library_list database_full = { REGISTER_SYMBOL(D3DDevice_SetRenderStateNotInline_0__LTCG_esi1_edi2, VER_RANGE(3911))), REGISTER_SYMBOL_INLINE(D3DDevice_SetRenderState_BackFillMode, VER_RANGE(3911)), REGISTER_SYMBOL_INLINE(D3DDevice_SetRenderState_CullMode, VER_RANGE(3911)), - REGISTER_SYMBOL_INLINE(D3DDevice_SetRenderState_Deferred, VER_RANGE(3911)), + REGISTER_SYMBOL_INLINE(D3DDevice_SetRenderState_Deferred, VER_RANGE(3911, 4034)), REGISTER_SYMBOL_INLINE(D3DDevice_SetRenderState_DoNotCullUncompressed, VER_RANGE(3911)), REGISTER_SYMBOL_INLINE(D3DDevice_SetRenderState_Dxt1NoiseEnable, VER_RANGE(3911)), REGISTER_SYMBOL_INLINE(D3DDevice_SetRenderState_EdgeAntiAlias, VER_RANGE(3911)), @@ -327,8 +327,9 @@ static const library_list database_full = { REGISTER_SYMBOL(D3DDevice_SetTextureState_BumpEnv_8__LTCG_eax1, VER_RANGE(3911))), REGISTER_SYMBOLS(D3DDevice_SetTextureState_ColorKeyColor, REGISTER_SYMBOL(D3DDevice_SetTextureState_ColorKeyColor, VER_RANGE(3911)), - REGISTER_SYMBOL(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_esi1_ebx2, VER_RANGE(3911)), + REGISTER_SYMBOL(D3DDevice_SetTextureState_ColorKeyColor_0__LTCG_eax1_ebx2, VER_RANGE(3911)), REGISTER_SYMBOL(D3DDevice_SetTextureState_ColorKeyColor_4__LTCG_eax1, VER_RANGE(3911))), + REGISTER_SYMBOL_INLINE(D3DDevice_SetTextureState_Deferred, VER_RANGE(3911, 4034)), REGISTER_SYMBOLS(D3DDevice_SetTextureState_TexCoordIndex, REGISTER_SYMBOL(D3DDevice_SetTextureState_TexCoordIndex, VER_RANGE(3911)), REGISTER_SYMBOL(D3DDevice_SetTextureState_TexCoordIndex_0__LTCG_edi1_eax2, VER_RANGE(3911)), @@ -399,7 +400,8 @@ static const library_list database_full = { REGISTER_SYMBOL_INLINE(D3D_AllocContiguousMemory, VER_RANGE(3911)), REGISTER_SYMBOLS(D3D_BlockOnResource, REGISTER_SYMBOL(D3D_BlockOnResource, VER_RANGE(3911)), - REGISTER_SYMBOL(D3D_BlockOnResource_0__LTCG_eax1, VER_RANGE(3911))), + REGISTER_SYMBOL(D3D_BlockOnResource_0__LTCG_eax1, VER_RANGE(3911)), + REGISTER_SYMBOL(D3D_BlockOnResource_0__LTCG_ecx1, VER_RANGE(4039))), REGISTER_SYMBOLS(D3D_BlockOnTime, REGISTER_SYMBOL(D3D_BlockOnTime, VER_RANGE(3911)), REGISTER_SYMBOL(D3D_BlockOnTime_4__LTCG_eax1, VER_RANGE(3911))),