From c4c0b5877fd07b4afc1c4e85d89ba8cac61bd57a Mon Sep 17 00:00:00 2001 From: gho tik Date: Mon, 9 Mar 2015 12:41:22 -0400 Subject: [PATCH] v2_03_35_src Former-commit-id: 6cd1f5b22c8dc6e2e54a29d755c7b74f422e1cd2 --- Include/dxwnd.h | 2 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/exports/Age of Empires II.dxw | 8 +- build/exports/Avernum demo.dxw | 31 ++++ build/exports/Banzai Bug.dxw | 31 ++++ build/exports/Cydonia.dxw | 31 ++++ build/exports/Diablo MP demo.dxw | 31 ++++ build/exports/Grand Prix World.dxw | 2 +- build/exports/Gruntz.dxw | 2 + build/exports/H.E.D.Z..dxw | 2 + build/exports/Homeworld.dxw | 11 +- build/exports/House of the Dead 2.dxw | 2 +- build/exports/Hoyle Casino Empire.dxw | 9 +- build/exports/Hydro Thunder.dxw | 9 +- build/exports/Incoming (GOG).dxw | 5 +- .../Legacy of Kain Soul Reaver (GOG).dxw | 11 +- .../Lords of Magic Special Edition.dxw | 3 + build/exports/The Sting!.dxw | 31 ++++ build/readme-relnotes.txt | 13 +- dll/ddraw.cpp | 172 +++++++++++++----- dll/dxhelper.cpp | 16 ++ dll/dxhelper.h | 1 + dll/dxhook.cpp | 4 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 413184 -> 473088 bytes dll/gdi32.cpp | 5 +- dll/gdiblt.cpp | 10 +- host/TabDirect3D.cpp | 1 + host/TabSysLibs.cpp | 1 + host/TargetDlg.cpp | 2 + host/TargetDlg.h | 2 + host/dxwndhost.aps | Bin 158928 -> 159312 bytes host/dxwndhost.rc | Bin 102592 -> 103126 bytes host/dxwndhost.vs2008.suo | Bin 261632 -> 270848 bytes host/dxwndhostView.cpp | 4 + host/host.aps | Bin 47496 -> 47496 bytes host/resource | Bin 36158 -> 36342 bytes 38 files changed, 384 insertions(+), 78 deletions(-) create mode 100644 build/exports/Avernum demo.dxw create mode 100644 build/exports/Banzai Bug.dxw create mode 100644 build/exports/Cydonia.dxw create mode 100644 build/exports/Diablo MP demo.dxw create mode 100644 build/exports/The Sting!.dxw diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 9e44332..52b2ac6 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -198,6 +198,8 @@ #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 +#define SETZBUFFERBITDEPTHS 0x00020000 // when not set, set the legacy dwZBufferBitDepths field in the directdraw capability from GetCaps() +#define SHAREDDC 0x00040000 // enable sharing window DC and primary surface DC // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 0984c50..5ba6e8d 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c01c7fd1f64f802d8807161a3d3e61c674473cb75ea1ce1b888b42c325af145d -size 581632 +oid sha256:7974a9d6ece70e47422cce4c82daa4d31131c217d89aa967ad23993ba7a3268c +size 583680 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 46ba3e7..134653c 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36da51e4bf39269c8ad561b1573553024b8de8be9072da196c89e32955a2ffb8 -size 541696 +oid sha256:cd704d7423b954daf34806d31bb047aa8d606752a5fa6cd1f9f602b668c5e5f3 +size 542208 diff --git a/build/exports/Age of Empires II.dxw b/build/exports/Age of Empires II.dxw index 13d078c..875af95 100644 --- a/build/exports/Age of Empires II.dxw +++ b/build/exports/Age of Empires II.dxw @@ -6,10 +6,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134217762 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -25,3 +25,7 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +notes0= +flagj0=128 +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Avernum demo.dxw b/build/exports/Avernum demo.dxw new file mode 100644 index 0000000..7006bfc --- /dev/null +++ b/build/exports/Avernum demo.dxw @@ -0,0 +1,31 @@ +[target] +title0=Avernum demo +path0=D:\Games\Avernum Demo\Avernum.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1745879040 +flagh0=16 +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=1200 +sizy0=900 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Banzai Bug.dxw b/build/exports/Banzai Bug.dxw new file mode 100644 index 0000000..c840edc --- /dev/null +++ b/build/exports/Banzai Bug.dxw @@ -0,0 +1,31 @@ +[target] +title0=Banzai Bug +path0=D:\Games\Banzai Bug\EXE\RELEASE.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=1 +coord0=0 +flag0=685899810 +flagg0=1207959680 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=131072 +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/Cydonia.dxw b/build/exports/Cydonia.dxw new file mode 100644 index 0000000..fee7f4b --- /dev/null +++ b/build/exports/Cydonia.dxw @@ -0,0 +1,31 @@ +[target] +title0=Cydonia +path0=D:\Games\Cydonia\cydonia.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138543108 +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/Diablo MP demo.dxw b/build/exports/Diablo MP demo.dxw new file mode 100644 index 0000000..1668e12 --- /dev/null +++ b/build/exports/Diablo MP demo.dxw @@ -0,0 +1,31 @@ +[target] +title0=Diablo MP demo +path0=D:\Games\Diablo MP demo\diablo_s.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136331298 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4225 +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/Grand Prix World.dxw b/build/exports/Grand Prix World.dxw index f96743d..9174eb4 100644 --- a/build/exports/Grand Prix World.dxw +++ b/build/exports/Grand Prix World.dxw @@ -27,5 +27,5 @@ winver0=0 maxres0=0 notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 diff --git a/build/exports/Gruntz.dxw b/build/exports/Gruntz.dxw index 1c4872b..1d98e7a 100644 --- a/build/exports/Gruntz.dxw +++ b/build/exports/Gruntz.dxw @@ -27,3 +27,5 @@ maxres0=-1 launchpath0= notes0= flagj0=128 +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/H.E.D.Z..dxw b/build/exports/H.E.D.Z..dxw index f0c91a8..097c877 100644 --- a/build/exports/H.E.D.Z..dxw +++ b/build/exports/H.E.D.Z..dxw @@ -27,3 +27,5 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Homeworld.dxw b/build/exports/Homeworld.dxw index c889303..e1e9261 100644 --- a/build/exports/Homeworld.dxw +++ b/build/exports/Homeworld.dxw @@ -5,11 +5,11 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=704667680 +flag0=704667682 flagg0=1208090896 flagh0=20 -flagi0=4 -tflag0=64 +flagi0=4194308 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -24,3 +24,8 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/House of the Dead 2.dxw b/build/exports/House of the Dead 2.dxw index 7fdf9f6..c022a51 100644 --- a/build/exports/House of the Dead 2.dxw +++ b/build/exports/House of the Dead 2.dxw @@ -27,5 +27,5 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 diff --git a/build/exports/Hoyle Casino Empire.dxw b/build/exports/Hoyle Casino Empire.dxw index d8254c1..292b4a8 100644 --- a/build/exports/Hoyle Casino Empire.dxw +++ b/build/exports/Hoyle Casino Empire.dxw @@ -6,12 +6,12 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134217762 +flag0=142606370 flagg0=1242562560 flagh0=20 -flagi0=138413060 +flagi0=205520900 flagj0=4224 -tflag0=6151 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -26,3 +26,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +notes0= +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Hydro Thunder.dxw b/build/exports/Hydro Thunder.dxw index 3210cd5..d952464 100644 --- a/build/exports/Hydro Thunder.dxw +++ b/build/exports/Hydro Thunder.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=704643104 +flag0=704643106 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,8 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Incoming (GOG).dxw b/build/exports/Incoming (GOG).dxw index 04531e5..95bf614 100644 --- a/build/exports/Incoming (GOG).dxw +++ b/build/exports/Incoming (GOG).dxw @@ -9,7 +9,7 @@ flag0=134217762 flagg0=1207959552 flagh0=20 flagi0=4194308 -tflag0=1024 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -26,3 +26,6 @@ winver0=0 maxres0=-1 launchpath0= flagj0=128 +notes0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Legacy of Kain Soul Reaver (GOG).dxw b/build/exports/Legacy of Kain Soul Reaver (GOG).dxw index ad09e92..6696bc1 100644 --- a/build/exports/Legacy of Kain Soul Reaver (GOG).dxw +++ b/build/exports/Legacy of Kain Soul Reaver (GOG).dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=7 coord0=0 -flag0=671088672 -flagg0=134217728 +flag0=671088674 +flagg0=1207959552 flagh0=20 -flagi0=1028 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,8 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Lords of Magic Special Edition.dxw b/build/exports/Lords of Magic Special Edition.dxw index 7ebbfc7..e7fdd9c 100644 --- a/build/exports/Lords of Magic Special Edition.dxw +++ b/build/exports/Lords of Magic Special Edition.dxw @@ -26,3 +26,6 @@ launchpath0= flagj0=128 winver0=0 maxres0=0 +notes0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/The Sting!.dxw b/build/exports/The Sting!.dxw new file mode 100644 index 0000000..f9f251d --- /dev/null +++ b/build/exports/The Sting!.dxw @@ -0,0 +1,31 @@ +[target] +title0=The Sting! +path0=D:\Games\sting\Sting.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=16 +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 4aa99c8..2fc8c67 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -876,4 +876,15 @@ fix: protections for GDI ReleaseDC operations against null window or DC v2.03.34: fix: handling of real primary/backbuffer surfaces in non-emulated modes and WinXP: now uses system memory if possible, video memory otherwise. fix: simulation of backbuffer attach in non emulated modes. -fix: mciSendString hooker, was losing a final command line argument \ No newline at end of file +fix: mciSendString hooker, was losing a final command line argument + +v2.03.35: +add: added "Set ZBufferBitDepths capability" flag to set a no longer supported fields in the capability structure. This makes ""Banzai Bug" bypass the capability checks. +fix: better handling of surface capabilities in flippable mode +fix: fixed bug in primary surface handling when already created ... +add: added ""Share ddraw and GDI DC" flag: sharing was introduced in release v2.03.19, but proved to be incompatible in many situations. Now it is off by default and enabled when necessary. +fix: the flags for disabling DDSCAPS_SYSTEMMEMORY capability are now used also in non-emulated flipping emulation mode. Depending on the video card, it may help getting compatibility. +fix: handling of NULL DC in non emulated modes: the NULL DC (corresponding to the whole desktop) is replaced by the window DC. This reduces problems like clearing the whole desktop. +fix: EnumDisplayModes was returning wrong modes list in SVGA mode. +fix: applied the error suppression to the DeleteAttachedSurface hooker. +fix: hooked User32 CreateRectRegion/Indirect calls. \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 1d7f5c9..65265e1 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1472,8 +1472,8 @@ static void HandleCapsD(char *sLabel, LPDDCAPS c) c->dwFXCaps, ExplainDDFXCaps(c->dwFXCaps), c->dwFXAlphaCaps, ExplainDDFXALPHACaps(c->dwFXAlphaCaps), c->dwCKeyCaps, ExplainDDCKeyCaps(c->dwCKeyCaps)); - OutTraceDDRAW("GetCaps(%s): VidMemTotal=%x VidMemFree=%x\n", - sLabel, c->dwVidMemTotal, c->dwVidMemFree); + OutTraceDDRAW("GetCaps(%s): VidMemTotal=%x VidMemFree=%x ZBufferBitDepths=%x(%s)\n", + sLabel, c->dwVidMemTotal, c->dwVidMemFree, c->dwZBufferBitDepths, ExplainZBufferBitDepths(c->dwZBufferBitDepths)); if(dxw.dwFlags2 & LIMITRESOURCES){ // check for memory value overflow const DWORD dwMaxMem = 0x70000000; if(c->dwVidMemTotal > dwMaxMem) c->dwVidMemTotal = dwMaxMem; @@ -1485,7 +1485,20 @@ static void HandleCapsD(char *sLabel, LPDDCAPS c) c->dwVidMemTotal = dwHugeMem; c->dwVidMemFree = dwHugeMem; } - if((dxw.dwFlags5 & STRESSRESOURCES) || (dxw.dwFlags5 & STRESSRESOURCES)) + if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS){ + // From MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/gg426101%28v=vs.85%29.aspx : + // dwZBufferBitDepths + // DDBD_8, DDBD_16, DDBD_24, or DDBD_32. (Indicate 8, 16, 24, or 32 bits per pixel.) + // This member is obsolete for DirectX 6.0 and later. + // Use the IDirect3D7::EnumZBufferFormats to retrieve information about supported depth buffer formats. + // v2.03.35: needed to bypass the "Banzai Bug" initial controls + if (c->dwZBufferBitDepths == 0) { + c->dwZBufferBitDepths = (DDBD_8|DDBD_16|DDBD_24|DDBD_32); + OutTraceDDRAW("GetCaps(%s): FIXED ZBufferBitDepths=%x(%s)\n", + sLabel, c->dwZBufferBitDepths, ExplainZBufferBitDepths(c->dwZBufferBitDepths)); + } + } + if((dxw.dwFlags5 & STRESSRESOURCES) || (dxw.dwFlags2 & LIMITRESOURCES)) OutTraceDDRAW("GetCaps(%s): FIXED VidMemTotal=%x VidMemFree=%x\n", sLabel, c->dwVidMemTotal, c->dwVidMemFree); } @@ -2182,30 +2195,25 @@ static void ClearSurfaceDesc(void *ddsd, int dxversion) ((LPDDSURFACEDESC)ddsd)->dwSize = size; } -static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion) +static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, int dxversion) { HRESULT res; DDSURFACEDESC2 ddsd; - OutTraceDW("DEBUG: BuildRealSurfaces: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + OutTraceDW("DEBUG: BuildRealSurfaces: lpdd=%x pCreateSurface=%x version=%d\n", lpdd, pCreateSurface, dxversion); if(lpDDSEmu_Prim==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS; // try DDSCAPS_SYSTEMMEMORY first, then suppress it if not supported - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_SYSTEMMEMORY; + // no, DDSCAPS_SYSTEMMEMORY cause screen flickering while moving the window (and other troubles?) + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); - if(res==DDERR_INCOMPATIBLEPRIMARY) { - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__)); - res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); - } if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ OutTraceDW("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); if(dxw.Windowize){ - // in Winowize mode, the desktop properties are untouched, then the current primary surface can be recycled + // in Windowize mode, the desktop properties are untouched, then the current primary surface can be recycled res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); - (*pReleaseS)(lpDDSEmu_Prim); } else { // in non-Windowized mode, the primary surface must be released and rebuilt with the proper properties @@ -2231,8 +2239,7 @@ static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurfa if(lpDDSEmu_Back==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - //ddsd.ddsCaps.dwCaps = dwBackBufferCaps; - ddsd.ddsCaps.dwCaps = dwBackBufferCaps|DDSCAPS_SYSTEMMEMORY; + ddsd.ddsCaps.dwCaps = dwBackBufferCaps; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); if(dxw.dwFlags4 & BILINEAR2XFILTER){ @@ -2310,11 +2317,11 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf // 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.dwFlags6 & SHAREDDC) bFlippedDC = TRUE; if(dxw.dwFlags5 & GDIMODE) return DD_OK; - BuildRealSurfaces(lpdd, pCreateSurface, lpddsd, dxversion); + BuildRealSurfaces(lpdd, pCreateSurface, dxversion); return DD_OK; } @@ -2343,8 +2350,10 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea 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); + ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM|DDSCAPS_FRONTBUFFER); + ddsd.ddsCaps.dwCaps |= (DDSCAPS_COMPLEX|DDSCAPS_FLIP|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; // dwWidth & dwHeight ddsd.dwWidth = dxw.GetScreenWidth(); @@ -2367,12 +2376,15 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea // set a global capability value for surfaces that have to blit to primary 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.dwFlags6 & SHAREDDC) bFlippedDC = TRUE; if(dxw.dwFlags5 & GDIMODE) return DD_OK; - BuildRealSurfaces(lpdd, pCreateSurface, lpddsd, dxversion); + BuildRealSurfaces(lpdd, pCreateSurface, dxversion); return DD_OK; } @@ -2488,6 +2500,7 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC HRESULT res; OutTraceDW("DEBUG: BuildBackBufferFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + //MessageBox(NULL, "BuildBackBufferFlippable", "DxWnd", MB_OK); // create BackBuffer surface memcpy(&ddsd, lpddsd, lpddsd->dwSize); @@ -2495,8 +2508,8 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC 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.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FRONTBUFFER|DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); @@ -2675,6 +2688,57 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf return DD_OK; } +static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) +{ + DDSURFACEDESC2 ddsd; + HRESULT res; + + OutTraceDW("DEBUG: BuildGenericFlippable: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion); + memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... + FixSurfaceCaps(&ddsd, dxversion); + + if(dxw.dwFlags6 & POWER2WIDTH){ // v2.03.28: POWER2WIDTH to fix "Midtown Madness" in surface emulation mode + if(((ddsd.dwFlags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && + (ddsd.ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN) + ){ + DWORD dwWidth; + dwWidth = ((ddsd.dwWidth + 3) >> 2) << 2; + if(dwWidth != ddsd.dwWidth) OutTraceDW("CreateSurface: fixed surface width %d->%d\n", ddsd.dwWidth, dwWidth); + ddsd.dwWidth = dwWidth; + } + } + + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); + if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res!=DD_OK)){ + OutTraceDW("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); + } + if (res) { + OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + OutTraceDW("CreateSurface: CREATED lpddsd=%x version=%d %s\n", + *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 + if(lpDDP && (ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8)){ + res=(*pSetPalette)(*lplpdds, lpDDP); + if(res) + OutTraceE("SetPalette: ERROR on lpdds=%x(Emu_Generic) res=%x(%s) at %d\n", *lplpdds, res, ExplainDDError(res), __LINE__); + else + OutTraceDW("CreateSurface: applied lpddp=%x to lpdds=%x\n", lpDDP, *lplpdds); + } + + // diagnostic hooks .... + HookDDSurfaceGeneric(lplpdds, dxversion); + + return DD_OK; +} + static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) { HRESULT res; @@ -2743,7 +2807,8 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate BuildPrimary = BuildPrimaryFlippable; BuildBackBuffer = BuildBackBufferFlippable; AttachBackBuffer = AttachBackBufferFlippable; - BuildGeneric = BuildGenericEmu; + BuildGeneric = BuildGenericFlippable; + //BuildGeneric = BuildGenericEmu; break; case PRIMARY_EMULATED: BuildPrimary = BuildPrimaryEmu; @@ -2974,10 +3039,16 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet lpBackBuffer = dxwss.GetBackBufferSurface(); if(lpBackBuffer){ *lplpddas = lpBackBuffer; - OutTraceDW("GetAttachedSurface(%d): SIMULATE attached to PRIM=%x\n", dxversion, lpdds); + OutTraceDW("GetAttachedSurface(%d): SIMULATE BACKBUF attach to PRIM=%x\n", dxversion, lpdds); return DD_OK; } } + // arguable utility .... + if ((IsPrim || IsBack) && lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ + *lplpddas = lpDDZBuffer; + OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x\n", dxversion, IsPrim?"PRIM":"BACK", lpdds); + return DD_OK; + } OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); } else { @@ -3350,18 +3421,6 @@ 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); @@ -3822,8 +3881,10 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED } else{ // since it can't scale, at least the updated rect is centered into the window. - (*pGetClientRect)(dxw.GethWnd(), &client); - (*pClientToScreen)(dxw.GethWnd(), &upleft); + HWND hwnd; + hwnd = dxw.GethWnd(); + (*pGetClientRect)(hwnd, &client); + (*pClientToScreen)(hwnd, &upleft); if (!lprect) lprect=&client; OffsetRect(lprect, upleft.x+(client.right-dxw.GetScreenWidth())/2, @@ -4009,6 +4070,8 @@ ReleaseDC with Unlock, returning the surface memory ptr (???) as HDC and avoiding the consistency check performed by surface::GetDC (why should it bother if the screen is 32BPP and the surface is not??? */ +// to do: double extGetDC/ReleaseDC in Emu/Dir mode ? + HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) { HRESULT res; @@ -4016,6 +4079,14 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":""); + + // In non-emulated mode, better return the window DC rather than the actual primary surfce DC, + // because that would refer to the whole desktop + if (!(dxw.dwFlags1 & EMULATESURFACE) && IsPrim) { + *pHDC = (*pGDIGetDC)(dxw.GethWnd()); + return DD_OK; + } + res=(*pGetDC)(lpdds, pHDC); if (res==DDERR_CANTCREATEDC && @@ -4069,7 +4140,8 @@ HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW lpdd) // res=(*pFlipToGDISurface)(lpdd); // if (res) OutTraceE("FlipToGDISurface: ERROR res=%x(%s), skipping\n", res, ExplainDDError(res)); // pretend you flipped anyway.... - bFlippedDC = TRUE; + + if(dxw.dwFlags6 & SHAREDDC) bFlippedDC = TRUE; return DD_OK; } @@ -4189,15 +4261,6 @@ HRESULT WINAPI myEnumModesFilterDirect(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l if (IsDebug) EnumModesCallbackDumper(lpDDSurfaceDesc, NULL); - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - // if PREVENTMAXIMIZE is set, don't let the caller know about forbidden screen settings. - if((lpDDSurfaceDesc->dwHeight > dxw.GetScreenHeight()) || - (lpDDSurfaceDesc->dwWidth > dxw.GetScreenWidth())){ - OutTraceDW("EnumDisplayModes: skipping screen size=(%d,%d)\n", lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->dwWidth); - return DDENUMRET_OK; - } - } - // tricky part: for each color depth related to current video resolution, fake each of the // supported resolutions, unless is greater than maximum allowed @@ -4207,6 +4270,14 @@ HRESULT WINAPI myEnumModesFilterDirect(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l lpDDSurfaceDesc->dwHeight=SupportedRes[ResIdx].h; lpDDSurfaceDesc->dwWidth=SupportedRes[ResIdx].w; if((dxw.dwFlags4 & LIMITSCREENRES) && CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; + if (dxw.dwFlags1 & PREVENTMAXIMIZE){ + // if PREVENTMAXIMIZE is set, don't let the caller know about forbidden screen settings. + if((lpDDSurfaceDesc->dwHeight > dxw.GetScreenHeight()) || + (lpDDSurfaceDesc->dwWidth > dxw.GetScreenWidth())){ + OutTraceDW("EnumDisplayModes: skipping screen size=(%d,%d)\n", lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->dwWidth); + return DDENUMRET_OK; + } + } res=(*((NewContext_Type *)lpContext)->lpCallback)(lpDDSurfaceDesc, ((NewContext_Type *)lpContext)->lpContext); OutTraceDW("EnumDisplayModes(D): proposed size[%d]=(%d,%d) res=%x\n", ResIdx, SupportedRes[ResIdx].w, SupportedRes[ResIdx].h, res); if(res==DDENUMRET_CANCEL) break; @@ -4564,6 +4635,7 @@ HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflag OutTraceDW("DeleteAttachedSurface: emulating surface detach lpdds=%x\n", lpddsdel); res = DD_OK; } + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } @@ -4982,7 +5054,7 @@ HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX lpCallback, LPVOID lp ret=(*pDirectDrawEnumerateEx)(lpCallback, lpContext, dwFlags); } if(ret) OutTraceE("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) ret=0; + if(dxw.dwFlags1 & SUPPRESSDXERRORS) ret=DD_OK; return ret; } diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index 96942d3..2ee318d 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -1622,6 +1622,22 @@ char *ExplainRegionType(DWORD c) return "unknown"; } +char *ExplainZBufferBitDepths(DWORD c) +{ + static char eb[128]; + unsigned int l; + strcpy(eb,"DDBD_"); + if(c & DDBD_8) strcat(eb, "8+"); + if(c & DDBD_16) strcat(eb, "16+"); + if(c & DDBD_24) strcat(eb, "24+"); + if(c & DDBD_32) strcat(eb, "32+"); + l=strlen(eb); + if (l>strlen("DDBD_")) eb[l-1]=0; // delete last '+' if any + else strcpy(eb,"NULL"); + return(eb); +} + + #define _FACD3D 0x876 #define MAKE_D3DHRESULT( code ) MAKE_HRESULT( 1, _FACD3D, code ) #define MAKE_D3DSTATUS( code ) MAKE_HRESULT( 0, _FACD3D, code ) diff --git a/dll/dxhelper.h b/dll/dxhelper.h index c1912fb..7eadb97 100644 --- a/dll/dxhelper.h +++ b/dll/dxhelper.h @@ -53,3 +53,4 @@ extern char *ExplainChangeDisplaySettingsFlags(DWORD); extern char *ExplainDICooperativeFlags(DWORD); extern char *ExplainRegionType(DWORD); extern char *ExplainPixelFormat(LPDDPIXELFORMAT); +extern char *ExplainZBufferBitDepths(DWORD); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index dae3f23..fc41b93 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -108,8 +108,8 @@ static char *Flag6Names[32]={ "FORCESWAPEFFECT", "LEGACYALLOC", "NODESTROYWINDOW", "NOMOVIES", "SUPPRESSRELEASE", "FIXMOVIESCOLOR", "WOW64REGISTRY", "DISABLEMAXWINMODE", "FIXPITCH", "POWER2WIDTH", "HIDETASKBAR", "ACTIVATEAPP", - "NOSYSMEMPRIMARY", "NOSYSMEMBACKBUF", "", "", - "", "", "", "", + "NOSYSMEMPRIMARY", "NOSYSMEMBACKBUF", "CONFIRMONCLOSE", "TERMINATEONCLOSE", + "FLIPEMULATION", "SETZBUFFERBITDEPTHS", "SHAREDDC", "", "", "", "", "", "", "", "", "", "", "", "", "", diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 3a96404..13a79bd 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.34" +#define VERSION "2.03.35" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 5293e82a6edce4091e6429275ffc5be5f46c3c0c..8423cf11188b41543d7da60fb2a30c5b72530c1e 100644 GIT binary patch delta 31725 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�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 DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef); + DDX_Check(pDX, IDC_SETZBUFFERBITDEPTHS, cTarget->m_SetZBufferBitDepths); // Ddraw tweaks DDX_Check(pDX, IDC_NOSYSMEMPRIMARY, cTarget->m_NoSysMemPrimary); diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp index 0b658ba..6e561a6 100644 --- a/host/TabSysLibs.cpp +++ b/host/TabSysLibs.cpp @@ -31,6 +31,7 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_CLIENTREMAPPING, cTarget->m_ClientRemapping); DDX_Radio(pDX, IDC_GDINONE, cTarget->m_DCEmulationMode); DDX_Check(pDX, IDC_FIXTEXTOUT, cTarget->m_FixTextOut); + DDX_Check(pDX, IDC_SHAREDDC, cTarget->m_SharedDC); // OpenGL DDX_Check(pDX, IDC_HOOKOPENGL, cTarget->m_HookOpenGL); // duplicated diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index c2dca3f..9c71c72 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -56,6 +56,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NoImagehlp = FALSE; m_ReplacePrivOps = FALSE; m_ForcesHEL = FALSE; + m_SetZBufferBitDepths = FALSE; m_ForcesSwapEffect = FALSE; m_ColorFix = FALSE; m_NoPixelFormat = FALSE; @@ -120,6 +121,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_CursorClipping = FALSE; m_VideoToSystemMem = FALSE; m_FixTextOut = FALSE; + m_SharedDC = TRUE; // seems better ..... m_HookGlide = FALSE; m_RemapMCI = TRUE; m_NoMovies = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index c0e3bd6..cb61681 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -88,6 +88,7 @@ public: BOOL m_CursorClipping; BOOL m_VideoToSystemMem; BOOL m_FixTextOut; + BOOL m_SharedDC; BOOL m_HookGlide; BOOL m_RemapMCI; BOOL m_NoMovies; @@ -181,6 +182,7 @@ public: BOOL m_DisableMaxWinMode; BOOL m_NoImagehlp; BOOL m_ForcesHEL; + BOOL m_SetZBufferBitDepths; BOOL m_ForcesSwapEffect; BOOL m_ColorFix; BOOL m_NoPixelFormat; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 9d095d46e8237c76b3d32ff2cfb8d830bd6008c9..851b00fe9ade565949f52c68331ca587ebc697fa 100644 GIT binary patch delta 3729 zcmaJ@3viQF7Cz@DO$&6~ihU+&n?86|D0%deK6s>g(9kpqN%|BC*t9|^PfIBkr6N$& z%Iks`9d{8QtFt>JU86GVxURMMSO-U33o65)GVF}I&MbA-Wp)_Y?zw-^CbK&`ndIK{ zec$=+`Om%i|Nq=q)6QL*cF2GW4i^+@jS&Ws>XnZEmW`2>ede&y61J3wd$;Z=@CV+vf$7xvUBb5!?=YIOq(u*EP9Z&On_zU0aln71L78|f|3|EwVKrkcgL{X%UMk@KL*6DXEnnD1#EUZTRgsHw4|=m zS_!2J7_tQ$!VPYZM^<93f`$AMT>%>Tb7Q$^;-k6@yIIlI`+N=IV8|8-NnuqvSmI%y zUqLINOhIXtuv|?6tDu~hp2@@tZq#RJD-{7XV_Ep;3$Yr_U`0N7COx}Kp_QWiwx*zL znAKPg)qLbkuC69V25fENfHN41_0wv!LM`%%Gns4=^0fCea54WupKe*Ah-DSwkh{?t z^tc_)fV4B2VX4A7T3fshs#5_iU_<`U`&n4W{ka)A_Nh8(sisDy5K|R6_@|_C^6%fz zS?W?WermN(>5A2ChGjAAc0;XZ3)Cx!QitD0=R`RuR&zPH`L*0aT+UB?ki`#tkctg7 zD?*PFU#7T`U;CgCz5HaJR_jwtTyBpu+~W2+e6q7vOBwi)dq33T3O)1WW4~^?^CBM_4$9s9HL5HjOazkEaI5EG~9g^uLBdks!>>j5r zAP=M@O|XWaFz8kHA@GqyS;-Q!KnK5M$W=uM`{qz~ip0vH6ZzNYb5&gg797r0gq3hV zZ!6HN))MABoW&0oXxKXB-52z#Zi03l&Xl=k6Rbym>Vgh?_(Xx8Z9x751si!up}u`n zLTN!;v(w`aDs`JHU~>ZLY_-!}LEbi`X(en)VBOy3PW#WS6}Ix{3ibE^|3jf()l0>M zk7V$PFEnf$@|$1ey82?tAzNLz(dJexEf&~5g*MZ##Uvah6JWa0;Zq0d2H`TVW?ZS(K6W&=l)&*99e4W`u|NCq-Fo7xFv5%D_Q> zvnZQAg53R;zI6AL-s=lFV+rN(C_>og4~8v{u-)ek1$-X5Wx`{8b#XpE&IgMP_yj*m z^I<+(tj8y#my4G!i5emy#uhK&eO)e1>>eE*?b^p~&*lA^hu6IkAI|UoJU+}?|9yO@ z?HP>^|It$)9|kwn#)mI&_)}aM-M_Ive&J~LmU@im`?s1HKQ=QBpX671AH7RHCK4YY z-}1<|IdK^*i2Sn+dC{?L8chEm50oo>tnb1c#mC(maJuZiCU1!DPdn5S3phhf0k5~o z;~@$L`0?%Y;=FMndU5-&(Ak6sxuQZA#75JxKU3B-`rFI4oJvCXR6Ln^sdHSjr-$6DxdHO{? zzA7gol!t$dasGUKMI$kLdP>eOU-6!wx> zS?<|+nDvjTN@F#ky?gN-mP zCcfH;M^m4MXJHr`W5^ya&QE$CUZK{#;YBBH%juh5WH|j}OEz|+wc ztl&;uAkN>%iju}U0FH}WG{r$t(82OGix&WlckzL)Jk34?upSlN9jp+qiYFy|s|#Sy z)8aLPl3%0)HaV#llWSRqnCM_?RjL|Az6x_hT7;tPBoue6DWVs5wQ8;gMNJY#eu~(L zMl?rQ9#hW{eKg{PI2K{~s^h6BemjFi=SYM>18iw zc~Y^7xBQN_*54?uORv@-ia)NPY-1N?54VeoE<)$tgW_Ntp?*SD;}q4j%k`vYaHV)k zYSxD7y6(kAnz`u!t0Uru1YhY#@r&)KO;S#582jZB=9(PoO+h*$KHhF$WBr{s7uAl{TY zuLqgX1xPg^RmPCGE?HxX$m}6@yoHIHX6e{N?9MjPOeoX0i$2NruVUismBfw^tFm@5 JabgY2`47b&Kr{dV delta 3537 zcmZ`*3s98T6+Y*#tS>}Og@t|c5-cL@gU64W$ignNvh2U?Lr~FGK}1DFMMR@TBQGB_ zRj+!HrkOZSTRUwN+HJ%!Hj+*>PN&V#H1Sm%n>y2`(U~|M$EIl_z4zZ$;&hgo<(~6> z-~G2NJYhp=#OTs#pd#YjLp!(h*#aki+SA2Am3Hg$xC< zI~+=GgG?oN)_L8sFQO@c*$UU&yhunCQ@|3i(XscE%moU?xBZNh%oZpdN1ts( zGFzbtY0Z^c$;Aq-EYfQa`bEPeb0J7{{}qF_BtrV^%R)YF#G zMC(FD`wS7wMpPph$t4STv~aN!4LJ?N2poS3W<#&J_^TEoN9nN4PXZ|B|X#twx}Wj%g+e#s+JsHqD?~%dsuT zk|znQ5E_sUT{oy2IXHAIi5^W;r>=X>S@c}&QE```i3>kDrlI*a)MP!<1vm7h8R^O! z2HZerrt8T@q-SpEa1*Uc*JBH9PS-Eo{G6Y-P;QrBS*^7QTAw4Gb>&WPz$JS`HES_! zp(E)AY@?rWv#s>M+~kHe|7m>*`xIPCIx zgGxzTA?)Oxy`{sk z0)6zgOcVCgcQRA)Aic}uLv$=tkB7th*`b=i3})dWEab z=d37~gPs6?0_>vq+jY}@&Op%T@dVv&PVt`MjstXHN0v6$PeK6cXp1rY?;UESnw_I` zdgq*!SlZ5TP3MnEO!{1S=F7zxlO74L-SbB5*$-$=S5C}j{!1(~n}248f6_G^yU5IN z=lAY~}f!AWw)$~sHf|wf!QcF*4b|vlYDL2My-6oO=V`FrPY3Nu_PRtVXXnAjJ zHjno8W=Ahbes2oJfkc|OX+}&piN^P3$7D-rb>CCBFMAD?^%n zre7D$F7j;Yv+O@SJNYb=`i=CXXW34kedplQdFOfNJE)7fnzC@;!6Q?!n816a!&E%8{x6A9S4!Z5ibIW43 zS%DxRObwqpyE=tVlXYSLZ}Q6D>c(^(`yd&UhA-*xA`*b%P6NIn0yf8lpR;$gs2|Qt z#b2wY0Y9&OUHFJ6DY!Hk8HJ`XrD4 zQ+se9JD-d**eMSN2p2r?V2&7*Wjql-5!S*HD2`0MAY*RabZCRU?4L5<%GlVj*^30H z48mcMBbtRZ%Ix9h8hi;)$vB0LB%_+0_hC_=Gtj}# z@OMx3{ak>7CVIZfsP0C9bCiAFNYc^Ermf@bNE5)r0oruh$h_;w1Ts2y@(^lSn}{V9 z>sUvOD#rw5V-qli4RKTzh(k7A&9hOVxf92(3ypaSvinmwI-`k9Ks`%rA|};)Q;~JW zbI{8{RcZpVKPT|4jc24YiFGs)W7-}q@@e*&;t*#L#-ai1=mfyg<(_ z<9k}c(NT`70?U!TEwUNSTmvguQZv_lwi4Og5Wc9MGYjCaYuRoA&e@6V`<Rl1#REL*VPA2OTsqFQ8#sCGEVBF`36k&g=nz}ZLGtRmY_}i>KID!5 zQ~rUuY{;SiLfs;B;wGW&E{|9=YkWl~vrrO?a1E zc$cs7EWes(4|zt+)$Fm*)_YjeWUb?mDjtlhA>kDN%%IboI|1p365A@5?s?eIAf<_kKc>b zF~ffv3)>_pFkvPyN>wETQ$Bw#yV{D--G#bPz0Qp2O}VkKP!|nsBIRQxk)Wn0EHYaP nxv`KKxNi}mhEvG+JL^bzFClTN%ujAMVE*0ot+>~j6P3X)9M?=5 delta 117 zcmcb%lbRio6 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 16f5ebc350af350a6c69efee920ba77d33dde71a..52635b60e5f66b14e67b5caef870e564c1690269 100644 GIT binary patch delta 6730 zcmb7I3tW{|w*S`Nhr{9N5fBgwKAs{1A|N6@La#b%=`i>#Ne^a*jwwDWw2TAe%)P&E zn(`G38#Snl@GXUowI39-rxP*-`(f;KYM-u zy}tciYwz`K=bdiO-S#yZJ^VCH1A-^nHBFGveeLjG7M8Y^y$UUz@Pz1QZyR`P+WCVZ zsn``HTAs0t1skbros^8?)HK6ovluu1)>t}-XnDc9Ucdkxu0xNOVF6a*H;7bicxbfj zYh-V;v{VL-lY^;YYB`LMLdYbI{eQ^|`>x}1C-ZaZc{w5E9-baGz2$D`Z6W+M<5u_Q zz|yiT?2@GB8WW(8u_jXQ#yTUlLamhkE48UD???U(#8RzgdGvCyj;F%%6)m@V1`dRt zEq=fGdv1WXj2i43iS-C64E8f_wI;X3{eGA9j;Q@VV#8sU32D#?n>LE3bP#ppAhsoT zQ>)eDdG*K}C)Uo62zbWdTUDpA|IK*lSX&mpeY3C(;Vx<4@bqatv_Z021hU#~@$=*t z{MS4SmvYj#uq?Ws(Pfj#SWziLTPn65nV4*l%FBd$0#Elu%3mQg5MCp^M8I+ZyWxPD zDdE%Dx*W*IT{fwQR!9N|A!0kBd;eQYP(&Yg@2clLN8P zln4Sh{YfU)os}-rIR@gODV3>Q$VR7Igki%^(qR@o2s2+@Nw5(72;4b_P02h@ zK|V4+cjM=^WeY{j_1%Fhzo)$@7Ezb1S`_^0A7P=1kciEx?l9pMV$d%_QdAN{pl?J5b^2-gWW z2sa5o5pEG~6Ydc15;_Q-1o9w94OxQgoQy5zzyNRf|u^-zw^Ujw~c1MLAAF!0m5rT36Gur=b9_ zxK`S*V;_WJj1Czdg;&7shc&+!8RlXgRs*^|q|&0NX<)&^nD zM463i<_eqnTr$)E9$X}2jjhk?IHUmr(YXz%(N;JEcr~4-byfpx1j9Zt8?(1VWYb^C z=G*%Kb#H!-S-&010W(IE^@p`V9y$;3yYGTK0Jo2YESQXqAIPM89Ia7@aC8ln(J&Kf z3yC+}#j$2{8x#VHV>FKq36O1;?18O-i5WDg$Q^J5aMNC{dLOuhjGD#_T;LY5xMr}h znE4+)q zdcd5q)c4|bL{`+35l!fT?Lkqr%i{6GMbMzzCZ*0xMF)8npKk!B`PP zzLb_Pte&|j@cPn(F=DYF?#(3E(5KU;`pI}P#4MU1ToSVeiolf91o(TF(waAO>EdNMc+er^vDhK)m^oeChtBE3$zvk7pDuLNCkTI;G`r9&Diy8( z%o;2Xy zb(6(XJX$S6&6+=m=SCUZ8%b>$sTEHWh2E3mL8my=_K6U7oIO}%)9xi2FnhmICEaM()fw-GwsW^DdbBztJ8XZ^8!pZE~Q7{j9mBDqYMIqr;T>xm;)LyX6R%lC_V z)N`mH?4*d5n3xL@Z%4?ZGF(sy1B4Df-3b9g!{Nsu+zhkGD}dRj#X&57jZDU~j5&A2 z9Z?q~X|4jL!;XQaw1BUUlfn2xj2za~OG-oZn~k-dVgWY1E@ScXx1>A7Dt{17i82Cn z;$#*&UIYs|0%QYTi4tU>adHpf?m<%b*ne4H=nd078w9#XO5L+1V74xs@o+jhP-LN; zXGfSWGDQD;!~VMnbJsXI%-?j=&PnT7BNIJqRFE&*y?hVivreH#VOo9Tl^Dzm5M#=gd(^Vpi05{*Ib7m-?t0~?nuRk@jC|UGE=MwJK zV(IRNS4u>rkyW9a^JmGu(6&;#Y%q&=zbdMD=SF$I>0Bk97A&cUIJEbHXmkE-`4Sj` zgJLkIg0|-oZ>5=OFUe>d)>exmbftk4N2CCm{|4#s&mF*?lIPuyEZeIONhJab!2kr+v<&X*3wt@D7MeE5O z&ZpBnd#B)-bYpD}WT0yu?IiZQU^O$EAdvs3enX#h^92%g zgkq^_bPQ55cCL*w?|dLF0xR4i#(TWR9hYZ-H~2K~b4EK&?9jUuCR%7Wkpw?N5W!0D zC)fyq1P&#GRUSflD4`oa^Ow}xisahOv3|K)o|eyjnkYW^H?Fs)Q6C2wjWJ2qCDg?V zPyel7QWsCs=S^!el@@rkt*3~a(Z%I@MrB<}uRQ5_CEzp_ckr0-{z4g5b(kb7)c6DM zD1pDPP7}Jgvn10en08BX@sxi`;M7TAy(oTQfs!BPEanodiVIa7mv>WK6y-DvI4VYF z){R#i-_HlDrL{-H$GmFTyh;}L;0~zwH18*prj7C}5<1_NiT@+;%$&H$md>qF3*1Rh zDxm+<1g3MY<^byZ^ZSPYmnC-Q*0a|~LWmZz1PkBna1=3g39B)hX zKN>Hrl>Hus?pehp5Vt~cs}y%1ajO-Fip$5-Z_D_q2KC5QH7b=R#Sx|bS#fVD zj{Ezj;`lm&$HnQNio2jVw#$o3zOC|M#C0k?Ke}9?cdPha&8lu1{Jo^dpkqkp#^@%< z(?~qYHl^2Faa`9Zl6iciee}|l-Vz^fsp4KzoKEk&Z22|)Q+m^f+^iJeS6m{MyA*fQ zhdZUXtBT`#u3_0zqE}TqZF)R0tTC8mHnX9MD)W9? zm*RN9JFQ;h(mqsV5|RHS*BuQ;7#2g#iHXy<`&<$U|(Nwg0$$KXBrVaoY# zjh}S_-N((QOw-~N$?F+UGN)w4^&>e&ap^u>U&UqnaQzjRPr2`YeJCBGEG^G{x4>u^ z8-W#1(lWA4a}@T-N|lXN}# zDBV9$dhF3pIPD%>WagA8`#6=Hjr+E%e95t5^aj-i|CiJ zMc4g|WyJf{=YAdtmgu10dx2>C-@;~#({|`1em5YDI>mho@f^Vev}|tx7fLfXzw2Pl z^8|2y%SlgqA|5MG`mC<_Zjd*=TTI1IdynNzDt2_eoy$jfkUvqp?v$|qYC6U}-^Y8M zkWV4{|8W;+(p}&zk-+b+SI)z`zy{?!?<1P1xexb+ z;=WQ`Z_+!dxOT;{51&)qHN~+HUsqg#*YYDhK0HX7{xmO1gKoSb!>ibBOBL1SqU^RT zb1GA1Y(C{A=TW{`aqOW_lFXh}>BFrjnZ0(a5BFD+*=yfd9DD7@{uEWP+a6G)PVy|0 zIq@Yin*mqOm&Kg;ikvw{uv)$l#p%TH^*JY9aap+HrW_d0>g=q!sVXMZe}TTMC=AYbQ~li4a|CXW!{Dz89OiyQ P=;}6yzZ?c%@^JqR;G-XW delta 2887 zcmcImeQ;C95r2F8kmV1IQG_r;2w`lh64?kLgfSG1NeETJ;~Gkvgqg~QP#~^x4as02 z%(KHJ83r8VN3`HE9%G0|2}2Dcx&%@x7}_Cx#Zlct2&KXWCX)e5GZ`jB9n*c{+x(gx;8V2(}V)N{3+hg&g5k}|GwYy&w)D+jCl)>CoxU_uX#g0Kl)wvzlAs}^!r0M zfO;az+^r+GMn{J}|zKJcm{+8n@s$7b0+Oicsgbr%V#ckwy z8=AX11l7$07hQfE#_64Hb+T>;1VPux8Fh9YHmNm?h~E3&l~KRuPA$_araGnphQ*-O zMqfYw+tJ&WS`Y6R>NEoZCpR5B~_9 z(pe6D6RFw_KaM%6aqryY&3oN}HMj~)ex^hFXgyisp!goN$V-0$H_*o0kfq;g$au8wLr4N8qhOPs zGtdiEn})XVr^b#SLo%Hzcd~6xH#p?nOYGkI<^~H)(68+poidYZ2ZWpWlFhR6G#muF zz7$;)`Ui}cp^`z3-=%bROG^J%I*hq z>@w(?)E?yF#X>P!#&1BWiCXi)Nyi&mlNk-dDVO)d4!$ZKtguo(xD8;Y)~)O#p_}NJ zH5sA^D6|}>Qy^EAlJ+mdmTw`6)E8y!H|L65K$azfX9pmeNlh`xmu+^j48r;1)$kyL zktLFudgx83er~o+?#~yCAQBLQy!nttStVj+#39V|Y6*M6(pwzhp`W0a%BG3q6c6wn zmj*;GmCX??q~#gAjT5`m=wzW7M(5^>@sT27mWes6Ww=r#BE>?;M5QrWCK9dHEIwT% z)AuEo@p%umoGUs9(Y^U1sM}s2MHQEj?_bU+7bj6BmK(;3fXLTFyKP1Un5cBEXw{nz zvI{R1kY-?+LrY#1qsSFu0Bws|Y3)U!(U=IQf@V9qW$9uOPnU_cyq6vyo-MOA@iqHI zF;$~`XHG&XK+GYm~W((3@W-R_J-FP z3!6j|_9d$5VEG^8sgf!%O?D(M$HVi$zSk-h!GgOn^_1anPz6z1x) zhEI9uzQH~b8zB=WEJE@YKm}Dev5D$^VEw>~m(cn+Ya0KLTTDg9x7UfhX}J*`S~@zY zP6L(tPq6*L0KOH=KrM%2b_~+R`NBg7f|wB*iHvRlF998~sve5BG8kGTuc(-c-P9Qa zlQdPLol_n&TnjL%2mS4`y&5+OJ<(~Cwh~;KLybXvnyNxLT%HW#j5Kn+gf;Zc7)}z& z1%mb1%{V5va`gD>uoPkoadsBHYey$h2%mp=b+KJoU|jl8c!3(LaEcL(`LwtS_fq|D zSaN$e=26Zm%+ibMTr$vvXE-!Q8o0OOeuymN_&cLxfGT!_?V(5)Zs(-28d;EtkE4dHW|Oi?S*dI=be^eeV=XH-C>xaZTzI|8v&uwe7FY1uN3elH9v$r zy?mEVYJWscP(?FeQD`fgA`wP1Z-wy4IhWZl^}5&Wk;9l7z9UQ}-&1y#CuKMVDSsTW zUYV1!zl<&Ov0Z+pP?r84<0ifOs8Ri(y!y)NpTgYB_(X>XuPqKgT51 zYh0I$2au~-S&5N>uHXSGy@J2s?BV{OR|LiX#=iaiFN6Vrxpd+yETp=#kin{%$>Ik0 z2W9GU_W#|S0#vJNi`>LC>dOa>%Fe<<*?SvrWyrj19FF1pIG4S`c%8~M_c06T&AT{N i_o|uZ$LWP1xL%%6scRlTD|$4r%WA92&y1G4X#WpEI-6Di diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 8b70dd8..a3dce89 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -286,6 +286,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_DisableMaxWinMode) t->flags6 |= DISABLEMAXWINMODE; if(dlg->m_NoImagehlp) t->flags5 |= NOIMAGEHLP; if(dlg->m_ForcesHEL) t->flags3 |= FORCESHEL; + if(dlg->m_SetZBufferBitDepths) t->flags6 |= SETZBUFFERBITDEPTHS; if(dlg->m_ForcesSwapEffect) t->flags6 |= FORCESWAPEFFECT; if(dlg->m_ColorFix) t->flags3 |= COLORFIX; if(dlg->m_NoPixelFormat) t->flags3 |= NOPIXELFORMAT; @@ -317,6 +318,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_CursorClipping) t->flags |= CLIPCURSOR; if(dlg->m_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY; if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT; + if(dlg->m_SharedDC) t->flags6 |= SHAREDDC; if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE; if(dlg->m_RemapMCI) t->flags5 |= REMAPMCI; if(dlg->m_NoMovies) t->flags6 |= NOMOVIES; @@ -498,6 +500,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_DisableMaxWinMode = t->flags6 & DISABLEMAXWINMODE ? 1 : 0; dlg->m_NoImagehlp = t->flags5 & NOIMAGEHLP ? 1 : 0; dlg->m_ForcesHEL = t->flags3 & FORCESHEL ? 1 : 0; + dlg->m_SetZBufferBitDepths = t->flags6 & SETZBUFFERBITDEPTHS ? 1 : 0; dlg->m_ForcesSwapEffect = t->flags6 & FORCESWAPEFFECT ? 1 : 0; dlg->m_ColorFix = t->flags3 & COLORFIX ? 1 : 0; dlg->m_NoPixelFormat = t->flags3 & NOPIXELFORMAT ? 1 : 0; @@ -546,6 +549,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_CursorClipping = t->flags & CLIPCURSOR ? 1 : 0; dlg->m_VideoToSystemMem = t->flags & SWITCHVIDEOMEMORY ? 1 : 0; dlg->m_FixTextOut = t->flags & FIXTEXTOUT ? 1 : 0; + dlg->m_SharedDC = t->flags6 & SHAREDDC ? 1 : 0; dlg->m_HookGlide = t->flags4 & HOOKGLIDE ? 1 : 0; dlg->m_RemapMCI = t->flags5 & REMAPMCI ? 1 : 0; dlg->m_NoMovies = t->flags6 & NOMOVIES ? 1 : 0; diff --git a/host/host.aps b/host/host.aps index b6d78306c7ef52a545a0c66dbefb15325b0c07b8..b5dc05d1bf4130bb13f93229dd6012476dd27a68 100644 GIT binary patch delta 318 zcmeD9%+&FjX+k)=v1xosQKiYoxCQ-;DU<*AF9(y;C)-Wr1G73eUz>QB1;{)w*Kab@ zbY&>3WV#}h^#slenV|#~J30d3ps$({kRRrZX&V$K(nWqL7%bX8lO_&c;6Sx2-a}3V1UI@~curMD;URbyq Vs`Jz$RUqrbq7n#y^XA1@MFC*gkY)e? delta 318 zcmeD9%+&FjX+k)=k#T%UQKjL=xCQ-;E|dTFF9(y;C)-Wr1G73eUz>QB1;{)w*Kab@ zbY&>3WV#}h^#slenV|#~J30d3ps$({kRRrZX&V$K(nWqL7%bX8lO_&c;6Sx2-a}3V1UI@~curMD;URbyq Vs`Jz$RUqrbq7n#y^XA1@MF9t}j9>r& diff --git a/host/resource b/host/resource index 2a40edef46b6b30fceec8ce233d98d07aea4d1f7..b362f0572c77100631f84839ff5afbae8fafc194 100644 GIT binary patch delta 98 zcmdlti|N~JrVW1SlRxmWCF?Fkff0kQ*tw8vyecG1Zf r7+DxiCkJv%gLLr+Gk7pK0#&*KRk<)YPZmtp1