diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 1356ba6..2a3b826 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6bba6804bdeb0de0f1ff7e02150e77f737c1f1bcbab40e6b192d48a7ab00451 -size 462848 +oid sha256:d99c6a80bd9c8ad4d82a995f662236e7a452ad2317a55eda538c7d2ea4ed3bb6 +size 463872 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 6b38169..91aeb61 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -3458,7 +3458,7 @@ coord138=0 flag138=679493664 flagg138=1208025088 flagh138=65556 -flagi138=4 +flagi138=67596 tflag138=6403 initx138=0 inity138=0 @@ -3471,7 +3471,7 @@ posy138=50 sizx138=800 sizy138=600 maxfps138=0 -initts138=-2 +initts138=0 winver138=0 maxres138=-1 title139=New York Race @@ -3630,11 +3630,11 @@ module145= opengllib145= ver145=1 coord145=0 -flag145=134234146 +flag145=134234274 flagg145=134283520 flagh145=20 flagi145=12 -tflag145=5249 +tflag145=6163 initx145=0 inity145=0 minx145=0 @@ -3646,7 +3646,7 @@ posy145=50 sizx145=800 sizy145=600 maxfps145=0 -initts145=2 +initts145=0 winver145=0 maxres145=-1 title146=Total Soccer 2000 (3DFX) @@ -3699,8 +3699,233 @@ maxfps147=0 initts147=0 winver147=0 maxres147=-1 +title148=Titan Quest +path148=D:\Games\Titan Quest\Titan Quest.exe +module148= +opengllib148= +ver148=9 +coord148=2 +flag148=134218272 +flagg148=134217728 +flagh148=20 +flagi148=1026 +tflag148=6147 +initx148=0 +inity148=0 +minx148=0 +miny148=0 +maxx148=0 +maxy148=0 +posx148=50 +posy148=50 +sizx148=800 +sizy148=600 +maxfps148=0 +initts148=0 +winver148=4 +maxres148=-1 +title149=Titan Quest Immortal Throne +path149=D:\Games\Titan Quest Immortal Throne\Tqit.exe +module149= +opengllib149= +ver149=9 +coord149=0 +flag149=134218272 +flagg149=1207959552 +flagh149=20 +flagi149=4 +tflag149=0 +initx149=0 +inity149=0 +minx149=0 +miny149=0 +maxx149=0 +maxy149=0 +posx149=50 +posy149=50 +sizx149=800 +sizy149=600 +maxfps149=0 +initts149=0 +winver149=0 +maxres149=-1 +title150=Darius Gaiden +path150=D:\Games\Darius_gaiden\DARIUS.EXE +module150= +opengllib150= +ver150=0 +coord150=0 +flag150=671089184 +flagg150=1207959552 +flagh150=20 +flagi150=4 +tflag150=0 +initx150=0 +inity150=0 +minx150=0 +miny150=0 +maxx150=0 +maxy150=0 +posx150=50 +posy150=50 +sizx150=800 +sizy150=600 +maxfps150=0 +initts150=2 +winver150=0 +maxres150=-1 +title151=Dark Colony +path151=D:\Games\DarkColony\DCOLONY\DC.EXE +module151= +opengllib151= +ver151=0 +coord151=0 +flag151=136315424 +flagg151=1207959552 +flagh151=20 +flagi151=4 +tflag151=0 +initx151=0 +inity151=0 +minx151=0 +miny151=0 +maxx151=0 +maxy151=0 +posx151=50 +posy151=50 +sizx151=800 +sizy151=600 +maxfps151=0 +initts151=0 +winver151=0 +maxres151=-1 +title152=Dark Reign 2 +path152=D:\Games\Dr2\dr2.exe +module152= +opengllib152= +ver152=0 +coord152=0 +flag152=671088672 +flagg152=1207959552 +flagh152=20 +flagi152=4 +tflag152=0 +initx152=0 +inity152=0 +minx152=0 +miny152=0 +maxx152=0 +maxy152=0 +posx152=50 +posy152=50 +sizx152=800 +sizy152=600 +maxfps152=0 +initts152=0 +winver152=0 +maxres152=-1 +title153=Dark Planet: Battle for Natrolis +path153=D:\Games\DarkPlanet\Dark.exe +module153= +opengllib153= +ver153=0 +coord153=0 +flag153=671088673 +flagg153=1208025088 +flagh153=20 +flagi153=12 +tflag153=0 +initx153=0 +inity153=0 +minx153=0 +miny153=0 +maxx153=0 +maxy153=0 +posx153=50 +posy153=50 +sizx153=800 +sizy153=600 +maxfps153=0 +initts153=0 +winver153=0 +maxres153=-1 +title154=Geneforge +path154=D:\Games\Geneforge\Geneforge.exe +module154= +opengllib154= +ver154=0 +coord154=0 +flag154=134234660 +flagg154=1207959680 +flagh154=20 +flagi154=131076 +tflag154=0 +initx154=0 +inity154=0 +minx154=0 +miny154=0 +maxx154=0 +maxy154=0 +posx154=50 +posy154=50 +sizx154=800 +sizy154=600 +maxfps154=0 +initts154=0 +winver154=0 +maxres154=-1 +title155=Geneforge (GOG) +path155=D:\Games\GOG.com\Geneforge\Geneforge\Geneforge.exe +module155= +opengllib155= +ver155=0 +coord155=0 +flag155=134234656 +flagg155=1208025088 +flagh155=20 +flagi155=12 +tflag155=0 +initx155=0 +inity155=0 +minx155=0 +miny155=0 +maxx155=0 +maxy155=0 +posx155=50 +posy155=50 +sizx155=800 +sizy155=600 +maxfps155=0 +initts155=-8 +winver155=0 +maxres155=-1 +title156=Jumpgate Classic +path156=D:\Games\Jumpgate\Jumpgate\jumpgate.exe +module156= +opengllib156= +ver156=0 +coord156=0 +flag156=134218272 +flagg156=1207959568 +flagh156=84 +flagi156=2 +tflag156=0 +initx156=0 +inity156=0 +minx156=0 +miny156=0 +maxx156=0 +maxy156=0 +posx156=50 +posy156=50 +sizx156=1200 +sizy156=900 +maxfps156=0 +initts156=0 +winver156=0 +maxres156=-1 [window] -posx=1010 -posy=145 +posx=963 +posy=147 sizx=638 sizy=618 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 3511506..9bff007 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -406,4 +406,11 @@ fixed ZBUFFER surface creation to handle GOG Incoming troubles on some cards fixed handling of special effects (wireframe, no fogging, zbuffer always) to be valid on all d3d versions v2.02.61 -added directx "Compensate Flip emulation" flag: used primarily to get rid of mouse artifacts due to emulated Flip rpocedure in windowed mode. Fixes Gruntz issues and some other games... \ No newline at end of file +added directx "Compensate Flip emulation" flag: used primarily to get rid of mouse artifacts due to emulated Flip rpocedure in windowed mode. Fixes Gruntz issues and some other games... + +v2.02.62 +fixed d3d7 CreateDevice hook and d3d7 rendering options (wireframe, disablefogging, zbufferalways) +fixed doublebuffer emulation - avoid returning the backbuffer when zbuffer is requested. Fixes rendering problems of many games! + + + diff --git a/d3d9proxy/proxydll.vs2008.suo b/d3d9proxy/proxydll.vs2008.suo index a237713..99172ba 100644 Binary files a/d3d9proxy/proxydll.vs2008.suo and b/d3d9proxy/proxydll.vs2008.suo differ diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 6109910..8e3172b 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2820,11 +2820,15 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet // 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 lpDDSBack surface can't be returned. - if (IsBack && (DDSD_Prim.dwBackBufferCount > 1)){ + if (IsBack && (DDSD_Prim.dwBackBufferCount > 1) && (lpddsc->dwCaps & DDSCAPS_BACKBUFFER)){ + //if (IsBack && (DDSD_Prim.dwBackBufferCount > 1)){ *lplpddas = lpDDSBack; - OutTraceDW("GetAttachedSurface(%d): DOUBLEBUFFER attached=%x\n", dxversion, *lplpddas); - return 0; + OutTraceDW("GetAttachedSurface(%d): DOUBLEBUFFER attached to BACK=%x\n", dxversion, *lplpddas); + return DD_OK; } // on primary surface return the lpDDSBack surface coming from either an explicit @@ -2834,7 +2838,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet if (lpDDSBack) { *lplpddas = lpDDSBack; OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); - return 0; + return DD_OK; } else { *lplpddas = NULL; @@ -2842,7 +2846,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet return DDERR_NOTFOUND; } } - + // proxy the call... res=(*pGetAttachedSurface)(lpdds, lpddsc, lplpddas); diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index 90b8119..a2bbba1 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -1662,3 +1662,20 @@ char *ExplainD3DRenderState(DWORD c) } return p; } + +char *ExplainRenderstateValue(DWORD Value) +{ + char *p; + switch(Value){ + case D3DCMP_NEVER : p="D3DCMP_NEVER"; break; + case D3DCMP_LESS : p="D3DCMP_LESS"; break; + case D3DCMP_EQUAL : p="D3DCMP_EQUAL"; break; + case D3DCMP_LESSEQUAL : p="D3DCMP_LESSEQUAL"; break; + case D3DCMP_GREATER : p="D3DCMP_GREATER"; break; + case D3DCMP_NOTEQUAL : p="D3DCMP_NOTEQUAL"; break; + case D3DCMP_GREATEREQUAL : p="D3DCMP_GREATEREQUAL"; break; + case D3DCMP_ALWAYS : p="D3DCMP_ALWAYS"; break; + default : p="???"; break; + } + return p; +} \ No newline at end of file diff --git a/dll/dxhelper.h b/dll/dxhelper.h index 1ef6d57..a9a3e8d 100644 --- a/dll/dxhelper.h +++ b/dll/dxhelper.h @@ -46,4 +46,5 @@ extern char *ExplainPeekRemoveMsg(DWORD); extern char *ExplainGetDCExFlags(DWORD); extern char *ExplainPaletteUse(UINT); extern char *ExplainRasterCaps(DWORD); -extern char *ExplainD3DRenderState(DWORD); \ No newline at end of file +extern char *ExplainD3DRenderState(DWORD); +extern char *ExplainRenderstateValue(DWORD); diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index e290c46..c0206be 100644 Binary files a/dll/dxwnd.aps and b/dll/dxwnd.aps differ diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 880edbd..c47f643 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.61" +#define VERSION "2.02.62" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 78dec33..0fa4906 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 66b4e2a..ab09fc1 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -7,6 +7,7 @@ #include "dxwnd.h" #include "dxwcore.hpp" #include "dxhook.h" +#include "dxhelper.h" #include "syslibs.h" #define HOOKD3D10ANDLATER 1 @@ -496,6 +497,7 @@ void HookD3DDevice8(void** ppD3Ddev8) if(dxw.dwFlags4 & DISABLEFOGGING) (*pSetRenderState)((void *)*ppD3Ddev8, D3DRS_FOGENABLE, FALSE); if(dxw.dwFlags4 & ZBUFFERALWAYS) (*pSetRenderState)((void *)*ppD3Ddev8, D3DRS_ZFUNC, D3DCMP_ALWAYS); //if(1) (*pSetRenderState)((void *)*ppD3Ddev8, D3DRS_SPECULARENABLE, TRUE); + //if(1) (*pSetRenderState)((void *)*ppD3Ddev8, D3DRS_ZFUNC, D3DCMP_LESSEQUAL); } //if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; //SetHook((void *)(**(DWORD **)ppD3Ddev8 + 4), extAddRef8, (void **)&pAddRef8, "AddRef(D8)"); @@ -529,6 +531,7 @@ void HookD3DDevice9(void** ppD3Ddev9) if(dxw.dwFlags4 & DISABLEFOGGING) (*pSetRenderState)((void *)*ppD3Ddev9, D3DRS_FOGENABLE, FALSE); if(dxw.dwFlags4 & ZBUFFERALWAYS) (*pSetRenderState)((void *)*ppD3Ddev9, D3DRS_ZFUNC, D3DCMP_ALWAYS); //if(1) (*pSetRenderState)((void *)*ppD3Ddev9, D3DRS_SPECULARENABLE, TRUE); + //if(1) (*pSetRenderState)((void *)*ppD3Ddev9, D3DRS_ZFUNC, D3DCMP_LESSEQUAL); } if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; SetHook((void *)(**(DWORD **)ppD3Ddev9 + 4), extAddRef9, (void **)&pAddRef9, "AddRef(D9)"); @@ -960,14 +963,25 @@ extern char *ExplainRenderstateValue(DWORD Value); HRESULT WINAPI extSetRenderState(void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value) { + HRESULT res; + OutTraceD3D("SetRenderState: d3dd=%x State=%x(%s) Value=%x\n", pd3dd, State, ExplainD3DRenderState(State), Value); + if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRS_ZFUNC)) { OutTraceD3D("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(Value)); Value = D3DCMP_ALWAYS; } - if((dxw.dwFlags2 & WIREFRAME) && (State == D3DRS_FILLMODE)) Value=D3DFILL_WIREFRAME; - if((dxw.dwFlags4 & DISABLEFOGGING) && (State == D3DRS_FOGENABLE)) Value=FALSE; - //if(1 && (State == D3DRS_SPECULARENABLE)) Value=TRUE; - return (*pSetRenderState)(pd3dd, State, Value); + if((dxw.dwFlags2 & WIREFRAME) && (State == D3DRS_FILLMODE)){ + OutTraceD3D("SetRenderState: FIXED State=FILLMODE Value=%x->D3DFILL_WIREFRAME\n", Value); + Value = D3DFILL_WIREFRAME; + } + if((dxw.dwFlags4 & DISABLEFOGGING) && (State == D3DRS_FOGENABLE)){ + OutTraceD3D("SetRenderState: FIXED State=FOGENABLE Value=%x->FALSE\n", Value); + Value = FALSE; + } + + res=(*pSetRenderState)(pd3dd, State, Value); + if(res) OutTraceE("SetRenderState: res=%x(%s)\n", res, ExplainDDError(res)); + return res; } HRESULT WINAPI extGetRenderState(void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value) diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 4223947..44026ec 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -77,11 +77,14 @@ AddViewport3_Type pAddViewport3 = NULL; Scene3_Type pBeginScene1 = NULL; Scene3_Type pBeginScene2 = NULL; Scene3_Type pBeginScene3 = NULL; +Scene3_Type pBeginScene7 = NULL; Scene3_Type pEndScene1 = NULL; Scene3_Type pEndScene2 = NULL; Scene3_Type pEndScene3 = NULL; +Scene3_Type pEndScene7 = NULL; SetRenderState3_Type pSetRenderState2 = NULL; SetRenderState3_Type pSetRenderState3 = NULL; +SetRenderState3_Type pSetRenderState7 = NULL; GetViewport7_Type pGetViewport7 = NULL; SetViewport7_Type pSetViewport7 = NULL; SetLightState_Type pSetLightState3 = NULL; @@ -148,14 +151,17 @@ HRESULT WINAPI extQueryInterfaceD3(void *, REFIID, LPVOID *); HRESULT WINAPI extD3DInitialize(void *, LPDIRECT3D , LPGUID, LPD3DDEVICEDESC); HRESULT WINAPI extD3DGetCaps(void *, LPD3DDEVICEDESC ,LPD3DDEVICEDESC); -HRESULT WINAPI extSetRenderState2(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extBeginScene1(void *); HRESULT WINAPI extEndScene1(void *); HRESULT WINAPI extBeginScene2(void *); HRESULT WINAPI extEndScene2(void *); -HRESULT WINAPI extSetRenderState3(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extBeginScene3(void *); HRESULT WINAPI extEndScene3(void *); +HRESULT WINAPI extBeginScene7(void *); +HRESULT WINAPI extEndScene7(void *); +HRESULT WINAPI extSetRenderState2(void *, D3DRENDERSTATETYPE, DWORD); +HRESULT WINAPI extSetRenderState3(void *, D3DRENDERSTATETYPE, DWORD); +HRESULT WINAPI extSetRenderState7(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extGetCaps3(void *, LPD3DDEVICEDESC, LPD3DDEVICEDESC); HRESULT WINAPI extSetLightState3(void *d3dd, D3DLIGHTSTATETYPE d3dls, DWORD t); HRESULT WINAPI extSetViewport3(void *, LPD3DVIEWPORT); @@ -269,7 +275,7 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int d3dversion) case 7: SetHook((void *)(**(DWORD **)lplpdd + 0), extQueryInterfaceD3, (void **)&pQueryInterfaceD3, "QueryInterface(D3S)"); SetHook((void *)(**(DWORD **)lplpdd + 12), extEnumDevices7, (void **)&pEnumDevices7, "EnumDevices(7)"); - SetHook((void *)(**(DWORD **)lplpdd + 32), extCreateDevice7, (void **)&pCreateDevice7, "CreateDevice(D3D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateDevice7, (void **)&pCreateDevice7, "CreateDevice(D3D7)"); break; } } @@ -302,6 +308,7 @@ void HookDirect3DDevice(void **lpd3ddev, int d3dversion) if(dxw.dwFlags2 & WIREFRAME)(*pSetRenderState2)(*lpd3ddev, D3DRENDERSTATE_FILLMODE, D3DFILL_WIREFRAME); if(dxw.dwFlags4 & DISABLEFOGGING) (*pSetRenderState2)(*lpd3ddev, D3DRENDERSTATE_FOGENABLE, FALSE); if(dxw.dwFlags4 & ZBUFFERALWAYS) (*pSetRenderState2)(*lpd3ddev, D3DRENDERSTATE_ZFUNC, D3DCMP_ALWAYS); + //if(1) (*pSetRenderState2)(*lpd3ddev, D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL); } break; case 3: @@ -317,11 +324,21 @@ void HookDirect3DDevice(void **lpd3ddev, int d3dversion) if(dxw.dwFlags2 & WIREFRAME)(*pSetRenderState3)(*lpd3ddev, D3DRENDERSTATE_FILLMODE, D3DFILL_WIREFRAME); if(dxw.dwFlags4 & DISABLEFOGGING) (*pSetRenderState3)(*lpd3ddev, D3DRENDERSTATE_FOGENABLE, FALSE); if(dxw.dwFlags4 & ZBUFFERALWAYS) (*pSetRenderState3)(*lpd3ddev, D3DRENDERSTATE_ZFUNC, D3DCMP_ALWAYS); + //if(1) (*pSetRenderState3)(*lpd3ddev, D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL); } break; case 7: + SetHook((void *)(**(DWORD **)lpd3ddev + 20), extBeginScene7, (void **)&pBeginScene7, "BeginScene(7)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 24), extEndScene7, (void **)&pEndScene7, "EndScene(7)"); SetHook((void *)(**(DWORD **)lpd3ddev + 52), extSetViewport7, (void **)&pSetViewport7, "SetViewport(7)"); SetHook((void *)(**(DWORD **)lpd3ddev + 60), extGetViewport7, (void **)&pGetViewport7, "GetViewport(7)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 80), extSetRenderState7, (void **)&pSetRenderState7, "SetRenderState(7)"); + if(pSetRenderState7){ + if(dxw.dwFlags2 & WIREFRAME)(*pSetRenderState7)(*lpd3ddev, D3DRENDERSTATE_FILLMODE, D3DFILL_WIREFRAME); + if(dxw.dwFlags4 & DISABLEFOGGING) (*pSetRenderState7)(*lpd3ddev, D3DRENDERSTATE_FOGENABLE, FALSE); + if(dxw.dwFlags4 & ZBUFFERALWAYS) (*pSetRenderState7)(*lpd3ddev, D3DRENDERSTATE_ZFUNC, D3DCMP_ALWAYS); + //if(1) (*pSetRenderState7)(*lpd3ddev, D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL); + } break; } } @@ -773,67 +790,42 @@ HRESULT WINAPI extD3DGetCaps(void *d3dd, LPD3DDEVICEDESC lpd3dd ,LPD3DDEVICEDESC return res; } -char *ExplainRenderstateValue(DWORD Value) +HRESULT WINAPI extSetRenderState(SetRenderState3_Type pSetRenderState, int version, void *d3dd, D3DRENDERSTATETYPE State, DWORD Value) { - char *p; - switch(Value){ - case D3DCMP_NEVER : p="D3DCMP_NEVER"; break; - case D3DCMP_LESS : p="D3DCMP_LESS"; break; - case D3DCMP_EQUAL : p="D3DCMP_EQUAL"; break; - case D3DCMP_LESSEQUAL : p="D3DCMP_LESSEQUAL"; break; - case D3DCMP_GREATER : p="D3DCMP_GREATER"; break; - case D3DCMP_NOTEQUAL : p="D3DCMP_NOTEQUAL"; break; - case D3DCMP_GREATEREQUAL : p="D3DCMP_GREATEREQUAL"; break; - case D3DCMP_ALWAYS : p="D3DCMP_ALWAYS"; break; - default : p="???"; break; + HRESULT res; + OutTraceD3D("SetRenderState(%d): d3dd=%x State=%x(%s) Value=%x\n", version, d3dd, State, ExplainD3DRenderState(State), Value); + + if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRENDERSTATE_ZFUNC)) { + OutTraceD3D("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(Value)); + Value = D3DCMP_ALWAYS; } - return p; + if((dxw.dwFlags2 & WIREFRAME) && (State == D3DRENDERSTATE_FILLMODE)){ + OutTraceD3D("SetRenderState: FIXED State=FILLMODE Value=%x->D3DFILL_WIREFRAME\n", Value); + Value = D3DFILL_WIREFRAME; + } + if((dxw.dwFlags4 & DISABLEFOGGING) && (State == D3DRENDERSTATE_FOGENABLE)){ + OutTraceD3D("SetRenderState: FIXED State=FOGENABLE Value=%x->FALSE\n", Value); + Value = FALSE; + } + + res=(*pSetRenderState)(d3dd, State, Value); + if(res) OutTraceE("SetRenderState: res=%x(%s)\n", res, ExplainDDError(res)); + return res; } HRESULT WINAPI extSetRenderState2(void *d3dd, D3DRENDERSTATETYPE State, DWORD Value) { - HRESULT res; - OutTraceD3D("SetRenderState(2): d3dd=%x State=%x(%s) Value=%x\n", d3dd, State, ExplainD3DRenderState(State), Value); - if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRENDERSTATE_ZFUNC)) { - DWORD OldValue; - OldValue = Value; - Value = D3DCMP_ALWAYS; - OutTraceD3D("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(OldValue)); - } - if((dxw.dwFlags2 & WIREFRAME) && (State == D3DRENDERSTATE_FILLMODE)){ - Value = D3DFILL_WIREFRAME; - OutTraceD3D("SetRenderState: FIXED State=FILLMODE Value=D3DFILL_WIREFRAME\n"); -} - if((dxw.dwFlags4 & DISABLEFOGGING) && (State == D3DRENDERSTATE_FOGENABLE)){ - OutTraceD3D("SetRenderState: FIXED State=FOGENABLE Value=FALSE\n"); - Value = FALSE; - } - res=(*pSetRenderState2)(d3dd, State, Value); - if(res) OutTraceE("SetRenderState(2): res=%x(%s)\n", res, ExplainDDError(res)); - return res; + return extSetRenderState(pSetRenderState2, 2, d3dd, State, Value); } HRESULT WINAPI extSetRenderState3(void *d3dd, D3DRENDERSTATETYPE State, DWORD Value) { - HRESULT res; - OutTraceD3D("SetRenderState(3): d3dd=%x State=%x(%s) Value=%x\n", d3dd, State, ExplainD3DRenderState(State), Value); - if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRENDERSTATE_ZFUNC)) { - DWORD OldValue; - OldValue = Value; - Value = D3DCMP_ALWAYS; - OutTraceD3D("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(OldValue)); - } - if((dxw.dwFlags2 & WIREFRAME) && (State == D3DRENDERSTATE_FILLMODE)){ - Value = D3DFILL_WIREFRAME; - OutTraceD3D("SetRenderState: FIXED State=FILLMODE Value=D3DFILL_WIREFRAME\n"); - } - if((dxw.dwFlags4 & DISABLEFOGGING) && (State == D3DRENDERSTATE_FOGENABLE)){ - OutTraceD3D("SetRenderState: FIXED State=FOGENABLE Value=FALSE\n"); - Value = FALSE; - } - res=(*pSetRenderState3)(d3dd, State, Value); - if(res) OutTraceE("SetRenderState(3): res=%x(%s)\n", res, ExplainDDError(res)); - return res; + return extSetRenderState(pSetRenderState3, 3, d3dd, State, Value); +} + +HRESULT WINAPI extSetRenderState7(void *d3dd, D3DRENDERSTATETYPE State, DWORD Value) +{ + return extSetRenderState(pSetRenderState7, 7, d3dd, State, Value); } HRESULT WINAPI extBeginScene1(void *d3dd) @@ -898,6 +890,18 @@ HRESULT WINAPI extBeginScene3(void *d3dd) return res; } +HRESULT WINAPI extBeginScene7(void *d3dd) +{ + HRESULT res; + OutTraceD3D("BeginScene(7): d3dd=%x\n", d3dd); + + // there is no Clear method for Viewport object in D3D7 !!! + + res=(*pBeginScene7)(d3dd); + if(res) OutTraceE("BeginScene(7): res=%x(%s)\n", res, ExplainDDError(res)); + return res; +} + HRESULT WINAPI extEndScene1(void *d3dd) { HRESULT res; @@ -928,6 +932,16 @@ HRESULT WINAPI extEndScene3(void *d3dd) return res; } +HRESULT WINAPI extEndScene7(void *d3dd) +{ + HRESULT res; + OutTraceD3D("EndScene(7): d3dd=%x\n", d3dd); + res=(*pEndScene7)(d3dd); + //dxw.ShowOverlay(); + if(res) OutTraceE("EndScene(7): res=%x(%s)\n", res, ExplainDDError(res)); + return res; +} + HRESULT WINAPI extGetCaps3(void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) { HRESULT res; diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..fedbe5e --- /dev/null +++ b/todo.txt @@ -0,0 +1,37 @@ + int WINAPI D3DPERF_BeginEvent(D3DCOLOR col, LPCWSTR wszName) +{ + if (!gl_hOriginalDll) LoadOriginalDll(); // looking for the "right d3d9.dll" + + typedef int (WINAPI* D3DPERF_BE)(D3DCOLOR,LPCWSTR); + D3DPERF_BE D3DPERF_BeginEvent_fn = (D3DPERF_BE) GetProcAddress( gl_hOriginalDll, "D3DPERF_BeginEvent"); + + return D3DPERF_BeginEvent_fn(col, wszName); +} + +int WINAPI D3DPERF_EndEvent() +{ + if (!gl_hOriginalDll) LoadOriginalDll(); // looking for the "right d3d9.dll" + + typedef int (WINAPI* D3DPERF_EE)(void); + D3DPERF_EE D3DPERF_EndEvent_fn = (D3DPERF_EE) GetProcAddress( gl_hOriginalDll, "D3DPERF_EndEvent"); + + return D3DPERF_EndEvent_fn(); +} + +void WINAPI D3DPERF_SetMarker(D3DCOLOR col, LPCWSTR wszName) +{ + if (!gl_hOriginalDll) LoadOriginalDll(); // looking for the "right d3d9.dll" + + typedef void (WINAPI* D3DPERF_SM)(D3DCOLOR,LPCWSTR); + D3DPERF_SM D3DPERF_SetMarker_fn = (D3DPERF_SM) GetProcAddress( gl_hOriginalDll, "D3DPERF_SetMarker"); + + D3DPERF_SetMarker_fn(col, wszName); +} + +LIBRARY "d3d9" + +EXPORTS + Direct3DCreate9 @1 + D3DPERF_BeginEvent @2 + D3DPERF_EndEvent @3 + D3DPERF_SetMarker @4 \ No newline at end of file