From 6a10a8301e2daccdb84d961a21d9ca1f3e23456d Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Sun, 14 Mar 2004 11:30:34 +0000 Subject: [PATCH] mem eat fix; single-window fix; minor shader fix (segaGT); more segaGT --- Cxbx.opt | Bin 60928 -> 58880 bytes Include/Win32/CxbxKrnl/EmuD3D8.h | 5 + Include/Win32/CxbxKrnl/EmuD3D8/VertexShader.h | 2 +- Include/Win32/CxbxKrnl/EmuD3D8Types.h | 1 + Include/Win32/CxbxKrnl/EmuXG.h | 25 +++ Source/Win32/Cxbx/jpegdec/jpegdec.cpp | 2 +- Source/Win32/CxbxKrnl/Emu.cpp | 30 +-- Source/Win32/CxbxKrnl/EmuD3D8.cpp | 96 ++++++++-- .../Win32/CxbxKrnl/EmuD3D8/VertexShader.cpp | 4 + Source/Win32/CxbxKrnl/EmuXG.cpp | 56 ++++++ .../CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl | 178 ++++++++++++++++++ .../CxbxKrnl/HLEDataBase/XG.1.0.4627.inl | 42 +++++ 12 files changed, 414 insertions(+), 27 deletions(-) diff --git a/Cxbx.opt b/Cxbx.opt index 5cfc806baa7346a26ab2f5b1b385cd77fe1a6187..e64961c61a7c08990573d5ea20411ea63c7af8b1 100644 GIT binary patch literal 58880 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 sHLPadt%W$k;voSNVFqzV|1MbKYy71{{R30 literal 60928 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 diff --git a/Include/Win32/CxbxKrnl/EmuD3D8.h b/Include/Win32/CxbxKrnl/EmuD3D8.h index 697adae81..0958eba10 100644 --- a/Include/Win32/CxbxKrnl/EmuD3D8.h +++ b/Include/Win32/CxbxKrnl/EmuD3D8.h @@ -161,6 +161,11 @@ HRESULT WINAPI EmuIDirect3D8_EnumAdapterModes // ****************************************************************** VOID WINAPI EmuIDirect3D8_KickOffAndWaitForIdle(); +// ****************************************************************** +// * func: EmuIDirect3D8_KickOffAndWaitForIdle +// ****************************************************************** +VOID WINAPI EmuIDirect3D8_KickOffAndWaitForIdle2(DWORD dwDummy1, DWORD dwDummy2); + // ****************************************************************** // * func: EmuIDirect3DDevice8_SetGammaRamp // ****************************************************************** diff --git a/Include/Win32/CxbxKrnl/EmuD3D8/VertexShader.h b/Include/Win32/CxbxKrnl/EmuD3D8/VertexShader.h index 8aac719db..b38ec83da 100644 --- a/Include/Win32/CxbxKrnl/EmuD3D8/VertexShader.h +++ b/Include/Win32/CxbxKrnl/EmuD3D8/VertexShader.h @@ -34,7 +34,7 @@ #ifndef VERTEXSHADER_H #define VERTEXSHADER_H -#define _DEBUG_VSH +//#define _DEBUG_VSH // nv2a microcode header typedef struct diff --git a/Include/Win32/CxbxKrnl/EmuD3D8Types.h b/Include/Win32/CxbxKrnl/EmuD3D8Types.h index b8eb2ced7..0949f9e6b 100644 --- a/Include/Win32/CxbxKrnl/EmuD3D8Types.h +++ b/Include/Win32/CxbxKrnl/EmuD3D8Types.h @@ -185,6 +185,7 @@ struct X_D3DResource // special resource data flags #define X_D3DRESOURCE_DATA_FLAG_SURFACE 0xEFFFFFFF #define X_D3DRESOURCE_DATA_FLAG_YUVSURF 0xDFFFFFFF +#define X_D3DRESOURCE_DATA_FLAG_D3DREND 0xCFFFFFFF // D3D Render Target // special resource lock flags #define X_D3DRESOURCE_LOCK_FLAG_NOSIZE 0xEFFFFFFF diff --git a/Include/Win32/CxbxKrnl/EmuXG.h b/Include/Win32/CxbxKrnl/EmuXG.h index f785ea83a..0c995bb19 100644 --- a/Include/Win32/CxbxKrnl/EmuXG.h +++ b/Include/Win32/CxbxKrnl/EmuXG.h @@ -34,6 +34,14 @@ #ifndef EMUXG_H #define EMUXG_H +typedef struct _XGPOINT3D +{ + DWORD u; + DWORD v; + DWORD w; +} +XGPOINT3D; + // ****************************************************************** // * func: EmuXGIsSwizzledFormat // ****************************************************************** @@ -57,6 +65,23 @@ VOID WINAPI EmuXGSwizzleRect DWORD BytesPerPixel ); +// ****************************************************************** +// * func: EmuXGSwizzleBox +// ****************************************************************** +VOID WINAPI EmuXGSwizzleBox +( + LPCVOID pSource, + DWORD RowPitch, + DWORD SlicePitch, + CONST D3DBOX *pBox, + LPVOID pDest, + DWORD Width, + DWORD Height, + DWORD Depth, + CONST XGPOINT3D *pPoint, + DWORD BytesPerPixel +); + // ****************************************************************** // * func: EmuXGUnswizzleRect // ****************************************************************** diff --git a/Source/Win32/Cxbx/jpegdec/jpegdec.cpp b/Source/Win32/Cxbx/jpegdec/jpegdec.cpp index 94cdb491a..40c14f6e3 100644 --- a/Source/Win32/Cxbx/jpegdec/jpegdec.cpp +++ b/Source/Win32/Cxbx/jpegdec/jpegdec.cpp @@ -165,7 +165,7 @@ uint08 *jpeg2bmp(uint08 *jpeg, uint32 jpegSize, uint32 &bmpSize) row_stride = cinfo.output_width * cinfo.output_components; // calculate bitmap size - bmpSize = row_stride*(cinfo.output_width*cinfo.output_height); + bmpSize = row_stride*cinfo.output_height; // allocate bitmap data buffer = (uint08*)malloc(bmpSize); diff --git a/Source/Win32/CxbxKrnl/Emu.cpp b/Source/Win32/CxbxKrnl/Emu.cpp index a93798da9..72c5a706d 100644 --- a/Source/Win32/CxbxKrnl/Emu.cpp +++ b/Source/Win32/CxbxKrnl/Emu.cpp @@ -155,7 +155,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit g_pTLS = pTLS; g_pTLSData = pTLSData; g_pXbeHeader = pXbeHeader; - g_hEmuParent = hwndParent; + g_hEmuParent = IsWindow(hwndParent) ? hwndParent : NULL; // For Unicode Conversions setlocale(LC_ALL, "English"); @@ -563,7 +563,7 @@ extern "C" CXBXKRNL_API void NTAPI EmuInit // _USE_XGMATH Disabled in mesh :[ // halo : dword_0_2E2D18 // halo : 1744F0 (bink) - _asm int 3 + //_asm int 3 Entry(); @@ -657,7 +657,8 @@ extern "C" CXBXKRNL_API void NTAPI EmuCleanup(const char *szErrorMessage, ...) freopen("nul", "w", stdout); } - SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0); + if(g_hEmuParent != NULL) + SendMessage(g_hEmuParent, WM_PARENTNOTIFY, WM_DESTROY, 0); TerminateProcess(GetCurrentProcess(), 0); @@ -723,10 +724,12 @@ extern "C" CXBXKRNL_API void NTAPI EmuSuspend() { char szBuffer[256]; - GetWindowText(g_hEmuParent, szBuffer, 255 - 10); + HWND hWnd = (g_hEmuParent != NULL) ? g_hEmuParent : g_hEmuWindow; + + GetWindowText(hWnd, szBuffer, 255 - 10); strcat(szBuffer, " (paused)"); - SetWindowText(g_hEmuParent, szBuffer); + SetWindowText(hWnd, szBuffer); } g_bEmuSuspended = TRUE; @@ -742,11 +745,13 @@ extern "C" CXBXKRNL_API void NTAPI EmuResume() { char szBuffer[256]; - GetWindowText(g_hEmuParent, szBuffer, 255); + HWND hWnd = (g_hEmuParent != NULL) ? g_hEmuParent : g_hEmuWindow; + + GetWindowText(hWnd, szBuffer, 255); szBuffer[strlen(szBuffer)-9] = '\0'; - SetWindowText(g_hEmuParent, szBuffer); + SetWindowText(hWnd, szBuffer); } for(int v=0;vCommon = 0; + g_pCachedRenderTarget->Data = X_D3DRESOURCE_DATA_FLAG_D3DREND; g_pD3DDevice8->GetRenderTarget(&g_pCachedRenderTarget->EmuSurface8); // update z-stencil surface cache @@ -885,6 +912,10 @@ static void EmuVerifyResourceIsRegistered(XTL::X_D3DResource *pResource) if(pResource->Lock != 0 && pResource->Lock != 0xEEEEEEEE && pResource->Lock != 0xFFFFFFFF) return; + // Already "Registered" implicitly + if(pResource->Data == X_D3DRESOURCE_DATA_FLAG_D3DREND) + return; + int v=0; for(v=0;v<16;v++) @@ -1418,6 +1449,32 @@ VOID WINAPI XTL::EmuIDirect3D8_KickOffAndWaitForIdle() return; } +// ****************************************************************** +// * func: EmuIDirect3D8_KickOffAndWaitForIdle2 +// ****************************************************************** +VOID WINAPI XTL::EmuIDirect3D8_KickOffAndWaitForIdle2(DWORD dwDummy1, DWORD dwDummy2) +{ + EmuSwapFS(); // Win2k/XP FS + + // debug trace + #ifdef _DEBUG_TRACE + { + printf("EmuD3D8 (0x%X): EmuIDirect3D8_KickOffAndWaitForIdle\n" + "(\n" + " dwDummy1 : 0x%.08X\n" + " dwDummy2 : 0x%.08X\n" + ");\n", + GetCurrentThreadId(), dwDummy1, dwDummy2); + } + #endif + + // TODO: Actually do something here? + + EmuSwapFS(); // XBox FS + + return; +} + // ****************************************************************** // * func: EmuIDirect3DDevice8_SetGammaRamp // ****************************************************************** @@ -2004,7 +2061,7 @@ XTL::X_D3DSurface * WINAPI XTL::EmuIDirect3DDevice8_GetRenderTarget2() pSurface8->AddRef(); #ifdef _DEBUG_TRACE - printf("EmuD3D8 (0x%X): RenderTarget := 0x%.08X\n", pSurface8); + printf("EmuD3D8 (0x%X): RenderTarget := 0x%.08X\n", GetCurrentThreadId(), pSurface8); #endif EmuSwapFS(); // Xbox FS @@ -4112,11 +4169,18 @@ HRESULT WINAPI XTL::EmuIDirect3DResource8_Register { if(bSwizzled) { - XTL::EmuXGUnswizzleRect - ( - pSrc, dwWidth, dwHeight, dwDepth, LockedRect.pBits, - LockedRect.Pitch, iRect, iPoint, dwBPP - ); + if((DWORD)pSrc == 0x80000000) + { + // TODO: Fix or handle this situation..? + } + else + { + XTL::EmuXGUnswizzleRect + ( + pSrc, dwWidth, dwHeight, dwDepth, LockedRect.pBits, + LockedRect.Pitch, iRect, iPoint, dwBPP + ); + } } else if(bCompressed) { @@ -4753,6 +4817,9 @@ HRESULT WINAPI XTL::EmuIDirect3DTexture8_GetSurfaceLevel *ppSurfaceLevel = new X_D3DSurface(); (*ppSurfaceLevel)->Data = 0xB00BBABE; + (*ppSurfaceLevel)->Common = 0; + (*ppSurfaceLevel)->Format = 0; + (*ppSurfaceLevel)->Size = 0; hRet = pTexture8->GetSurfaceLevel(Level, &((*ppSurfaceLevel)->EmuSurface8)); @@ -7048,6 +7115,7 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetRenderTarget if(pRenderTarget != 0) { EmuVerifyResourceIsRegistered(pRenderTarget); + pPCRenderTarget = pRenderTarget->EmuSurface8; } diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/VertexShader.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/VertexShader.cpp index 344dd772a..4bc1ad767 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/VertexShader.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/VertexShader.cpp @@ -1868,6 +1868,10 @@ extern HRESULT XTL::EmuRecompileVshFunction VSH_XBOX_SHADER *pShader = (VSH_XBOX_SHADER*)malloc(sizeof(VSH_XBOX_SHADER)); HRESULT hRet = 0; + // TODO: support this situation.. + if(pFunction == NULL) + return E_FAIL; + *ppRecompiled = NULL; *pOriginalSize = 0; if(!pShader) diff --git a/Source/Win32/CxbxKrnl/EmuXG.cpp b/Source/Win32/CxbxKrnl/EmuXG.cpp index b938f3d57..e8a5af1f0 100644 --- a/Source/Win32/CxbxKrnl/EmuXG.cpp +++ b/Source/Win32/CxbxKrnl/EmuXG.cpp @@ -157,6 +157,62 @@ VOID WINAPI XTL::EmuXGSwizzleRect return; } +// ****************************************************************** +// * func: EmuXGSwizzleBox +// ****************************************************************** +VOID WINAPI XTL::EmuXGSwizzleBox +( + LPCVOID pSource, + DWORD RowPitch, + DWORD SlicePitch, + CONST D3DBOX *pBox, + LPVOID pDest, + DWORD Width, + DWORD Height, + DWORD Depth, + CONST XGPOINT3D *pPoint, + DWORD BytesPerPixel +) +{ + EmuSwapFS(); // Win2k/XP FS + + // ****************************************************************** + // * debug trace + // ****************************************************************** + #ifdef _DEBUG_TRACE + { + printf("EmuXapi (0x%X): EmuXGSwizzleBox\n" + "(\n" + " pSource : 0x%.08X\n" + " RowPitch : 0x%.08X\n" + " SlicePitch : 0x%.08X\n" + " pBox : 0x%.08X\n" + " pDest : 0x%.08X\n" + " Width : 0x%.08X\n" + " Height : 0x%.08X\n" + " Depth : 0x%.08X\n" + " pPoint : 0x%.08X\n" + " BytesPerPixel : 0x%.08X\n" + ");\n", + GetCurrentThreadId(), pSource, RowPitch, SlicePitch, pBox, pDest, Width, Height, + Depth, pPoint, BytesPerPixel); + } + #endif + + if(pBox == NULL && pPoint == NULL && RowPitch == 0 && SlicePitch == 0) + { + memcpy(pDest, pSource, Width*Height*Depth*BytesPerPixel); + } + else + { + EmuCleanup("Temporarily unsupported swizzle (easy fix)"); + } + + EmuSwapFS(); // Xbox FS + + return; +} + // ****************************************************************** // * func: EmuXGUnswizzleRect // ****************************************************************** diff --git a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl index 1046bcf4d..3cf9f4318 100644 --- a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl +++ b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl @@ -257,6 +257,45 @@ SOOVPA<9> IDirect3D8_KickOffAndWaitForIdle_1_0_4627 = } }; +// ****************************************************************** +// * IDirect3D8_KickOffAndWaitForIdle2 +// ****************************************************************** +SOOVPA<11> IDirect3D8_KickOffAndWaitForIdle2_1_0_4627 = +{ + 0, // Large == 0 + 11, // Count == 11 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + // IDirect3D8_KickOffAndWaitForIdle2+0x00 : mov eax, [addr] + { 0x00, 0xA1 }, // (Offset,Value)-Pair #1 + + // IDirect3D8_KickOffAndWaitForIdle2+0x05 : mov ecx, [eax+0x30] + { 0x05, 0x8B }, // (Offset,Value)-Pair #2 + { 0x06, 0x48 }, // (Offset,Value)-Pair #3 + { 0x07, 0x30 }, // (Offset,Value)-Pair #4 + + // IDirect3D8_KickOffAndWaitForIdle2+0x08 : push 2 + { 0x08, 0x6A }, // (Offset,Value)-Pair #5 + { 0x09, 0x02 }, // (Offset,Value)-Pair #6 + + // IDirect3D8_KickOffAndWaitForIdle2+0x0A : push ecx + { 0x0A, 0x51 }, // (Offset,Value)-Pair #7 + + // IDirect3D8_KickOffAndWaitForIdle2+0x0B : call [addr] + { 0x0B, 0xE8 }, // (Offset,Value)-Pair #8 + + // IDirect3D8_KickOffAndWaitForIdle2+0x18 : call [addr] + { 0x18, 0xE8 }, // (Offset,Value)-Pair #9 + + // IDirect3D8_KickOffAndWaitForIdle2+0x1D : retn 0x08 + { 0x1D, 0xC2 }, // (Offset,Value)-Pair #10 + { 0x1E, 0x08 }, // (Offset,Value)-Pair #11 + } +}; + // ****************************************************************** // * IDirect3DDevice8_SetViewport // ****************************************************************** @@ -320,6 +359,39 @@ SOOVPA<12> D3D_CommonSetRenderTarget_1_0_4627 = } }; +// ****************************************************************** +// * D3D_CommonSetRenderTargetB +// ****************************************************************** +SOOVPA<11> D3D_CommonSetRenderTargetB_1_0_4627 = +{ + 0, // Large == 0 + 11, // Count == 11 + + XREF_COMMONSETRENDERTARGET, // XRef Not Saved + 0, // XRef Not Used + + { + // D3D_CommonSetRenderTargetB+0x00 : sub esp, 0x24 + { 0x00, 0x83 }, // (Offset,Value)-Pair #1 + { 0x01, 0xEC }, // (Offset,Value)-Pair #2 + { 0x02, 0x24 }, // (Offset,Value)-Pair #3 + + // D3D_CommonSetRenderTargetB+0x86 : jmp +0x06 + { 0x8D, 0xEB }, // (Offset,Value)-Pair #4 + { 0x8E, 0x04 }, // (Offset,Value)-Pair #5 + + // D3D_CommonSetRenderTargetB+0xE4 : and eax, 0x0FFF + { 0xE4, 0x25 }, // (Offset,Value)-Pair #6 + { 0xE5, 0xFF }, // (Offset,Value)-Pair #7 + { 0xE6, 0x0F }, // (Offset,Value)-Pair #8 + { 0xE7, 0x00 }, // (Offset,Value)-Pair #9 + + // D3D_CommonSetRenderTargetB+0xF4 : jge +0x06 + { 0xF4, 0x7D }, // (Offset,Value)-Pair #10 + { 0xF5, 0x06 }, // (Offset,Value)-Pair #11 + } +}; + // ****************************************************************** // * IDirect3DDevice8_SetRenderTarget // ****************************************************************** @@ -525,6 +597,42 @@ SOOVPA<10> IDirect3DDevice8_GetRenderTarget2_1_0_4627 = } }; +// ****************************************************************** +// * IDirect3DDevice8_GetRenderTarget2B +// ****************************************************************** +SOOVPA<10> IDirect3DDevice8_GetRenderTarget2B_1_0_4627 = +{ + 0, // Large == 0 + 10, // Count == 10 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + // IDirect3DDevice8_GetRenderTarget2B+0x00 : mov eax, [addr] + { 0x00, 0xA1 }, // (Offset,Value)-Pair #1 + + // IDirect3DDevice8_GetRenderTarget2B+0x05 : push esi + { 0x05, 0x56 }, // (Offset,Value)-Pair #2 + + // IDirect3DDevice8_GetRenderTarget2B+0x06 : mov esi, [eax + 0x21B4] + { 0x06, 0x8B }, // (Offset,Value)-Pair #3 + { 0x07, 0xB0 }, // (Offset,Value)-Pair #4 + { 0x08, 0xB4 }, // (Offset,Value)-Pair #5 + { 0x09, 0x21 }, // (Offset,Value)-Pair #6 + + // IDirect3DDevice8_GetRenderTarget2B+0x2A : jz + 0x06 + { 0x2A, 0x74 }, // (Offset,Value)-Pair #7 + { 0x2B, 0x06 }, // (Offset,Value)-Pair #8 + + // IDirect3DDevice8_GetRenderTarget2B+0x2D : call [addr] + { 0x2D, 0xE8 }, // (Offset,Value)-Pair #9 + + // IDirect3DDevice8_GetRenderTarget2B+0x37 : retn + { 0x37, 0xC3 }, // (Offset,Value)-Pair #10 + } +}; + // ****************************************************************** // * IDirect3DDevice8_GetDepthStencilSurface2 // ****************************************************************** @@ -1203,6 +1311,38 @@ SOOVPA<12> IDirect3DDevice8_SetVerticalBlankCallback_1_0_4627 = } }; +// ****************************************************************** +// * IDirect3DDevice8_GetViewport +// ****************************************************************** +SOOVPA<10> IDirect3DDevice8_GetViewport_1_0_4627 = +{ + 0, // Large == 0 + 10, // Count == 10 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + // IDirect3DDevice8_GetViewport+0x05 : push esi; push edi + { 0x05, 0x56 }, // (Offset,Value)-Pair #1 + { 0x06, 0x57 }, // (Offset,Value)-Pair #2 + + // IDirect3DDevice8_GetViewport+0x0B : lea esi, [eax+0x0A90] + { 0x0B, 0x8D }, // (Offset,Value)-Pair #3 + { 0x0C, 0xB0 }, // (Offset,Value)-Pair #4 + { 0x0D, 0x90 }, // (Offset,Value)-Pair #5 + { 0x0E, 0x0A }, // (Offset,Value)-Pair #6 + + // IDirect3DDevice8_GetViewport+0x11 : mov ecx, 6 + { 0x11, 0xB9 }, // (Offset,Value)-Pair #7 + { 0x12, 0x06 }, // (Offset,Value)-Pair #8 + + // IDirect3DDevice8_GetViewport+0x1A : retn 0x04 + { 0x1A, 0xC2 }, // (Offset,Value)-Pair #9 + { 0x1B, 0x04 }, // (Offset,Value)-Pair #10 + } +}; + // ****************************************************************** // * IDirect3DDevice8_SetTextureState_TexCoordIndex // ****************************************************************** @@ -2395,6 +2535,16 @@ OOVPATable D3D8_1_0_4627[] = "EmuIDirect3D8_KickOffAndWaitForIdle" #endif }, + // IDirect3D8::KickOffAndWaitForIdle2 + { + (OOVPA*)&IDirect3D8_KickOffAndWaitForIdle2_1_0_4627, + + XTL::EmuIDirect3D8_KickOffAndWaitForIdle2, + + #ifdef _DEBUG_TRACE + "EmuIDirect3D8_KickOffAndWaitForIdle2" + #endif + }, // IDirect3DDevice8::GetBackBuffer2 { (OOVPA*)&IDirect3DDevice8_GetBackBuffer2_1_0_4627, @@ -2433,6 +2583,14 @@ OOVPATable D3D8_1_0_4627[] = "D3D_CommonSetRenderTarget" #endif }, + // D3D_CommonSetRenderTargetB + { + (OOVPA*)&D3D_CommonSetRenderTargetB_1_0_4627, 0, + + #ifdef _DEBUG_TRACE + "D3D_CommonSetRenderTargetB" + #endif + }, // IDirect3DDevice8::SetRenderTarget { (OOVPA*)&IDirect3DDevice8_SetRenderTarget_1_0_4627, @@ -2473,6 +2631,16 @@ OOVPATable D3D8_1_0_4627[] = "EmuIDirect3DDevice8_GetRenderTarget2" #endif }, + // IDirect3DDevice8::GetRenderTarget2B + { + (OOVPA*)&IDirect3DDevice8_GetRenderTarget2B_1_0_4627, + + XTL::EmuIDirect3DDevice8_GetRenderTarget2, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_GetRenderTarget2B" + #endif + }, // IDirect3DDevice8::GetDepthStencilSurface2 { (OOVPA*)&IDirect3DDevice8_GetDepthStencilSurface2_1_0_4627, @@ -2723,6 +2891,16 @@ OOVPATable D3D8_1_0_4627[] = "EmuIDirect3DDevice8_SetVerticalBlankCallback" #endif }, + // IDirect3DDevice8::GetViewport + { + (OOVPA*)&IDirect3DDevice8_GetViewport_1_0_4627, + + XTL::EmuIDirect3DDevice8_GetViewport, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_GetViewport" + #endif + }, // IDirect3DDevice8::SetTextureState_TexCoordIndex { (OOVPA*)&IDirect3DDevice8_SetTextureState_TexCoordIndex_1_0_4627, diff --git a/Source/Win32/CxbxKrnl/HLEDataBase/XG.1.0.4627.inl b/Source/Win32/CxbxKrnl/HLEDataBase/XG.1.0.4627.inl index 38538ecd2..acb49a0c9 100644 --- a/Source/Win32/CxbxKrnl/HLEDataBase/XG.1.0.4627.inl +++ b/Source/Win32/CxbxKrnl/HLEDataBase/XG.1.0.4627.inl @@ -32,6 +32,38 @@ // * // ****************************************************************** +// ****************************************************************** +// * XGSwizzleBox +// ****************************************************************** +SOOVPA<10> XGSwizzleBox_1_0_4627 = +{ + 0, // Large == 0 + 10, // Count == 10 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + // XGSwizzleBox+0x60 : sub ecx, [eax] + { 0x60, 0x2B }, // (Offset,Value)-Pair #1 + { 0x61, 0x08 }, // (Offset,Value)-Pair #2 + + // XGSwizzleBox+0x8E : lea ecx, [ebp+0xD8] + { 0x8E, 0x8D }, // (Offset,Value)-Pair #3 + { 0x8F, 0x4D }, // (Offset,Value)-Pair #4 + { 0x90, 0xD8 }, // (Offset,Value)-Pair #5 + + // XGSwizzleBox+0xD5 : shl eax, 2 + { 0xD5, 0xC1 }, // (Offset,Value)-Pair #6 + { 0xD6, 0xE0 }, // (Offset,Value)-Pair #7 + { 0xD7, 0x02 }, // (Offset,Value)-Pair #8 + + // XGSwizzleBox+0xE2 : test ebx, ebx + { 0xE2, 0x85 }, // (Offset,Value)-Pair #9 + { 0xE3, 0xDB }, // (Offset,Value)-Pair #10 + } +}; + // ****************************************************************** // * XG_1_0_4627 // ****************************************************************** @@ -57,6 +89,16 @@ OOVPATable XG_1_0_4627[] = "EmuXGSwizzleRect" #endif }, + // XGSwizzleBox + { + (OOVPA*)&XGSwizzleBox_1_0_4627, + + XTL::EmuXGSwizzleBox, + + #ifdef _DEBUG_TRACE + "EmuXGSwizzleBox" + #endif + }, }; // ******************************************************************