diff --git a/Cxbx.opt b/Cxbx.opt index 39a1b98ce..57ec2949b 100644 Binary files a/Cxbx.opt and b/Cxbx.opt differ diff --git a/Doc/Development/IDA-MissedHLF.txt b/Doc/Development/IDA-MissedHLF.txt index b69120544..9bf10e119 100644 --- a/Doc/Development/IDA-MissedHLF.txt +++ b/Doc/Development/IDA-MissedHLF.txt @@ -45,9 +45,25 @@ Message("}\n"); -for(int v=0;v \ No newline at end of file diff --git a/Include/Win32/CxbxKrnl/EmuD3D8.h b/Include/Win32/CxbxKrnl/EmuD3D8.h index 4e16b8afa..3346d7613 100644 --- a/Include/Win32/CxbxKrnl/EmuD3D8.h +++ b/Include/Win32/CxbxKrnl/EmuD3D8.h @@ -48,9 +48,6 @@ extern VOID EmuD3DInit(Xbe::Header *XbeHeader, uint32 XbeHeaderSize); // cleanup direct3d extern VOID EmuD3DCleanup(); -// is this texture linear? -extern GUID hRefGUID_bTexIsLinear; - // EmuD3DTileCache (8 tiles maximum) extern X_D3DTILE EmuD3DTileCache[0x08]; diff --git a/Include/Win32/CxbxKrnl/ResourceTracker.h b/Include/Win32/CxbxKrnl/ResourceTracker.h index b1ff0bb76..3eeeace00 100644 --- a/Include/Win32/CxbxKrnl/ResourceTracker.h +++ b/Include/Win32/CxbxKrnl/ResourceTracker.h @@ -86,7 +86,7 @@ extern class ResourceTracker : public Mutex } g_VBTrackTotal, g_VBTrackDisable, g_PBTrackTotal, g_PBTrackDisable, g_PBTrackShowOnce, -g_PatchedStreamsCache; +g_PatchedStreamsCache, g_DataToTexture; struct RTNode { diff --git a/Source/Win32/CxbxKrnl/EmuD3D8.cpp b/Source/Win32/CxbxKrnl/EmuD3D8.cpp index dfee5e2c0..959913f1e 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8.cpp @@ -427,8 +427,8 @@ void ToggleFauxFullscreen(HWND hWnd) } SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); - SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); ShowWindow(hWnd, SW_MAXIMIZE); + SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } else { @@ -1343,6 +1343,10 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SelectVertexShader VERTEX_SHADER *pVertexShader = (VERTEX_SHADER *)(((X_D3DVertexShader *)(Handle & 0x7FFFFFFF))->Handle); g_pD3DDevice8->SetVertexShader(pVertexShader->Handle); } + else if(Handle == NULL) + { + g_pD3DDevice8->SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX0); + } else if(Address < 136) { X_D3DVertexShader *pVertexShader = (X_D3DVertexShader*)g_VertexShaderSlots[Address]; @@ -2227,6 +2231,16 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CreateVertexShader ZeroMemory(pD3DVertexShader, sizeof(X_D3DVertexShader)); ZeroMemory(pVertexShader, sizeof(VERTEX_SHADER)); + // HACK: TODO: support this situation + if(pDeclaration == NULL) + { + *pHandle = NULL; + + EmuSwapFS(); // Win2k/XP FS + + return S_OK; + } + LPD3DXBUFFER pRecompiledBuffer = NULL; DWORD *pRecompiledDeclaration; DWORD *pRecompiledFunction = NULL; @@ -2768,7 +2782,22 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CreateTexture ); if(FAILED(hRet)) + { EmuWarning("CreateTexture Failed!"); + (*ppTexture)->Data = 0xBEADBEAD; + } + else + { + D3DLOCKED_RECT LockedRect; + + (*ppTexture)->EmuTexture8->LockRect(0, &LockedRect, NULL, NULL); + + (*ppTexture)->Data = (DWORD)LockedRect.pBits; + + g_DataToTexture.insert((*ppTexture)->Data, *ppTexture); + + (*ppTexture)->EmuTexture8->UnlockRect(0); + } DbgPrintf("EmuD3D8 (0x%X): Created Texture : 0x%.08X (0x%.08X)\n", GetCurrentThreadId(), *ppTexture, (*ppTexture)->EmuTexture8); } @@ -3120,7 +3149,9 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetTexture char szBuffer[255]; - sprintf(szBuffer, "C:\\Aaron\\Textures\\0x%.08X-Texture%.03d.bmp", pTexture, dwDumpTexture++); + sprintf(szBuffer, "C:\\Aaron\\Textures\\0x%.08X-SetTexture%.03d.bmp", pTexture, dwDumpTexture++); + + pTexture->EmuTexture8->UnlockRect(0); D3DXSaveTextureToFile(szBuffer, D3DXIFF_BMP, pBaseTexture8, NULL); } @@ -3154,28 +3185,48 @@ VOID __fastcall XTL::EmuIDirect3DDevice8_SwitchTexture ");\n", GetCurrentThreadId(), Method, Data, Format); - EmuWarning("EmuIDirect3DDevice8_SwitchTexture is not implemented!"); + DWORD StageLookup[] = { 0x00081b00, 0x00081b40, 0x00081b80, 0x00081bc0 }; + DWORD Stage = -1; - // - // TODO: Crawl list of active X_D3DTexture's, searching for Data.. - // we're basically screwed in the event that the texture is - // not _Register'd (should never happen though) - // + for(int v=0;v<4;v++) + { + if(StageLookup[v] == Method) + { + Stage = v; + } + } - /* - IDirect3DBaseTexture8 *pBaseTexture8 = pTexture->EmuBaseTexture8; - IDirect3DBaseTexture8 *pPrevTexture8 = NULL; + if(Stage == -1) + { + EmuWarning("Unknown Method (0x%.08X)", Method); + } + else + { + // + // WARNING: TODO: Correct reference counting has not been completely verified for this code + // - // Xbox SwitchTexture does not decrement the reference count on the - // old texture, but SetTexture does, so we need to pre-increment - g_pD3DDevice8->GetTexture(Stage, &pPrevTexture8); + X_D3DTexture *pTexture = (X_D3DTexture *)g_DataToTexture.get(Data); - HRESULT hRet = g_pD3DDevice8->SetTexture(Stage, pBaseTexture8); + EmuWarning("Switching Texture 0x%.08X (0x%.08X) @ Stage %d", pTexture, pTexture->EmuBaseTexture8, Stage); - // Xbox SwitchTexture does not increment reference count, but the - // above SetTexture does, so we need to remove it. - pBaseTexture8->Release(); - //*/ + HRESULT hRet = g_pD3DDevice8->SetTexture(Stage, pTexture->EmuBaseTexture8); + + /* + if(pTexture->EmuBaseTexture8 != NULL) + { + static int dwDumpTexture = 0; + + char szBuffer[255]; + + sprintf(szBuffer, "C:\\Aaron\\Textures\\0x%.08X-SwitchTexture%.03d.bmp", pTexture, dwDumpTexture++); + + pTexture->EmuTexture8->UnlockRect(0); + + D3DXSaveTextureToFile(szBuffer, D3DXIFF_BMP, pTexture->EmuBaseTexture8, NULL); + } + //*/ + } EmuSwapFS(); // XBox FS @@ -4089,7 +4140,7 @@ HRESULT WINAPI XTL::EmuIDirect3DResource8_Register char szBuffer[255]; - sprintf(szBuffer, "C:\\Aaron\\Textures\\%.03d-Surface%.03d.bmp", X_Format, dwDumpSurface++); + sprintf(szBuffer, "C:\\Aaron\\Textures\\%.03d-RegSurface%.03d.bmp", X_Format, dwDumpSurface++); D3DXSaveSurfaceToFile(szBuffer, D3DXIFF_BMP, pResource->EmuSurface8, NULL, NULL); } @@ -4105,7 +4156,7 @@ HRESULT WINAPI XTL::EmuIDirect3DResource8_Register { IDirect3DSurface8 *pSurface=0; - sprintf(szBuffer, "C:\\Aaron\\Textures\\%.03d-CubeTex%.03d-%d.bmp", X_Format, dwDumpCube++, v); + sprintf(szBuffer, "C:\\Aaron\\Textures\\%.03d-RegCubeTex%.03d-%d.bmp", X_Format, dwDumpCube++, v); pResource->EmuCubeTexture8->GetCubeMapSurface((D3DCUBEMAP_FACES)v, 0, &pSurface); @@ -4118,7 +4169,7 @@ HRESULT WINAPI XTL::EmuIDirect3DResource8_Register char szBuffer[255]; - sprintf(szBuffer, "C:\\Aaron\\Textures\\%.03d-Texture%.03d.bmp", X_Format, dwDumpTex++); + sprintf(szBuffer, "C:\\Aaron\\Textures\\%.03d-RegTexture%.03d.bmp", X_Format, dwDumpTex++); D3DXSaveTextureToFile(szBuffer, D3DXIFF_BMP, pResource->EmuTexture8, NULL); } @@ -4337,7 +4388,7 @@ VOID WINAPI XTL::EmuGet2DSurfaceDesc char szBuffer[255]; - sprintf(szBuffer, "C:\\Aaron\\Textures\\Texture%.03d.bmp", dwDumpTexture++); + sprintf(szBuffer, "C:\\Aaron\\Textures\\GetDescTexture%.03d.bmp", dwDumpTexture++); D3DXSaveTextureToFile(szBuffer, D3DXIFF_BMP, pPixelContainer->EmuTexture8, NULL); */ @@ -6134,7 +6185,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_SetRenderState_YuvEnable ");\n", GetCurrentThreadId(), Value); - EmuWarning("YuvEnable not implemented"); + EmuWarning("YuvEnable not implemented (0x%.08X)", Value); EmuSwapFS(); // XBox FS diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/State.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/State.cpp index 2ea8c1f6f..e62cb19be 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/State.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/State.cpp @@ -197,7 +197,7 @@ void XTL::EmuUpdateDeferredStates() // TODO: Use a lookup table, this is not always a 1:1 map if(pCur[12] != X_D3DTSS_UNK) { - if(pCur[12] > 12) + if(pCur[12] > 12 && !(pCur[12] >= 17 && pCur[12] <= 21)) EmuCleanup("(Temporarily) Unsupported D3DTSS_COLOROP Value (%d)", pCur[12]); g_pD3DDevice8->SetTextureStageState(v, D3DTSS_COLOROP, pCur[12]); diff --git a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5558.inl b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5558.inl index 0b60c7c0e..257274d8d 100644 --- a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5558.inl +++ b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5558.inl @@ -185,6 +185,42 @@ SOOVPA<11> IDirect3DDevice8_SelectVertexShader_1_0_5558 = } }; +// ****************************************************************** +// * IDirect3DDevice8_CreateVertexShader +// ****************************************************************** +SOOVPA<12> IDirect3DDevice8_CreateVertexShader_1_0_5558 = +{ + 0, // Large == 0 + 12, // Count == 12 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + // IDirect3DDevice8_CreateVertexShader+0x00 : push ecx; push ebx; push ebp + { 0x00, 0x51 }, // (Offset,Value)-Pair #1 + { 0x01, 0x53 }, // (Offset,Value)-Pair #2 + { 0x02, 0x55 }, // (Offset,Value)-Pair #3 + + // IDirect3DDevice8_CreateVertexShader+0x0A : jz +0x10 + { 0x0A, 0x74 }, // (Offset,Value)-Pair #4 + { 0x0B, 0x10 }, // (Offset,Value)-Pair #5 + + // IDirect3DDevice8_CreateVertexShader+0x43 : shl eax, 0x02 + { 0x43, 0xC1 }, // (Offset,Value)-Pair #6 + { 0x44, 0xE0 }, // (Offset,Value)-Pair #7 + { 0x45, 0x02 }, // (Offset,Value)-Pair #8 + + // IDirect3DDevice8_CreateVertexShader+0x73 : mov eax, 0x8007000E + { 0x65, 0x07 }, // (Offset,Value)-Pair #11 + { 0x66, 0x80 }, // (Offset,Value)-Pair #12 + + // IDirect3DDevice8_CreateVertexShader+0x69 : retn 0x10 + { 0x69, 0xC2 }, // (Offset,Value)-Pair #9 + { 0x6A, 0x10 }, // (Offset,Value)-Pair #10 + } +}; + // ****************************************************************** // * IDirect3DDevice8_SetVertexShaderConstant1 // ****************************************************************** @@ -302,6 +338,28 @@ LOOVPA<8> IDirect3DDevice8_Clear_1_0_5558 = } }; +// ****************************************************************** +// * IDirect3DDevice8_CreateVertexBuffer2 +// ****************************************************************** +SOOVPA<17> IDirect3DDevice8_CreateVertexBuffer2_1_0_5558 = +{ + 0, // Large == 0 + 7, // Count == 7 + + -1, // Xref Not Saved + 0, // Xref Not Used + + { + { 0x08, 0xE8 }, + { 0x12, 0x1E }, + { 0x1C, 0x50 }, + { 0x26, 0x68 }, + { 0x31, 0x33 }, + { 0x3A, 0xFF }, + { 0x44, 0x01 }, + } +}; + // ****************************************************************** // * IDirect3DDevice8_UpdateOverlay // ****************************************************************** @@ -411,6 +469,29 @@ SOOVPA<7> IDirect3DDevice8_SetPixelShader_1_0_5558 = } }; +// ****************************************************************** +// * IDirect3DDevice8_CreateTexture2 +// ****************************************************************** +SOOVPA<8> IDirect3DDevice8_CreateTexture2_1_0_5558 = +{ + 0, // Large == 0 + 8, // Count == 8 + + -1, // Xref Not Saved + 0, // Xref Not Used + + { + { 0x14, 0x4C }, + { 0x2A, 0x8B }, + { 0x42, 0x8B }, + { 0x56, 0x80 }, + { 0x70, 0x85 }, + { 0x82, 0x5E }, + { 0x98, 0x89 }, + { 0xAE, 0x1C }, + } +}; + // ****************************************************************** // * IDirect3DDevice8_End // ****************************************************************** @@ -584,6 +665,28 @@ SOOVPA<8> IDirect3DDevice8_SetVertexShader_1_0_5558 = } }; +// ****************************************************************** +// * IDirect3DDevice8_SetIndices +// ****************************************************************** +SOOVPA<7> IDirect3DDevice8_SetIndices_1_0_5558 = +{ + 0, // Large == 0 + 7, // Count == 7 + + -1, // Xref Not Saved + 0, // Xref Not Used + + { + { 0x0F, 0x10 }, + { 0x20, 0xC7 }, + { 0x31, 0xC0 }, + { 0x42, 0x78 }, + { 0x53, 0xBE }, + { 0x64, 0x89 }, + { 0x75, 0x10 }, + } +}; + // ****************************************************************** // * IDirect3DDevice8_SetTexture // ****************************************************************** @@ -705,6 +808,29 @@ SOOVPA<11> IDirect3DDevice8_BlockUntilVerticalBlank_1_0_5558 = } }; +// ****************************************************************** +// * IDirect3DDevice8_DrawIndexedVertices +// ****************************************************************** +SOOVPA<8> IDirect3DDevice8_DrawIndexedVertices_1_0_5558 = +{ + 0, // Large == 0 + 8, // Count == 8 + + -1, // Xref Not Saved + 0, // Xref Not Used + + { + { 0x1E, 0x5E }, + { 0x3E, 0x17 }, + { 0x5E, 0x00 }, + { 0x7E, 0x8B }, + { 0x9E, 0x89 }, + { 0xBE, 0x2B }, + { 0xDE, 0x00 }, + { 0xFE, 0x04 }, + } +}; + // ****************************************************************** // * IDirect3DDevice8_DrawIndexedVerticesUP // ****************************************************************** @@ -914,13 +1040,24 @@ OOVPATable D3D8_1_0_5558[] = }, // D3DDevice_RunVertexStateShader (* unchanged since 4627 *) { - (OOVPA*)&X_D3DDevice_RunVertexStateShader_1_0_4627, - XTL::EmuIDirect3DDevice8_RunVertexStateShader, + (OOVPA*)&X_D3DDevice_RunVertexStateShader_1_0_4627, + + XTL::EmuIDirect3DDevice8_RunVertexStateShader, #ifdef _DEBUG_TRACE "D3DDevice_RunVertexStateShader" #endif }, + // D3DDevice_GetVertexShaderSize (* unchanged since 4627 *) + { + (OOVPA*)&X_D3DDevice_GetVertexShaderSize_1_0_4627, + + XTL::EmuIDirect3DDevice8_GetVertexShaderSize, + + #ifdef _DEBUG_TRACE + "D3DDevice_GetVertexShaderSize" + #endif + }, // IDirect3DDevice8::LoadVertexShader { (OOVPA*)&IDirect3DDevice8_LoadVertexShader_1_0_5558, @@ -941,6 +1078,16 @@ OOVPATable D3D8_1_0_5558[] = "EmuIDirect3DDevice8_SelectVertexShader" #endif }, + // IDirect3DDevice8::CreateVertexShader + { + (OOVPA*)&IDirect3DDevice8_CreateVertexShader_1_0_5558, + + XTL::EmuIDirect3DDevice8_CreateVertexShader, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_CreateVertexShader" + #endif + }, // IDirect3DDevice8::SetVertexShaderConstant1 { (OOVPA*)&IDirect3DDevice8_SetVertexShaderConstant1_1_0_5558, @@ -961,6 +1108,16 @@ OOVPATable D3D8_1_0_5558[] = "EmuIDirect3DDevice8_SetVertexShaderConstantNotInlineFast" #endif }, + // IDirect3DDevice8::CreateVertexBuffer2 + { + (OOVPA*)&IDirect3DDevice8_CreateVertexBuffer2_1_0_5558, + + XTL::EmuIDirect3DDevice8_CreateVertexBuffer2, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_CreateVertexBuffer2" + #endif + }, // IDirect3DDevice8::UpdateOverlay { (OOVPA*)&IDirect3DDevice8_UpdateOverlay_1_0_5558, @@ -1031,6 +1188,16 @@ OOVPATable D3D8_1_0_5558[] = "EmuIDirect3DDevice8_BlockUntilVerticalBlank" #endif }, + // IDirect3DDevice8::DrawIndexedVertices + { + (OOVPA*)&IDirect3DDevice8_DrawIndexedVertices_1_0_5558, + + XTL::EmuIDirect3DDevice8_DrawIndexedVertices, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_DrawIndexedVertices" + #endif + }, // IDirect3DDevice8::DrawIndexedVerticesUP { (OOVPA*)&IDirect3DDevice8_DrawIndexedVerticesUP_1_0_5558, @@ -1051,6 +1218,16 @@ OOVPATable D3D8_1_0_5558[] = "EmuIDirect3DDevice8_SetPixelShader" #endif }, + // IDirect3DDevice8::CreateTexture2 + { + (OOVPA*)&IDirect3DDevice8_CreateTexture2_1_0_5558, + + XTL::EmuIDirect3DDevice8_CreateTexture2, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_CreateTexture2" + #endif + }, // IDirect3DDevice8::GetDisplayMode (* unchanged since 4627 *) { (OOVPA*)&IDirect3DDevice8_GetDisplayMode_1_0_4627, @@ -1301,6 +1478,16 @@ OOVPATable D3D8_1_0_5558[] = "EmuIDirect3DDevice8_SetVertexShader" #endif }, + // IDirect3DDevice8::SetIndices + { + (OOVPA*)&IDirect3DDevice8_SetIndices_1_0_5558, + + XTL::EmuIDirect3DDevice8_SetIndices, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_SetIndices" + #endif + }, // IDirect3DDevice8::SetTexture { (OOVPA*)&IDirect3DDevice8_SetTexture_1_0_5558, @@ -1381,6 +1568,16 @@ OOVPATable D3D8_1_0_5558[] = "EmuIDirect3DDevice8_SetShaderConstantMode" #endif }, + // IDirect3DResource8::Register (* unchanged since 3925 *) + { + (OOVPA*)&IDirect3DResource8_Register_1_0_3925, + + XTL::EmuIDirect3DResource8_Register, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DResource8_Register" + #endif + }, // IDirect3DResource8::AddRef (* unchanged since 3925 *) { (OOVPA*)&IDirect3DResource8_AddRef_1_0_3925, diff --git a/Source/Win32/CxbxKrnl/ResourceTracker.cpp b/Source/Win32/CxbxKrnl/ResourceTracker.cpp index a18c64de5..49d743333 100644 --- a/Source/Win32/CxbxKrnl/ResourceTracker.cpp +++ b/Source/Win32/CxbxKrnl/ResourceTracker.cpp @@ -47,6 +47,8 @@ ResourceTracker g_PBTrackShowOnce; ResourceTracker g_PatchedStreamsCache; +ResourceTracker g_DataToTexture; + ResourceTracker::~ResourceTracker() { clear();