diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 8b762a3..9829a76 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -264,6 +264,7 @@ #define DDSFORMAT 0x00001000 // texture dump / hack are performed in MS DDS format #define HOOKWING32 0x00002000 // Hook WinG32.dll #define SEQUENCEDIAT 0x00004000 // IFT has sequential format, DLL entries before and API next +#define D3D8BACK16 0x00008000 // D3D8 emulate 16 bpp backbuffer on a 32 bpp desktop (Win8-10 needed feature) // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 272fccb..fa2b277 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c1ff3a6f4bd35e8240757938f69a200d952634e134b6543dea433fc90ef1a35b -size 770560 +oid sha256:1db64cc2ff8db11e460be5c81efc1a0da01f7393b14471b0d3fb158105ed4523 +size 774656 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index d5d810c..21123ed 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:490cb948680c5a66c5697716453ebc008d2a3614cda1924c369ccfd9d5f925a1 -size 669184 +oid sha256:cac62feee622d3aecce7d6529ebd4f0460d97e9eb20edf79b3a03d935610cc1f +size 669696 diff --git a/build/exports/Dangerous Waters.dxw b/build/exports/Dangerous Waters.dxw new file mode 100644 index 0000000..e57ba3f --- /dev/null +++ b/build/exports/Dangerous Waters.dxw @@ -0,0 +1,36 @@ +[target] +title0=Dangerous Waters +path0=F:\Games\Dangerous Waters\dangerouswaters.noshims.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185832 +flagg0=1207959680 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65537 +flagl0=32768 +flagm0=32768 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=640 +initresh0=480 diff --git a/build/exports/Dirt Track Racing 2 Demo.dxw b/build/exports/Dirt Track Racing 2 Demo.dxw new file mode 100644 index 0000000..d8a56dd --- /dev/null +++ b/build/exports/Dirt Track Racing 2 Demo.dxw @@ -0,0 +1,36 @@ +[target] +title0=Dirt Track Racing 2 Demo +path0=F:\Games\Dirt Track Racing 2 Demo\DTR2Demo.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4226 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Dirt Track Racing 2.dxw b/build/exports/Dirt Track Racing 2.dxw new file mode 100644 index 0000000..7aab23c --- /dev/null +++ b/build/exports/Dirt Track Racing 2.dxw @@ -0,0 +1,36 @@ +[target] +title0=Dirt Track Racing 2 +path0=F:\Games\Dirt Track Racing 2\DTR2.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959560 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Dirt Track Racing.dxw b/build/exports/Dirt Track Racing.dxw new file mode 100644 index 0000000..8601e0b --- /dev/null +++ b/build/exports/Dirt Track Racing.dxw @@ -0,0 +1,36 @@ +[target] +title0=Dirt Track Racing +path0=F:\Games\Dirt Track Racing\DTR.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/TOCA Touring Car Championship.dxw b/build/exports/TOCA Touring Car Championship.dxw new file mode 100644 index 0000000..2d5ac22 --- /dev/null +++ b/build/exports/TOCA Touring Car Championship.dxw @@ -0,0 +1,36 @@ +[target] +title0=TOCA Touring Car Championship +path0=F:\Games\tourcar\tourcars.exe +startfolder0= +launchpath0=F:\Games\tourcar\setup.exe +module0= +opengllib0= +notes0= +registry0=\n[HKEY_LOCAL_MACHINE\SOFTWARE\Codemasters]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Codemasters\Touring Car]\n"GameDirectory"="F:\\Games\\tourcar\\"\n"CD_Drive"="."\n"Install_Drive"="F:"\n"CardHintIndex"=dword:00000000\n"ShowRunInfo"=dword:00000000\n"S3RunInfo"=dword:00000000\n\n +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185834 +flagg0=1207959552 +flagh0=528 +flagi0=138412032 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 4a06b21..6947a34 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1416,4 +1416,10 @@ fix: bilinear 2X crash fix: handling of 16 to 32 bpp color conversion in D3D8 IDirect3DDevice8 Copyrects and GetFrontBuffer methods. Fixes "Dirt track Racing 2" missing panels. fix: more / better logging fix: in USER32/CreateWindow* calls, handles the case where a to-be main window is moved/resized before being declared as main window. Fixes uncontrolled position changes in "Civil Wars 2 Generals". -add: preliminary hooks for message loop APIs USER32/PeekMessage, GetMessage, PostMessage. Now PeekMessage includes SLOWDOW flag processing, reduces CPU time in "Civil Wars 2 Generals". \ No newline at end of file +add: preliminary hooks for message loop APIs USER32/PeekMessage, GetMessage, PostMessage. Now PeekMessage includes SLOWDOW flag processing, reduces CPU time in "Civil Wars 2 Generals". + +v2.04.03-fx1 +add: D3D8 16bpp backbuffer emulation on 32bpp color depth. Fixes "Dangerous Waters" on 32bpp Win8-10 +add: more OpenGL wgl* hooks, used by "StarSiege 2014". +fix: using correct version method pointers in bilinear blit, avoids crash in "Daytona USA" using bilinear filtering +fix: do not try to CloseHandle the handle returned by GetMenu, avoids debugger exceptions. diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 73d5ad2..2d39e14 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2996,7 +2996,7 @@ HRESULT WINAPI PrimaryBilinearBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURF BltFast_Type pBltFast; int dwSize; - switch(dxversion){ + switch(iBakBufferVersion){ // v2.04.03.fx1 fix: must use iBakBufferVersion, not dxversion! default: case 1: pBltFast=pBltFast1; pCreateSurface=pCreateSurface1; dwSize = sizeof(DDSURFACEDESC); break; case 2: pBltFast=pBltFast2; pCreateSurface=(CreateSurface1_Type)pCreateSurface2; dwSize = sizeof(DDSURFACEDESC); break; @@ -3004,6 +3004,7 @@ HRESULT WINAPI PrimaryBilinearBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURF case 4: pBltFast=pBltFast4; pCreateSurface=(CreateSurface1_Type)pCreateSurface4; dwSize = sizeof(DDSURFACEDESC2); break; case 7: pBltFast=pBltFast7; pCreateSurface=(CreateSurface1_Type)pCreateSurface7; dwSize = sizeof(DDSURFACEDESC2); break; } + caps.dwCaps = DDSCAPS_BACKBUFFER; memset(&ddsd, 0, sizeof(DDSURFACEDESC)); ddsd.dwSize = dwSize; diff --git a/dll/dxmapping.cpp b/dll/dxmapping.cpp index 8d7f361..815edec 100644 --- a/dll/dxmapping.cpp +++ b/dll/dxmapping.cpp @@ -26,7 +26,7 @@ void dxwCore::UpdateDesktopCoordinates() RECT Client; POINT UpLeft = {0, 0}; - OutTraceB("dxwCore::UpdateDesktopCoordinates: OLD pos=(%d,%d) size=(%dx%d)\n", iPosX, iPosY, iSizX, iSizY); + //OutTraceB("dxwCore::UpdateDesktopCoordinates: OLD pos=(%d,%d) size=(%dx%d)\n", iPosX, iPosY, iSizX, iSizY); if(!(*pGetClientRect)(hWnd, &Client)) return; if((Client.right == 0) || (Client.bottom == 0)) return; if(!(*pClientToScreen)(hWnd, &UpLeft)) return; @@ -35,7 +35,7 @@ void dxwCore::UpdateDesktopCoordinates() iPosY = UpLeft.y; iSizX = Client.right - Client.left; iSizY = Client.bottom - Client.top; - OutTraceB("dxwCore::UpdateDesktopCoordinates: NEW pos=(%d,%d) size=(%dx%d)\n", iPosX, iPosY, iSizX, iSizY); + //OutTraceB("dxwCore::UpdateDesktopCoordinates: NEW pos=(%d,%d) size=(%dx%d)\n", iPosX, iPosY, iSizX, iSizY); } // GetScreenRect: returns a RECT sized as the virtual desktop @@ -460,7 +460,7 @@ void dxwCore::CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWP // BEWARE: from MSDN - If the window is a child window, the return value is undefined. hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); AdjustWindowRectEx(&rect, dwStyle, (hMenu!=NULL), dwExStyle); - if (hMenu) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){}; + // if (hMenu) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){}; switch(dxw.Coordinates){ case DXW_DESKTOP_WORKAREA: case DXW_DESKTOP_FULL: diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 3e36f93..b61f9b4 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.04.02" +#define VERSION "2.04.03.fx1" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo new file mode 100644 index 0000000..6e767de Binary files /dev/null and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/dxwnd.vs2008.vcproj.DESKTOP-Q3RE27J.user.user b/dll/dxwnd.vs2008.vcproj.DESKTOP-Q3RE27J.user.user deleted file mode 100644 index d055039..0000000 --- a/dll/dxwnd.vs2008.vcproj.DESKTOP-Q3RE27J.user.user +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index a885eca..5e633ff 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -20,6 +20,16 @@ extern void D3D9TextureHandling(void *, int); extern void D3D8TextureHandling(void *, int); +extern HRESULT exCreateImageSurface8(void *, UINT, UINT, D3DFORMAT, LPDIRECTDRAWSURFACE *); +extern HRESULT dxCopyRects(void *, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); +extern HRESULT dwD3D8InitEmulation(void *); +extern LPDIRECTDRAWSURFACE dwGetVirtualBackBuffer(); +extern void dwD3D8ShutdownEmulation(void *); +extern HRESULT dwD3D8Present(void *, CONST RECT *, CONST RECT*, HWND, CONST RGNDATA *); +extern void HookWindowProc(HWND); +extern char *ExplainDDError(DWORD); +extern char *ExplainRenderstateValue(DWORD Value); +extern HRESULT dxGetFrontBuffer(void *, LPDIRECTDRAWSURFACE); void *lpD3DActiveDevice = NULL; typedef HRESULT (WINAPI *QueryInterface_Type)(void *, REFIID riid, void** ppvObj); @@ -67,6 +77,7 @@ typedef HMONITOR (WINAPI *GetAdapterMonitor_Type)(void *, UINT); typedef HRESULT (WINAPI *CreateDevice_Type)(void *, UINT, D3DDEVTYPE, HWND, DWORD, void *, void **); typedef HRESULT (WINAPI *CreateDeviceEx_Type)(void *, UINT, D3DDEVTYPE, HWND, DWORD, void *, D3DDISPLAYMODEEX *, void **); typedef BOOL (WINAPI *DisableD3DSpy_Type)(void); +typedef HRESULT (WINAPI *GetBackBuffer8_Type)(void *, UINT, D3DBACKBUFFER_TYPE, LPDIRECTDRAWSURFACE *); UINT WINAPI extGetAdapterCount8(void *); UINT WINAPI extGetAdapterCount9(void *); @@ -83,6 +94,7 @@ HMONITOR WINAPI extGetAdapterMonitor9(void *, UINT); HRESULT WINAPI extCreateDevice8(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, void **); HRESULT WINAPI extCreateDevice9(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, void **); HRESULT WINAPI extCreateDeviceEx(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, D3DDISPLAYMODEEX *, void **); +HRESULT WINAPI extGetBackBuffer8(void *, UINT, D3DBACKBUFFER_TYPE, LPDIRECTDRAWSURFACE *); GetAdapterCount_Type pGetAdapterCount8, pGetAdapterCount9; GetAdapterModeCount8_Type pGetAdapterModeCount8; @@ -94,6 +106,7 @@ D3DGetDeviceCaps9_Type pD3DGetDeviceCaps9 = 0; GetAdapterMonitor_Type pGetAdapterMonitor8, pGetAdapterMonitor9; CreateDevice_Type pCreateDevice8, pCreateDevice9; CreateDeviceEx_Type pCreateDeviceEx = 0; +GetBackBuffer8_Type pGetBackBuffer8 = 0; // IDirect3DDevice8/9 methods @@ -117,6 +130,7 @@ typedef HRESULT (WINAPI *CreateTexture8_Type)(void *, UINT, UINT, UINT, DWORD, D typedef HRESULT (WINAPI *CreateTexture9_Type)(void *, UINT, UINT, UINT, DWORD, D3DFORMAT, D3DPOOL, void **, HANDLE *); typedef HRESULT (WINAPI *CopyRects_Type)(void *, LPDIRECTDRAWSURFACE, CONST RECT *, UINT, LPDIRECTDRAWSURFACE, CONST POINT *); typedef HRESULT (WINAPI *GetFrontBuffer_Type)(void *, LPDIRECTDRAWSURFACE); +typedef ULONG (WINAPI *ReleaseDev_Type)(void *); UINT WINAPI extGetAvailableTextureMem8(void *); UINT WINAPI extGetAvailableTextureMem9(void *); @@ -143,6 +157,8 @@ HRESULT WINAPI extCreateTexture9(void *, UINT, UINT, UINT, DWORD, D3DFORMAT, D3D // CopyRects prototype uses IDirect3DSurface8 *, but to avoid including d3d8.h better use a generic ptr as LPDIRECTDRAWSURFACE HRESULT WINAPI extCopyRects(void *, LPDIRECTDRAWSURFACE, CONST RECT *, UINT, LPDIRECTDRAWSURFACE, CONST POINT *); HRESULT WINAPI extGetFrontBuffer(void *, LPDIRECTDRAWSURFACE); +ULONG WINAPI extReleaseDev8(void *); +ULONG WINAPI extReleaseDev9(void *); GetAvailableTextureMem_Type pGetAvailableTextureMem8, pGetAvailableTextureMem9; TestCooperativeLevel_Type pTestCooperativeLevel8, pTestCooperativeLevel9; @@ -166,6 +182,7 @@ CreateTexture8_Type pCreateTexture8 = 0; CreateTexture9_Type pCreateTexture9 = 0; CopyRects_Type pCopyRects = 0; GetFrontBuffer_Type pGetFrontBuffer = 0; +ReleaseDev_Type pReleaseDev8, pReleaseDev9; // IDirect3DTexture8/9 methods @@ -233,8 +250,6 @@ void WINAPI extSetGammaRamp8(void *, UINT, DWORD, D3DGAMMARAMP *); void WINAPI extSetGammaRamp9(void *, UINT, DWORD, D3DGAMMARAMP *); void WINAPI extGetGammaRamp8(void *, UINT, D3DGAMMARAMP *); void WINAPI extGetGammaRamp9(void *, UINT, D3DGAMMARAMP *); -ULONG WINAPI extAddRef9(void *); -ULONG WINAPI extRelease9(void *); BOOL WINAPI voidDisableD3DSpy(void); ULONG WINAPI extCreateRenderTarget8(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**); @@ -255,8 +270,6 @@ HRESULT WINAPI extD3D11CreateDeviceAndSwapChain(IDXGIAdapter *, D3D_DRIVER_TYPE, void WINAPI extRSSetViewports10(void *, UINT, D3D10_VIEWPORT *); void WINAPI extRSSetViewports11(ID3D11DeviceContext *, UINT, D3D11_VIEWPORT *); -extern char *ExplainDDError(DWORD); - QueryInterface_Type pQueryInterfaceD3D8 = 0; QueryInterface_Type pQueryInterfaceDev8 = 0; QueryInterface_Type pQueryInterfaceD3D9 = 0; @@ -460,6 +473,7 @@ void HookD3DDevice8(void** ppD3Ddev8) { OutTraceD3D("Device hook for IID_IDirect3DDevice8 interface\n"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 0), extQueryInterfaceDev8, (void **)&pQueryInterfaceDev8, "QueryInterface(D8)"); + //SetHook((void *)(**(DWORD **)ppD3Ddev8 + 8), extReleaseDev8, (void **)&pReleaseDev8, "Release(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 12), extTestCooperativeLevel8, (void **)&pTestCooperativeLevel8, "TestCooperativeLevel(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 16), extGetAvailableTextureMem8, (void **)&pGetAvailableTextureMem8, "GetAvailableTextureMem(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 24), extGetDirect3D8, (void **)&pGetDirect3D8, "GetDirect3D(D8)"); @@ -469,6 +483,7 @@ void HookD3DDevice8(void** ppD3Ddev8) SetHook((void *)(**(DWORD **)ppD3Ddev8 + 52), extCreateAdditionalSwapChain8, (void **)&pCreateAdditionalSwapChain8, "CreateAdditionalSwapChain(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 56), extReset8, (void **)&pReset8, "Reset(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 60), extPresent8, (void **)&pPresent8, "Present(D8)"); + SetHook((void *)(**(DWORD **)ppD3Ddev8 + 64), extGetBackBuffer8, (void **)&pGetBackBuffer8, "GetBackBuffer(D8)"); if(dxw.dwFlags2 & DISABLEGAMMARAMP){ SetHook((void *)(**(DWORD **)ppD3Ddev8 + 72), extSetGammaRamp8, (void **)&pSetGammaRamp8, "SetGammaRamp(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 76), extGetGammaRamp8, (void **)&pGetGammaRamp8, "GetGammaRamp(D8)"); @@ -503,6 +518,7 @@ void HookD3DDevice9(void** ppD3Ddev9) { OutTraceD3D("Device hook for IID_IDirect3DDevice9 interface\n"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 0), extQueryInterfaceDev9, (void **)&pQueryInterfaceDev9, "QueryInterface(D9)"); + //SetHook((void *)(**(DWORD **)ppD3Ddev9 + 8), extReleaseDev9, (void **)&pReleaseDev9, "Release(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 12), extTestCooperativeLevel9, (void **)&pTestCooperativeLevel9, "TestCooperativeLevel(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 16), extGetAvailableTextureMem9, (void **)&pGetAvailableTextureMem9, "GetAvailableTextureMem(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 24), extGetDirect3D9, (void **)&pGetDirect3D9, "GetDirect3D(D9)"); @@ -613,6 +629,26 @@ void HookDirect3D9(void *lpd3d, BOOL ex) if(ex) SetHook((void *)(*(DWORD *)lpd3d + 80), extCreateDeviceEx, (void **)&pCreateDeviceEx, "CreateDeviceEx(D9)"); } +static char *ExplainD3DBehaviourFlags(DWORD c) +{ + static char eb[256]; + unsigned int l; + strcpy(eb,"D3DCREATE_"); + if (c & D3DCREATE_FPU_PRESERVE) strcat(eb, "FPU_PRESERVE+"); + if (c & D3DCREATE_MULTITHREADED) strcat(eb, "MULTITHREADED+"); + if (c & D3DCREATE_PUREDEVICE) strcat(eb, "PUREDEVICE+"); + if (c & D3DCREATE_SOFTWARE_VERTEXPROCESSING) strcat(eb, "SOFTWARE_VERTEXPROCESSING+"); + if (c & D3DCREATE_HARDWARE_VERTEXPROCESSING) strcat(eb, "HARDWARE_VERTEXPROCESSING+"); + if (c & D3DCREATE_MIXED_VERTEXPROCESSING) strcat(eb, "MIXED_VERTEXPROCESSING+"); + if (c & D3DCREATE_DISABLE_DRIVER_MANAGEMENT) strcat(eb, "DISABLE_DRIVER_MANAGEMENT+"); + if (c & D3DCREATE_ADAPTERGROUP_DEVICE) strcat(eb, "ADAPTERGROUP_DEVICE+"); + if (c & D3DCREATE_DISABLE_DRIVER_MANAGEMENT_EX) strcat(eb, "DISABLE_DRIVER_MANAGEMENT_EX+"); + l=strlen(eb); + if (l>strlen("D3DCREATE_")) eb[l-1]=0; // delete last '+' if any + else eb[0]=0; + return(eb); +} + void* WINAPI extDirect3DCreate9(UINT sdkversion) { void *lpd3d; @@ -739,7 +775,7 @@ static HRESULT WINAPI extReset(int dwD3DVersion, void *pd3dd, D3DPRESENT_PARAMET OutTrace("D3D%d::Reset\n", dwD3DVersion); OutTrace(" BackBufferWidth = %i\n", *(tmp ++)); OutTrace(" BackBufferHeight = %i\n", *(tmp ++)); - OutTrace(" BackBufferFormat = %i\n", *(tmp ++)); + OutTrace(" BackBufferFormat = %i(%s)\n", *(tmp ++), ExplainD3DSurfaceFormat(param[2])); OutTrace(" BackBufferCount = %i\n", *(tmp ++)); OutTrace(" MultiSampleType = %i\n", *(tmp ++)); if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++)); @@ -808,10 +844,19 @@ static HRESULT WINAPI extReset(int dwD3DVersion, void *pd3dd, D3DPRESENT_PARAMET } } + if((dxw.dwFlags8 & D3D8BACK16) && (dwD3DVersion == 8)){ + D3DPRESENT_PARAMETERS *params = (D3DPRESENT_PARAMETERS *)¶m[0]; + dwD3D8ShutdownEmulation(pd3dd); + // Change the presentation effect from D3DSWAPEFFECT_COPY to D3DSWAPEFFECT_DISCARD to fix blank screen on W10. + params->SwapEffect = D3DSWAPEFFECT_DISCARD; + // Drop the lockable backbuffer flag to be safe. We do not need it. + params->Flags &= ~D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; + } + if(!(dxw.dwFlags4 & NOD3DRESET)){ res = (*pReset)(pd3dd, (D3DPRESENT_PARAMETERS *)param); if(res){ - OutTraceD3D("switching to mode=%x\n", mode.Format); + OutTraceD3D("err=%x(%s) switching to mode=%d(%s)\n", res, ExplainDDError(res), mode.Format, ExplainD3DSurfaceFormat(mode.Format)); param[2] = mode.Format; // first attempt: current screen mode res = (*pReset)(pd3dd, (D3DPRESENT_PARAMETERS *)param); } @@ -825,7 +870,7 @@ static HRESULT WINAPI extReset(int dwD3DVersion, void *pd3dd, D3DPRESENT_PARAMET return D3DERR_INVALIDCALL; } if(res){ - OutTraceD3D("FAILED! %x\n", res); + OutTraceD3D("FAILED! %x(%s)\n", res, ExplainDDError(res)); return res; } OutTraceD3D("SUCCESS!\n"); @@ -836,6 +881,11 @@ static HRESULT WINAPI extReset(int dwD3DVersion, void *pd3dd, D3DPRESENT_PARAMET res=D3D_OK; } + if((dxw.dwFlags8 & D3D8BACK16) && (dwD3DVersion == 8)){ + dwD3D8InitEmulation(pd3dd); + if(res) OutTraceE("Reset: dwD3D8InitEmulation ERROR: err=%x(%s)\n", res, ExplainDDError(res)); + } + dxw.SetScreenSize(pPresParam->BackBufferWidth, pPresParam->BackBufferHeight); dxw.SetVSyncDelays(mode.RefreshRate); @@ -853,7 +903,7 @@ HRESULT WINAPI extReset8(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) HRESULT WINAPI extReset9(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) { return extReset(9, pd3dd, pPresParam); } -static HRESULT WINAPI extPresent(Present_Type pPresent, void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) +static HRESULT WINAPI extPresent(int d3dversion, Present_Type pPresent, void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) { HRESULT res; RECT RemappedSrcRect, RemappedDstRect; @@ -864,13 +914,19 @@ static HRESULT WINAPI extPresent(Present_Type pPresent, void *pd3dd, CONST RECT else strcpy(sSourceRect, "(NULL)"); if (pDestRect) sprintf_s(sDestRect, 80, "(%d,%d)-(%d,%d)", pDestRect->left, pDestRect->top, pDestRect->right, pDestRect->bottom); else strcpy(sDestRect, "(NULL)"); - OutTraceB("Present: SourceRect=%s DestRect=%s hDestWndOverride=%x\n", sSourceRect, sDestRect, hDestWindowOverride); + OutTraceB("Present(%d): d3dd=%x SourceRect=%s DestRect=%s hDestWndOverride=%x dirtyregion=%x\n", + d3dversion, pd3dd, sSourceRect, sDestRect, hDestWindowOverride, pDirtyRegion); } // frame counter handling.... if (dxw.HandleFPS()) return D3D_OK; if (dxw.dwFlags1 & SAVELOAD) dxw.VSyncWait(); + if((dxw.dwFlags8 & D3D8BACK16) && (d3dversion == 8)){ + res = dwD3D8Present(pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); + OutTraceD3D("Present: EMULATION res=%x\n", res); + } + if(dxw.dwFlags2 & FULLRECTBLT) pSourceRect = pDestRect = NULL; if(dxw.Windowize){ // v2.03.15 - fix target RECT region @@ -888,15 +944,29 @@ static HRESULT WINAPI extPresent(Present_Type pPresent, void *pd3dd, CONST RECT } res=(*pPresent)(pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); - if(res) OutTraceE("Present: err=%x(%s)\n", res, ExplainDDError(res)); + if(res) { + OutTraceE("Present: err=%x(%s)\n", res, ExplainDDError(res)); + } + else { + if(IsDebug){ + if(pDirtyRegion) { + OutTrace("Present: D3D_OK dirtyreg={buf=%x type=%d count=%d rgnsize=%x bound=(%d,%d)-(%d,%d)}\n", + pDirtyRegion->Buffer, pDirtyRegion->rdh.iType, pDirtyRegion->rdh.nCount, pDirtyRegion->rdh.nRgnSize, + pDirtyRegion->rdh.rcBound.left, pDirtyRegion->rdh.rcBound.top, pDirtyRegion->rdh.rcBound.right, pDirtyRegion->rdh.rcBound.bottom); + } + else { + OutTrace("Present: D3D_OK\n"); + } + } + } dxw.ShowOverlay(); return res; } HRESULT WINAPI extPresent8(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) -{ return extPresent(pPresent8, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); } +{ return extPresent(8, pPresent8, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); } HRESULT WINAPI extPresent9(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) -{ return extPresent(pPresent9, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); } +{ return extPresent(9, pPresent9, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); } HRESULT WINAPI extGetDisplayMode8(void *lpd3d, D3DDISPLAYMODE *pMode) { @@ -980,12 +1050,12 @@ HRESULT WINAPI extEnumAdapterModes9(void *lpd3d, UINT Adapter, D3DFORMAT Format, return res; } -HRESULT WINAPI extGetAdapterDisplayMode8(void *lpd3d, UINT Adapter, D3DDISPLAYMODE *pMode) +HRESULT WINAPI extGetAdapterDisplayMode(int d3dversion, GetAdapterDisplayMode_Type pGetAdapterDisplayMode, void *lpd3d, UINT Adapter, D3DDISPLAYMODE *pMode) { HRESULT res; - res=(*pGetAdapterDisplayMode8)(lpd3d, Adapter, pMode); - OutTraceD3D("GetAdapterDisplayMode(8): size=(%dx%d) RefreshRate=%d Format=%d\n", - pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format); + res=(*pGetAdapterDisplayMode)(lpd3d, Adapter, pMode); + OutTraceD3D("GetAdapterDisplayMode(%d): size=(%dx%d) RefreshRate=%d Format=%d(%s)\n", + d3dversion, pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format, ExplainD3DSurfaceFormat(pMode->Format)); if(dxw.dwFlags2 & KEEPASPECTRATIO){ pMode->Width=dxw.iSizX; pMode->Height=dxw.iSizY; @@ -994,33 +1064,19 @@ HRESULT WINAPI extGetAdapterDisplayMode8(void *lpd3d, UINT Adapter, D3DDISPLAYMO pMode->Width = dxw.GetScreenWidth(); pMode->Height = dxw.GetScreenHeight(); } - OutTraceD3D("GetAdapterDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + OutTraceD3D("GetAdapterDisplayMode: fixed size=(%dx%d)\n", pMode->Width, pMode->Height); dxw.SetVSyncDelays(pMode->RefreshRate); return res; } +HRESULT WINAPI extGetAdapterDisplayMode8(void *lpd3d, UINT Adapter, D3DDISPLAYMODE *pMode) +{ return extGetAdapterDisplayMode(8, pGetAdapterDisplayMode8, lpd3d, Adapter, pMode); } HRESULT WINAPI extGetAdapterDisplayMode9(void *lpd3d, UINT Adapter, D3DDISPLAYMODE *pMode) -{ - HRESULT res; - res=(*pGetAdapterDisplayMode9)(lpd3d, Adapter, pMode); - OutTraceD3D("GetAdapterDisplayMode(9): size=(%dx%d) RefreshRate=%d Format=%d\n", - pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format); - if(dxw.dwFlags2 & KEEPASPECTRATIO){ - pMode->Width=dxw.iSizX; - pMode->Height=dxw.iSizY; - } - else{ - pMode->Width = dxw.GetScreenWidth(); - pMode->Height = dxw.GetScreenHeight(); - } - OutTraceD3D("GetAdapterDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); - dxw.SetVSyncDelays(pMode->RefreshRate); - return res; -} +{ return extGetAdapterDisplayMode(9, pGetAdapterDisplayMode9, lpd3d, Adapter, pMode); } + HWND FixD3DWindowFrame(HWND hFocusWin) { - extern void HookWindowProc(HWND); HWND hRetWnd = hFocusWin; if(!(dxw.dwFlags3 & NOWINDOWMOVE)) @@ -1068,7 +1124,7 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi dxw.SetScreenSize(param[0], param[1]); if(dxw.Windowize) hfocuswindow=FixD3DWindowFrame(hfocuswindow); - + if(IsTraceD3D){ tmp = param; DWORD SwapEffect; @@ -1076,10 +1132,10 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi OutTrace(" Adapter = %i\n", adapter); OutTrace(" DeviceType = %i\n", devicetype); OutTrace(" hFocusWindow = 0x%x\n", hfocuswindow); - OutTrace(" BehaviorFlags = 0x%x\n", behaviorflags); + OutTrace(" BehaviorFlags = 0x%x(%s)\n", behaviorflags, ExplainD3DBehaviourFlags(behaviorflags)); OutTrace(" BackBufferWidth = %i\n", *(tmp ++)); OutTrace(" BackBufferHeight = %i\n", *(tmp ++)); - OutTrace(" BackBufferFormat = %i\n", *(tmp ++)); + OutTrace(" BackBufferFormat = %i(%s)\n", *(tmp ++), ExplainD3DSurfaceFormat(param[2])); OutTrace(" BackBufferCount = %i\n", *(tmp ++)); OutTrace(" MultiSampleType = %i\n", *(tmp ++)); if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++)); @@ -1098,7 +1154,7 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi (*pGetAdapterDisplayMode9)(lpd3d, 0, &mode); else (*pGetAdapterDisplayMode8)(lpd3d, 0, &mode); - OutTraceD3D(" Current Format = 0x%x\n", mode.Format); + OutTraceD3D(" Current Format = %d(%s)\n", mode.Format, ExplainD3DSurfaceFormat(mode.Format)); OutTraceD3D(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height); OutTraceD3D(" Current Refresh Rate = %d\n", mode.RefreshRate); @@ -1128,12 +1184,12 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi } res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); if(res){ - OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format); + OutTraceD3D("err=%x(%s) switching to mode=%d(%s)\n", res, ExplainDDError(res), mode.Format, ExplainD3DSurfaceFormat(mode.Format)); param[2] = mode.Format; // first attempt: current screen mode res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } if(res){ - OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res); + OutTraceD3D("err=%x(%s) switching to mode=D3DFMT_UNKNOWN\n", res, ExplainDDError(res)); param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } @@ -1151,24 +1207,28 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi } res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); if(res){ - OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format); + OutTraceD3D("err=%x(%s) switching to mode=%d(%s)\n", res, ExplainDDError(res), mode.Format, ExplainD3DSurfaceFormat(mode.Format)); param[2] = mode.Format; // first attempt: current screen mode res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } if(res){ - OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res); + OutTraceD3D("err=%x(%s) switching to mode=D3DFMT_UNKNOWN\n", res, ExplainDDError(res)); param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } } if(res){ - OutTraceD3D("FAILED! err=%x\n", res); + OutTraceD3D("FAILED! err=%x(%s)\n", res, ExplainDDError(res)); return res; } OutTraceD3D("SUCCESS! device=%x\n", *ppd3dd); lpD3DActiveDevice = *ppd3dd; + if((dxw.dwFlags8 & D3D8BACK16) && (dwD3DVersion == 8)){ + dwD3D8InitEmulation(*ppd3dd); + } + if(dwD3DVersion == 8){ HookD3DDevice8(ppd3dd); } @@ -1218,7 +1278,7 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp OutTrace(" BehaviorFlags = 0x%x\n", behaviorflags); OutTrace(" BackBufferWidth = %i\n", *(tmp ++)); OutTrace(" BackBufferHeight = %i\n", *(tmp ++)); - OutTrace(" BackBufferFormat = %i\n", *(tmp ++)); + OutTrace(" BackBufferFormat = %i(%s)\n", *(tmp ++), ExplainD3DSurfaceFormat(param[2])); OutTrace(" BackBufferCount = %i\n", *(tmp ++)); OutTrace(" MultiSampleType = %i\n", *(tmp ++)); OutTrace(" MultiSampleQuality = %i\n", *(tmp ++)); @@ -1235,7 +1295,7 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp //((LPDIRECT3D9)lpd3d)->GetAdapterDisplayMode(0, &mode); (*pGetAdapterDisplayMode9)(lpd3d, 0, &mode); - OutTraceD3D(" Current Format = 0x%x\n", mode.Format); + OutTraceD3D(" Current Format = %d(%s)\n", mode.Format, ExplainD3DSurfaceFormat(mode.Format)); OutTraceD3D(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height); OutTraceD3D(" Current Refresh Rate = %d\n", mode.RefreshRate); @@ -1270,17 +1330,17 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); if(res){ - OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format); + OutTraceD3D("err=%x(%s) switching to mode=%d(%s)\n", res, ExplainDDError(res), mode.Format, ExplainD3DSurfaceFormat(mode.Format)); param[2] = mode.Format; // first attempt: current screen mode res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); } if(res){ - OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res); + OutTraceD3D("err=%x(%s) switching to mode=D3DFMT_UNKNOWN\n", res, ExplainDDError(res)); param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); } if(res){ - OutTraceD3D("FAILED! err=%x\n", res); + OutTraceD3D("FAILED! err=%x(%s)\n", res, ExplainDDError(res)); return res; } OutTraceD3D("SUCCESS!\n"); @@ -1299,8 +1359,6 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp return DD_OK; } -extern char *ExplainRenderstateValue(DWORD Value); - static HRESULT WINAPI extSetRenderState(SetRenderState_Type pSetRenderState, void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value) { HRESULT res; @@ -1387,7 +1445,7 @@ static HRESULT WINAPI extCreateAdditionalSwapChain(int dwD3DVersion, void *lpd3d OutTrace("D3D%d::CreateAdditionalSwapChain\n", dwD3DVersion); OutTrace(" BackBufferWidth = %i\n", *(tmp ++)); OutTrace(" BackBufferHeight = %i\n", *(tmp ++)); - OutTrace(" BackBufferFormat = %i\n", *(tmp ++)); + OutTrace(" BackBufferFormat = %i(%s)\n", *(tmp ++), ExplainD3DSurfaceFormat(param[2])); OutTrace(" BackBufferCount = %i\n", *(tmp ++)); OutTrace(" MultiSampleType = %i\n", *(tmp ++)); if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++)); @@ -1405,7 +1463,7 @@ static HRESULT WINAPI extCreateAdditionalSwapChain(int dwD3DVersion, void *lpd3d res2=(*pGetAdapterDisplayMode)(lpd3dd, D3DADAPTER_DEFAULT, &mode); if(res2==DD_OK){ - OutTraceD3D(" Current Format = 0x%x\n", mode.Format); + OutTraceD3D(" Current Format = %d(%s)\n", mode.Format, ExplainD3DSurfaceFormat(mode.Format)); OutTraceD3D(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height); OutTraceD3D(" Current Refresh Rate = %d\n", mode.RefreshRate); } @@ -1440,7 +1498,7 @@ static HRESULT WINAPI extCreateAdditionalSwapChain(int dwD3DVersion, void *lpd3d res=(*pCreateAdditionalSwapChain)(lpd3dd, (D3DPRESENT_PARAMETERS *)param, ppSwapChain); if(res && (res2==DD_OK)){ - OutTraceD3D("switching to mode=%x\n", mode.Format); + OutTraceD3D("err=%x(%s) switching to mode=%d(%s)\n", res, ExplainDDError(res), mode.Format, ExplainD3DSurfaceFormat(mode.Format)); param[2] = mode.Format; // first attempt: current screen mode res=(*pCreateAdditionalSwapChain)(lpd3dd, (D3DPRESENT_PARAMETERS *)param, ppSwapChain); } @@ -1712,6 +1770,19 @@ HRESULT WINAPI extQueryInterfaceDev9(void *obj, REFIID riid, void** ppvObj) return res; } +static ULONG WINAPI ReleaseDev(int d3dversion, ReleaseDev_Type pReleaseDev, void *lpdd) +{ + ULONG ActualRef; + ActualRef=(*pReleaseDev)(lpdd); + OutTraceD3D("Release(D%d): lpdd=%x ret=%d\n", d3dversion, lpdd, ActualRef); + return ActualRef; +} + +ULONG WINAPI extReleaseDev8(void *lpdd) +{ return ReleaseDev(8, pReleaseDev8, lpdd); } +ULONG WINAPI extReleaseDev9(void *lpdd) +{ return ReleaseDev(9, pReleaseDev9, lpdd); } + HRESULT WINAPI extGetDirect3D8(void *lpdd3dd, void **ppD3D8) { HRESULT res; @@ -1794,22 +1865,6 @@ void WINAPI extSetCursorPosition8(void *lpdd3dd, int X, int Y, DWORD Flags) //(*pSetCursorPosition8)(lpdd3dd, X, Y, Flags); } -ULONG WINAPI extAddRef9(void *lpdd3dd) -{ - ULONG res; - res=(*pAddRef9)(lpdd3dd); - OutTraceD3D("Device::AddRef(9): dd3dd=%x res=%x\n", lpdd3dd, res); - return res; -} - -ULONG WINAPI extRelease9(void *lpdd3dd) -{ - ULONG res; - res=(*pRelease9)(lpdd3dd); - OutTraceD3D("Device::Release(9): dd3dd=%x res=%x\n", lpdd3dd, res); - return res; -} - //ULONG WINAPI extCreateRenderTarget8(void *lpdd3dd, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) ULONG WINAPI extCreateRenderTarget8(void *lpdd3dd, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, void** ppSurface) { @@ -1936,22 +1991,7 @@ HRESULT WINAPI voidDirect3DShaderValidatorCreate9(void) return 0; } -static HRESULT WINAPI extCheckDeviceType(CheckDeviceType_Type pCheckDeviceType, void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) -{ - HRESULT res; - OutTraceD3D("CheckDeviceType: d3d=%x adapter=%d windowed=%x\n", lpd3d, Adapter, bWindowed); - if(dxw.Windowize) bWindowed = TRUE; - res = (*pCheckDeviceType)(lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); - OutTraceD3D("CheckDeviceType: res=%x\n", res); - return res; -} - -HRESULT WINAPI extCheckDeviceType8(void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) -{ return extCheckDeviceType(pCheckDeviceType8, lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); } -HRESULT WINAPI extCheckDeviceType9(void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) -{ return extCheckDeviceType(pCheckDeviceType9, lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); } - -static char *ExplainD3D9DeviceType(D3DDEVTYPE DeviceType) +static char *ExplainD3DDeviceType(D3DDEVTYPE DeviceType) { char *s; switch(DeviceType){ @@ -1964,10 +2004,26 @@ static char *ExplainD3D9DeviceType(D3DDEVTYPE DeviceType) return s; } -HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps, int version) +static HRESULT WINAPI extCheckDeviceType(int d3dversion, CheckDeviceType_Type pCheckDeviceType, void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) { HRESULT res; - OutTraceD3D("GetDeviceCaps(%d): d3d=%x adapter=%d devtype=%x(%s)\n", version, lpd3d, Adapter, DeviceType, ExplainD3D9DeviceType(DeviceType)); + OutTraceD3D("CheckDeviceType(%d): d3d=%x adapter=%d devtype=%x(%s) backbufferformat=%d(%s) windowed=%x\n", + d3dversion, lpd3d, Adapter, DevType, ExplainD3DDeviceType(DevType), AdapterFormat, ExplainD3DSurfaceFormat(AdapterFormat), bWindowed); + if(dxw.Windowize) bWindowed = TRUE; + res = (*pCheckDeviceType)(lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); + OutTraceD3D("CheckDeviceType: res=%x(%s)\n", res, ExplainDDError(res)); + return res; +} + +HRESULT WINAPI extCheckDeviceType8(void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) +{ return extCheckDeviceType(8, pCheckDeviceType8, lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); } +HRESULT WINAPI extCheckDeviceType9(void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) +{ return extCheckDeviceType(9, pCheckDeviceType9, lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); } + +HRESULT WINAPI extD3DGetDeviceCaps(int version, void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) +{ + HRESULT res; + OutTraceD3D("GetDeviceCaps(%d): d3d=%x adapter=%d devtype=%x(%s)\n", version, lpd3d, Adapter, DeviceType, ExplainD3DDeviceType(DeviceType)); if(version == 8) res=(*pD3DGetDeviceCaps8)(lpd3d, Adapter, DeviceType, (D3DCAPS8 *)pCaps); @@ -1992,7 +2048,7 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT "AlphaCmpCaps=%x\n\t" "ShadeCaps=%x\n\t" "TextureCaps=%x\n\t", - pCaps->DeviceType, ExplainD3D9DeviceType(pCaps->DeviceType), + pCaps->DeviceType, ExplainD3DDeviceType(pCaps->DeviceType), pCaps->Caps, pCaps->Caps2, pCaps->Caps3, pCaps->PresentationIntervals, pCaps->CursorCaps, pCaps->DevCaps, @@ -2052,7 +2108,7 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT "VertexShaderVersion=%x\n\t" "MaxVertexShaderConst=%d\n\t" "PixelShaderVersion=%x\n\t" - "PixelShader1xMaxValue=%f\n\t", + "PixelShader1xMaxValue=%f\n", pCaps->MaxTextureWidth, pCaps->MaxTextureHeight, pCaps->MaxVolumeExtent, pCaps->MaxTextureRepeat, @@ -2081,7 +2137,7 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT pCaps->PixelShaderVersion, pCaps->PixelShader1xMaxValue); if(version == 9) OutTrace( - "DevCaps2=%x Reserved5=%x\n\t" + "\tDevCaps2=%x Reserved5=%x\n\t" "MaxNpatchTessellationLevel=%f\n\t" "MasterAdapterOrdinal=%i\n\t" "AdapterOrdinalInGroup=%i\n\t" @@ -2111,7 +2167,7 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT } if(dxw.dwFlags7 & SUPPRESSOVERLAY){ - if(pCaps->Caps & D3DCAPS_OVERLAY) OutTraceDW("GetDeviceCaps(%d): SUPPRESS OVERLAY CAP\n"); + if(pCaps->Caps & D3DCAPS_OVERLAY) OutTraceDW("GetDeviceCaps(%d): SUPPRESS OVERLAY CAP\n", version); pCaps->Caps &= ~D3DCAPS_OVERLAY; } @@ -2119,9 +2175,9 @@ HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceT } HRESULT WINAPI extD3DGetDeviceCaps8(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8 *pCaps) -{ return extD3DGetDeviceCaps(lpd3d, Adapter, DeviceType, (D3DCAPS9 *)pCaps, 8); } +{ return extD3DGetDeviceCaps(8, lpd3d, Adapter, DeviceType, (D3DCAPS9 *)pCaps); } HRESULT WINAPI extD3DGetDeviceCaps9(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9 *pCaps) -{ return extD3DGetDeviceCaps(lpd3d, Adapter, DeviceType, pCaps, 9); } +{ return extD3DGetDeviceCaps(9, lpd3d, Adapter, DeviceType, pCaps); } static HMONITOR WINAPI extGetAdapterMonitor(GetAdapterMonitor_Type pGetAdapterMonitor, void *lpd3d, UINT Adapter) { @@ -2274,6 +2330,7 @@ static HRESULT WINAPI extLockRect(LockRect_Type pLockRect, void *lpd3dtex, UINT strcpy_s(sRect, 80, "NULL"); OutTrace("Texture::LockRect: lpd3dtex=%x level=%d rect=%s flags=%x\n", lpd3dtex, Level, sRect, Flags); } + res=(*pLockRect)(lpd3dtex, Level, pLockedRect, pRect, Flags); if (res) OutTraceE("Device::LockRect ERROR: err=%x\n", res); else { @@ -2293,7 +2350,12 @@ static HRESULT WINAPI extUnlockRect(UnlockRect_Type pUnlockRect, void *lpd3dtex, { HRESULT res; OutTraceD3D("Texture::UnlockRect: lpd3dtex=%x level=%d\n", lpd3dtex, Level); + res=(*pUnlockRect)(lpd3dtex, Level); + if (res) OutTraceE("Device::UnlockRect ERROR: err=%x\n", res); + else { + OutTraceD3D("Device::UnlockRect: D3D_OK\n"); + } if(TextureHandling) TextureHandling(lpd3dtex, Level); return res; @@ -2372,7 +2434,6 @@ HRESULT WINAPI extGetFrontBuffer(void *lpd3dd, LPDIRECTDRAWSURFACE pDestSurface) // fake D3D_OK condition. if(res == D3DERR_INVALIDCALL) { - extern HRESULT dxGetFrontBuffer(void *, LPDIRECTDRAWSURFACE); res = dxGetFrontBuffer(lpd3dd, pDestSurface); if(res) OutTraceDW("GetFrontBuffer(8): ret=%x return FAKE D3D_OK\n", res); res = D3D_OK; @@ -2395,7 +2456,6 @@ HRESULT WINAPI extCopyRects(void *lpd3dd, LPDIRECTDRAWSURFACE pSourceSurface, CO res = (*pCopyRects)(lpd3dd, pSourceSurface, pSourceRectsArray, cRects, pDestinationSurface, pDestPointsArray); if((res == D3DERR_INVALIDCALL) && (cRects==0)) { - extern HRESULT dxCopyRects(void *, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); res = dxCopyRects(lpd3dd, pSourceSurface, pDestinationSurface); if(res) OutTraceDW("CopyRects(8): res=%x FAKE D3D_OK on 0 rects\n", res); res = D3D_OK; @@ -2403,3 +2463,27 @@ HRESULT WINAPI extCopyRects(void *lpd3dd, LPDIRECTDRAWSURFACE pSourceSurface, CO OutTraceD3D("CopyRects(8): ret=%x\n", res); return res; } + +// STDMETHOD(GetBackBuffer)(THIS_ UINT iSwapChain,UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface9** ppBackBuffer) PURE; + +HRESULT WINAPI extGetBackBuffer8(void *lpd3dd, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, LPDIRECTDRAWSURFACE *ppBackBuffer) +{ + HRESULT res; + OutTraceD3D("GetBackBuffer(8): d3d=%x backbuffer=%x type=%x\n", lpd3dd, BackBuffer, Type); + + if((dxw.dwFlags8 & D3D8BACK16) && (dwD3DVersion == 8)){ + if ((BackBuffer != 0) || (Type != D3DBACKBUFFER_TYPE_MONO)) { + return D3DERR_INVALIDCALL; + } + *ppBackBuffer = dwGetVirtualBackBuffer(); + (*ppBackBuffer)->AddRef(); + OutTraceD3D("GetBackBuffer(8): EMULATION OK\n"); + return D3D_OK; + } + + res = (*pGetBackBuffer8)(lpd3dd, BackBuffer, Type, ppBackBuffer); + if(res) OutTraceE("GetBackBuffer(8): ret=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + + if(res) OutTraceE("GetBackBuffer(8): ret=%x(%s)\n", res, ExplainDDError(res)); + return res; +} \ No newline at end of file diff --git a/dll/hd3d8.cpp b/dll/hd3d8.cpp index 0c5696f..17681b1 100644 --- a/dll/hd3d8.cpp +++ b/dll/hd3d8.cpp @@ -205,6 +205,11 @@ HRESULT dxGetFrontBuffer(void *lpd3dd, LPDIRECTDRAWSURFACE xdest) return DD_OK; } +HRESULT exCreateImageSurface8(void *lpd3dd, UINT w, UINT h, D3DFORMAT Format, LPDIRECTDRAWSURFACE *ppBackBuffer) +{ + return ((IDirect3DDevice8 *)lpd3dd)->CreateImageSurface(w, h, Format, (IDirect3DSurface8 **)ppBackBuffer); +} + HRESULT dxCopyRects(void *lpd3dd, LPDIRECTDRAWSURFACE psrc, LPDIRECTDRAWSURFACE pdst) { HRESULT res; @@ -319,4 +324,178 @@ HRESULT dxCopyRects(void *lpd3dd, LPDIRECTDRAWSURFACE psrc, LPDIRECTDRAWSURFACE return res; } +LPDIRECT3DSURFACE8 D3D8EmulatedBackBuffer; +LPDIRECT3DSURFACE8 D3D8RealBackBuffer; +LPDIRECT3DSURFACE8 RealDepthBuffer; +LPDIRECT3DTEXTURE8 D3D8EmulatedBackBufferTexture; +IDirect3DSurface8* EmulatedBackBufferTextureLevel0; +LPDIRECTDRAWSURFACE dwGetVirtualBackBuffer() +{ + return (LPDIRECTDRAWSURFACE)D3D8EmulatedBackBuffer; +} + +HRESULT dwD3D8InitEmulation(void *lpd3ddx) +{ + HRESULT res; + LPDIRECT3DDEVICE8 lpd3dd = (LPDIRECT3DDEVICE8)lpd3ddx; + + // Create the render target which will be used as the real back buffer. + res = lpd3dd->CreateRenderTarget(dxw.GetScreenWidth(), dxw.GetScreenHeight(), D3DFMT_R5G6B5, D3DMULTISAMPLE_NONE, TRUE, &D3D8EmulatedBackBuffer); + if(res) OutTraceE("dwD3D8InitEmulation: CreateRenderTarget ERROR res=%x at %d\n", res, __LINE__); + + res = lpd3dd->CreateTexture(dxw.GetScreenWidth(), dxw.GetScreenHeight(), 1, 0, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, &D3D8EmulatedBackBufferTexture); + if(res) OutTraceE("dwD3D8InitEmulation: CreateTexture ERROR res=%x at %d\n", res, __LINE__); + + res = D3D8EmulatedBackBufferTexture->GetSurfaceLevel(0, &EmulatedBackBufferTextureLevel0); + if(res) OutTraceE("dwD3D8InitEmulation: GetSurfaceLevel ERROR res=%x at %d\n", res, __LINE__); + + // Locate the real buffers. + res = lpd3dd->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &D3D8RealBackBuffer); + if(res) OutTraceE("dwD3D8InitEmulation: GetBackBuffer ERROR res=%x at %d\n", res, __LINE__); + + res = lpd3dd->GetDepthStencilSurface(&RealDepthBuffer); + if(res) OutTraceE("dwD3D8InitEmulation: GetDepthStencilSurface ERROR res=%x at %d\n", res, __LINE__); + + // Switch the render target to the emulated one by default. + + res = lpd3dd->SetRenderTarget(D3D8EmulatedBackBuffer, RealDepthBuffer); + if(res) OutTraceE("dwD3D8InitEmulation: SetRenderTarget ERROR res=%x at %d\n", res, __LINE__); + + return D3D_OK; +} + +void dwD3D8ShutdownEmulation(void *lpd3ddx) +{ + HRESULT res; + LPDIRECT3DDEVICE8 lpd3dd = (LPDIRECT3DDEVICE8)lpd3ddx; + + // Restore targets. + + res=lpd3dd->SetRenderTarget(D3D8RealBackBuffer, RealDepthBuffer); + if(res) OutTraceE("dwD3D8ShutdownEmulation: SetRenderTarget ERROR res=%x at %d\n", res, __LINE__); + res=D3D8RealBackBuffer->Release(); + res=RealDepthBuffer->Release(); + + // Destroy emulation objects. + + res=EmulatedBackBufferTextureLevel0->Release(); + res=D3D8EmulatedBackBufferTexture->Release(); + res=D3D8EmulatedBackBuffer->Release(); +} + +static DWORD set_rs(LPDIRECT3DDEVICE8 lpd3dd, const D3DRENDERSTATETYPE type, const DWORD value) +{ + DWORD old_value; + lpd3dd->GetRenderState(type, &old_value); + lpd3dd->SetRenderState(type, value); + return old_value; +} + +static DWORD set_tss(LPDIRECT3DDEVICE8 lpd3dd, const DWORD stage, const D3DTEXTURESTAGESTATETYPE type, const DWORD value) +{ + DWORD old_value; + lpd3dd->GetTextureStageState(stage, type, &old_value); + lpd3dd->SetTextureStageState(stage, type, value); + return old_value; +} + +HRESULT dwD3D8Present(void *lpd3ddx, CONST RECT *pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion) +{ + HRESULT res; + LPDIRECT3DDEVICE8 lpd3dd = (LPDIRECT3DDEVICE8)lpd3ddx; + + if (pSourceRect || pDestRect || hDestWindowOverride || pDirtyRegion) { + OutTraceE("dwD3D8Present: ERROR only parameter-less Present is supported\n"); + return D3DERR_INVALIDCALL; + } + + // Blit the render target to the texture. + + res = lpd3dd->CopyRects(D3D8EmulatedBackBuffer, NULL, 0, EmulatedBackBufferTextureLevel0, NULL); + if(res) OutTraceE("dwD3D8Present: CopyRects ERROR res=%x at %d\n", res, __LINE__); + + // Render the texture to the real back buffer. + + res = lpd3dd->BeginScene(); + if(res) { + OutTraceE("dwD3D8Present: CopyRects ERROR res=%x at %d\n", res, __LINE__); + return D3DERR_INVALIDCALL; + } + + LPDIRECT3DSURFACE8 old_back_buffer; + LPDIRECT3DSURFACE8 old_depth_buffer; + lpd3dd->GetRenderTarget(&old_back_buffer); + lpd3dd->GetDepthStencilSurface(&old_depth_buffer); + + lpd3dd->SetRenderTarget(D3D8RealBackBuffer, RealDepthBuffer); + + LPDIRECT3DBASETEXTURE8 old_txt; + lpd3dd->GetTexture(0, &old_txt); + lpd3dd->SetTexture(0, D3D8EmulatedBackBufferTexture); + + DWORD old_vs; + lpd3dd->GetVertexShader(&old_vs); + lpd3dd->SetVertexShader(D3DFVF_XYZRHW | D3DFVF_TEX1); + + IDirect3DVertexBuffer8 *old_stream_0; + UINT old_stream_0_stride; + lpd3dd->GetStreamSource(0, &old_stream_0, &old_stream_0_stride); + + const DWORD old_cull = set_rs(lpd3dd, D3DRS_CULLMODE, D3DCULL_NONE); + const DWORD old_atest = set_rs(lpd3dd, D3DRS_ALPHATESTENABLE, FALSE); + const DWORD old_blend = set_rs(lpd3dd, D3DRS_ALPHABLENDENABLE, FALSE); + const DWORD old_z_enable = set_rs(lpd3dd, D3DRS_ZENABLE, FALSE); + const DWORD old_z_write = set_rs(lpd3dd, D3DRS_ZWRITEENABLE, FALSE); + const DWORD old_stencil = set_rs(lpd3dd, D3DRS_STENCILENABLE, FALSE); + const DWORD old_fog = set_rs(lpd3dd, D3DRS_FOGENABLE, FALSE); + const DWORD old_specular = set_rs(lpd3dd, D3DRS_SPECULARENABLE, FALSE); + const DWORD old_zbias = set_rs(lpd3dd, D3DRS_ZBIAS, 0); + + const DWORD old_colorop_0 = set_tss(lpd3dd, 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + const DWORD old_colorarg_0 = set_tss(lpd3dd, 0, D3DTSS_COLORARG0, D3DTA_TEXTURE); + const DWORD old_colorop_1 = set_tss(lpd3dd, 1, D3DTSS_COLOROP, D3DTOP_DISABLE); + const DWORD old_mag_filter_0 = set_tss(lpd3dd, 0, D3DTSS_MAGFILTER, D3DTEXF_POINT); + const DWORD old_min_filter_0 = set_tss(lpd3dd, 0, D3DTSS_MINFILTER, D3DTEXF_POINT); + + const float right = static_cast(dxw.GetScreenWidth()); + const float bottom = static_cast(dxw.GetScreenHeight()); + + const struct QuadVertex { + float x, y, z, w; + float u, v; + } quad[] = { + {-0.5f + 0.0f, -0.5f + 0.0f, 0.5f, 1.0f, 0.0f, 0.0f}, + {-0.5f + right, -0.5f + 0.0f, 0.5f, 1.0f, 1.0f, 0.0f}, + {-0.5f + right, -0.5f + bottom, 0.5f, 1.0f, 1.0f, 1.0f}, + {-0.5f + 0.0f, -0.5f + bottom, 0.5f, 1.0f, 0.0f, 1.0f}, + }; + lpd3dd->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, quad, sizeof(QuadVertex)); + + // Restore whatever parts of the state are necessary. + // Currently we do not restore viewport. + + lpd3dd->SetRenderTarget(old_back_buffer, old_depth_buffer); + lpd3dd->SetTexture(0, old_txt); + lpd3dd->SetVertexShader(old_vs); + + lpd3dd->SetRenderState(D3DRS_CULLMODE, old_cull); + lpd3dd->SetRenderState(D3DRS_ALPHATESTENABLE, old_atest); + lpd3dd->SetRenderState(D3DRS_ALPHABLENDENABLE, old_blend); + lpd3dd->SetRenderState(D3DRS_ZENABLE, old_z_enable); + lpd3dd->SetRenderState(D3DRS_ZWRITEENABLE, old_z_write); + lpd3dd->SetRenderState(D3DRS_STENCILENABLE, old_stencil); + lpd3dd->SetRenderState(D3DRS_FOGENABLE, old_fog); + lpd3dd->SetRenderState(D3DRS_SPECULARENABLE, old_specular); + lpd3dd->SetRenderState(D3DRS_ZBIAS, old_zbias); + + lpd3dd->SetTextureStageState(0, D3DTSS_COLOROP, old_colorop_0); + lpd3dd->SetTextureStageState(0, D3DTSS_COLORARG0, old_colorarg_0); + lpd3dd->SetTextureStageState(1, D3DTSS_COLOROP, old_colorop_1); + lpd3dd->SetTextureStageState(0, D3DTSS_MAGFILTER, old_mag_filter_0); + lpd3dd->SetTextureStageState(0, D3DTSS_MINFILTER, old_min_filter_0); + + lpd3dd->SetStreamSource(0, old_stream_0, old_stream_0_stride); + lpd3dd->EndScene(); + return D3D_OK; +} diff --git a/host/TabDirect3D.cpp b/host/TabDirect3D.cpp index 016bf98..11b4cfc 100644 --- a/host/TabDirect3D.cpp +++ b/host/TabDirect3D.cpp @@ -53,6 +53,9 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) // Swap Effect DDX_Check(pDX, IDC_FORCESWAPEFFECT, cTarget->m_ForcesSwapEffect); DDX_Radio(pDX, IDC_SWAP_DISCARD, cTarget->m_SwapEffect); + + // Emulations .... + DDX_Check(pDX, IDC_D3D8BACK16, cTarget->m_D3D8Back16); } BEGIN_MESSAGE_MAP(CTabDirect3D, CDialog) diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index e33d684..86eb989 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -60,6 +60,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SuppressD3DExt = FALSE; m_Enum16bitModes = FALSE; m_TrimTextureFormats = FALSE; + m_D3D8Back16 = FALSE; m_NoHALDevice = FALSE; //m_RawFormat = FALSE; m_TextureFileFormat = 0; @@ -114,6 +115,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_StressResources = FALSE; m_DisableFogging = FALSE; m_Power2Width = FALSE; + m_ClearTarget = FALSE; m_FixPitch = FALSE, m_NoPower2Fix = FALSE; m_NoPerfCounter = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 58fb9cc..15dde6c 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -267,6 +267,7 @@ public: BOOL m_SuppressD3DExt; BOOL m_Enum16bitModes; BOOL m_TrimTextureFormats; + BOOL m_D3D8Back16; //BOOL m_RawFormat; BOOL m_LimitScreenRes; BOOL m_InitialRes; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps new file mode 100644 index 0000000..5573441 Binary files /dev/null and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index d1fc472..e1c83f5 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 65deb6e..5ed9731 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhost.vs2008.vcproj.DESKTOP-Q3RE27J.user.user b/host/dxwndhost.vs2008.vcproj.DESKTOP-Q3RE27J.user.user deleted file mode 100644 index 723bba8..0000000 --- a/host/dxwndhost.vs2008.vcproj.DESKTOP-Q3RE27J.user.user +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 76901bf..f1ab47b 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -391,6 +391,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; if(dlg->m_Enum16bitModes) t->flags7 |= ENUM16BITMODES; if(dlg->m_TrimTextureFormats) t->flags8 |= TRIMTEXTUREFORMATS; + if(dlg->m_D3D8Back16) t->flags8 |= D3D8BACK16; if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; if(dlg->m_AEROBoost) t->flags5 |= AEROBOOST; if(dlg->m_DiabloTweak) t->flags5 |= DIABLOTWEAK; @@ -687,6 +688,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SuppressD3DExt = t->flags3 & SUPPRESSD3DEXT ? 1 : 0; dlg->m_Enum16bitModes = t->flags7 & ENUM16BITMODES ? 1 : 0; dlg->m_TrimTextureFormats = t->flags8 & TRIMTEXTUREFORMATS ? 1 : 0; + dlg->m_D3D8Back16 = t->flags8 & D3D8BACK16 ? 1 : 0; dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0; dlg->m_AEROBoost = t->flags5 & AEROBOOST ? 1 : 0; dlg->m_DiabloTweak = t->flags5 & DIABLOTWEAK ? 1 : 0; diff --git a/host/resource b/host/resource index 94ed69c..992c4ed 100644 Binary files a/host/resource and b/host/resource differ