From c887f35b9c0c349d2cf9f34a07719a1faa2ef4e3 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 15 Aug 2015 12:41:17 -0400 Subject: [PATCH] v2_03_33_src Former-commit-id: 2b7343daa6f3a3990dd7321d5855c6d479d2a5ff --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 5 + ...lair Witch Volume Three - Elly Kedward.dxw | 31 ++ build/exports/Blair Witch Volume Two.dxw | 31 ++ build/exports/Evil Islands.dxw | 31 ++ build/exports/Sheep Dog'n Wolf.dxw | 31 ++ build/exports/The Watchmaker.dxw | 31 ++ build/exports/Theme Park World.dxw | 31 ++ build/exports/TrickStyle (D3D).dxw | 31 ++ build/exports/Urban Chaos.dxw | 31 ++ build/exports/Wargasm.dxw | 31 ++ build/readme-relnotes.txt | 5 + dll/ddblit.cpp | 11 +- dll/ddraw.cpp | 432 +++++++++++++----- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 384000 -> 412634 bytes dll/user32.cpp | 4 + host/TabDirect3D.cpp | 2 + host/TabDirectX.cpp | 3 +- host/TargetDlg.cpp | 6 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 158740 -> 158928 bytes host/dxwndhost.rc | Bin 102348 -> 102592 bytes host/dxwndhost.vs2008.suo | Bin 260608 -> 261632 bytes host/dxwndhostView.cpp | 2 + host/resource | Bin 36066 -> 36158 bytes 28 files changed, 623 insertions(+), 136 deletions(-) create mode 100644 build/dxwnd.ini create mode 100644 build/exports/Blair Witch Volume Three - Elly Kedward.dxw create mode 100644 build/exports/Blair Witch Volume Two.dxw create mode 100644 build/exports/Evil Islands.dxw create mode 100644 build/exports/Sheep Dog'n Wolf.dxw create mode 100644 build/exports/The Watchmaker.dxw create mode 100644 build/exports/Theme Park World.dxw create mode 100644 build/exports/TrickStyle (D3D).dxw create mode 100644 build/exports/Urban Chaos.dxw create mode 100644 build/exports/Wargasm.dxw diff --git a/Include/dxwnd.h b/Include/dxwnd.h index d079f95..9e44332 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -197,6 +197,7 @@ #define NOSYSMEMBACKBUF 0x00002000 // forces suppression of DDSCAPS_SYSTEMMEMORY capability on emulated backbuffer surface #define CONFIRMONCLOSE 0x00004000 // on close button, ask the user before closing the window / terminating the program #define TERMINATEONCLOSE 0x00008000 // on WM_CLOSE message, also terminates the program +#define FLIPEMULATION 0x00010000 // create virtual primary and backbuffer as un-attached surfaces and replace Flip with Blt // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 9a39756..7dbb1fa 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:801f4eac2532d06296db4f257f4b14b6d58d6e6729a7df14a5c73407cbfbb3a5 -size 578560 +oid sha256:fb897fb45eee04399f47f1872c1f63f8a3aaccd0c6d936ca3eabc0e41ecdef7e +size 580608 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 620b79a..46ba3e7 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:298792319c4f1da616431a5ac3e9cbd4ae54c82335a70f27affa029e8f0b3183 +oid sha256:36da51e4bf39269c8ad561b1573553024b8de8be9072da196c89e32955a2ffb8 size 541696 diff --git a/build/dxwnd.ini b/build/dxwnd.ini new file mode 100644 index 0000000..f1dc130 --- /dev/null +++ b/build/dxwnd.ini @@ -0,0 +1,5 @@ +[window] +posx=1220 +posy=260 +sizx=320 +sizy=200 diff --git a/build/exports/Blair Witch Volume Three - Elly Kedward.dxw b/build/exports/Blair Witch Volume Three - Elly Kedward.dxw new file mode 100644 index 0000000..3e3bc18 --- /dev/null +++ b/build/exports/Blair Witch Volume Three - Elly Kedward.dxw @@ -0,0 +1,31 @@ +[target] +title0=Blair Witch Volume Three - Elly Kedward +path0=D:\Games\Blair Witch Volume Three - Elly Kedward\bw3.exe +launchpath0= +module0= +opengllib0= +notes0="Limit available resources" to bypass the resource cheks, though not fully necessary: \ntyping the enter key the game starts anyway.\n +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1476395008 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Blair Witch Volume Two.dxw b/build/exports/Blair Witch Volume Two.dxw new file mode 100644 index 0000000..2a01b7e --- /dev/null +++ b/build/exports/Blair Witch Volume Two.dxw @@ -0,0 +1,31 @@ +[target] +title0=Blair Witch Volume Two +path0=D:\Games\Blair Witch II\blairwitch2.exe +launchpath0= +module0= +opengllib0= +notes0="Limit available resources" to bypass the resource cheks, though not fully necessary: \ntyping the enter key the game starts anyway.\n +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1476395008 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Evil Islands.dxw b/build/exports/Evil Islands.dxw new file mode 100644 index 0000000..91ac389 --- /dev/null +++ b/build/exports/Evil Islands.dxw @@ -0,0 +1,31 @@ +[target] +title0=Evil Islands +path0=D:\Games\Evil Islands\Game.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Sheep Dog'n Wolf.dxw b/build/exports/Sheep Dog'n Wolf.dxw new file mode 100644 index 0000000..951f33b --- /dev/null +++ b/build/exports/Sheep Dog'n Wolf.dxw @@ -0,0 +1,31 @@ +[target] +title0=Sheep Dog'n Wolf +path0=D:\Games\Sheep & Wolf\SheepD3D.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/The Watchmaker.dxw b/build/exports/The Watchmaker.dxw new file mode 100644 index 0000000..2a67922 --- /dev/null +++ b/build/exports/The Watchmaker.dxw @@ -0,0 +1,31 @@ +[target] +title0=The Watchmaker +path0=D:\Games\The Watchmaker\Wm.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Theme Park World.dxw b/build/exports/Theme Park World.dxw new file mode 100644 index 0000000..1122df8 --- /dev/null +++ b/build/exports/Theme Park World.dxw @@ -0,0 +1,31 @@ +[target] +title0=Theme Park World +path0=D:\Games\Theme Park World\tp.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=681590839 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/TrickStyle (D3D).dxw b/build/exports/TrickStyle (D3D).dxw new file mode 100644 index 0000000..82d1ee9 --- /dev/null +++ b/build/exports/TrickStyle (D3D).dxw @@ -0,0 +1,31 @@ +[target] +title0=TrickStyle (D3D) +path0=D:\Games\TrickStyle\TS_D3D.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136331298 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=67113088 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Urban Chaos.dxw b/build/exports/Urban Chaos.dxw new file mode 100644 index 0000000..20658e6 --- /dev/null +++ b/build/exports/Urban Chaos.dxw @@ -0,0 +1,31 @@ +[target] +title0=Urban Chaos +path0=D:\Games\Urban Chaos\fallen.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Wargasm.dxw b/build/exports/Wargasm.dxw new file mode 100644 index 0000000..61e04c5 --- /dev/null +++ b/build/exports/Wargasm.dxw @@ -0,0 +1,31 @@ +[target] +title0=Wargasm +path0=D:\Games\Wargasm\tank.exe +launchpath0= +module0= +opengllib0= +notes0=Must set HOVAPPDATA=. environment variable +ver0=0 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 510bec6..f696c27 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -867,3 +867,8 @@ add: flags "Ask confirmation on window close" and "Terminate on window close" fix: implemented surface stack cleanup on overflow: this should allow "European Air War" to run through several seasons. debug: added a few diagnostic messages to trap possible errors in DLL injection functions fix: recovered the menu Edit->Add command that went disabled + +v2.03.33: +add: new surface handling, more similar to D3DWindower. The previous mode can be activated by setting the "Flip emulation" flag. The new mode can successfully manage "Microsoft Motocross Madness 2". +fix: Reelease operation for primary surface when used for GDI GetDC operation +fix: protections for GDI ReleaseDC operations against null window or DC diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index 68c2f26..693df6c 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -19,6 +19,8 @@ extern CreateSurface1_Type pCreateSurface3; extern CreateSurface2_Type pCreateSurface4; extern CreateSurface2_Type pCreateSurface7; extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); +extern HDC hFlippedDC; +extern ReleaseDC_Type pReleaseDC; extern void BlitError(HRESULT, LPRECT, LPRECT, int); extern void BlitTrace(char *, LPRECT, LPRECT, int); @@ -239,12 +241,12 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest emurect.bottom = dxw.GetScreenHeight(); } - res=0; + res=DD_OK; // blit only when source and dest surface are different. Should make ScreenRefresh faster. if (lpdds != lpddssrc){ if (IsDebug) BlitTrace("SRC2EMU", &emurect, &destrect, __LINE__); if(destrect.top == -32000) return DD_OK; // happens when window is minimized & do not notify on task switch ... - if(lpdds->IsLost()) lpdds->Restore(); // lpDDSEmu_Back could get lost ..... + if(lpdds->IsLost()) lpdds->Restore(); // lpDDSEmu_Back could get lost ..... res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } @@ -272,10 +274,13 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest // Try to handle HDC lock concurrency.... if(res==DDERR_SURFACEBUSY){ + (*pReleaseDC)(lpdds, hFlippedDC); +#if 0 res=(*pUnlockMethod(lpddssrc))(lpddssrc, NULL); if(res && (res!=DDERR_NOTLOCKED)) OutTraceE("Unlock ERROR: lpdds=%x err=%x(%s)\n", lpddssrc, res, ExplainDDError(res)); res=(*pUnlockMethod(lpdds))(lpdds, NULL); // v2.03.24 reintroduced because of "Virtua Cop" if(res && (res!=DDERR_NOTLOCKED)) OutTraceE("Unlock ERROR: lpdds=%x err=%x(%s)\n", lpdds, res, ExplainDDError(res)); +#endif if (IsDebug) BlitTrace("BUSY", &emurect, &destrect, __LINE__); res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); @@ -287,7 +292,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest LPDIRECTDRAWSURFACE lpDDSSource; if (res=(*pColorConversion)(lpdds, emurect, &lpDDSSource)) { - OutTraceE("sBlt ERROR: Color conversion failed res=%d(%s)\n", res, ExplainDDError(res)); + OutTraceE("sBlt ERROR: Color conversion failed res=%x(%s)\n", res, ExplainDDError(res)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 16daaf0..9ebec0c 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2182,81 +2182,17 @@ static void ClearSurfaceDesc(void *ddsd, int dxversion) ((LPDDSURFACEDESC)ddsd)->dwSize = size; } -static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion) { - DDSURFACEDESC2 ddsd; HRESULT res; + DDSURFACEDESC2 ddsd; - // emulated primary surface - memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); - - // handle the surface attributes before the ddsd.dwFlags gets updated: - // if a surface desc is NOT specified, build one - if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); - // then save it - dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; - - OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); - ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - if(dxw.dwFlags6 & NOSYSMEMPRIMARY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - - extern BOOL bInCreateDevice; - //if (bInCreateDevice) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - //if (bInCreateDevice) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_3DDEVICE; - - // this would make STCC work in emulated mode, but SLOW!!!! - //if(ddsd.ddsCaps.dwCaps & DDSCAPS_3DDEVICE) { - // ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - // //ddsd.ddsCaps.dwCaps |= (DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - //} - - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - - // create Primary surface - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ - LPDIRECTDRAWSURFACE lpPrim; - OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); - (*pGetGDISurface)(lpPrimaryDD, &lpPrim); - while ((*pReleaseS)(lpPrim)); - res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - } - /* fall through */ - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - } - - OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - HookDDSurfacePrim(lplpdds, dxversion); - // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... - iBakBufferVersion=dxversion; // v2.03.01 - - // set a global capability value for surfaces that have to blit to primary - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - // DDSCAPS_SYSTEMMEMORY makes operations faster, but it is not always good... - dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - // this is important to avoid that certain D3D operations will abort - see "Forsaken" problem - if(dxw.dwFlags6 & NOSYSMEMBACKBUF) dwBackBufferCaps = DDSCAPS_OFFSCREENPLAIN; - - if(dxw.dwFlags5 & GDIMODE) return DD_OK; - + OutTraceDW("DEBUG: BuildRealSurfaces: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); if(lpDDSEmu_Prim==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + //ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_SYSTEMMEMORY; OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ @@ -2276,7 +2212,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(res){ OutTraceE("CreateSurface: ERROR on DDSEmu_Prim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; + return; } OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); @@ -2290,7 +2226,8 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(lpDDSEmu_Back==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = dwBackBufferCaps; + //ddsd.ddsCaps.dwCaps = dwBackBufferCaps; + ddsd.ddsCaps.dwCaps = dwBackBufferCaps|DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); if(dxw.dwFlags4 & BILINEAR2XFILTER){ @@ -2305,16 +2242,128 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(res){ OutTraceE("CreateSurface: CreateSurface ERROR on DDSEmuBack : res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; + return; } OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); dxwss.PopSurface(lpDDSEmu_Back); if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); } +} + +static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildPrimaryEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // emulated primary surface + memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); + + // handle the surface attributes before the ddsd.dwFlags gets updated: + // if a surface desc is NOT specified, build one + if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); + // then save it + dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; + + OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); + ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); + ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT); + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces + ddsd.ddsCaps.dwCaps |= (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags6 & NOSYSMEMPRIMARY) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; + + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + + // create Primary surface + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res){ + OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); + HookDDSurfacePrim(lplpdds, dxversion); + // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... + iBakBufferVersion=dxversion; // v2.03.01 + + // set a global capability value for surfaces that have to blit to primary + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces + // DDSCAPS_SYSTEMMEMORY makes operations faster, but it is not always good... + dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + // this is important to avoid that certain D3D operations will abort - see "Forsaken" problem + if(dxw.dwFlags6 & NOSYSMEMBACKBUF) dwBackBufferCaps = DDSCAPS_OFFSCREENPLAIN; bFlippedDC = TRUE; - + + if(dxw.dwFlags5 & GDIMODE) return DD_OK; + + BuildRealSurfaces(lpdd, pCreateSurface, lpddsd, dxversion); + return DD_OK; +} + +static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildPrimaryFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + // emulated primary surface + memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); + + // handle the surface attributes before the ddsd.dwFlags gets updated: + // if a surface desc is NOT specified, build one + if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); + // then save it + dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; + + OutTraceDW("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); + + // dwFlags + ddsd.dwFlags &= ~(DDSD_REFRESHRATE); + ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_BACKBUFFERCOUNT); + + // dwBackBufferCount: set to at least 1 + if(!(lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) || (lpddsd->dwBackBufferCount == 0)) ddsd.dwBackBufferCount = 1; + + // dwCaps + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + ddsd.ddsCaps.dwCaps |= (DDSCAPS_COMPLEX|DDSCAPS_FLIP|DDSCAPS_OFFSCREENPLAIN); + + // dwWidth & dwHeight + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + + // create Primary surface + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res){ + OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + + OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); + HookDDSurfacePrim(lplpdds, dxversion); + // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... + iBakBufferVersion=dxversion; // v2.03.01 + + // set a global capability value for surfaces that have to blit to primary + dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + + bFlippedDC = TRUE; + + if(dxw.dwFlags5 & GDIMODE) return DD_OK; + + BuildRealSurfaces(lpdd, pCreateSurface, lpddsd, dxversion); return DD_OK; } @@ -2323,6 +2372,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf DDSURFACEDESC2 ddsd; HRESULT res; + OutTraceDW("DEBUG: BuildPrimaryDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // genuine primary surface memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); @@ -2384,6 +2434,7 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS DDSURFACEDESC2 ddsd; HRESULT res; + OutTraceDW("DEBUG: BuildBackBufferEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // create BackBuffer surface memcpy(&ddsd, lpddsd, lpddsd->dwSize); ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); @@ -2411,6 +2462,91 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! iBakBufferVersion=dxversion; // v2.02.31 + // V2.1.85/V2.2.34: tricky !!!! + // When a real backbuffer is created, it has a reference to its frontbuffer. + // some games (Monopoly 3D) may depend on this setting - i.e. they could close + // the exceeding references - so this is better be replicated adding an initial + // reference to the zero count. But you don't have to do this if the backbuffer + // is created independently by the primary surface. + (*lplpdds)->AddRef(); // should it be repeated BBCount times???? + + return DD_OK; +} + +static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + + // create BackBuffer surface + memcpy(&ddsd, lpddsd, lpddsd->dwSize); + + ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); + ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); + + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_BACKBUFFER|DDSCAPS_PRIMARYSURFACE); + ddsd.ddsCaps.dwCaps |= (DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + + ddsd.dwWidth = dxw.GetScreenWidth(); + ddsd.dwHeight = dxw.GetScreenHeight(); + GetPixFmt(&ddsd); + + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); + if(res) { + OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } + + OutTraceDW("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); + HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! + iBakBufferVersion=dxversion; // v2.02.31 + + return DD_OK; +} + +static HRESULT AttachBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + HRESULT res; + LPDIRECTDRAWSURFACE lpDDSPrim; + OutTraceDW("DEBUG: AttachBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + + // retrieve the attached backbuffer surface and hook it + + if(lpddsd->dwBackBufferCount == 0) return DD_OK; // nothing to retrieve + + GetAttachedSurface_Type pGetAttachedSurface; + DDSCAPS2 caps; + switch(dxversion){ + default: + case 1: + case 2: + pGetAttachedSurface = pGetAttachedSurface1; break; + case 3: + pGetAttachedSurface = pGetAttachedSurface3; break; + case 4: + pGetAttachedSurface = pGetAttachedSurface4; break; + case 7: + pGetAttachedSurface = pGetAttachedSurface7; break; + } + memset(&caps, 0, sizeof(caps)); + caps.dwCaps = DDSCAPS_BACKBUFFER; + lpDDSPrim = dxwss.GetPrimarySurface(); + res = (*pGetAttachedSurface)(lpDDSPrim, (LPDDSCAPS)&caps, lplpdds); + if(res){ + OutTraceE("CreateSurface: GetAttachedSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + OutTraceDW("CreateSurface: retrieved BACK DDSBack=%x\n", *lplpdds); + if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); + HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! + iBakBufferVersion=dxversion; // v2.02.31 + return DD_OK; } @@ -2419,6 +2555,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS DDSURFACEDESC2 ddsd; HRESULT res; + OutTraceDW("DEBUG: BuildBackBufferDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); // create BackBuffer surface // ClearSurfaceDesc((void *)&ddsd, dxversion); memcpy(&ddsd, lpddsd, lpddsd->dwSize); @@ -2474,6 +2611,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf DDSURFACEDESC2 ddsd; HRESULT res; + OutTraceDW("DEBUG: BuildGenericEmu: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... FixSurfaceCaps(&ddsd, dxversion); // It looks that DDSCAPS_SYSTEMMEMORY surfaces can perfectly be DDSCAPS_3DDEVICE as well. @@ -2506,7 +2644,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", - *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir Generic]", __LINE__)); + *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); // v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply. // fixes "Virtua Fighter PC" palette bug @@ -2528,6 +2666,7 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf { HRESULT res; + OutTraceDW("DEBUG: BuildGenericDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); @@ -2567,21 +2706,39 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate typedef HRESULT (*BuildSurface_Type)(LPDIRECTDRAW, CreateSurface_Type, LPDDSURFACEDESC2, int, LPDIRECTDRAWSURFACE *, void *); BuildSurface_Type BuildPrimary; BuildSurface_Type BuildBackBuffer; + BuildSurface_Type AttachBackBuffer; BuildSurface_Type BuildGeneric; - - if (dxw.dwFlags1 & EMULATESURFACE){ - BuildPrimary = BuildPrimaryEmu; - BuildBackBuffer = BuildBackBufferEmu; - BuildGeneric = BuildGenericEmu; - } - else { - BuildPrimary = BuildPrimaryDir; - BuildBackBuffer = BuildBackBufferDir; - BuildGeneric = BuildGenericDir; - } + enum { + PRIMARY_DIRECT = 0, + PRIMARY_FLIPPABLE, + PRIMARY_EMULATED + } SurfaceMode; OutTraceDDRAW("CreateSurface: Version=%d lpdd=%x %s\n", dxversion, lpdd, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__)); + + SurfaceMode = (dxw.dwFlags1 & EMULATESURFACE) ? ((dxw.dwFlags6 & FLIPEMULATION) ? PRIMARY_EMULATED : PRIMARY_FLIPPABLE) : PRIMARY_DIRECT; + + switch(SurfaceMode) { + case PRIMARY_DIRECT: + BuildPrimary = BuildPrimaryDir; + BuildBackBuffer = BuildBackBufferDir; + AttachBackBuffer = BuildBackBufferDir; + BuildGeneric = BuildGenericDir; + break; + case PRIMARY_FLIPPABLE: + BuildPrimary = BuildPrimaryFlippable; + BuildBackBuffer = BuildBackBufferFlippable; + AttachBackBuffer = AttachBackBufferFlippable; + BuildGeneric = BuildGenericEmu; + break; + case PRIMARY_EMULATED: + BuildPrimary = BuildPrimaryEmu; + BuildBackBuffer = BuildBackBufferEmu; + AttachBackBuffer = BuildBackBufferEmu; + BuildGeneric = BuildGenericEmu; + break; + } // check for lpddsd->dwSize value TargetSize=(dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); @@ -2628,7 +2785,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!! lpDDSBack = dxwss.GetBackBufferSurface(); if (lpDDSBack) { - while(lpDDSBack->Release()); + if(dxw.dwFlags6 & FLIPEMULATION) while(lpDDSBack->Release()); dxwss.PopSurface(lpDDSBack); lpDDSBack = NULL; } @@ -2663,17 +2820,9 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate if (BBCount){ // build emulated backbuffer surface - res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); + res=AttachBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); if(res) return res; dxwss.PushBackBufferSurface(lpDDSBack, dxversion); - - // V2.1.85/V2.2.34: tricky !!!! - // When a real backbuffer is created, it has a reference to its frontbuffer. - // some games (Monopoly 3D) may depend on this setting - i.e. they could close - // the exceeding references - so this is better be replicated adding an initial - // reference to the zero count. But you don't have to do this if the backbuffer - // is created independently by the primary surface. - lpDDSBack->AddRef(); // should it be repeated BBCount times???? } if(IsTraceDDRAW){ @@ -2722,7 +2871,6 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate } } - return res; } @@ -2760,40 +2908,48 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); - // v2.1.81: fix to make "Silver" working: if the primary surface was created with - // backbuffercount == 2, the game expects some more surface to be attached to - // the attached backbuffer. Since there would be no use for it, just return - // the attached backbuffer itself. Makes Silver working, anyway.... - // beware: "Snowboard Racer" fails if you return an attached surface anyhow! There, - // the primary surface was created with back buffer count == 1. - // v2.2.62 fix: a check to implement doublebuffer emulation only in case of DDSCAPS_BACKBUFFER - // requests. A call to GetAttachedSurface can be made to retrieve DDSCAPS_ZBUFFER surfaces, and in - // this case the BackBuffer surface can't be returned. + if(dxw.dwFlags6 & FLIPEMULATION){ - if (IsBack && (DDSD_Prim.dwBackBufferCount > 1) && (lpddsc->dwCaps & DDSCAPS_BACKBUFFER)){ - *lplpddas = lpdds; - OutTraceDW("GetAttachedSurface(%d): DOUBLEBUFFER attached to BACK=%x\n", dxversion, lpdds); - return DD_OK; - } + // v2.1.81: fix to make "Silver" working: if the primary surface was created with + // backbuffercount == 2, the game expects some more surface to be attached to + // the attached backbuffer. Since there would be no use for it, just return + // the attached backbuffer itself. Makes Silver working, anyway.... + // beware: "Snowboard Racer" fails if you return an attached surface anyhow! There, + // the primary surface was created with back buffer count == 1. + // v2.2.62 fix: a check to implement doublebuffer emulation only in case of DDSCAPS_BACKBUFFER + // requests. A call to GetAttachedSurface can be made to retrieve DDSCAPS_ZBUFFER surfaces, and in + // this case the BackBuffer surface can't be returned. - // on primary surface return the backbuffer surface coming from either an explicit - // AddAttachedSurface, or a primary complex surface creation otherwise.... - - if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) { // v2.02.42 added DDSCAPS_FLIP for Empire Earth - // in "Tomb Raider III" GOG release, the primary surface is queryed and has no attached - // backbuffer, but a backbuffer does exist and has to be retrieved by GetBackBufferSurface. - LPDIRECTDRAWSURFACE lpddsback = dxwss.GetBackBufferSurface(); - if (lpddsback) { - *lplpddas = lpddsback; - OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); + if (IsBack && (DDSD_Prim.dwBackBufferCount > 1) && (lpddsc->dwCaps & DDSCAPS_BACKBUFFER)){ + *lplpddas = lpdds; + OutTraceDW("GetAttachedSurface(%d): DOUBLEBUFFER attached to BACK=%x\n", dxversion, lpdds); return DD_OK; } - else { - *lplpddas = NULL; - OutTraceDW("GetAttachedSurface(%d): no attached BACKBUFFER\n", dxversion); - return DDERR_NOTFOUND; + + // on primary surface return the backbuffer surface coming from either an explicit + // AddAttachedSurface, or a primary complex surface creation otherwise.... + + if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) { // v2.02.42 added DDSCAPS_FLIP for Empire Earth + // in "Tomb Raider III" GOG release, the primary surface is queryed and has no attached + // backbuffer, but a backbuffer does exist and has to be retrieved by GetBackBufferSurface. + LPDIRECTDRAWSURFACE lpddsback = dxwss.GetBackBufferSurface(); + if (lpddsback) { + *lplpddas = lpddsback; + OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); + return DD_OK; + } + else { + *lplpddas = NULL; + OutTraceDW("GetAttachedSurface(%d): no attached BACKBUFFER\n", dxversion); + return DDERR_NOTFOUND; + } } } + else { + // Virtual primary surfaces are created with no DDSCAPS_3DDEVICE caps, so don't look for it .... + if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) + lpddsc->dwCaps &= ~DDSCAPS_3DDEVICE; + } // proxy the call... @@ -3169,6 +3325,18 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); + if (!(dxw.dwFlags6 & FLIPEMULATION) && 0) { + OutTrace("DEBUG: attempting actual Flip\n"); + //res=(*pFlip)(lpdds, lpddssrc, dwflags); + res=(*pFlip)(lpdds, lpddssrc, 0); + if(res){ + OutTraceE("Flip: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + return res; + } + if(dxw.dwFlags1 & EMULATESURFACE) dxw.ScreenRefresh(); + return DD_OK; + } + if (!IsPrim){ if(lpddssrc){ res=(*pFlip)(lpdds, lpddssrc, dwflags); @@ -4616,9 +4784,19 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR if (IsBack) { OutTraceDW("GetSurfaceDesc: fixing BACKBUFFER surface\n"); IsFixed=TRUE; - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // you never know.... - lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) lpddsd->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; + //lpddsd->ddsCaps.dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // you never know.... + //lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way + //if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) lpddsd->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; + + //if(!(dxw.dwFlags6 & FLIPEMULATION)){ + // lpddsd->ddsCaps.dwCaps |= (DDSCAPS_3DDEVICE); // you never know.... + // lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_COMPLEX|DDSCAPS_FLIP); // backbuffer surfaces can't be this way + //} + // try ... + lpddsd->ddsCaps.dwCaps |= (DDSCAPS_3DDEVICE|DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN|DDSCAPS_COMPLEX|DDSCAPS_FLIP); // backbuffer surfaces can't be this way + + } if (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 9e50140..8ee69a2 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.03.32" +#define VERSION "2.03.33" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index bea27dca8f71d2a128f2219d680575e6edfad9ee..96403ea484cf2b4509356a69225b7384fb342e5d 100644 GIT binary patch delta 23990 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 DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt); DDX_Check(pDX, IDC_FORCESHEL, cTarget->m_ForcesHEL); + DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); + DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef); // Ddraw tweaks DDX_Check(pDX, IDC_NOSYSMEMPRIMARY, cTarget->m_NoSysMemPrimary); diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp index b4e7da7..6158799 100644 --- a/host/TabDirectX.cpp +++ b/host/TabDirectX.cpp @@ -40,9 +40,8 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NOPALETTEUPDATE, cTarget->m_NoPaletteUpdate); DDX_Check(pDX, IDC_NOPIXELFORMAT, cTarget->m_NoPixelFormat); DDX_Check(pDX, IDC_NOALPHACHANNEL, cTarget->m_NoAlphaChannel); - DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); - DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef); DDX_Check(pDX, IDC_NOFLIPEMULATION, cTarget->m_NoFlipEmulation); + DDX_Check(pDX, IDC_FLIPEMULATION, cTarget->m_FlipEmulation); DDX_Check(pDX, IDC_FULLRECTBLT, cTarget->m_FullRectBlt); DDX_Check(pDX, IDC_CENTERTOWIN, cTarget->m_CenterToWin); DDX_Check(pDX, IDC_SETCOMPATIBILITY, cTarget->m_SetCompatibility); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 00ce1d7..c2dca3f 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -28,6 +28,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_MouseVisibility = 0; m_HookDI = FALSE; m_ModifyMouse = TRUE; // default true !! + m_LogEnabled = FALSE; m_OutProxyTrace = FALSE; m_OutDebug = FALSE; m_RegistryOp = FALSE; @@ -37,6 +38,10 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_OutD3DTrace = FALSE; m_OutDDRAWTrace = FALSE; m_OutDebugString = FALSE; + m_EraseLogFile = FALSE; + m_AddTimeStamp = FALSE; + m_ImportTable = FALSE; + m_TraceHooks = FALSE; m_DXProxed = FALSE; //m_HandleDC = FALSE; m_HandleExceptions = FALSE; @@ -124,6 +129,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_KeepCursorFixed = FALSE; m_UseRGB565 = TRUE; // seems the default for 16bit video mode m_SuppressDXErrors = FALSE; + m_FlipEmulation = FALSE; m_MarkBlit = FALSE; m_MarkLock = FALSE; m_NoSysMemPrimary = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 43d4058..c0e3bd6 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -97,6 +97,7 @@ public: BOOL m_KeepCursorFixed; BOOL m_UseRGB565; BOOL m_SuppressDXErrors; + BOOL m_FlipEmulation; BOOL m_MarkBlit; BOOL m_MarkLock; BOOL m_NoSysMemPrimary; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 7790ac030b8f7e1fa0012d7171fa3534cac1264d..9d095d46e8237c76b3d32ff2cfb8d830bd6008c9 100644 GIT binary patch delta 3585 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 delta 3623 zcmY*a3s93+7Cz^OhX{*c36CTYUZNt4c>oEh)tCf~gd`;4p+%#DsEBVX)^63ZqIAZ! z)T>dHcc027~8H&b=v9FE?xHAKXwzC3FrU5 z^PO|Qd+yDjD<37D_%La}k@L-31|2nRj=e2gJKFY`LI!ilYzpn#+0Ms0AHc?!cHGN3 z5Nhx`T(v8}Y_eF4kdNSUgd9${Gw4((6BH?s z9~sZpS|UlmZAHlM3L2nMSf>IlT{;6dqa&i{H`v;yg(647oni5!5MJ798SM% zXEeb=CFf{u@i@q*LYiR_^2grD!Uwr8SDmvs>VuYQYEXR$k2E%Z`;D9>OBIce zChb+GVl|n-9^vi})M_$=LtzvjJ{w&V<(^ngmEh!GLa(*^Xqp4R~)VkcxP>ajs@XEPb%@yEA?zybN27V_`gC2hLa<;}BmC7M5 zwJBRRTfxT{>9eu%_*>cN=iBt!iU0x)fR5Df^3;V~o?0(d84Pq1!6^x+-|zJ+88bBT z*Yw$}8TqzrTGoPm;F=a&d3wGMSMc(DEw1Ft^YbhZO|5Tr1!cL>0ButecDK{!m$y+S zjj)QJ$=9h?Bk+-dtVGF~A;dq<&sD7vk;-$Xta1_VIU%ve=`@(?3$<&-g@9 zHhT=Y>myzH{;1yL4LTzQm2dzdWb*|=W=F{G^#uK1cL0pg$JZ3=@i0GFoR3HNS$gj0 zW5qgrB7C!W(1sWJ!<}{U%F8u8)_Isk9_4$Mhc>+ugUY)87K5@j-;P0=?y(s3b@#Fu z6xgyb20gdsuTd24->OC)?48L^ZF`N|d((N#_7;9)dr4G+$>E$Gbr?ewgdf>CQxzpx z0QuD|dEwU|{%@?TCw!yl*D<@n=fbDp_Z{}YGj z_`5?zxG8*h=!c|m$}{JuY3L@`y8I1ZkKOI1pCO}>er6Z~LK465{K9;f!yXDc{q&Wx z1)VXX>K{d)zVHCQ)sz%Yc;RFmCiBxHx%B_vY1!fTN1BrPdme4L_tkRxwFqCB{6{JS z5JRcBT*l8+ai@%}Gq7C7{u#JB5oqMS&??f?@PWZJoGue7X;>(uAreP}X}A@M7#&Z? zbxdaFWZ-cbU(LV?42nOfF@#N{IhkmW!*|3g4bI28!kCJd^`SS1#lP(Av& z246!qIXU{Q4qucHBAAC?h@~c+DSUc-5FZ4Ch|4l;7urI6 zD1I1PAw~3*;Ud*RSR#4~u`%%j7=}7x|5S!X(Vvg0;_X6o$d%HHFct9$p)bZj;z`&K zNpM-*wPTJrUX0~fD}E>@!?}uKk?+T8sy^7OxD}UjaGE$ei<;%v(o?w}6H+)d!*OuY z;K=;Tv#<)+i`%nscH$1$04eaY_)ROdHfd=?X(d$TF2O=teOn36p8hMUbSRah!zK6` z6D4{~O-Y2GLmzZTI-Z`3d4r`?cT=wT_FUR}m6i-FEXAEd)6AxeC0dLVua@HVg!?9j z=Hc6;UzB0LULMMBH+op8R*bvx7;}b1uz}A1Q}Ahh$t1c$A~yUJab2?C zsZoS7F{k96=>QWsNUO%v=V@gihO{3C15it|`Dd}HT2C!~Wulp)>f=fj2db#$z&t}Pc8-=;<_wZQ!l=iCAvlw7aK`r=p+}uR#DYS?3b-5o?Jn!k66{v z3fj&}*;Z;CE5)GHl&vEFt8h{LoD6_saj%oxl#qM%B72E~PEFel+WZS2|waf9^i)+O=1to!&XZRY*^$qzphH5(~; z?Q5}8#w&4RA4SzWY9_X2vPg%wO2i*!a@-4u6jNsZb zajc8!#C{i>8Bcc*GQ=;sn3-NB6mrGQE|$p-xx}|rNQa=_O#42%oa*ZtjdwGRH>IA5 z3leQ7#CE&Ip3TxwgBX idWmT2rj6ff5qo5EVH*>lv{7<|lB$U{Oq^NEa{dR;(kV*- diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 6355d10f705de47c82af260dd07fc11103d714e6..6df0913de0af8cee6b84d3ab2f5f942ad205d709 100644 GIT binary patch delta 322 zcmYk0ze@sf7{=e@dmR~;>DmvZq9JbZ&O7g<4EqnNxu8jIbk3nfqbTw&pWzn8l;%tB zqP39PBxtjsuq7I7D5A!?Y-xChhnMH`eA+ePvMw}Rn@l1FweGx|JLg$~RC{TfOW||N zWg2OJA$S+W$My-+DT(@53itV!K#U|3{gV+kG*}fL&jn{dq6EqPlIQNUcuq#Oo3foT zE`qE54vUliJB40#uw0B{rnriBZjq@J^J)j*Tv(zQ#rs&r2Z@wGJ|o%bU5n2i`rCqL}8-c-Gfh1s0JZ2EsyM%&5X>Nhc3O#iFOXg}!|&*U!+ zOIQsV3>XY1e{8dze53INry+w8gAN0boGh4OKIuHiWV1z+CU2-`o4nxesha!azdZkWSjo9$$$FfCLidJ;WtGx$&A4QWYXrS3Dfw2UIrR_!*H|8 Wf(ML~Po0&UF6Y3=wfWiNTW_G(@L diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index e911037f2a2b7d3ec40252b82bce0b7ec381ef9e..16f5ebc350af350a6c69efee920ba77d33dde71a 100644 GIT binary patch delta 6898 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 Wf>`vVv{Sg+Crh11{9EkXmi^zHUyRfM diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index e41c5e5..8b70dd8 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -326,6 +326,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_KeepCursorFixed) t->flags2 |= KEEPCURSORFIXED; if(dlg->m_UseRGB565) t->flags |= USERGB565; if(dlg->m_SuppressDXErrors) t->flags |= SUPPRESSDXERRORS; + if(dlg->m_FlipEmulation) t->flags6 |= FLIPEMULATION; if(dlg->m_MarkBlit) t->flags3 |= MARKBLIT; if(dlg->m_MarkLock) t->flags3 |= MARKLOCK; if(dlg->m_NoSysMemPrimary) t->flags6 |= NOSYSMEMPRIMARY; @@ -554,6 +555,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_KeepCursorFixed = t->flags2 & KEEPCURSORFIXED ? 1 : 0; dlg->m_UseRGB565 = t->flags & USERGB565 ? 1 : 0; dlg->m_SuppressDXErrors = t->flags & SUPPRESSDXERRORS ? 1 : 0; + dlg->m_FlipEmulation = t->flags6 & FLIPEMULATION ? 1 : 0; dlg->m_MarkBlit = t->flags3 & MARKBLIT ? 1 : 0; dlg->m_MarkLock = t->flags3 & MARKLOCK ? 1 : 0; dlg->m_NoSysMemPrimary = t->flags6 & NOSYSMEMPRIMARY ? 1 : 0; diff --git a/host/resource b/host/resource index 7dd19c1e4069248a7a66072eef81dc2e669c3514..2a40edef46b6b30fceec8ce233d98d07aea4d1f7 100644 GIT binary patch delta 34 pcmaDflWE^9rVXFcCV${#nS9E_WU>Gw%j63{T*NN3`BT~lRR9iZ4yFJA delta 14 Wcmdlti|Nr!rVXFcHv6T2Pz3-ukq2D>