2013-04-27 12:19:14 -04:00
|
|
|
//#define D3D10_IGNORE_SDK_LAYERS 1
|
2015-03-22 12:40:33 -04:00
|
|
|
#define _CRT_SECURE_NO_WARNINGS
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
#include <windows.h>
|
|
|
|
#include <d3d9.h>
|
2016-04-17 12:45:41 -04:00
|
|
|
#include <d3d8caps.h>
|
2013-04-27 12:19:14 -04:00
|
|
|
#include <D3D10_1.h>
|
|
|
|
#include <D3D10Misc.h>
|
|
|
|
#include <D3D11.h>
|
2012-12-24 10:20:23 -05:00
|
|
|
#include "dxwnd.h"
|
2013-01-04 10:30:38 -05:00
|
|
|
#include "dxwcore.hpp"
|
2013-02-06 11:19:16 -05:00
|
|
|
#include "dxhook.h"
|
2014-11-03 11:38:55 -05:00
|
|
|
#include "dxhelper.h"
|
2013-06-15 12:21:25 -04:00
|
|
|
#include "syslibs.h"
|
2014-12-13 11:40:09 -05:00
|
|
|
#include "stdio.h"
|
2014-07-13 12:39:33 -04:00
|
|
|
#include "hd3d.doc.hpp" // fake include to hold documentation
|
2013-02-06 11:19:16 -05:00
|
|
|
|
|
|
|
#define HOOKD3D10ANDLATER 1
|
2014-10-06 12:39:20 -04:00
|
|
|
#define TRACEALLMETHODS 1
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2015-10-05 12:40:44 -04:00
|
|
|
extern void D3D9TextureHandling(void *, int);
|
|
|
|
extern void D3D8TextureHandling(void *, int);
|
|
|
|
|
2016-04-03 12:42:48 -04:00
|
|
|
void *lpD3DActiveDevice = NULL;
|
2013-02-06 11:19:16 -05:00
|
|
|
typedef HRESULT (WINAPI *QueryInterface_Type)(void *, REFIID riid, void** ppvObj);
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
// D3D8/9 API
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
typedef void* (WINAPI *Direct3DCreate8_Type)(UINT);
|
|
|
|
typedef void* (WINAPI *Direct3DCreate9_Type)(UINT);
|
2013-02-06 11:19:16 -05:00
|
|
|
typedef HRESULT (WINAPI *Direct3DCreate9Ex_Type)(UINT, IDirect3D9Ex **);
|
2013-06-15 12:21:25 -04:00
|
|
|
typedef HRESULT (WINAPI *CheckFullScreen_Type)(void);
|
2014-04-01 12:38:40 -04:00
|
|
|
typedef BOOL (WINAPI * DisableD3DSpy_Type)(void);
|
2016-06-21 12:46:09 -04:00
|
|
|
typedef void (WINAPI * D3DPERF_SetOptions_Type)(DWORD);
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
void* WINAPI extDirect3DCreate8(UINT);
|
|
|
|
void* WINAPI extDirect3DCreate9(UINT);
|
|
|
|
HRESULT WINAPI extDirect3DCreate9Ex(UINT, IDirect3D9Ex **);
|
|
|
|
HRESULT WINAPI extCheckFullScreen(void);
|
|
|
|
HRESULT WINAPI voidDirect3DShaderValidatorCreate9(void);
|
|
|
|
void WINAPI voidDebugSetLevel(void);
|
|
|
|
void WINAPI voidDebugSetMute(void);
|
|
|
|
BOOL WINAPI voidDisableD3DSpy(void);
|
2014-12-13 11:40:09 -05:00
|
|
|
BOOL WINAPI extDisableD3DSpy(void);
|
2016-06-21 12:46:09 -04:00
|
|
|
void WINAPI extD3DPERF_SetOptions(DWORD);
|
2014-10-06 12:39:20 -04:00
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
Direct3DCreate8_Type pDirect3DCreate8 = 0;
|
|
|
|
Direct3DCreate9_Type pDirect3DCreate9 = 0;
|
|
|
|
Direct3DCreate9Ex_Type pDirect3DCreate9Ex = 0;
|
|
|
|
CheckFullScreen_Type pCheckFullScreen = 0;
|
|
|
|
DisableD3DSpy_Type pDisableD3DSpy = 0;
|
2016-06-21 12:46:09 -04:00
|
|
|
D3DPERF_SetOptions_Type pD3DPERF_SetOptions = 0;
|
2016-04-20 12:45:44 -04:00
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
// IDirect3D8/9 methods
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
typedef UINT (WINAPI *GetAdapterCount_Type)(void *);
|
2013-02-06 11:19:16 -05:00
|
|
|
typedef HRESULT (WINAPI *GetAdapterIdentifier_Type)(void *, UINT, DWORD, D3DADAPTER_IDENTIFIER9 *);
|
2016-07-09 12:47:08 -04:00
|
|
|
typedef UINT (WINAPI *GetAdapterModeCount8_Type)(void *, UINT);
|
|
|
|
typedef UINT (WINAPI *GetAdapterModeCount9_Type)(void *, UINT, D3DFORMAT);
|
2012-12-24 10:20:23 -05:00
|
|
|
typedef HRESULT (WINAPI *EnumAdapterModes8_Type)(void *, UINT, UINT, D3DDISPLAYMODE *);
|
|
|
|
typedef HRESULT (WINAPI *EnumAdapterModes9_Type)(void *, UINT, D3DFORMAT ,UINT, D3DDISPLAYMODE *);
|
|
|
|
typedef HRESULT (WINAPI *GetAdapterDisplayMode_Type)(void *, UINT, D3DDISPLAYMODE *);
|
2014-10-06 12:39:20 -04:00
|
|
|
typedef HRESULT (WINAPI *CheckDeviceType_Type)(void *, UINT, D3DDEVTYPE, D3DFORMAT, D3DFORMAT, BOOL);
|
2016-04-17 12:45:41 -04:00
|
|
|
typedef HRESULT (WINAPI *D3DGetDeviceCaps8_Type)(void *, UINT, D3DDEVTYPE, D3DCAPS8 *);
|
|
|
|
typedef HRESULT (WINAPI *D3DGetDeviceCaps9_Type)(void *, UINT, D3DDEVTYPE, D3DCAPS9 *);
|
2014-10-06 12:39:20 -04:00
|
|
|
typedef HMONITOR (WINAPI *GetAdapterMonitor_Type)(void *, UINT);
|
|
|
|
typedef HRESULT (WINAPI *CreateDevice_Type)(void *, UINT, D3DDEVTYPE, HWND, DWORD, void *, void **);
|
|
|
|
typedef HRESULT (WINAPI *CreateDeviceEx_Type)(void *, UINT, D3DDEVTYPE, HWND, DWORD, void *, D3DDISPLAYMODEEX *, void **);
|
2016-04-20 12:45:44 -04:00
|
|
|
typedef BOOL (WINAPI *DisableD3DSpy_Type)(void);
|
2014-10-06 12:39:20 -04:00
|
|
|
|
|
|
|
UINT WINAPI extGetAdapterCount8(void *);
|
|
|
|
UINT WINAPI extGetAdapterCount9(void *);
|
|
|
|
HRESULT WINAPI extGetAdapterIdentifier8(void *, UINT, DWORD, D3DADAPTER_IDENTIFIER9 *);
|
|
|
|
HRESULT WINAPI extGetAdapterIdentifier9(void *, UINT, DWORD, D3DADAPTER_IDENTIFIER9 *);
|
2016-07-09 12:47:08 -04:00
|
|
|
UINT WINAPI extGetAdapterModeCount8(void *, UINT);
|
|
|
|
UINT WINAPI extGetAdapterModeCount9(void *, UINT, D3DFORMAT);
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extCheckDeviceType8(void *, UINT, D3DDEVTYPE, D3DFORMAT, D3DFORMAT, BOOL);
|
|
|
|
HRESULT WINAPI extCheckDeviceType9(void *, UINT, D3DDEVTYPE, D3DFORMAT, D3DFORMAT, BOOL);
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extD3DGetDeviceCaps8(void *, UINT, D3DDEVTYPE, D3DCAPS8 *);
|
2015-01-24 11:40:16 -05:00
|
|
|
HRESULT WINAPI extD3DGetDeviceCaps9(void *, UINT, D3DDEVTYPE, D3DCAPS9 *);
|
2016-04-20 12:45:44 -04:00
|
|
|
HMONITOR WINAPI extGetAdapterMonitor8(void *, UINT);
|
|
|
|
HMONITOR WINAPI extGetAdapterMonitor9(void *, UINT);
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extCreateDevice8(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, void **);
|
|
|
|
HRESULT WINAPI extCreateDevice9(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, void **);
|
2014-10-06 12:39:20 -04:00
|
|
|
HRESULT WINAPI extCreateDeviceEx(void *, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS *, D3DDISPLAYMODEEX *, void **);
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
GetAdapterCount_Type pGetAdapterCount8, pGetAdapterCount9;
|
2016-07-09 12:47:08 -04:00
|
|
|
GetAdapterModeCount8_Type pGetAdapterModeCount8;
|
|
|
|
GetAdapterModeCount9_Type pGetAdapterModeCount9;
|
2016-04-20 12:45:44 -04:00
|
|
|
GetAdapterIdentifier_Type pGetAdapterIdentifier8, pGetAdapterIdentifier9;
|
|
|
|
CheckDeviceType_Type pCheckDeviceType8, pCheckDeviceType9;
|
2016-04-17 12:45:41 -04:00
|
|
|
D3DGetDeviceCaps8_Type pD3DGetDeviceCaps8 = 0;
|
|
|
|
D3DGetDeviceCaps9_Type pD3DGetDeviceCaps9 = 0;
|
2016-04-20 12:45:44 -04:00
|
|
|
GetAdapterMonitor_Type pGetAdapterMonitor8, pGetAdapterMonitor9;
|
|
|
|
CreateDevice_Type pCreateDevice8, pCreateDevice9;
|
2014-10-06 12:39:20 -04:00
|
|
|
CreateDeviceEx_Type pCreateDeviceEx = 0;
|
|
|
|
|
|
|
|
// IDirect3DDevice8/9 methods
|
|
|
|
|
2015-07-01 12:40:14 -04:00
|
|
|
typedef UINT (WINAPI *GetAvailableTextureMem_Type)(void *);
|
2014-10-06 12:39:20 -04:00
|
|
|
typedef HRESULT (WINAPI *TestCooperativeLevel_Type)(void *);
|
|
|
|
typedef HRESULT (WINAPI *GetDirect3D8_Type)(void *, void **);
|
|
|
|
typedef HRESULT (WINAPI *GetDirect3D9_Type)(void *, void **);
|
2013-10-21 12:38:23 -04:00
|
|
|
typedef HRESULT (WINAPI *GetDisplayMode8_Type)(void *, D3DDISPLAYMODE *);
|
|
|
|
typedef HRESULT (WINAPI *GetDisplayMode9_Type)(void *, UINT, D3DDISPLAYMODE *);
|
2014-10-06 12:39:20 -04:00
|
|
|
typedef void (WINAPI *SetCursorPosition9_Type)(void *, int, int, DWORD);
|
|
|
|
typedef void (WINAPI *SetCursorPosition8_Type)(void *, int, int, DWORD);
|
|
|
|
typedef BOOL (WINAPI *ShowCursor8_Type)(void *, BOOL);
|
|
|
|
typedef BOOL (WINAPI *ShowCursor9_Type)(void *, BOOL);
|
|
|
|
typedef HRESULT (WINAPI *CreateAdditionalSwapChain_Type)(void *, D3DPRESENT_PARAMETERS *, IDirect3DSwapChain9 **);
|
|
|
|
typedef HRESULT (WINAPI *GetSwapChain_Type)(void *, UINT, IDirect3DSwapChain9**);
|
|
|
|
typedef UINT (WINAPI *GetNumberOfSwapChains_Type)(void *);
|
|
|
|
typedef HRESULT (WINAPI *BeginStateBlock_Type)(void *);
|
|
|
|
typedef HRESULT (WINAPI *EndStateBlock8_Type)(void *, DWORD *);
|
|
|
|
typedef HRESULT (WINAPI *EndStateBlock9_Type)(void *, IDirect3DStateBlock9**);
|
2014-12-13 11:40:09 -05:00
|
|
|
typedef HRESULT (WINAPI *CreateTexture8_Type)(void *, UINT, UINT, UINT, DWORD, D3DFORMAT, D3DPOOL, void **);
|
|
|
|
typedef HRESULT (WINAPI *CreateTexture9_Type)(void *, UINT, UINT, UINT, DWORD, D3DFORMAT, D3DPOOL, void **, HANDLE *);
|
2014-10-06 12:39:20 -04:00
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
UINT WINAPI extGetAvailableTextureMem8(void *);
|
|
|
|
UINT WINAPI extGetAvailableTextureMem9(void *);
|
|
|
|
HRESULT WINAPI extTestCooperativeLevel8(void *);
|
|
|
|
HRESULT WINAPI extTestCooperativeLevel9(void *);
|
2014-10-06 12:39:20 -04:00
|
|
|
HRESULT WINAPI extGetDirect3D8(void *, void **);
|
|
|
|
HRESULT WINAPI extGetDirect3D9(void *, void **);
|
|
|
|
HRESULT WINAPI extGetDisplayMode8(void *, D3DDISPLAYMODE *);
|
|
|
|
HRESULT WINAPI extGetDisplayMode9(void *, UINT, D3DDISPLAYMODE *);
|
|
|
|
void WINAPI extSetCursorPosition9(void *, int, int, DWORD);
|
|
|
|
void WINAPI extSetCursorPosition8(void *, int, int, DWORD);
|
|
|
|
BOOL WINAPI extShowCursor8(void *, BOOL);
|
|
|
|
BOOL WINAPI extShowCursor9(void *, BOOL);
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extCreateAdditionalSwapChain8(void *, D3DPRESENT_PARAMETERS *, IDirect3DSwapChain9 **);
|
|
|
|
HRESULT WINAPI extCreateAdditionalSwapChain9(void *, D3DPRESENT_PARAMETERS *, IDirect3DSwapChain9 **);
|
2014-10-06 12:39:20 -04:00
|
|
|
HRESULT WINAPI extGetSwapChain(void *, UINT, IDirect3DSwapChain9**);
|
|
|
|
UINT WINAPI extGetNumberOfSwapChains(void *);
|
|
|
|
HRESULT WINAPI extBeginStateBlock8(void *);
|
|
|
|
HRESULT WINAPI extBeginStateBlock9(void *);
|
|
|
|
HRESULT WINAPI extEndStateBlock8(void *, DWORD *);
|
|
|
|
HRESULT WINAPI extEndStateBlock9(void *, IDirect3DStateBlock9**);
|
2014-12-13 11:40:09 -05:00
|
|
|
HRESULT WINAPI extCreateTexture8(void *, UINT, UINT, UINT, DWORD, D3DFORMAT, D3DPOOL, void **);
|
|
|
|
HRESULT WINAPI extCreateTexture9(void *, UINT, UINT, UINT, DWORD, D3DFORMAT, D3DPOOL, void **, HANDLE *);
|
2014-10-06 12:39:20 -04:00
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
GetAvailableTextureMem_Type pGetAvailableTextureMem8, pGetAvailableTextureMem9;
|
|
|
|
TestCooperativeLevel_Type pTestCooperativeLevel8, pTestCooperativeLevel9;
|
2014-10-06 12:39:20 -04:00
|
|
|
GetDirect3D8_Type pGetDirect3D8 = 0;
|
|
|
|
GetDirect3D9_Type pGetDirect3D9 = 0;
|
|
|
|
GetDisplayMode8_Type pGetDisplayMode8 = 0;
|
|
|
|
GetDisplayMode9_Type pGetDisplayMode9 = 0;
|
|
|
|
SetCursorPosition9_Type pSetCursorPosition9 = 0;
|
|
|
|
SetCursorPosition8_Type pSetCursorPosition8 = 0;
|
|
|
|
ShowCursor8_Type pShowCursor8 = 0;
|
|
|
|
ShowCursor9_Type pShowCursor9 = 0;
|
2016-04-17 12:45:41 -04:00
|
|
|
CreateAdditionalSwapChain_Type pCreateAdditionalSwapChain8 = 0;
|
|
|
|
CreateAdditionalSwapChain_Type pCreateAdditionalSwapChain9 = 0;
|
2014-10-06 12:39:20 -04:00
|
|
|
GetSwapChain_Type pGetSwapChain = 0;
|
|
|
|
GetNumberOfSwapChains_Type pGetNumberOfSwapChains = 0;
|
|
|
|
BeginStateBlock_Type pBeginStateBlock8 = 0;
|
|
|
|
BeginStateBlock_Type pBeginStateBlock9 = 0;
|
|
|
|
EndStateBlock8_Type pEndStateBlock8 = 0;
|
|
|
|
EndStateBlock9_Type pEndStateBlock9 = 0;
|
2014-12-13 11:40:09 -05:00
|
|
|
CreateTexture8_Type pCreateTexture8 = 0;
|
|
|
|
CreateTexture9_Type pCreateTexture9 = 0;
|
|
|
|
|
|
|
|
// IDirect3DTexture8/9 methods
|
|
|
|
|
|
|
|
typedef HRESULT (WINAPI *LockRect_Type)(void *, UINT, D3DLOCKED_RECT *, CONST RECT *, DWORD);
|
|
|
|
typedef HRESULT (WINAPI *UnlockRect_Type)(void *, UINT);
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extLockRect8(void *, UINT, D3DLOCKED_RECT *, CONST RECT *, DWORD);
|
|
|
|
HRESULT WINAPI extLockRect9(void *, UINT, D3DLOCKED_RECT *, CONST RECT *, DWORD);
|
2014-12-13 11:40:09 -05:00
|
|
|
HRESULT WINAPI extUnlockRect8(void *, UINT);
|
|
|
|
HRESULT WINAPI extUnlockRect9(void *, UINT);
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
LockRect_Type pLockRect8, pLockRect9;
|
|
|
|
UnlockRect_Type pUnlockRect8, pUnlockRect9;
|
2014-10-06 12:39:20 -04:00
|
|
|
|
|
|
|
// to sort ...
|
|
|
|
|
2013-01-25 11:17:02 -05:00
|
|
|
typedef HRESULT (WINAPI *Present_Type)(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
|
2013-04-27 12:19:14 -04:00
|
|
|
typedef HRESULT (WINAPI *SetRenderState_Type)(void *, D3DRENDERSTATETYPE, DWORD);
|
|
|
|
typedef HRESULT (WINAPI *GetRenderState_Type)(void *, D3DRENDERSTATETYPE, DWORD );
|
2013-02-06 11:19:16 -05:00
|
|
|
typedef HRESULT (WINAPI *GetViewport_Type)(void *, D3DVIEWPORT9 *);
|
|
|
|
typedef HRESULT (WINAPI *SetViewport_Type)(void *, D3DVIEWPORT9 *);
|
2013-07-25 12:38:10 -04:00
|
|
|
typedef void (WINAPI *SetGammaRamp_Type)(void *, UINT, DWORD, D3DGAMMARAMP *);
|
|
|
|
typedef void (WINAPI *GetGammaRamp_Type)(void *, UINT, D3DGAMMARAMP *);
|
2014-03-15 12:38:56 -04:00
|
|
|
typedef HRESULT (WINAPI *SetTexture8_Type)(void *, DWORD, void *);
|
|
|
|
typedef HRESULT (WINAPI *SetTexture9_Type)(void *, DWORD, void *);
|
2013-04-27 12:19:14 -04:00
|
|
|
|
2014-01-03 11:38:52 -05:00
|
|
|
//typedef ULONG (WINAPI *CreateRenderTarget8_Type)(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, IDirect3DSurface8**);
|
|
|
|
typedef ULONG (WINAPI *CreateRenderTarget8_Type)(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
|
2016-04-03 12:42:48 -04:00
|
|
|
typedef ULONG (WINAPI *CreateRenderTarget9_Type)(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
|
2014-01-03 11:38:52 -05:00
|
|
|
typedef ULONG (WINAPI *BeginScene_Type)(void *);
|
|
|
|
typedef ULONG (WINAPI *EndScene_Type)(void *);
|
|
|
|
|
2013-04-27 12:19:14 -04:00
|
|
|
typedef HRESULT (WINAPI *D3D10CreateDevice_Type)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, ID3D10Device **);
|
|
|
|
typedef HRESULT (WINAPI *D3D10CreateDeviceAndSwapChain_Type)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **);
|
|
|
|
typedef HRESULT (WINAPI *D3D10CreateDevice1_Type)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, D3D10_FEATURE_LEVEL1, UINT, ID3D10Device **);
|
|
|
|
typedef HRESULT (WINAPI *D3D10CreateDeviceAndSwapChain1_Type)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **);
|
|
|
|
typedef HRESULT (WINAPI *D3D11CreateDevice_Type)(IDXGIAdapter *, D3D_DRIVER_TYPE, HMODULE, UINT, const D3D_FEATURE_LEVEL *, UINT, UINT, ID3D11Device **, D3D_FEATURE_LEVEL *, ID3D11DeviceContext **);
|
|
|
|
typedef HRESULT (WINAPI *D3D11CreateDeviceAndSwapChain_Type)(IDXGIAdapter *, D3D_DRIVER_TYPE, HMODULE, UINT, const D3D_FEATURE_LEVEL *, UINT, UINT, const DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D11Device **, D3D_FEATURE_LEVEL *, ID3D11DeviceContext **);
|
2014-12-13 11:40:09 -05:00
|
|
|
typedef void (WINAPI *RSSetViewports10_Type)(void *, UINT, D3D10_VIEWPORT *);
|
|
|
|
typedef void (WINAPI *RSSetViewports11_Type)(void *, UINT, D3D11_VIEWPORT *);
|
2013-12-22 11:38:36 -05:00
|
|
|
typedef ULONG (WINAPI *AddRef_Type)(void *);
|
|
|
|
typedef ULONG (WINAPI *Release_Type)(void *);
|
2014-03-15 12:38:56 -04:00
|
|
|
typedef HRESULT (WINAPI *Reset_Type)(void *, D3DPRESENT_PARAMETERS*);
|
2013-02-06 11:19:16 -05:00
|
|
|
|
|
|
|
HRESULT WINAPI extQueryInterfaceD3D8(void *, REFIID, void** );
|
|
|
|
HRESULT WINAPI extQueryInterfaceDev8(void *, REFIID, void** );
|
|
|
|
HRESULT WINAPI extQueryInterfaceD3D9(void *, REFIID, void** );
|
|
|
|
HRESULT WINAPI extQueryInterfaceDev9(void *, REFIID, void** );
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
HRESULT WINAPI extEnumAdapterModes8(void *, UINT, UINT , D3DDISPLAYMODE *);
|
|
|
|
HRESULT WINAPI extEnumAdapterModes9(void *, UINT, D3DFORMAT, UINT , D3DDISPLAYMODE *);
|
2013-07-09 12:38:16 -04:00
|
|
|
HRESULT WINAPI extGetAdapterDisplayMode8(void *, UINT, D3DDISPLAYMODE *);
|
|
|
|
HRESULT WINAPI extGetAdapterDisplayMode9(void *, UINT, D3DDISPLAYMODE *);
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extPresent8(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
|
|
|
|
HRESULT WINAPI extPresent9(void *, CONST RECT *, CONST RECT *, HWND, CONST RGNDATA *);
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extSetRenderState8(void *, D3DRENDERSTATETYPE, DWORD);
|
|
|
|
HRESULT WINAPI extSetRenderState9(void *, D3DRENDERSTATETYPE, DWORD);
|
|
|
|
HRESULT WINAPI extGetRenderState8(void *, D3DRENDERSTATETYPE, DWORD);
|
|
|
|
HRESULT WINAPI extGetRenderState9(void *, D3DRENDERSTATETYPE, DWORD);
|
2013-02-06 11:19:16 -05:00
|
|
|
HRESULT WINAPI extGetViewport(void *, D3DVIEWPORT9 *);
|
|
|
|
HRESULT WINAPI extSetViewport(void *, D3DVIEWPORT9 *);
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extReset8(void *, D3DPRESENT_PARAMETERS *);
|
|
|
|
HRESULT WINAPI extReset9(void *, D3DPRESENT_PARAMETERS *);
|
2016-04-20 12:45:44 -04:00
|
|
|
void WINAPI extSetGammaRamp8(void *, UINT, DWORD, D3DGAMMARAMP *);
|
|
|
|
void WINAPI extSetGammaRamp9(void *, UINT, DWORD, D3DGAMMARAMP *);
|
|
|
|
void WINAPI extGetGammaRamp8(void *, UINT, D3DGAMMARAMP *);
|
|
|
|
void WINAPI extGetGammaRamp9(void *, UINT, D3DGAMMARAMP *);
|
2013-12-22 11:38:36 -05:00
|
|
|
ULONG WINAPI extAddRef9(void *);
|
|
|
|
ULONG WINAPI extRelease9(void *);
|
2014-04-01 12:38:40 -04:00
|
|
|
BOOL WINAPI voidDisableD3DSpy(void);
|
|
|
|
|
2014-01-03 11:38:52 -05:00
|
|
|
ULONG WINAPI extCreateRenderTarget8(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
|
2016-04-03 12:42:48 -04:00
|
|
|
ULONG WINAPI extCreateRenderTarget9(void *, UINT, UINT, D3DFORMAT, D3DMULTISAMPLE_TYPE, BOOL, void**);
|
2014-01-03 11:38:52 -05:00
|
|
|
ULONG WINAPI extBeginScene8(void *);
|
|
|
|
ULONG WINAPI extEndScene8(void *);
|
|
|
|
ULONG WINAPI extBeginScene9(void *);
|
|
|
|
ULONG WINAPI extEndScene9(void *);
|
2014-03-15 12:38:56 -04:00
|
|
|
ULONG WINAPI extSetTexture8(void *, DWORD, void *);
|
|
|
|
ULONG WINAPI extSetTexture9(void *, DWORD, void *);
|
2013-12-22 11:38:36 -05:00
|
|
|
|
2013-04-27 12:19:14 -04:00
|
|
|
HRESULT WINAPI extD3D10CreateDevice(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, ID3D10Device **);
|
|
|
|
HRESULT WINAPI extD3D10CreateDeviceAndSwapChain(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **);
|
|
|
|
HRESULT WINAPI extD3D10CreateDevice1(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, D3D10_FEATURE_LEVEL1, UINT, ID3D10Device **);
|
|
|
|
HRESULT WINAPI extD3D10CreateDeviceAndSwapChain1(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D10Device **);
|
|
|
|
HRESULT WINAPI extD3D11CreateDevice(IDXGIAdapter *, D3D_DRIVER_TYPE, HMODULE, UINT, const D3D_FEATURE_LEVEL *, UINT, UINT, ID3D11Device **, D3D_FEATURE_LEVEL *, ID3D11DeviceContext **);
|
|
|
|
HRESULT WINAPI extD3D11CreateDeviceAndSwapChain(IDXGIAdapter *, D3D_DRIVER_TYPE, HMODULE, UINT, const D3D_FEATURE_LEVEL *, UINT, UINT, const DXGI_SWAP_CHAIN_DESC *, IDXGISwapChain **, ID3D11Device **, D3D_FEATURE_LEVEL *, ID3D11DeviceContext **);
|
2014-12-13 11:40:09 -05:00
|
|
|
void WINAPI extRSSetViewports10(void *, UINT, D3D10_VIEWPORT *);
|
|
|
|
void WINAPI extRSSetViewports11(ID3D11DeviceContext *, UINT, D3D11_VIEWPORT *);
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
extern char *ExplainDDError(DWORD);
|
|
|
|
|
2013-06-15 12:21:25 -04:00
|
|
|
QueryInterface_Type pQueryInterfaceD3D8 = 0;
|
|
|
|
QueryInterface_Type pQueryInterfaceDev8 = 0;
|
|
|
|
QueryInterface_Type pQueryInterfaceD3D9 = 0;
|
|
|
|
QueryInterface_Type pQueryInterfaceDev9 = 0;
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2013-06-15 12:21:25 -04:00
|
|
|
EnumAdapterModes8_Type pEnumAdapterModes8 = 0;
|
|
|
|
EnumAdapterModes9_Type pEnumAdapterModes9 = 0;
|
2013-07-09 12:38:16 -04:00
|
|
|
GetAdapterDisplayMode_Type pGetAdapterDisplayMode8 = 0;
|
|
|
|
GetAdapterDisplayMode_Type pGetAdapterDisplayMode9 = 0;
|
2016-04-17 12:45:41 -04:00
|
|
|
Present_Type pPresent8 = 0;
|
|
|
|
Present_Type pPresent9 = 0;
|
2016-04-20 12:45:44 -04:00
|
|
|
SetRenderState_Type pSetRenderState8, pSetRenderState9;
|
|
|
|
GetRenderState_Type pGetRenderState8, pGetRenderState9;
|
2013-06-15 12:21:25 -04:00
|
|
|
GetViewport_Type pGetViewport = 0;
|
|
|
|
SetViewport_Type pSetViewport = 0;
|
2016-04-20 12:45:44 -04:00
|
|
|
SetGammaRamp_Type pSetGammaRamp8, pSetGammaRamp9;
|
|
|
|
GetGammaRamp_Type pGetGammaRamp8, pGetGammaRamp9;
|
2013-06-15 12:21:25 -04:00
|
|
|
|
2014-01-03 11:38:52 -05:00
|
|
|
CreateRenderTarget8_Type pCreateRenderTarget8 = 0;
|
2016-04-03 12:42:48 -04:00
|
|
|
CreateRenderTarget9_Type pCreateRenderTarget9 = 0;
|
2016-04-20 12:45:44 -04:00
|
|
|
BeginScene_Type pBeginScene8, pBeginScene9;
|
|
|
|
EndScene_Type pEndScene8, pEndScene9;
|
|
|
|
Reset_Type pReset8, pReset9;
|
2014-03-15 12:38:56 -04:00
|
|
|
SetTexture8_Type pSetTexture8 = 0;
|
|
|
|
SetTexture9_Type pSetTexture9 = 0;
|
2014-01-03 11:38:52 -05:00
|
|
|
|
2013-06-15 12:21:25 -04:00
|
|
|
D3D10CreateDevice_Type pD3D10CreateDevice = 0;
|
|
|
|
D3D10CreateDeviceAndSwapChain_Type pD3D10CreateDeviceAndSwapChain = 0;
|
|
|
|
D3D10CreateDevice1_Type pD3D10CreateDevice1 = 0;
|
|
|
|
D3D10CreateDeviceAndSwapChain1_Type pD3D10CreateDeviceAndSwapChain1 = 0;
|
|
|
|
D3D11CreateDevice_Type pD3D11CreateDevice = 0;
|
|
|
|
D3D11CreateDeviceAndSwapChain_Type pD3D11CreateDeviceAndSwapChain = 0;
|
2014-12-13 11:40:09 -05:00
|
|
|
RSSetViewports10_Type pRSSetViewports10 = 0;
|
|
|
|
RSSetViewports11_Type pRSSetViewports11 = 0;
|
2013-01-25 11:17:02 -05:00
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
AddRef_Type pAddRef9 = 0;
|
|
|
|
Release_Type pRelease9 = 0;
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
DWORD dwD3DVersion;
|
2015-04-26 12:40:41 -04:00
|
|
|
DWORD dwD3DSwapEffect;
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2016-12-03 11:45:15 -05:00
|
|
|
static HookEntryEx_Type d3d8Hooks[]={
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "Direct3DCreate8", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate8, (FARPROC)extDirect3DCreate8},
|
|
|
|
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
|
2014-10-06 12:39:20 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-12-03 11:45:15 -05:00
|
|
|
static HookEntryEx_Type d3d9Hooks[]={
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "Direct3DCreate9", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate9, (FARPROC)extDirect3DCreate9},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "Direct3DCreate9Ex", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate9Ex, (FARPROC)extDirect3DCreate9Ex},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "CheckFullScreen", (FARPROC)NULL, (FARPROC *)&pCheckFullScreen, (FARPROC)extCheckFullScreen},
|
2016-04-09 12:47:04 -04:00
|
|
|
//{HOOK_HOT_CANDIDATE, 0, "DisableD3DSpy", (FARPROC)NULL, (FARPROC *)&pDisableD3DSpy, (FARPROC)extDisableD3DSpy},
|
2016-06-21 12:46:09 -04:00
|
|
|
{HOOK_HOT_CANDIDATE, 0, "D3DPERF_SetOptions", (FARPROC)NULL, (FARPROC *)&pD3DPERF_SetOptions, (FARPROC)extD3DPERF_SetOptions},
|
2016-12-03 11:45:15 -05:00
|
|
|
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
|
2014-10-06 12:39:20 -04:00
|
|
|
};
|
|
|
|
|
2016-12-03 11:45:15 -05:00
|
|
|
static HookEntryEx_Type d3d9Extra[]={
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "Direct3DShaderValidatorCreate9", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)voidDirect3DShaderValidatorCreate9},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "DebugSetLevel", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)voidDebugSetLevel},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "DebugSetMute", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)voidDebugSetMute},
|
2016-04-09 12:47:04 -04:00
|
|
|
{HOOK_HOT_CANDIDATE, 0, "DisableD3DSpy", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)voidDisableD3DSpy},
|
2016-12-03 11:45:15 -05:00
|
|
|
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
|
2014-10-06 12:39:20 -04:00
|
|
|
};
|
|
|
|
|
2016-12-03 11:45:15 -05:00
|
|
|
static HookEntryEx_Type d3d10Hooks[]={
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "D3D10CreateDevice", (FARPROC)NULL, (FARPROC *)&pD3D10CreateDevice, (FARPROC)extD3D10CreateDevice},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "D3D10CreateDeviceAndSwapChain", (FARPROC)NULL, (FARPROC *)&pD3D10CreateDeviceAndSwapChain, (FARPROC)extD3D10CreateDeviceAndSwapChain},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "CheckFullScreen", (FARPROC)NULL, (FARPROC *)&pCheckFullScreen, (FARPROC)extCheckFullScreen},
|
|
|
|
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
|
2014-10-06 12:39:20 -04:00
|
|
|
};
|
|
|
|
|
2016-12-03 11:45:15 -05:00
|
|
|
static HookEntryEx_Type d3d10_1Hooks[]={
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "D3D11CreateDevice", (FARPROC)NULL, (FARPROC *)&pD3D11CreateDevice, (FARPROC)extD3D11CreateDevice},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "D3D11CreateDeviceAndSwapChain", (FARPROC)NULL, (FARPROC *)&pD3D11CreateDeviceAndSwapChain, (FARPROC)extD3D11CreateDeviceAndSwapChain},
|
|
|
|
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
|
2014-10-06 12:39:20 -04:00
|
|
|
};
|
|
|
|
|
2016-12-03 11:45:15 -05:00
|
|
|
static HookEntryEx_Type d3d11Hooks[]={
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "D3D10CreateDevice1", (FARPROC)NULL, (FARPROC *)&pD3D10CreateDevice1, (FARPROC)extD3D10CreateDevice1},
|
|
|
|
{HOOK_HOT_CANDIDATE, 0, "D3D10CreateDeviceAndSwapChain1", (FARPROC)NULL, (FARPROC *)&pD3D10CreateDeviceAndSwapChain1, (FARPROC)extD3D10CreateDeviceAndSwapChain1},
|
|
|
|
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
|
2014-10-06 12:39:20 -04:00
|
|
|
};
|
|
|
|
|
2013-02-06 11:19:16 -05:00
|
|
|
FARPROC Remap_d3d8_ProcAddress(LPCSTR proc, HMODULE hModule)
|
|
|
|
{
|
2014-10-06 12:39:20 -04:00
|
|
|
FARPROC addr;
|
2015-04-26 12:40:41 -04:00
|
|
|
//if (dxw.dwTargetDDVersion == HOOKDDRAWNONE) return NULL;
|
2016-12-03 11:45:15 -05:00
|
|
|
if (addr=RemapLibraryEx(proc, hModule, d3d8Hooks)) return addr;
|
2013-02-06 11:19:16 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
FARPROC Remap_d3d9_ProcAddress(LPCSTR proc, HMODULE hModule)
|
|
|
|
{
|
2014-10-06 12:39:20 -04:00
|
|
|
FARPROC addr;
|
2015-04-26 12:40:41 -04:00
|
|
|
//if (dxw.dwTargetDDVersion == HOOKDDRAWNONE) return NULL;
|
2016-12-03 11:45:15 -05:00
|
|
|
if (addr=RemapLibraryEx(proc, hModule, d3d9Hooks)) return addr;
|
|
|
|
if (dxw.dwFlags3 & SUPPRESSD3DEXT) if (addr=RemapLibraryEx(proc, hModule, d3d9Extra)) return addr;
|
2013-02-06 11:19:16 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
FARPROC Remap_d3d10_ProcAddress(LPCSTR proc, HMODULE hModule)
|
|
|
|
{
|
2014-10-06 12:39:20 -04:00
|
|
|
FARPROC addr;
|
2015-04-26 12:40:41 -04:00
|
|
|
//if (dxw.dwTargetDDVersion == HOOKDDRAWNONE) return NULL;
|
2016-12-03 11:45:15 -05:00
|
|
|
if (addr=RemapLibraryEx(proc, hModule, d3d10Hooks)) return addr;
|
2013-02-06 11:19:16 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
FARPROC Remap_d3d10_1_ProcAddress(LPCSTR proc, HMODULE hModule)
|
2013-02-06 11:19:16 -05:00
|
|
|
{
|
2014-10-06 12:39:20 -04:00
|
|
|
FARPROC addr;
|
2015-04-26 12:40:41 -04:00
|
|
|
//if (dxw.dwTargetDDVersion == HOOKDDRAWNONE) return NULL;
|
2016-12-03 11:45:15 -05:00
|
|
|
if (addr=RemapLibraryEx(proc, hModule, d3d10_1Hooks)) return addr;
|
2013-02-06 11:19:16 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
FARPROC Remap_d3d11_ProcAddress(LPCSTR proc, HMODULE hModule)
|
|
|
|
{
|
2014-10-06 12:39:20 -04:00
|
|
|
FARPROC addr;
|
2015-04-26 12:40:41 -04:00
|
|
|
//if (dxw.dwTargetDDVersion == HOOKDDRAWNONE) return NULL;
|
2016-12-03 11:45:15 -05:00
|
|
|
if (addr=RemapLibraryEx(proc, hModule, d3d11Hooks)) return addr;
|
2013-02-06 11:19:16 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-04-04 12:17:08 -04:00
|
|
|
int HookDirect3D(HMODULE module, int version){
|
2014-06-14 12:39:22 -04:00
|
|
|
LPDIRECT3D9 lpd3d;
|
|
|
|
ID3D10Device *lpd3d10;
|
|
|
|
ID3D11Device *lpd3d11;
|
|
|
|
HRESULT res;
|
|
|
|
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceDW("HookDirect3D: module=%x version=%d\n", module, version);
|
2012-12-24 10:20:23 -05:00
|
|
|
switch(version){
|
|
|
|
case 0:
|
2016-12-03 11:45:15 -05:00
|
|
|
HookLibraryEx(module, d3d8Hooks, "d3d8.dll");
|
|
|
|
HookLibraryEx(module, d3d9Hooks, "d3d9.dll");
|
2013-02-06 11:19:16 -05:00
|
|
|
#ifdef HOOKD3D10ANDLATER
|
2016-12-03 11:45:15 -05:00
|
|
|
HookLibraryEx(module, d3d10Hooks, "d3d10.dll");
|
|
|
|
HookLibraryEx(module, d3d10_1Hooks, "d3d10_1.dll");
|
|
|
|
HookLibraryEx(module, d3d11Hooks, "d3d11.dll");
|
2013-02-06 11:19:16 -05:00
|
|
|
#endif
|
2012-12-24 10:20:23 -05:00
|
|
|
break;
|
|
|
|
case 8:
|
2016-12-03 11:45:15 -05:00
|
|
|
PinLibraryEx(d3d8Hooks, "d3d8.dll"); // pin for "Port Royale 2"
|
|
|
|
HookLibraryEx(module, d3d8Hooks, "d3d8.dll");
|
2014-06-14 12:39:22 -04:00
|
|
|
if(pDirect3DCreate8){
|
|
|
|
lpd3d = (LPDIRECT3D9)extDirect3DCreate8(220);
|
|
|
|
if(lpd3d) lpd3d->Release();
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
break;
|
|
|
|
case 9:
|
2016-12-03 11:45:15 -05:00
|
|
|
PinLibraryEx(d3d9Hooks, "d3d9.dll");// pin for "Affari tuoi"
|
|
|
|
HookLibraryEx(module, d3d9Hooks, "d3d9.dll");
|
2014-06-14 12:39:22 -04:00
|
|
|
if(pDirect3DCreate9){
|
|
|
|
lpd3d = (LPDIRECT3D9)extDirect3DCreate9(31);
|
|
|
|
if(lpd3d) lpd3d->Release();
|
|
|
|
}
|
2013-04-27 12:19:14 -04:00
|
|
|
break;
|
2013-02-06 11:19:16 -05:00
|
|
|
#ifdef HOOKD3D10ANDLATER
|
2013-04-27 12:19:14 -04:00
|
|
|
case 10:
|
2016-12-03 11:45:15 -05:00
|
|
|
PinLibraryEx(d3d10Hooks, "d3d10.dll");
|
|
|
|
PinLibraryEx(d3d10_1Hooks, "d3d10_1.dll");
|
|
|
|
HookLibraryEx(module, d3d10Hooks, "d3d10.dll");
|
|
|
|
HookLibraryEx(module, d3d10_1Hooks, "d3d10_1.dll");
|
2014-06-14 12:39:22 -04:00
|
|
|
if(pD3D10CreateDevice){
|
|
|
|
res = extD3D10CreateDevice(
|
|
|
|
NULL,
|
|
|
|
D3D10_DRIVER_TYPE_HARDWARE,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
D3D10_SDK_VERSION,
|
|
|
|
&lpd3d10);
|
|
|
|
if(res==DD_OK) lpd3d10->Release();
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
break;
|
2013-04-27 12:19:14 -04:00
|
|
|
case 11:
|
2016-12-03 11:45:15 -05:00
|
|
|
PinLibraryEx(d3d11Hooks, "d3d11.dll");
|
|
|
|
HookLibraryEx(module, d3d11Hooks, "d3d11.dll");
|
2014-06-14 12:39:22 -04:00
|
|
|
if(pD3D11CreateDevice){
|
|
|
|
D3D_FEATURE_LEVEL FeatureLevel;
|
|
|
|
ID3D11DeviceContext *pImmediateContext;
|
|
|
|
res = extD3D11CreateDevice(
|
|
|
|
NULL,
|
|
|
|
D3D_DRIVER_TYPE_HARDWARE,
|
|
|
|
NULL,
|
|
|
|
0, // flags
|
|
|
|
NULL, // FeatureLevels
|
|
|
|
0,
|
|
|
|
D3D11_SDK_VERSION,
|
|
|
|
&lpd3d11,
|
|
|
|
&FeatureLevel,
|
|
|
|
&pImmediateContext);
|
|
|
|
if(res==DD_OK) lpd3d11->Release();
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
#endif
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
if(pDirect3DCreate8 || pDirect3DCreate9) return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
void HookD3DDevice8(void** ppD3Ddev8)
|
|
|
|
{
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("Device hook for IID_IDirect3DDevice8 interface\n");
|
2013-12-22 11:38:36 -05:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 0), extQueryInterfaceDev8, (void **)&pQueryInterfaceDev8, "QueryInterface(D8)");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 12), extTestCooperativeLevel8, (void **)&pTestCooperativeLevel8, "TestCooperativeLevel(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 16), extGetAvailableTextureMem8, (void **)&pGetAvailableTextureMem8, "GetAvailableTextureMem(D8)");
|
2014-03-15 12:38:56 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 24), extGetDirect3D8, (void **)&pGetDirect3D8, "GetDirect3D(D8)");
|
2013-12-22 11:38:36 -05:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 32), extGetDisplayMode8, (void **)&pGetDisplayMode8, "GetDisplayMode(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 44), extSetCursorPosition8, (void **)&pSetCursorPosition8, "SetCursorPosition(D8)");
|
2014-05-20 12:39:14 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 48), extShowCursor8, (void **)&pShowCursor8, "ShowCursor(D8)");
|
2016-04-17 12:45:41 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 52), extCreateAdditionalSwapChain8, (void **)&pCreateAdditionalSwapChain8, "CreateAdditionalSwapChain(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 56), extReset8, (void **)&pReset8, "Reset(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 60), extPresent8, (void **)&pPresent8, "Present(D8)");
|
2013-12-22 11:38:36 -05:00
|
|
|
if(dxw.dwFlags2 & DISABLEGAMMARAMP){
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 72), extSetGammaRamp8, (void **)&pSetGammaRamp8, "SetGammaRamp(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 76), extGetGammaRamp8, (void **)&pGetGammaRamp8, "GetGammaRamp(D8)");
|
2013-12-22 11:38:36 -05:00
|
|
|
}
|
2014-12-13 11:40:09 -05:00
|
|
|
if(dxw.dwFlags5 & TEXTUREMASK){
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 80), extCreateTexture8, (void **)&pCreateTexture8, "CreateTexture(D8)");
|
|
|
|
}
|
2015-10-05 12:40:44 -04:00
|
|
|
//SetHook((void *)(**(DWORD **)ppD3Ddev8 + 112), extCopyRects, (void **)&pCopyRects, "CopyRects(D8)");
|
2014-01-03 11:38:52 -05:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 100), extCreateRenderTarget8, (void **)&pCreateRenderTarget8, "CreateRenderTarget(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 136), extBeginScene8, (void **)&pBeginScene8, "BeginScene(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 140), extEndScene8, (void **)&pEndScene8, "EndScene(D8)");
|
|
|
|
if((dxw.dwFlags2 & WIREFRAME) || (dxw.dwFlags4 & DISABLEFOGGING) || (dxw.dwFlags4 & ZBUFFERALWAYS)){
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 200), extSetRenderState8, (void **)&pSetRenderState8, "SetRenderState(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 204), extGetRenderState8, (void **)&pGetRenderState8, "GetRenderState(D8)");
|
|
|
|
if(dxw.dwFlags2 & WIREFRAME) (*pSetRenderState8)((void *)*ppD3Ddev8, D3DRS_FILLMODE, D3DFILL_WIREFRAME);
|
|
|
|
if(dxw.dwFlags4 & DISABLEFOGGING) (*pSetRenderState8)((void *)*ppD3Ddev8, D3DRS_FOGENABLE, FALSE);
|
|
|
|
if(dxw.dwFlags4 & ZBUFFERALWAYS) (*pSetRenderState8)((void *)*ppD3Ddev8, D3DRS_ZFUNC, D3DCMP_ALWAYS);
|
|
|
|
//if(1) (*pSetRenderState8)((void *)*ppD3Ddev8, D3DRS_SPECULARENABLE, TRUE);
|
2013-12-22 11:38:36 -05:00
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 208), extBeginStateBlock8, (void **)&pBeginStateBlock8, "BeginStateBlock(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 212), extEndStateBlock8, (void **)&pEndStateBlock8, "EndStateBlock(D8)");
|
2015-10-05 12:40:44 -04:00
|
|
|
if((dxw.dwFlags5 & TEXTUREMASK) || (dxw.dwFlags4 & NOTEXTURES)){
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 244), extSetTexture8, (void **)&pSetTexture8, "SetTexture(D8)");
|
|
|
|
}
|
2014-01-03 11:38:52 -05:00
|
|
|
//if (!(dxw.dwTFlags & OUTPROXYTRACE)) return;
|
|
|
|
//SetHook((void *)(**(DWORD **)ppD3Ddev8 + 4), extAddRef8, (void **)&pAddRef8, "AddRef(D8)");
|
|
|
|
//SetHook((void *)(**(DWORD **)ppD3Ddev8 + 8), extRelease8, (void **)&pRelease8, "Release(D8)");
|
2013-12-22 11:38:36 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void HookD3DDevice9(void** ppD3Ddev9)
|
|
|
|
{
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("Device hook for IID_IDirect3DDevice9 interface\n");
|
2013-12-22 11:38:36 -05:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 0), extQueryInterfaceDev9, (void **)&pQueryInterfaceDev9, "QueryInterface(D9)");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 12), extTestCooperativeLevel9, (void **)&pTestCooperativeLevel9, "TestCooperativeLevel(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 16), extGetAvailableTextureMem9, (void **)&pGetAvailableTextureMem9, "GetAvailableTextureMem(D9)");
|
2014-03-15 12:38:56 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 24), extGetDirect3D9, (void **)&pGetDirect3D9, "GetDirect3D(D9)");
|
2013-12-22 11:38:36 -05:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 32), extGetDisplayMode9, (void **)&pGetDisplayMode9, "GetDisplayMode(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 44), extSetCursorPosition9, (void **)&pSetCursorPosition9, "SetCursorPosition(D9)");
|
2014-05-20 12:39:14 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 48), extShowCursor9, (void **)&pShowCursor9, "ShowCursor(D9)");
|
2016-04-17 12:45:41 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 52), extCreateAdditionalSwapChain9, (void **)&pCreateAdditionalSwapChain9, "CreateAdditionalSwapChain(D9)");
|
2014-10-06 12:39:20 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 56), extGetSwapChain, (void **)&pGetSwapChain, "GetSwapChain(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 60), extGetNumberOfSwapChains, (void **)&pGetNumberOfSwapChains, "extGetNumberOfSwapChains(D9)");
|
2016-04-17 12:45:41 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 64), extReset9, (void **)&pReset9, "Reset(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 68), extPresent9, (void **)&pPresent9, "Present(D9)");
|
2013-12-22 11:38:36 -05:00
|
|
|
if(dxw.dwFlags2 & DISABLEGAMMARAMP){
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 84), extSetGammaRamp9, (void **)&pSetGammaRamp9, "SetGammaRamp(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 88), extGetGammaRamp9, (void **)&pGetGammaRamp9, "GetGammaRamp(D9)");
|
2013-12-22 11:38:36 -05:00
|
|
|
}
|
2014-12-13 11:40:09 -05:00
|
|
|
if(dxw.dwFlags5 & TEXTUREMASK){
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 92), extCreateTexture9, (void **)&pCreateTexture9, "CreateTexture(D9)");
|
|
|
|
}
|
2015-10-05 12:40:44 -04:00
|
|
|
#ifdef DXWNDDISABLEDHOOKS
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 120), extUpdateSurface, (void **)&pUpdateSurface, "UpdateSurface(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 124), extUpdateTexture, (void **)&pUpdateTexture, "UpdateTexture(D9)");
|
|
|
|
#endif
|
|
|
|
|
2016-04-03 12:42:48 -04:00
|
|
|
//SetHook((void *)(**(DWORD **)ppD3Ddev9 + 112), extCreateRenderTarget9, (void **)&pCreateRenderTarget9, "CreateRenderTarget(D9)");
|
2014-01-03 11:38:52 -05:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 164), extBeginScene9, (void **)&pBeginScene9, "BeginScene(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 168), extEndScene9, (void **)&pEndScene9, "EndScene(D9)");
|
2013-12-22 11:38:36 -05:00
|
|
|
//SetHook((void *)(**(DWORD **)ppD3Ddev9 +188), extSetViewport, (void **)&pSetViewport, "SetViewport(D9)");
|
|
|
|
//SetHook((void *)(**(DWORD **)ppD3Ddev9 +192), extGetViewport, (void **)&pGetViewport, "GetViewport(D9)");
|
2014-01-03 11:38:52 -05:00
|
|
|
if((dxw.dwFlags2 & WIREFRAME) || (dxw.dwFlags4 & DISABLEFOGGING) || (dxw.dwFlags4 & ZBUFFERALWAYS)){
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 228), extSetRenderState9, (void **)&pSetRenderState9, "SetRenderState(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 232), extGetRenderState9, (void **)&pGetRenderState9, "GetRenderState(D9)");
|
|
|
|
if(dxw.dwFlags2 & WIREFRAME) (*pSetRenderState9)((void *)*ppD3Ddev9, D3DRS_FILLMODE, D3DFILL_WIREFRAME);
|
|
|
|
if(dxw.dwFlags4 & DISABLEFOGGING) (*pSetRenderState9)((void *)*ppD3Ddev9, D3DRS_FOGENABLE, FALSE);
|
|
|
|
if(dxw.dwFlags4 & ZBUFFERALWAYS) (*pSetRenderState9)((void *)*ppD3Ddev9, D3DRS_ZFUNC, D3DCMP_ALWAYS);
|
|
|
|
//if(1) (*pSetRenderState9)((void *)*ppD3Ddev9, D3DRS_SPECULARENABLE, TRUE);
|
2013-12-22 11:38:36 -05:00
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 240), extBeginStateBlock9, (void **)&pBeginStateBlock9, "BeginStateBlock(D9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 244), extEndStateBlock9, (void **)&pEndStateBlock9, "EndStateBlock(D9)");
|
2015-10-05 12:40:44 -04:00
|
|
|
if((dxw.dwFlags5 & TEXTUREMASK) || (dxw.dwFlags4 & NOTEXTURES)){
|
2014-10-06 12:39:20 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Ddev9 + 260), extSetTexture9, (void **)&pSetTexture9, "SetTexture(D9)");
|
|
|
|
}
|
2013-12-22 11:38:36 -05:00
|
|
|
}
|
|
|
|
|
2014-12-13 11:40:09 -05:00
|
|
|
// WIP
|
|
|
|
void HookD3DTexture8(void** ppD3Dtex8)
|
|
|
|
{
|
|
|
|
OutTraceD3D("Device hook for IDirect3DTexture8 interface\n");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Dtex8 + 64), extLockRect8, (void **)&pLockRect8, "LockRect(D8)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Dtex8 + 68), extUnlockRect8, (void **)&pUnlockRect8, "UnlockRect(D8)");
|
2014-12-13 11:40:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void HookD3DTexture9(void** ppD3Dtex9)
|
|
|
|
{
|
|
|
|
OutTraceD3D("Device hook for IDirect3DTexture9 interface\n");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(**(DWORD **)ppD3Dtex9 + 76), extLockRect9, (void **)&pLockRect9, "LockRect(T9)");
|
|
|
|
SetHook((void *)(**(DWORD **)ppD3Dtex9 + 80), extUnlockRect9, (void **)&pUnlockRect9, "UnlockRect(T9)");
|
2014-12-13 11:40:09 -05:00
|
|
|
}
|
|
|
|
|
2014-03-15 12:38:56 -04:00
|
|
|
void HookDirect3D8(void *lpd3d)
|
|
|
|
{
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 0), extQueryInterfaceD3D8, (void **)&pQueryInterfaceD3D8, "QueryInterface(D8)");
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 16), extGetAdapterCount8, (void **)&pGetAdapterCount8, "GetAdapterCount(D8)");
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier8, (void **)&pGetAdapterIdentifier8, "GetAdapterIdentifier(D8)");
|
2016-07-09 12:47:08 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 24), extGetAdapterModeCount8, (void **)&pGetAdapterModeCount8, "GetAdapterGetAdapterModeCount(D8)");
|
2014-03-15 12:38:56 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes8, (void **)&pEnumAdapterModes8, "EnumAdapterModes(D8)");
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode8, (void **)&pGetAdapterDisplayMode8, "GetAdapterDisplayMode(D8)");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 36), extCheckDeviceType8, (void **)&pCheckDeviceType8, "CheckDeviceType(D8)");
|
2016-04-17 12:45:41 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 52), extD3DGetDeviceCaps8, (void **)&pD3DGetDeviceCaps8, "GetDeviceCaps(D8)");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 56), extGetAdapterMonitor8, (void **)&pGetAdapterMonitor8, "GetAdapterMonitor(D8)");
|
2016-04-17 12:45:41 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 60), extCreateDevice8, (void **)&pCreateDevice8, "CreateDevice(D8)");
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
2013-12-22 11:38:36 -05:00
|
|
|
|
2014-12-13 11:40:09 -05:00
|
|
|
BOOL WINAPI extDisableD3DSpy(void)
|
|
|
|
{
|
|
|
|
if(TRUE) return FALSE;
|
|
|
|
return (*pDisableD3DSpy)();
|
|
|
|
}
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
void* WINAPI extDirect3DCreate8(UINT sdkversion)
|
|
|
|
{
|
|
|
|
void *lpd3d;
|
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("Direct3DCreate8: sdkversion=%x\n", sdkversion);
|
2012-12-24 10:20:23 -05:00
|
|
|
lpd3d = (*pDirect3DCreate8)(sdkversion);
|
2013-12-22 11:38:36 -05:00
|
|
|
if(!lpd3d) {
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceE("Direct3DCreate8: ERROR err=%d\n", GetLastError());
|
2013-12-22 11:38:36 -05:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
dwD3DVersion = 8;
|
2014-03-15 12:38:56 -04:00
|
|
|
HookDirect3D8(lpd3d);
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("Direct3DCreate8: d3d=%x\n", lpd3d);
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
return lpd3d;
|
|
|
|
}
|
|
|
|
|
2014-03-15 12:38:56 -04:00
|
|
|
void HookDirect3D9(void *lpd3d, BOOL ex)
|
|
|
|
{
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 0), extQueryInterfaceD3D9, (void **)&pQueryInterfaceD3D9, "QueryInterface(D9)");
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 16), extGetAdapterCount9, (void **)&pGetAdapterCount9, "GetAdapterCount(D9)");
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier9, (void **)&pGetAdapterIdentifier9, "GetAdapterIdentifier(D9)");
|
2016-07-09 12:47:08 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 24), extGetAdapterModeCount9, (void **)&pGetAdapterModeCount9, "GetAdapterGetAdapterModeCount(D9)");
|
2014-03-15 12:38:56 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes9, (void **)&pEnumAdapterModes9, "EnumAdapterModes(D9)");
|
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode9, (void **)&pGetAdapterDisplayMode9, "GetAdapterDisplayMode(D9)");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 36), extCheckDeviceType9, (void **)&pCheckDeviceType9, "CheckDeviceType(D9)");
|
2016-04-17 12:45:41 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 56), extD3DGetDeviceCaps9, (void **)&pD3DGetDeviceCaps9, "GetDeviceCaps(D9)");
|
2016-04-20 12:45:44 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 60), extGetAdapterMonitor9, (void **)&pGetAdapterMonitor9, "GetAdapterMonitor(D9)");
|
2016-04-17 12:45:41 -04:00
|
|
|
SetHook((void *)(*(DWORD *)lpd3d + 64), extCreateDevice9, (void **)&pCreateDevice9, "CreateDevice(D9)");
|
2014-03-15 12:38:56 -04:00
|
|
|
if(ex) SetHook((void *)(*(DWORD *)lpd3d + 80), extCreateDeviceEx, (void **)&pCreateDeviceEx, "CreateDeviceEx(D9)");
|
|
|
|
}
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
void* WINAPI extDirect3DCreate9(UINT sdkversion)
|
|
|
|
{
|
2013-12-22 11:38:36 -05:00
|
|
|
void *lpd3d;
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("Direct3DCreate9: sdkversion=%x\n", sdkversion);
|
2012-12-24 10:20:23 -05:00
|
|
|
lpd3d = (*pDirect3DCreate9)(sdkversion);
|
2013-12-22 11:38:36 -05:00
|
|
|
if(!lpd3d) {
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceE("Direct3DCreate9: ERROR err=%d\n", GetLastError());
|
2013-12-22 11:38:36 -05:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
dwD3DVersion = 9;
|
2014-03-15 12:38:56 -04:00
|
|
|
HookDirect3D9(lpd3d, FALSE);
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("Direct3DCreate9: d3d=%x\n", lpd3d);
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
return lpd3d;
|
|
|
|
}
|
|
|
|
|
2013-02-06 11:19:16 -05:00
|
|
|
HRESULT WINAPI extDirect3DCreate9Ex(UINT sdkversion, IDirect3D9Ex **ppD3D)
|
|
|
|
{
|
|
|
|
void *lpd3d;
|
|
|
|
HRESULT res;
|
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("Direct3DCreate9Ex: sdkversion=%x\n", sdkversion);
|
2013-02-06 11:19:16 -05:00
|
|
|
res = (*pDirect3DCreate9Ex)(sdkversion, ppD3D);
|
|
|
|
if(res) {
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceE("Direct3DCreate9Ex: ERROR res=%x(%s)\n", res, ExplainDDError(res));
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
2013-12-22 11:38:36 -05:00
|
|
|
dwD3DVersion = 9;
|
2013-02-06 11:19:16 -05:00
|
|
|
lpd3d = *ppD3D;
|
2014-03-15 12:38:56 -04:00
|
|
|
HookDirect3D9(lpd3d, TRUE);
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("Direct3DCreate9Ex: d3d=%x\n", lpd3d);
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2013-07-09 12:38:16 -04:00
|
|
|
UINT WINAPI extGetAdapterCount8(void *lpd3d)
|
2013-06-01 12:16:52 -04:00
|
|
|
{
|
|
|
|
UINT res;
|
2013-07-09 12:38:16 -04:00
|
|
|
res=(*pGetAdapterCount8)(lpd3d);
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceD3D("GetAdapterCount(8): count=%d\n", res);
|
2013-06-01 12:16:52 -04:00
|
|
|
if(dxw.dwFlags2 & HIDEMULTIMONITOR) {
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetAdapterCount: HIDEMULTIMONITOR count=1\n");
|
2013-06-01 12:16:52 -04:00
|
|
|
res=1;
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2013-07-09 12:38:16 -04:00
|
|
|
UINT WINAPI extGetAdapterCount9(void *lpd3d)
|
|
|
|
{
|
|
|
|
UINT res;
|
|
|
|
res=(*pGetAdapterCount9)(lpd3d);
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceD3D("GetAdapterCount(9): count=%d\n", res);
|
2013-07-09 12:38:16 -04:00
|
|
|
if(dxw.dwFlags2 & HIDEMULTIMONITOR) {
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetAdapterCount: HIDEMULTIMONITOR count=1\n");
|
2013-07-09 12:38:16 -04:00
|
|
|
res=1;
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extGetAdapterIdentifier8(void *pd3dd, UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9 *pIdentifier)
|
2013-02-06 11:19:16 -05:00
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("GetAdapterIdentifier(8): Adapter=%d flags=%x\n", Adapter, Flags);
|
2013-07-09 12:38:16 -04:00
|
|
|
res=pGetAdapterIdentifier8(pd3dd, Adapter, Flags, pIdentifier);
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("GetAdapterIdentifier(8): ret=%x\n", res);
|
2014-05-29 12:39:18 -04:00
|
|
|
//if(pIdentifier){
|
|
|
|
// OutTraceD3D("\tDriver=%s\n", pIdentifier->Driver);
|
|
|
|
// OutTraceD3D("\tDescription=%s\n", pIdentifier->Description);
|
|
|
|
// OutTraceD3D("\tDeviceName=%s\n", pIdentifier->DeviceName);
|
|
|
|
// OutTraceD3D("\tVersion=%x\n", pIdentifier->DriverVersion);
|
|
|
|
//}
|
2013-07-09 12:38:16 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extGetAdapterIdentifier9(void *pd3dd, UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9 *pIdentifier)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("GetAdapterIdentifier(9): Adapter=%d flags=%x\n", Adapter, Flags);
|
2013-07-09 12:38:16 -04:00
|
|
|
res=pGetAdapterIdentifier9(pd3dd, Adapter, Flags, pIdentifier);
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("GetAdapterIdentifier(9): ret=%x\n", res);
|
2014-05-29 12:39:18 -04:00
|
|
|
if(pIdentifier){
|
|
|
|
OutTraceD3D("\tDriver=%s\n", pIdentifier->Driver);
|
|
|
|
OutTraceD3D("\tDescription=%s\n", pIdentifier->Description);
|
|
|
|
OutTraceD3D("\tDeviceName=%s\n", pIdentifier->DeviceName);
|
|
|
|
OutTraceD3D("\tVersion=%x\n", pIdentifier->DriverVersion);
|
|
|
|
OutTraceD3D("\tVendorId=%x\n", pIdentifier->VendorId);
|
|
|
|
OutTraceD3D("\tDeviceId=%x\n", pIdentifier->DeviceId);
|
|
|
|
OutTraceD3D("\tSubSysId=%x\n", pIdentifier->SubSysId);
|
|
|
|
OutTraceD3D("\tWHQLLevel=%x\n", pIdentifier->WHQLLevel);
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2015-07-04 12:40:35 -04:00
|
|
|
static char *ExplainSwapEffect(DWORD f)
|
|
|
|
{
|
|
|
|
char *s;
|
|
|
|
switch(f){
|
|
|
|
case D3DSWAPEFFECT_DISCARD: s="DISCARD"; break;
|
|
|
|
case D3DSWAPEFFECT_FLIP: s="FLIP"; break;
|
|
|
|
case D3DSWAPEFFECT_COPY: s="COPY"; break;
|
|
|
|
case D3DSWAPEFFECT_OVERLAY: s="OVERLAY"; break;
|
|
|
|
case D3DSWAPEFFECT_FLIPEX: s="FLIPEX"; break;
|
|
|
|
default: s="unknown"; break;
|
|
|
|
}
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
static HRESULT WINAPI extReset(int dwD3DVersion, void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam)
|
2012-12-24 10:20:23 -05:00
|
|
|
{
|
2014-03-15 12:38:56 -04:00
|
|
|
HRESULT res;
|
|
|
|
DWORD param[64], *tmp;
|
|
|
|
D3DDISPLAYMODE mode;
|
2014-10-06 12:39:20 -04:00
|
|
|
DWORD Windowed;
|
2014-03-15 12:38:56 -04:00
|
|
|
void *pD3D;
|
2016-04-17 12:45:41 -04:00
|
|
|
Reset_Type pReset;
|
2014-03-15 12:38:56 -04:00
|
|
|
|
|
|
|
memcpy(param, pPresParam, (dwD3DVersion == 9)?56:52);
|
2015-07-04 12:40:35 -04:00
|
|
|
dxw.SetScreenSize(param[0], param[1]);
|
2014-03-15 12:38:56 -04:00
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
if(IsTraceD3D){
|
2014-03-15 12:38:56 -04:00
|
|
|
tmp = param;
|
2015-07-04 12:40:35 -04:00
|
|
|
DWORD SwapEffect;
|
2014-03-15 12:38:56 -04:00
|
|
|
OutTrace("D3D%d::Reset\n", dwD3DVersion);
|
|
|
|
OutTrace(" BackBufferWidth = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferHeight = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferCount = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" MultiSampleType = %i\n", *(tmp ++));
|
|
|
|
if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++));
|
2015-07-04 12:40:35 -04:00
|
|
|
SwapEffect = *(tmp ++);
|
|
|
|
OutTrace(" SwapEffect = 0x%x(%s)\n", SwapEffect, ExplainSwapEffect(SwapEffect));
|
2014-03-15 12:38:56 -04:00
|
|
|
OutTrace(" hDeviceWindow = 0x%x\n", *(tmp ++));
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTrace(" Windowed = %i\n", *(tmp ++));
|
2014-03-15 12:38:56 -04:00
|
|
|
OutTrace(" EnableAutoDepthStencil = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" AutoDepthStencilFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" Flags = 0x%x\n", *(tmp ++));
|
|
|
|
OutTrace(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++));
|
|
|
|
}
|
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
Windowed = (dwD3DVersion == 8) ? param[7] : param[8];
|
2016-04-17 12:45:41 -04:00
|
|
|
pReset = (dwD3DVersion == 8) ? pReset8 : pReset9;
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize){
|
|
|
|
if(Windowed) {
|
|
|
|
// do not attempt to reset when returning to windowed mode: it is useless (you are windowed already)
|
|
|
|
// and the code below (GetDirect3D, ...) doesn't work.
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("SKIPPED!\n");
|
2014-02-05 11:39:10 -05:00
|
|
|
return DD_OK;
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
2014-02-05 11:39:10 -05:00
|
|
|
|
|
|
|
if (dwD3DVersion == 9){
|
|
|
|
res=(*pGetDirect3D9)(pd3dd, &pD3D);
|
|
|
|
if(res) {
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetDirect3D FAILED! %x\n", res);
|
2014-02-05 11:39:10 -05:00
|
|
|
return(DD_OK);
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetDirect3D pd3d=%x\n", pD3D);
|
2014-02-05 11:39:10 -05:00
|
|
|
res=(*pGetAdapterDisplayMode9)(pD3D, 0, &mode);
|
|
|
|
if(res) {
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetAdapterDisplayMode FAILED! %x\n", res);
|
2014-02-05 11:39:10 -05:00
|
|
|
return(DD_OK);
|
|
|
|
}
|
2015-04-26 12:40:41 -04:00
|
|
|
if(dxw.dwFlags6 & FORCESWAPEFFECT) param[6] = dxw.SwapEffect; //Swap effect;
|
|
|
|
dwD3DSwapEffect = param[6];
|
2014-02-05 11:39:10 -05:00
|
|
|
param[7] = 0; //hDeviceWindow
|
|
|
|
dxw.SetFullScreen(~param[8]?TRUE:FALSE);
|
|
|
|
param[8] = 1; //Windowed
|
|
|
|
//param[11] = D3DPRESENTFLAG_DEVICECLIP; //Flags;
|
|
|
|
param[12] = 0; //FullScreen_RefreshRateInHz;
|
|
|
|
param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
2014-02-05 11:39:10 -05:00
|
|
|
else{
|
|
|
|
res=(*pGetDirect3D8)(pd3dd, &pD3D);
|
|
|
|
if(res) {
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetDirect3D FAILED! %x\n", res);
|
2014-02-05 11:39:10 -05:00
|
|
|
return(DD_OK);
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetDirect3D pd3d=%x\n", pD3D);
|
2014-02-05 11:39:10 -05:00
|
|
|
res=(*pGetAdapterDisplayMode8)(pD3D, 0, &mode);
|
|
|
|
if(res) {
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetAdapterDisplayMode FAILED! %x\n", res);
|
2014-02-05 11:39:10 -05:00
|
|
|
return(DD_OK);
|
|
|
|
}
|
2015-04-26 12:40:41 -04:00
|
|
|
if(dxw.dwFlags6 & FORCESWAPEFFECT) param[5] = dxw.SwapEffect; //Swap effect;
|
|
|
|
dwD3DSwapEffect = param[5];
|
2014-02-05 11:39:10 -05:00
|
|
|
param[6] = 0; //hDeviceWindow
|
|
|
|
dxw.SetFullScreen(~param[7]?TRUE:FALSE);
|
|
|
|
param[7] = 1; //Windowed
|
|
|
|
//param[10] = D3DPRESENTFLAG_DEVICECLIP; //Flags;
|
|
|
|
param[11] = 0; //FullScreen_RefreshRateInHz;
|
|
|
|
param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-20 12:39:14 -04:00
|
|
|
if(!(dxw.dwFlags4 & NOD3DRESET)){
|
|
|
|
res = (*pReset)(pd3dd, (D3DPRESENT_PARAMETERS *)param);
|
2014-07-13 12:39:33 -04:00
|
|
|
if(res){
|
|
|
|
OutTraceD3D("switching to mode=%x\n", mode.Format);
|
|
|
|
param[2] = mode.Format; // first attempt: current screen mode
|
|
|
|
res = (*pReset)(pd3dd, (D3DPRESENT_PARAMETERS *)param);
|
|
|
|
}
|
|
|
|
if(res){
|
|
|
|
OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n");
|
|
|
|
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
|
|
|
|
res = (*pReset)(pd3dd, (D3DPRESENT_PARAMETERS *)param);
|
|
|
|
}
|
2014-05-20 12:39:14 -04:00
|
|
|
if(res == D3DERR_INVALIDCALL){
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("FAILED! D3DERR_INVALIDCALL\n", res);
|
2014-05-20 12:39:14 -04:00
|
|
|
return D3DERR_INVALIDCALL;
|
|
|
|
}
|
|
|
|
if(res){
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("FAILED! %x\n", res);
|
2014-05-20 12:39:14 -04:00
|
|
|
return res;
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("SUCCESS!\n");
|
2014-05-20 12:39:14 -04:00
|
|
|
(dwD3DVersion == 8) ? HookD3DDevice8(&pd3dd) : HookD3DDevice9(&pd3dd);
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
2014-05-20 12:39:14 -04:00
|
|
|
else{
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("SKIPPED!\n");
|
2014-05-20 12:39:14 -04:00
|
|
|
res=D3D_OK;
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
dxw.SetScreenSize(pPresParam->BackBufferWidth, pPresParam->BackBufferHeight);
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(mode.RefreshRate);
|
2014-03-15 12:38:56 -04:00
|
|
|
|
|
|
|
GetHookInfo()->IsFullScreen = dxw.IsFullScreen();
|
|
|
|
GetHookInfo()->DXVersion=(short)dwD3DVersion;
|
|
|
|
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
|
|
|
|
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
|
|
|
|
GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
return D3D_OK;
|
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extReset8(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam)
|
|
|
|
{ return extReset(8, pd3dd, pPresParam); }
|
|
|
|
HRESULT WINAPI extReset9(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam)
|
|
|
|
{ return extReset(9, pd3dd, pPresParam); }
|
|
|
|
|
|
|
|
static HRESULT WINAPI extPresent(Present_Type pPresent, void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
|
2013-01-25 11:17:02 -05:00
|
|
|
{
|
2013-02-06 11:19:16 -05:00
|
|
|
HRESULT res;
|
2015-07-04 12:40:35 -04:00
|
|
|
RECT RemappedSrcRect, RemappedDstRect;
|
2015-03-22 12:40:33 -04:00
|
|
|
if(IsDebug){
|
|
|
|
char sSourceRect[81];
|
|
|
|
char sDestRect[81];
|
|
|
|
if (pSourceRect) sprintf_s(sSourceRect, 80, "(%d,%d)-(%d,%d)", pSourceRect->left, pSourceRect->top, pSourceRect->right, pSourceRect->bottom);
|
|
|
|
else strcpy(sSourceRect, "(NULL)");
|
|
|
|
if (pDestRect) sprintf_s(sDestRect, 80, "(%d,%d)-(%d,%d)", pDestRect->left, pDestRect->top, pDestRect->right, pDestRect->bottom);
|
|
|
|
else strcpy(sDestRect, "(NULL)");
|
|
|
|
OutTraceB("Present: SourceRect=%s DestRect=%s hDestWndOverride=%x\n", sSourceRect, sDestRect, hDestWindowOverride);
|
|
|
|
}
|
2015-07-04 12:40:35 -04:00
|
|
|
|
2013-01-25 11:17:02 -05:00
|
|
|
// frame counter handling....
|
|
|
|
if (dxw.HandleFPS()) return D3D_OK;
|
2014-10-08 12:39:38 -04:00
|
|
|
if (dxw.dwFlags1 & SAVELOAD) dxw.VSyncWait();
|
2015-07-04 12:40:35 -04:00
|
|
|
|
2015-03-22 12:40:33 -04:00
|
|
|
if(dxw.dwFlags2 & FULLRECTBLT) pSourceRect = pDestRect = NULL;
|
2015-07-04 12:40:35 -04:00
|
|
|
if(dxw.Windowize){
|
|
|
|
// v2.03.15 - fix target RECT region
|
2015-04-26 12:40:41 -04:00
|
|
|
if ((dwD3DSwapEffect == D3DSWAPEFFECT_COPY) && (dxw.dwFlags2 & KEEPASPECTRATIO)) {
|
2015-10-05 12:40:44 -04:00
|
|
|
RemappedDstRect=dxw.MapClientRect((LPRECT)pDestRect);
|
|
|
|
pDestRect = &RemappedDstRect;
|
|
|
|
OutTraceB("Present: FIXED DestRect=(%d,%d)-(%d,%d)\n", RemappedDstRect.left, RemappedDstRect.top, RemappedDstRect.right, RemappedDstRect.bottom);
|
2015-04-26 12:40:41 -04:00
|
|
|
}
|
2015-07-04 12:40:35 -04:00
|
|
|
// in case of NOD3DRESET, remap source rect. Unfortunately, this doesn't work in fullscreen mode ....
|
|
|
|
if((dxw.dwFlags4 & NOD3DRESET) && (pSourceRect == NULL)){
|
|
|
|
RemappedSrcRect = dxw.GetScreenRect();
|
|
|
|
pSourceRect = &RemappedSrcRect;
|
|
|
|
OutTraceB("Present: NOD3DRESET FIXED SourceRect=(%d,%d)-(%d,%d)\n", RemappedSrcRect.left, RemappedSrcRect.top, RemappedSrcRect.right, RemappedSrcRect.bottom);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
res=(*pPresent)(pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
|
|
|
|
if(res) OutTraceE("Present: err=%x(%s)\n", res, ExplainDDError(res));
|
2013-03-12 12:38:32 -04:00
|
|
|
dxw.ShowOverlay();
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
2013-01-25 11:17:02 -05:00
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extPresent8(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
|
|
|
|
{ return extPresent(pPresent8, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); }
|
|
|
|
HRESULT WINAPI extPresent9(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
|
|
|
|
{ return extPresent(pPresent9, pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); }
|
|
|
|
|
2013-10-21 12:38:23 -04:00
|
|
|
HRESULT WINAPI extGetDisplayMode8(void *lpd3d, D3DDISPLAYMODE *pMode)
|
2012-12-24 10:20:23 -05:00
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-10-21 12:38:23 -04:00
|
|
|
res=(*pGetDisplayMode8)(lpd3d, pMode);
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceD3D("GetDisplayMode(8): size=(%dx%d) RefreshRate=%d Format=%d\n",
|
2012-12-24 10:20:23 -05:00
|
|
|
pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format);
|
2013-01-04 10:30:38 -05:00
|
|
|
if(dxw.dwFlags2 & KEEPASPECTRATIO){
|
2013-01-19 11:16:54 -05:00
|
|
|
pMode->Width=dxw.iSizX;
|
|
|
|
pMode->Height=dxw.iSizY;
|
2013-10-21 12:38:23 -04:00
|
|
|
}
|
2014-02-02 11:38:46 -05:00
|
|
|
else{
|
|
|
|
pMode->Width = dxw.GetScreenWidth();
|
|
|
|
pMode->Height = dxw.GetScreenHeight();
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height);
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(pMode->RefreshRate);
|
2013-10-21 12:38:23 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extGetDisplayMode9(void *lpd3d, UINT iSwapChain, D3DDISPLAYMODE *pMode)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
res=(*pGetDisplayMode9)(lpd3d, iSwapChain, pMode);
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceD3D("GetDisplayMode(9): SwapChain=%d size=(%dx%d) RefreshRate=%d Format=%d\n",
|
2013-10-21 12:38:23 -04:00
|
|
|
iSwapChain, pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format);
|
|
|
|
if(dxw.dwFlags2 & KEEPASPECTRATIO){
|
|
|
|
pMode->Width=dxw.iSizX;
|
|
|
|
pMode->Height=dxw.iSizY;
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
2014-02-02 11:38:46 -05:00
|
|
|
else{
|
|
|
|
pMode->Width = dxw.GetScreenWidth();
|
|
|
|
pMode->Height = dxw.GetScreenHeight();
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height);
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(pMode->RefreshRate);
|
2012-12-24 10:20:23 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extEnumAdapterModes8(void *lpd3d, UINT Adapter, UINT Mode, D3DDISPLAYMODE* pMode)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("EnumAdapterModes(8): adapter=%d mode=%d pMode=%x\n", Adapter, Mode, pMode);
|
2016-07-09 12:47:08 -04:00
|
|
|
if(dxw.dwFlags7 & ENUM16BITMODES){
|
|
|
|
res=(*pEnumAdapterModes8)(lpd3d, Adapter, Mode/2, pMode);
|
|
|
|
if((res == D3D_OK) && (Mode % 2)){
|
|
|
|
pMode->Format = (dxw.dwFlags1 & USERGB565)? D3DFMT_R5G6B5 : D3DFMT_A1R5G5B5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
res=(*pEnumAdapterModes8)(lpd3d, Adapter, Mode, pMode);
|
|
|
|
if(res) {
|
|
|
|
OutTraceE("EnumAdapterModes ERROR: err=%x(%s)\n", res, ExplainDDError(res));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
OutTraceD3D("EnumAdapterModes(8): res=(%dx%d) refresh=%dHz format=%d(%s)\n",
|
|
|
|
pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format, ExplainD3DSurfaceFormat(pMode->Format));
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extEnumAdapterModes9(void *lpd3d, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("EnumAdapterModes(9): adapter=%d format=%x mode=%d pMode=%x\n", Adapter, Format, Mode, pMode);
|
2016-07-09 12:47:08 -04:00
|
|
|
if(dxw.dwFlags7 & ENUM16BITMODES){
|
|
|
|
res=(*pEnumAdapterModes9)(lpd3d, Adapter, Format, Mode/2, pMode);
|
|
|
|
if((res == D3D_OK) && (Mode % 2)){
|
|
|
|
pMode->Format = (dxw.dwFlags1 & USERGB565)? D3DFMT_R5G6B5 : D3DFMT_A1R5G5B5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
res=(*pEnumAdapterModes9)(lpd3d, Adapter, Format, Mode, pMode);
|
|
|
|
if(res) {
|
|
|
|
OutTraceE("EnumAdapterModes ERROR: err=%x(%s)\n", res, ExplainDDError(res));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
OutTraceD3D("EnumAdapterModes(9): res=(%dx%d) refresh=%dHz format=%d(%s)\n",
|
|
|
|
pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format, ExplainD3DSurfaceFormat(pMode->Format));
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2013-07-09 12:38:16 -04:00
|
|
|
HRESULT WINAPI extGetAdapterDisplayMode8(void *lpd3d, UINT Adapter, D3DDISPLAYMODE *pMode)
|
2012-12-24 10:20:23 -05:00
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-07-09 12:38:16 -04:00
|
|
|
res=(*pGetAdapterDisplayMode8)(lpd3d, Adapter, pMode);
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceD3D("GetAdapterDisplayMode(8): size=(%dx%d) RefreshRate=%d Format=%d\n",
|
2012-12-24 10:20:23 -05:00
|
|
|
pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format);
|
2013-01-04 10:30:38 -05:00
|
|
|
if(dxw.dwFlags2 & KEEPASPECTRATIO){
|
2013-01-19 11:16:54 -05:00
|
|
|
pMode->Width=dxw.iSizX;
|
|
|
|
pMode->Height=dxw.iSizY;
|
2013-07-09 12:38:16 -04:00
|
|
|
}
|
2014-02-02 11:38:46 -05:00
|
|
|
else{
|
|
|
|
pMode->Width = dxw.GetScreenWidth();
|
|
|
|
pMode->Height = dxw.GetScreenHeight();
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetAdapterDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height);
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(pMode->RefreshRate);
|
2013-07-09 12:38:16 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extGetAdapterDisplayMode9(void *lpd3d, UINT Adapter, D3DDISPLAYMODE *pMode)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
res=(*pGetAdapterDisplayMode9)(lpd3d, Adapter, pMode);
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceD3D("GetAdapterDisplayMode(9): size=(%dx%d) RefreshRate=%d Format=%d\n",
|
2013-07-09 12:38:16 -04:00
|
|
|
pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format);
|
|
|
|
if(dxw.dwFlags2 & KEEPASPECTRATIO){
|
|
|
|
pMode->Width=dxw.iSizX;
|
|
|
|
pMode->Height=dxw.iSizY;
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
2014-02-02 11:38:46 -05:00
|
|
|
else{
|
|
|
|
pMode->Width = dxw.GetScreenWidth();
|
|
|
|
pMode->Height = dxw.GetScreenHeight();
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("GetAdapterDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height);
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(pMode->RefreshRate);
|
2012-12-24 10:20:23 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2014-08-10 12:39:50 -04:00
|
|
|
HWND FixD3DWindowFrame(HWND hFocusWin)
|
2013-06-15 12:21:25 -04:00
|
|
|
{
|
2014-08-10 12:39:50 -04:00
|
|
|
extern void HookWindowProc(HWND);
|
|
|
|
HWND hRetWnd = hFocusWin;
|
|
|
|
|
2014-02-05 11:39:10 -05:00
|
|
|
if(!(dxw.dwFlags3 & NOWINDOWMOVE))
|
|
|
|
AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight());
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2013-06-15 12:21:25 -04:00
|
|
|
if(dxw.dwFlags3 & FIXD3DFRAME){
|
|
|
|
char ClassName[81];
|
2013-06-29 12:38:04 -04:00
|
|
|
RECT workarea;
|
2014-08-10 12:39:50 -04:00
|
|
|
HWND hChildWin;
|
2013-06-15 12:21:25 -04:00
|
|
|
GetClassName(dxw.GethWnd(), ClassName, 80);
|
2013-06-29 12:38:04 -04:00
|
|
|
(*pGetClientRect)(dxw.GethWnd(), &workarea);
|
2013-09-16 12:38:17 -04:00
|
|
|
if (dxw.dwFlags2 & KEEPASPECTRATIO) dxw.FixWorkarea(&workarea);
|
2014-08-10 12:39:50 -04:00
|
|
|
hChildWin=(*pCreateWindowExA)(
|
2013-06-15 12:21:25 -04:00
|
|
|
0, ClassName, "child",
|
|
|
|
WS_CHILD|WS_VISIBLE,
|
|
|
|
//GetSystemMetrics(SM_CXSIZEFRAME), GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYCAPTION),
|
2013-06-29 12:38:04 -04:00
|
|
|
workarea.left, workarea.top, workarea.right-workarea.left, workarea.bottom-workarea.top,
|
2014-08-10 12:39:50 -04:00
|
|
|
//workarea.left+20, workarea.top+20, workarea.right-workarea.left-40, workarea.bottom-workarea.top-40,
|
2013-06-29 12:38:04 -04:00
|
|
|
dxw.GethWnd(), NULL, NULL, NULL);
|
2014-08-10 12:39:50 -04:00
|
|
|
if (hChildWin)
|
|
|
|
OutTraceD3D("CreateDevice: ChildWin=%x pos=(%d,%d) size=(%d,%d)\n",
|
|
|
|
hChildWin, workarea.left, workarea.top, workarea.right-workarea.left, workarea.bottom-workarea.top);
|
2013-06-15 12:21:25 -04:00
|
|
|
else
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceE("CreateDevice: CreateWindowEx ERROR err=%d\n", GetLastError());
|
2014-08-10 12:39:50 -04:00
|
|
|
dxw.SethWnd(hChildWin, dxw.GethWnd());
|
|
|
|
HookWindowProc(hChildWin);
|
|
|
|
hRetWnd = hChildWin;
|
2013-06-15 12:21:25 -04:00
|
|
|
}
|
2014-08-10 12:39:50 -04:00
|
|
|
|
|
|
|
return hRetWnd;
|
2014-02-05 11:39:10 -05:00
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype,
|
|
|
|
HWND hfocuswindow, DWORD behaviorflags, D3DPRESENT_PARAMETERS *ppresentparam, void **ppd3dd, int dwD3DVersion)
|
2014-02-05 11:39:10 -05:00
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
DWORD param[64], *tmp;
|
|
|
|
D3DDISPLAYMODE mode;
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
OutTraceD3D("CreateDevice(%d): lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n",
|
2014-02-05 11:39:10 -05:00
|
|
|
dwD3DVersion, lpd3d, adapter, hfocuswindow, behaviorflags, ppresentparam->BackBufferWidth, ppresentparam->BackBufferHeight);
|
|
|
|
|
|
|
|
memcpy(param, ppresentparam, (dwD3DVersion == 9)?56:52);
|
|
|
|
dxw.SethWnd(hfocuswindow);
|
|
|
|
dxw.SetScreenSize(param[0], param[1]);
|
|
|
|
|
2014-08-10 12:39:50 -04:00
|
|
|
if(dxw.Windowize) hfocuswindow=FixD3DWindowFrame(hfocuswindow);
|
2013-06-15 12:21:25 -04:00
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
if(IsTraceD3D){
|
2013-12-22 11:38:36 -05:00
|
|
|
tmp = param;
|
2015-07-04 12:40:35 -04:00
|
|
|
DWORD SwapEffect;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace("D3D%d::CreateDevice\n", dwD3DVersion);
|
|
|
|
OutTrace(" Adapter = %i\n", adapter);
|
|
|
|
OutTrace(" DeviceType = %i\n", devicetype);
|
|
|
|
OutTrace(" hFocusWindow = 0x%x\n", hfocuswindow);
|
|
|
|
OutTrace(" BehaviorFlags = 0x%x\n", behaviorflags);
|
|
|
|
OutTrace(" BackBufferWidth = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferHeight = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferCount = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" MultiSampleType = %i\n", *(tmp ++));
|
|
|
|
if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++));
|
2015-07-04 12:40:35 -04:00
|
|
|
SwapEffect = *(tmp ++);
|
|
|
|
OutTrace(" SwapEffect = 0x%x(%s)\n", SwapEffect, ExplainSwapEffect(SwapEffect));
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace(" hDeviceWindow = 0x%x\n", *(tmp ++));
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTrace(" Windowed = %i\n", *(tmp ++));
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace(" EnableAutoDepthStencil = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" AutoDepthStencilFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" Flags = 0x%x\n", *(tmp ++));
|
|
|
|
OutTrace(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++));
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2013-07-09 12:38:16 -04:00
|
|
|
if(dwD3DVersion == 9)
|
|
|
|
(*pGetAdapterDisplayMode9)(lpd3d, 0, &mode);
|
|
|
|
else
|
|
|
|
(*pGetAdapterDisplayMode8)(lpd3d, 0, &mode);
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D(" Current Format = 0x%x\n", mode.Format);
|
|
|
|
OutTraceD3D(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height);
|
|
|
|
OutTraceD3D(" Current Refresh Rate = %d\n", mode.RefreshRate);
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2015-07-04 12:40:35 -04:00
|
|
|
if((dxw.dwFlags4 & NOD3DRESET) && dxw.Windowize){
|
|
|
|
RECT desktop;
|
|
|
|
// Get a handle to the desktop window
|
|
|
|
const HWND hDesktop = (*pGetDesktopWindow)();
|
|
|
|
// Get the size of screen to the variable desktop
|
|
|
|
(*pGetWindowRect)(hDesktop, &desktop);
|
|
|
|
// The top left corner will have coordinates (0,0)
|
|
|
|
// and the bottom right corner will have coordinates
|
|
|
|
// (horizontal, vertical)
|
|
|
|
param[0] = desktop.right;
|
|
|
|
param[1] = desktop.bottom;
|
|
|
|
}
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
if(dwD3DVersion == 9){
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize){
|
2015-04-26 12:40:41 -04:00
|
|
|
if(dxw.dwFlags6 & FORCESWAPEFFECT) param[6] = dxw.SwapEffect; //Swap effect;
|
|
|
|
dwD3DSwapEffect = param[6];
|
2014-02-05 11:39:10 -05:00
|
|
|
param[7] = 0; //hDeviceWindow
|
|
|
|
dxw.SetFullScreen(~param[8]?TRUE:FALSE);
|
|
|
|
param[8] = 1; //Windowed
|
|
|
|
//param[11] = D3DPRESENTFLAG_DEVICECLIP; //Flags;
|
|
|
|
param[12] = 0; //FullScreen_RefreshRateInHz;
|
|
|
|
param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
|
|
|
|
}
|
2013-07-09 12:38:16 -04:00
|
|
|
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
|
2014-07-13 12:39:33 -04:00
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format);
|
2014-07-13 12:39:33 -04:00
|
|
|
param[2] = mode.Format; // first attempt: current screen mode
|
|
|
|
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
|
|
|
|
}
|
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res);
|
2014-07-13 12:39:33 -04:00
|
|
|
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
|
|
|
|
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
else{
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize){
|
2015-04-26 12:40:41 -04:00
|
|
|
if(dxw.dwFlags6 & FORCESWAPEFFECT) param[5] = dxw.SwapEffect; //Swap effect;
|
|
|
|
dwD3DSwapEffect = param[5];
|
2014-02-05 11:39:10 -05:00
|
|
|
param[6] = 0; //hDeviceWindow
|
|
|
|
dxw.SetFullScreen(~param[7]?TRUE:FALSE);
|
|
|
|
param[7] = 1; //Windowed
|
|
|
|
//param[10] = D3DPRESENTFLAG_DEVICECLIP; //Flags;
|
|
|
|
param[11] = 0; //FullScreen_RefreshRateInHz;
|
|
|
|
param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
|
|
|
|
}
|
2013-07-09 12:38:16 -04:00
|
|
|
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
|
2014-07-13 12:39:33 -04:00
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format);
|
2014-07-13 12:39:33 -04:00
|
|
|
param[2] = mode.Format; // first attempt: current screen mode
|
|
|
|
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
|
|
|
|
}
|
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res);
|
2014-07-13 12:39:33 -04:00
|
|
|
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
|
|
|
|
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("FAILED! err=%x\n", res);
|
2012-12-24 10:20:23 -05:00
|
|
|
return res;
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("SUCCESS! device=%x\n", *ppd3dd);
|
2016-04-03 12:42:48 -04:00
|
|
|
lpD3DActiveDevice = *ppd3dd;
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2013-06-29 12:38:04 -04:00
|
|
|
if(dwD3DVersion == 8){
|
2013-12-22 11:38:36 -05:00
|
|
|
HookD3DDevice8(ppd3dd);
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
else {
|
2013-12-22 11:38:36 -05:00
|
|
|
HookD3DDevice9(ppd3dd);
|
2013-02-06 11:19:16 -05:00
|
|
|
}
|
|
|
|
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(mode.RefreshRate);
|
|
|
|
|
2013-02-06 11:19:16 -05:00
|
|
|
GetHookInfo()->IsFullScreen = dxw.IsFullScreen();
|
|
|
|
GetHookInfo()->DXVersion=(short)dwD3DVersion;
|
|
|
|
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
|
|
|
|
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
|
|
|
|
GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
|
2016-01-05 11:45:50 -05:00
|
|
|
return DD_OK;
|
2013-02-06 11:19:16 -05:00
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extCreateDevice8(void *lpd3d, UINT adapter, D3DDEVTYPE dt, HWND hfw, DWORD bf, D3DPRESENT_PARAMETERS *ppp, void **ppd3dd)
|
|
|
|
{ return extCreateDevice(lpd3d, adapter, dt, hfw, bf, ppp, ppd3dd, 8); }
|
|
|
|
HRESULT WINAPI extCreateDevice9(void *lpd3d, UINT adapter, D3DDEVTYPE dt, HWND hfw, DWORD bf, D3DPRESENT_PARAMETERS *ppp, void **ppd3dd)
|
|
|
|
{ return extCreateDevice(lpd3d, adapter, dt, hfw, bf, ppp, ppd3dd, 9); }
|
|
|
|
|
|
|
|
|
2013-02-06 11:19:16 -05:00
|
|
|
HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype,
|
|
|
|
HWND hfocuswindow, DWORD behaviorflags, D3DPRESENT_PARAMETERS *ppresentparam, D3DDISPLAYMODEEX *pFullscreenDisplayMode, void **ppd3dd)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
DWORD param[64], *tmp;
|
|
|
|
D3DDISPLAYMODE mode;
|
|
|
|
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceD3D("CreateDeviceEx: D3DVersion=%d lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n",
|
|
|
|
dwD3DVersion, lpd3d, adapter, hfocuswindow, behaviorflags, ppresentparam->BackBufferWidth, ppresentparam->BackBufferHeight);
|
|
|
|
|
2013-02-06 11:19:16 -05:00
|
|
|
memcpy(param, ppresentparam, 56);
|
|
|
|
dxw.SethWnd(hfocuswindow);
|
|
|
|
dxw.SetScreenSize(param[0], param[1]);
|
2014-02-05 11:39:10 -05:00
|
|
|
|
2014-08-10 12:39:50 -04:00
|
|
|
if(dxw.Windowize) hfocuswindow=FixD3DWindowFrame(hfocuswindow);
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
if(IsTraceD3D){
|
2015-07-04 12:40:35 -04:00
|
|
|
tmp = param;
|
|
|
|
DWORD SwapEffect;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace("D3D%d::CreateDeviceEx\n", dwD3DVersion);
|
|
|
|
OutTrace(" Adapter = %i\n", adapter);
|
|
|
|
OutTrace(" DeviceType = %i\n", devicetype);
|
|
|
|
OutTrace(" hFocusWindow = 0x%x\n", hfocuswindow);
|
|
|
|
OutTrace(" BehaviorFlags = 0x%x\n", behaviorflags);
|
|
|
|
OutTrace(" BackBufferWidth = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferHeight = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferCount = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" MultiSampleType = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" MultiSampleQuality = %i\n", *(tmp ++));
|
2015-07-04 12:40:35 -04:00
|
|
|
SwapEffect = *(tmp ++);
|
|
|
|
OutTrace(" SwapEffect = 0x%x(%s)\n", SwapEffect, ExplainSwapEffect(SwapEffect));
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace(" hDeviceWindow = 0x%x\n", *(tmp ++));
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTrace(" Windowed = %i\n", *(tmp ++));
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace(" EnableAutoDepthStencil = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" AutoDepthStencilFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" Flags = 0x%x\n", *(tmp ++));
|
|
|
|
OutTrace(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++));
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
|
|
|
|
//((LPDIRECT3D9)lpd3d)->GetAdapterDisplayMode(0, &mode);
|
2013-07-09 12:38:16 -04:00
|
|
|
(*pGetAdapterDisplayMode9)(lpd3d, 0, &mode);
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D(" Current Format = 0x%x\n", mode.Format);
|
|
|
|
OutTraceD3D(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height);
|
|
|
|
OutTraceD3D(" Current Refresh Rate = %d\n", mode.RefreshRate);
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2015-07-04 12:40:35 -04:00
|
|
|
if((dxw.dwFlags4 & NOD3DRESET) && dxw.Windowize){
|
|
|
|
RECT desktop;
|
|
|
|
// Get a handle to the desktop window
|
|
|
|
const HWND hDesktop = (*pGetDesktopWindow)();
|
|
|
|
// Get the size of screen to the variable desktop
|
|
|
|
(*pGetWindowRect)(hDesktop, &desktop);
|
|
|
|
// The top left corner will have coordinates (0,0)
|
|
|
|
// and the bottom right corner will have coordinates
|
|
|
|
// (horizontal, vertical)
|
|
|
|
param[0] = desktop.right;
|
|
|
|
param[1] = desktop.bottom;
|
|
|
|
}
|
|
|
|
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize){
|
2015-04-26 12:40:41 -04:00
|
|
|
if(dxw.dwFlags6 & FORCESWAPEFFECT) param[6] = dxw.SwapEffect; //Swap effect;
|
|
|
|
dwD3DSwapEffect = param[6];
|
2014-02-05 11:39:10 -05:00
|
|
|
//param[7] = 0; //hDeviceWindow
|
|
|
|
param[7] = (DWORD)dxw.GethWnd(); //hDeviceWindow
|
|
|
|
dxw.SetFullScreen(~param[8]?TRUE:FALSE);
|
|
|
|
param[8] = 1; //Windowed
|
|
|
|
param[12] = 0; //FullScreen_RefreshRateInHz;
|
|
|
|
param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
|
2016-06-21 12:46:09 -04:00
|
|
|
// from MSDN:
|
|
|
|
// The display mode for when the device is set to fullscreen. See D3DDISPLAYMODEEX.
|
|
|
|
// If BehaviorFlags specifies D3DCREATE_ADAPTERGROUP_DEVICE, this parameter is an array.
|
|
|
|
// This parameter must be NULL for windowed mode.
|
|
|
|
pFullscreenDisplayMode = NULL;
|
2014-02-05 11:39:10 -05:00
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
|
|
|
|
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
|
2014-07-13 12:39:33 -04:00
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format);
|
2014-07-13 12:39:33 -04:00
|
|
|
param[2] = mode.Format; // first attempt: current screen mode
|
|
|
|
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
|
|
|
|
}
|
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res);
|
2014-07-13 12:39:33 -04:00
|
|
|
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
|
|
|
|
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
if(res){
|
2016-06-21 12:46:09 -04:00
|
|
|
OutTraceD3D("FAILED! err=%x\n", res);
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("SUCCESS!\n");
|
2016-04-03 12:42:48 -04:00
|
|
|
lpD3DActiveDevice = *ppd3dd;
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
HookD3DDevice9(ppd3dd);
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(mode.RefreshRate);
|
|
|
|
|
2013-01-25 11:17:02 -05:00
|
|
|
GetHookInfo()->IsFullScreen = dxw.IsFullScreen();
|
|
|
|
GetHookInfo()->DXVersion=(short)dwD3DVersion;
|
|
|
|
GetHookInfo()->Height=(short)dxw.GetScreenHeight();
|
|
|
|
GetHookInfo()->Width=(short)dxw.GetScreenWidth();
|
|
|
|
GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount;
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2016-01-05 11:45:50 -05:00
|
|
|
return DD_OK;
|
2012-12-24 10:20:23 -05:00
|
|
|
}
|
|
|
|
|
2014-01-03 11:38:52 -05:00
|
|
|
extern char *ExplainRenderstateValue(DWORD Value);
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
static HRESULT WINAPI extSetRenderState(SetRenderState_Type pSetRenderState, void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value)
|
2013-04-27 12:19:14 -04:00
|
|
|
{
|
2014-11-03 11:38:55 -05:00
|
|
|
HRESULT res;
|
|
|
|
OutTraceD3D("SetRenderState: d3dd=%x State=%x(%s) Value=%x\n", pd3dd, State, ExplainD3DRenderState(State), Value);
|
|
|
|
|
2014-01-03 11:38:52 -05:00
|
|
|
if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRS_ZFUNC)) {
|
|
|
|
OutTraceD3D("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(Value));
|
|
|
|
Value = D3DCMP_ALWAYS;
|
|
|
|
}
|
2014-11-03 11:38:55 -05:00
|
|
|
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;
|
2013-04-27 12:19:14 -04:00
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extSetRenderState8(void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value)
|
|
|
|
{ return extSetRenderState(pSetRenderState8, pd3dd, State, Value); }
|
|
|
|
HRESULT WINAPI extSetRenderState9(void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value)
|
|
|
|
{ return extSetRenderState(pSetRenderState9, pd3dd, State, Value); }
|
|
|
|
|
|
|
|
static HRESULT WINAPI extGetRenderState(GetRenderState_Type pGetRenderState, void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value)
|
2013-04-27 12:19:14 -04:00
|
|
|
{
|
|
|
|
return (*pGetRenderState)(pd3dd, State, Value);
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extGetRenderState8(void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value)
|
|
|
|
{ return extGetRenderState(pSetRenderState8, pd3dd, State, Value); }
|
|
|
|
HRESULT WINAPI extGetRenderState9(void *pd3dd, D3DRENDERSTATETYPE State, DWORD Value)
|
|
|
|
{ return extGetRenderState(pSetRenderState9, pd3dd, State, Value); }
|
|
|
|
|
2013-02-06 11:19:16 -05:00
|
|
|
HRESULT WINAPI extGetViewport(void *pd3dd, D3DVIEWPORT9 *pViewport)
|
|
|
|
{
|
|
|
|
return (*pGetViewport)(pd3dd, pViewport);
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extSetViewport(void *pd3dd, D3DVIEWPORT9 *pViewport)
|
|
|
|
{
|
|
|
|
RECT client;
|
|
|
|
POINT p={0,0};
|
|
|
|
(*pGetClientRect)(dxw.GethWnd(), &client);
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("SetViewport: declared pos=(%d,%d) size=(%d,%d) depth=(%f;%f)\n",
|
2013-02-06 11:19:16 -05:00
|
|
|
pViewport->X, pViewport->Y, pViewport->Width, pViewport->Height, pViewport->MinZ, pViewport->MaxZ);
|
2013-06-15 12:21:25 -04:00
|
|
|
if(IsDebug) OutTrace("SetViewport: DEBUG win=(%d,%d) screen=(%d,%d)\n",
|
2013-02-06 11:19:16 -05:00
|
|
|
client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight());
|
|
|
|
pViewport->X = (pViewport->X * (int)client.right) / (int)dxw.GetScreenWidth();
|
|
|
|
pViewport->Y = (pViewport->Y * (int)client.bottom) / (int)dxw.GetScreenHeight();
|
|
|
|
pViewport->Width = (pViewport->Width * (int)client.right) / (int)dxw.GetScreenWidth();
|
|
|
|
pViewport->Height = (pViewport->Height * (int)client.bottom) / (int)dxw.GetScreenHeight();
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("SetViewport: remapped pos=(%d,%d) size=(%d,%d)\n",
|
2013-02-06 11:19:16 -05:00
|
|
|
pViewport->X, pViewport->Y, pViewport->Width, pViewport->Height);
|
|
|
|
return (*pSetViewport)(pd3dd, pViewport);
|
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
static HRESULT WINAPI extCreateAdditionalSwapChain(int dwD3DVersion, void *lpd3dd, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **ppSwapChain)
|
2013-02-06 11:19:16 -05:00
|
|
|
{
|
2015-03-22 12:40:33 -04:00
|
|
|
HRESULT res, res2;
|
2013-02-06 11:19:16 -05:00
|
|
|
DWORD param[64], *tmp;
|
|
|
|
D3DDISPLAYMODE mode;
|
2016-04-17 12:45:41 -04:00
|
|
|
CreateAdditionalSwapChain_Type pCreateAdditionalSwapChain;
|
|
|
|
Reset_Type pReset;
|
|
|
|
GetAdapterDisplayMode_Type pGetAdapterDisplayMode;
|
|
|
|
|
|
|
|
OutTraceD3D("CreateAdditionalSwapChain(%d): d3d=%x\n", dwD3DVersion, lpd3dd);
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
pCreateAdditionalSwapChain = (dwD3DVersion == 8) ? pCreateAdditionalSwapChain8 : pCreateAdditionalSwapChain9;
|
|
|
|
pReset = (dwD3DVersion == 8) ? pReset8 : pReset9;
|
|
|
|
pGetAdapterDisplayMode = (dwD3DVersion == 8) ? pGetAdapterDisplayMode8 : pGetAdapterDisplayMode9;
|
2014-02-02 11:38:46 -05:00
|
|
|
|
2013-02-06 11:19:16 -05:00
|
|
|
memcpy(param, pPresentationParameters, (dwD3DVersion == 9)?56:52);
|
|
|
|
dxw.SetScreenSize(param[0], param[1]);
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize) FixD3DWindowFrame(dxw.GethWnd());
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
if(IsTraceD3D){
|
2015-07-04 12:40:35 -04:00
|
|
|
tmp = param;
|
|
|
|
DWORD SwapEffect;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace("D3D%d::CreateAdditionalSwapChain\n", dwD3DVersion);
|
|
|
|
OutTrace(" BackBufferWidth = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferHeight = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" BackBufferCount = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" MultiSampleType = %i\n", *(tmp ++));
|
|
|
|
if(dwD3DVersion == 9) OutTrace(" MultiSampleQuality = %i\n", *(tmp ++));
|
2015-07-04 12:40:35 -04:00
|
|
|
SwapEffect = *(tmp ++);
|
|
|
|
OutTrace(" SwapEffect = 0x%x(%s)\n", SwapEffect, ExplainSwapEffect(SwapEffect));
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace(" hDeviceWindow = 0x%x\n", *(tmp ++));
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTrace(" Windowed = %i\n", *(tmp ++));
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTrace(" EnableAutoDepthStencil = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" AutoDepthStencilFormat = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" Flags = 0x%x\n", *(tmp ++));
|
|
|
|
OutTrace(" FullScreen_RefreshRateInHz = %i\n", *(tmp ++));
|
|
|
|
OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++));
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
res2=(*pGetAdapterDisplayMode)(lpd3dd, D3DADAPTER_DEFAULT, &mode);
|
|
|
|
|
2015-03-22 12:40:33 -04:00
|
|
|
if(res2==DD_OK){
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D(" Current Format = 0x%x\n", mode.Format);
|
|
|
|
OutTraceD3D(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height);
|
|
|
|
OutTraceD3D(" Current Refresh Rate = %d\n", mode.RefreshRate);
|
2015-03-22 12:40:33 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
OutTraceE("CreateAdditionalSwapChain: GetAdapterDisplayMode err=%x(%s)\n", res2, ExplainDDError(res2));
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize){
|
|
|
|
if(dwD3DVersion == 9){
|
2015-04-26 12:40:41 -04:00
|
|
|
if(dxw.dwFlags6 & FORCESWAPEFFECT) param[6] = dxw.SwapEffect; //Swap effect;
|
|
|
|
dwD3DSwapEffect = param[6];
|
2014-02-05 11:39:10 -05:00
|
|
|
param[7] = 0; //hDeviceWindow
|
|
|
|
dxw.SetFullScreen(~param[8]?TRUE:FALSE);
|
|
|
|
param[8] = 1; //Windowed
|
|
|
|
param[12] = 0; //FullScreen_RefreshRateInHz;
|
|
|
|
param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
|
|
|
|
}
|
|
|
|
else{
|
2015-04-26 12:40:41 -04:00
|
|
|
if(dxw.dwFlags6 & FORCESWAPEFFECT) param[5] = dxw.SwapEffect; //Swap effect;
|
|
|
|
dwD3DSwapEffect = param[5];
|
2014-02-05 11:39:10 -05:00
|
|
|
param[6] = 0; //hDeviceWindow
|
|
|
|
dxw.SetFullScreen(~param[7]?TRUE:FALSE);
|
|
|
|
param[7] = 1; //Windowed
|
|
|
|
param[11] = 0; //FullScreen_RefreshRateInHz;
|
|
|
|
param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
}
|
2015-03-22 12:40:33 -04:00
|
|
|
|
|
|
|
if(res2 == D3DERR_DEVICELOST){
|
|
|
|
res2 = (*pReset)(lpd3dd, (D3DPRESENT_PARAMETERS *)param);
|
|
|
|
if(res2 != DD_OK) OutTraceE("CreateAdditionalSwapChain: Reset err=%x(%s)\n", res2, ExplainDDError(res2));
|
|
|
|
}
|
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
res=(*pCreateAdditionalSwapChain)(lpd3dd, (D3DPRESENT_PARAMETERS *)param, ppSwapChain);
|
2015-03-22 12:40:33 -04:00
|
|
|
if(res && (res2==DD_OK)){
|
2014-07-13 12:39:33 -04:00
|
|
|
OutTraceD3D("switching to mode=%x\n", mode.Format);
|
|
|
|
param[2] = mode.Format; // first attempt: current screen mode
|
|
|
|
res=(*pCreateAdditionalSwapChain)(lpd3dd, (D3DPRESENT_PARAMETERS *)param, ppSwapChain);
|
|
|
|
}
|
|
|
|
if(res){
|
|
|
|
OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n");
|
|
|
|
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
|
|
|
|
res=(*pCreateAdditionalSwapChain)(lpd3dd, (D3DPRESENT_PARAMETERS *)param, ppSwapChain);
|
|
|
|
}
|
2015-03-22 12:40:33 -04:00
|
|
|
//if(res){
|
|
|
|
// OutTraceD3D("switching to size=0,0\n");
|
|
|
|
// param[0] = param[1] = 0; // third attempt: unknown, good for windowed mode
|
|
|
|
// res=(*pCreateAdditionalSwapChain)(lpd3dd, (D3DPRESENT_PARAMETERS *)param, ppSwapChain);
|
|
|
|
//}
|
2014-07-13 12:39:33 -04:00
|
|
|
if(res) {
|
2015-03-22 12:40:33 -04:00
|
|
|
OutTraceE("CreateAdditionalSwapChain ERROR: res=%x(%s)\n", res, ExplainDDError(res));
|
2014-07-13 12:39:33 -04:00
|
|
|
}
|
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
(dwD3DVersion == 9) ? HookD3DDevice9(&lpd3dd) : HookD3DDevice8(&lpd3dd);
|
2014-10-08 12:39:38 -04:00
|
|
|
dxw.SetVSyncDelays(mode.RefreshRate);
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extCreateAdditionalSwapChain8(void *lpd3dd, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **ppSwapChain)
|
|
|
|
{ return extCreateAdditionalSwapChain(8, lpd3dd, pPresentationParameters, ppSwapChain); }
|
|
|
|
HRESULT WINAPI extCreateAdditionalSwapChain9(void *lpd3dd, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **ppSwapChain)
|
|
|
|
{ return extCreateAdditionalSwapChain(9, lpd3dd, pPresentationParameters, ppSwapChain); }
|
|
|
|
|
2013-01-25 11:17:02 -05:00
|
|
|
// to do:
|
|
|
|
// hook SetCursorPosition ShowCursor to handle cursor
|
2013-04-27 12:19:14 -04:00
|
|
|
|
|
|
|
HRESULT WINAPI extD3D10CreateDevice(
|
|
|
|
IDXGIAdapter *pAdapter,
|
|
|
|
D3D10_DRIVER_TYPE DriverType,
|
|
|
|
HMODULE Software,
|
|
|
|
UINT Flags,
|
|
|
|
UINT SDKVersion,
|
|
|
|
ID3D10Device **ppDevice)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2014-12-13 11:40:09 -05:00
|
|
|
//D3D10_VIEWPORT ViewPort;
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("D3D10CreateDevice: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion);
|
2013-02-06 11:19:16 -05:00
|
|
|
//return 0x887a0004;
|
2013-04-27 12:19:14 -04:00
|
|
|
res=(*pD3D10CreateDevice)(pAdapter, DriverType, Software, Flags, SDKVersion, ppDevice);
|
2013-02-06 11:19:16 -05:00
|
|
|
if(res){
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceE("D3D10CreateDevice: ret=%x(%s)\n", res, ExplainDDError(res));
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
2014-12-13 11:40:09 -05:00
|
|
|
// useless ....
|
|
|
|
//SetHook((void *)(*(DWORD *)*ppDevice + 120), extRSSetViewports10, (void **)&pRSSetViewports10, "RSSetViewports(D10)");
|
|
|
|
|
|
|
|
// useless ....
|
|
|
|
//if(dxw.Windowize){
|
|
|
|
// ViewPort.TopLeftX=dxw.iPosX;
|
|
|
|
// ViewPort.TopLeftY=dxw.iPosY;
|
|
|
|
// ViewPort.Width=dxw.iSizX;
|
|
|
|
// ViewPort.Height=dxw.iSizY;
|
|
|
|
// ViewPort.MinDepth=1.0;
|
|
|
|
// ViewPort.MaxDepth=1.0;
|
|
|
|
// (*pRSSetViewports10)((void *)*ppDevice, 1, (D3D10_VIEWPORT *)&ViewPort);
|
|
|
|
//}
|
2014-02-05 11:39:10 -05:00
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
OutTraceD3D("D3D10CreateDevice: ret=%x\n", res);
|
2013-04-27 12:19:14 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extD3D10CreateDevice1(
|
|
|
|
IDXGIAdapter *pAdapter,
|
|
|
|
D3D10_DRIVER_TYPE DriverType,
|
|
|
|
HMODULE Software,
|
|
|
|
UINT Flags,
|
|
|
|
D3D10_FEATURE_LEVEL1 HardwareLevel,
|
|
|
|
UINT SDKVersion,
|
|
|
|
ID3D10Device **ppDevice)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D10CreateDevice1: DriverType=%x Flags=%x HardwareLevel=%x SDKVersion=%x\n", DriverType, Flags, HardwareLevel, SDKVersion);
|
2013-04-27 12:19:14 -04:00
|
|
|
res=(*pD3D10CreateDevice1)(pAdapter, DriverType, Software, Flags, HardwareLevel, SDKVersion, ppDevice);
|
2014-12-13 11:40:09 -05:00
|
|
|
SetHook((void *)(*(DWORD *)*ppDevice + 100), extRSSetViewports10, (void **)&pRSSetViewports10, "RSSetViewports(D10)");
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D10CreateDevice1: ret=%x\n", res);
|
2013-04-27 12:19:14 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extD3D10CreateDeviceAndSwapChain(
|
|
|
|
IDXGIAdapter *pAdapter,
|
|
|
|
D3D10_DRIVER_TYPE DriverType,
|
|
|
|
HMODULE Software,
|
|
|
|
UINT Flags,
|
|
|
|
UINT SDKVersion,
|
|
|
|
DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
|
|
|
|
IDXGISwapChain **ppSwapChain,
|
|
|
|
ID3D10Device **ppDevice)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D10CreateDeviceAndSwapChain: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion);
|
2013-02-06 11:19:16 -05:00
|
|
|
//return 0x887a0004;
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize){
|
|
|
|
pSwapChainDesc->OutputWindow = dxw.GethWnd();
|
|
|
|
pSwapChainDesc->Windowed = true;
|
|
|
|
}
|
2013-04-27 12:19:14 -04:00
|
|
|
res=(*pD3D10CreateDeviceAndSwapChain)(pAdapter, DriverType, Software, Flags, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice);
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D10CreateDeviceAndSwapChain ret=%x\n", res);
|
2013-04-27 12:19:14 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extD3D10CreateDeviceAndSwapChain1(
|
|
|
|
IDXGIAdapter *pAdapter,
|
|
|
|
D3D10_DRIVER_TYPE DriverType,
|
|
|
|
HMODULE Software,
|
|
|
|
UINT Flags,
|
|
|
|
UINT SDKVersion,
|
|
|
|
DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
|
|
|
|
IDXGISwapChain **ppSwapChain,
|
|
|
|
ID3D10Device **ppDevice)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D10CreateDeviceAndSwapChain1: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion);
|
2013-02-06 11:19:16 -05:00
|
|
|
//return 0x887a0004;
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize){
|
|
|
|
pSwapChainDesc->OutputWindow = dxw.GethWnd();
|
|
|
|
pSwapChainDesc->Windowed = true;
|
|
|
|
}
|
2013-04-27 12:19:14 -04:00
|
|
|
res=(*pD3D10CreateDeviceAndSwapChain1)(pAdapter, DriverType, Software, Flags, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice);
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D10CreateDeviceAndSwapChain1 ret=%x\n", res);
|
2013-04-27 12:19:14 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extD3D11CreateDevice(
|
|
|
|
IDXGIAdapter *pAdapter,
|
|
|
|
D3D_DRIVER_TYPE DriverType,
|
|
|
|
HMODULE Software,
|
|
|
|
UINT Flags,
|
|
|
|
const D3D_FEATURE_LEVEL *pFeatureLevels,
|
|
|
|
UINT FeatureLevels,
|
|
|
|
UINT SDKVersion,
|
|
|
|
ID3D11Device **ppDevice,
|
|
|
|
D3D_FEATURE_LEVEL *pFeatureLevel,
|
|
|
|
ID3D11DeviceContext **ppImmediateContext)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D11CreateDevice: DriverType=%x Flags=%x FeatureLevels=%x SDKVersion=%x\n", DriverType, Flags, FeatureLevels, SDKVersion);
|
2013-02-06 11:19:16 -05:00
|
|
|
//return 0x887a0004;
|
2013-04-27 12:19:14 -04:00
|
|
|
res=(*pD3D11CreateDevice)(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext);
|
2013-02-06 11:19:16 -05:00
|
|
|
if(res){
|
2014-02-02 11:38:46 -05:00
|
|
|
OutTraceE("D3D11CreateDevice: ret=%x\n", res);
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
2014-12-13 11:40:09 -05:00
|
|
|
SetHook((void *)(*(DWORD *)ppImmediateContext + 148), extRSSetViewports11, (void **)&pRSSetViewports11, "RSSetViewports(D11)");
|
2013-02-06 11:19:16 -05:00
|
|
|
//SetHook((void *)(*(DWORD *)ppImmediateContext + 152), extRSSetScissorRects, (void **)&pRSSetScissorRects, "RSSetScissorRects(D11)");
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D11CreateDevice ret=%x\n", res);
|
2013-04-27 12:19:14 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extD3D11CreateDeviceAndSwapChain(
|
|
|
|
IDXGIAdapter *pAdapter,
|
|
|
|
D3D_DRIVER_TYPE DriverType,
|
|
|
|
HMODULE Software,
|
|
|
|
UINT Flags,
|
|
|
|
const D3D_FEATURE_LEVEL *pFeatureLevels,
|
|
|
|
UINT FeatureLevels,
|
|
|
|
UINT SDKVersion,
|
|
|
|
const DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
|
|
|
|
IDXGISwapChain **ppSwapChain,
|
|
|
|
ID3D11Device **ppDevice,
|
|
|
|
D3D_FEATURE_LEVEL *pFeatureLevel,
|
|
|
|
ID3D11DeviceContext **ppImmediateContext)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D11CreateDeviceAndSwapChain\n");
|
2013-02-06 11:19:16 -05:00
|
|
|
res=(*pD3D11CreateDeviceAndSwapChain)(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice, pFeatureLevel, ppImmediateContext);
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D11CreateDeviceAndSwapChain ret=%x\n", res);
|
2013-04-27 12:19:14 -04:00
|
|
|
return res;
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2014-12-13 11:40:09 -05:00
|
|
|
void WINAPI extRSSetViewports10(void *This, UINT NumViewports, D3D10_VIEWPORT *pViewports)
|
2013-02-06 11:19:16 -05:00
|
|
|
{
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("RSSetViewports: NumViewports=%d\n", NumViewports);
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2014-02-05 11:39:10 -05:00
|
|
|
if(dxw.Windowize && (NumViewports==1)){
|
2013-02-06 11:19:16 -05:00
|
|
|
pViewports->TopLeftX=dxw.iPosX;
|
|
|
|
pViewports->TopLeftY=dxw.iPosY;
|
|
|
|
pViewports->Width=dxw.iSizX;
|
|
|
|
pViewports->Height=dxw.iSizY;
|
|
|
|
}
|
|
|
|
|
2014-12-13 11:40:09 -05:00
|
|
|
(*pRSSetViewports10)(This, NumViewports, pViewports);
|
|
|
|
}
|
|
|
|
|
|
|
|
void WINAPI extRSSetViewports11(ID3D11DeviceContext *This, UINT NumViewports, D3D11_VIEWPORT *pViewports)
|
|
|
|
{
|
|
|
|
OutTraceD3D("RSSetViewports: NumViewports=%d\n", NumViewports);
|
|
|
|
|
|
|
|
if(dxw.Windowize && (NumViewports==1)){
|
|
|
|
pViewports->TopLeftX=dxw.iPosX;
|
|
|
|
pViewports->TopLeftY=dxw.iPosY;
|
|
|
|
pViewports->Width=dxw.iSizX;
|
|
|
|
pViewports->Height=dxw.iSizY;
|
|
|
|
}
|
|
|
|
|
|
|
|
(*pRSSetViewports11)(This, NumViewports, pViewports);
|
2013-02-06 11:19:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extQueryInterfaceD3D8(void *obj, REFIID riid, void** ppvObj)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D::QueryInterface(8): d3d=%x riid=%x\n", obj, riid.Data1);
|
2013-02-06 11:19:16 -05:00
|
|
|
res=pQueryInterfaceD3D8(obj, riid, ppvObj);
|
2013-12-27 11:38:38 -05:00
|
|
|
if(res)
|
|
|
|
OutTraceE("D3D::QueryInterface(8): ERROR ret=%x(%s)\n", res, ExplainDDError(res));
|
|
|
|
else
|
|
|
|
OutTraceD3D("D3D::QueryInterface(8): obp=%x\n", *ppvObj);
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extQueryInterfaceDev8(void *obj, REFIID riid, void** ppvObj)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("Device::QueryInterface(8): d3d=%x riid=%x\n", obj, riid.Data1);
|
2013-02-06 11:19:16 -05:00
|
|
|
res=pQueryInterfaceDev8(obj, riid, ppvObj);
|
2013-12-27 11:38:38 -05:00
|
|
|
if(res){
|
|
|
|
OutTraceE("Device::QueryInterface(8): ERROR ret=%x(%s)\n", res, ExplainDDError(res));
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
OutTraceD3D("Device::QueryInterface(8): obp=%x\n", *ppvObj);
|
|
|
|
|
|
|
|
switch(*(DWORD *)&riid){
|
|
|
|
case 0x7385E5DF: // IID_IDirect3DDevice8
|
|
|
|
HookD3DDevice8(ppvObj);
|
|
|
|
break;
|
|
|
|
case 0xD0223B96: // IID_IDirect3DDevice9
|
|
|
|
HookD3DDevice9(ppvObj);
|
|
|
|
break;
|
|
|
|
}
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extQueryInterfaceD3D9(void *obj, REFIID riid, void** ppvObj)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("D3D::QueryInterface(9): d3d=%x riid=%x\n", obj, riid.Data1);
|
2013-02-06 11:19:16 -05:00
|
|
|
res=pQueryInterfaceD3D9(obj, riid, ppvObj);
|
2013-12-27 11:38:38 -05:00
|
|
|
if(res)
|
|
|
|
OutTraceE("D3D::QueryInterface(9): ERROR ret=%x(%s)\n", res, ExplainDDError(res));
|
|
|
|
else
|
|
|
|
OutTraceD3D("D3D::QueryInterface(9): obp=%x\n", *ppvObj);
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extQueryInterfaceDev9(void *obj, REFIID riid, void** ppvObj)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-06-15 12:21:25 -04:00
|
|
|
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("Device::QueryInterface(9): d3d=%x riid=%x\n", obj, riid.Data1);
|
2013-02-06 11:19:16 -05:00
|
|
|
res=pQueryInterfaceDev9(obj, riid, ppvObj);
|
|
|
|
if(res){
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("Device::QueryInterface(9): ERROR ret=%x\n", res);
|
2013-02-06 11:19:16 -05:00
|
|
|
return res;
|
|
|
|
}
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("Device::QueryInterface(9): ppvObj=%x\n", *ppvObj);
|
2013-02-06 11:19:16 -05:00
|
|
|
|
2013-06-15 12:21:25 -04:00
|
|
|
switch(*(DWORD *)&riid){
|
2013-12-22 11:38:36 -05:00
|
|
|
case 0x7385E5DF: // IID_IDirect3DDevice8
|
|
|
|
HookD3DDevice8(ppvObj);
|
|
|
|
break;
|
2013-06-15 12:21:25 -04:00
|
|
|
case 0xD0223B96: // IID_IDirect3DDevice9
|
2013-12-22 11:38:36 -05:00
|
|
|
HookD3DDevice9(ppvObj);
|
2013-06-15 12:21:25 -04:00
|
|
|
break;
|
2013-02-06 11:19:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2014-03-15 12:38:56 -04:00
|
|
|
HRESULT WINAPI extGetDirect3D8(void *lpdd3dd, void **ppD3D8)
|
2013-02-06 11:19:16 -05:00
|
|
|
{
|
2014-03-15 12:38:56 -04:00
|
|
|
HRESULT res;
|
|
|
|
OutTraceD3D("Device::GetDirect3D(8): d3dd=%x\n", lpdd3dd);
|
|
|
|
res=(*pGetDirect3D8)(lpdd3dd, ppD3D8);
|
|
|
|
if(res)
|
|
|
|
OutTraceE("Device::GetDirect3D ERROR: d3dd=%x ret=%x\n", lpdd3dd, res);
|
|
|
|
else{
|
|
|
|
OutTraceD3D("Device::GetDirect3D: d3dd=%x d3d=%x\n", lpdd3dd, *ppD3D8);
|
|
|
|
HookDirect3D8(*ppD3D8);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extGetDirect3D9(void *lpdd3dd, void **ppD3D9)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("Device::GetDirect3D(9): d3dd=%x\n", lpdd3dd);
|
2014-03-15 12:38:56 -04:00
|
|
|
res=(*pGetDirect3D9)(lpdd3dd, ppD3D9);
|
|
|
|
if(res)
|
|
|
|
OutTraceE("Device::GetDirect3D ERROR: d3dd=%x ret=%x\n", lpdd3dd, res);
|
|
|
|
else{
|
|
|
|
OutTraceD3D("Device::GetDirect3D: d3dd=%x d3d=%x\n", lpdd3dd, *ppD3D9);
|
|
|
|
// re-hook d3d session: neeeded for Need for Speed Underground
|
|
|
|
HookDirect3D9(*ppD3D9, FALSE);
|
|
|
|
}
|
|
|
|
return res;
|
2013-02-06 11:19:16 -05:00
|
|
|
}
|
2013-06-15 12:21:25 -04:00
|
|
|
|
|
|
|
HRESULT WINAPI extCheckFullScreen(void)
|
|
|
|
{
|
2014-02-05 11:39:10 -05:00
|
|
|
HRESULT res;
|
|
|
|
if(dxw.Windowize){
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("CheckFullScreen: return OK\n");
|
2014-02-05 11:39:10 -05:00
|
|
|
res=0;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
res=(*pCheckFullScreen)();
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceD3D("CheckFullScreen: return %x\n", res);
|
2014-02-05 11:39:10 -05:00
|
|
|
}
|
|
|
|
return res;
|
2013-06-15 12:21:25 -04:00
|
|
|
}
|
2013-06-29 12:38:04 -04:00
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
static void WINAPI extSetGammaRamp(SetGammaRamp_Type pSetGammaRamp, void *lpdd3dd, UINT iSwapChain, DWORD Flags, D3DGAMMARAMP *pRamp)
|
2013-06-29 12:38:04 -04:00
|
|
|
{
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("SetGammaRamp: dd3dd=%x SwapChain=%d flags=%x\n", lpdd3dd, iSwapChain, Flags);
|
2013-06-29 12:38:04 -04:00
|
|
|
if (dxw.dwFlags2 & DISABLEGAMMARAMP) return;
|
2013-07-25 12:38:10 -04:00
|
|
|
(*pSetGammaRamp)(lpdd3dd, iSwapChain, Flags, pRamp);
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
void WINAPI extSetGammaRamp8(void *lpdd3dd, UINT iSwapChain, DWORD Flags, D3DGAMMARAMP *pRamp)
|
|
|
|
{ return extSetGammaRamp(pSetGammaRamp8, lpdd3dd, iSwapChain, Flags, pRamp); }
|
|
|
|
void WINAPI extSetGammaRamp9(void *lpdd3dd, UINT iSwapChain, DWORD Flags, D3DGAMMARAMP *pRamp)
|
|
|
|
{ return extSetGammaRamp(pSetGammaRamp9, lpdd3dd, iSwapChain, Flags, pRamp); }
|
|
|
|
|
|
|
|
static void WINAPI extGetGammaRamp(GetGammaRamp_Type pGetGammaRamp, void *lpdd3dd, UINT iSwapChain, D3DGAMMARAMP *pRamp)
|
2013-07-25 12:38:10 -04:00
|
|
|
{
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("GetGammaRamp: dd3dd=%x SwapChain=%d\n", lpdd3dd, iSwapChain);
|
2013-07-25 12:38:10 -04:00
|
|
|
(*pGetGammaRamp)(lpdd3dd, iSwapChain, pRamp);
|
2013-06-29 12:38:04 -04:00
|
|
|
}
|
2013-12-22 11:38:36 -05:00
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
void WINAPI extGetGammaRamp8(void *lpdd3dd, UINT iSwapChain, D3DGAMMARAMP *pRamp)
|
|
|
|
{ return extGetGammaRamp(pGetGammaRamp8, lpdd3dd, iSwapChain, pRamp); }
|
|
|
|
void WINAPI extGetGammaRamp9(void *lpdd3dd, UINT iSwapChain, D3DGAMMARAMP *pRamp)
|
|
|
|
{ return extGetGammaRamp(pGetGammaRamp9, lpdd3dd, iSwapChain, pRamp); }
|
|
|
|
|
2013-12-22 11:38:36 -05:00
|
|
|
void WINAPI extSetCursorPosition9(void *lpdd3dd, int X, int Y, DWORD Flags)
|
|
|
|
{
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("SetCursorPosition: dd3dd=%x pos=(%d,%d) flags=%x\n", lpdd3dd, X, Y, Flags);
|
2013-12-22 11:38:36 -05:00
|
|
|
if(dxw.dwFlags2 & KEEPCURSORFIXED) return;
|
|
|
|
// to do: proper scaling.....
|
|
|
|
//(*pSetCursorPosition9)(lpdd3dd, X, Y, Flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
void WINAPI extSetCursorPosition8(void *lpdd3dd, int X, int Y, DWORD Flags)
|
|
|
|
{
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("SetCursorPosition: dd3dd=%x pos=(%d,%d) flags=%x\n", lpdd3dd, X, Y, Flags);
|
2013-12-22 11:38:36 -05:00
|
|
|
if(dxw.dwFlags2 & KEEPCURSORFIXED) return;
|
|
|
|
// to do: proper scaling.....
|
|
|
|
//(*pSetCursorPosition8)(lpdd3dd, X, Y, Flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI extAddRef9(void *lpdd3dd)
|
|
|
|
{
|
|
|
|
ULONG res;
|
|
|
|
res=(*pAddRef9)(lpdd3dd);
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("Device::AddRef(9): dd3dd=%x res=%x\n", lpdd3dd, res);
|
2013-12-22 11:38:36 -05:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI extRelease9(void *lpdd3dd)
|
|
|
|
{
|
|
|
|
ULONG res;
|
|
|
|
res=(*pRelease9)(lpdd3dd);
|
2013-12-27 11:38:38 -05:00
|
|
|
OutTraceD3D("Device::Release(9): dd3dd=%x res=%x\n", lpdd3dd, res);
|
2013-12-22 11:38:36 -05:00
|
|
|
return res;
|
2014-04-01 12:38:40 -04:00
|
|
|
}
|
|
|
|
|
2014-01-03 11:38:52 -05:00
|
|
|
//ULONG WINAPI extCreateRenderTarget8(void *lpdd3dd, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface)
|
|
|
|
ULONG WINAPI extCreateRenderTarget8(void *lpdd3dd, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, void** ppSurface)
|
|
|
|
{
|
|
|
|
ULONG res;
|
|
|
|
|
|
|
|
OutTraceD3D("Device::CreateRenderTarget(8): dd3dd=%x dim=(%dx%d) Format=%x Lockable=%x\n",
|
|
|
|
lpdd3dd, Width, Height, Format, Lockable);
|
|
|
|
res=(*pCreateRenderTarget8)(lpdd3dd, Width, Height, Format, MultiSample, Lockable, ppSurface);
|
|
|
|
OutTraceD3D("Device::CreateRenderTarget(8): res=%x\n", res);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI extBeginScene8(void *lpdd3dd)
|
|
|
|
{
|
|
|
|
ULONG res;
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceB("Device::BeginScene(8): d3dd=%x\n", lpdd3dd);
|
2014-01-03 11:38:52 -05:00
|
|
|
res=(*pBeginScene8)(lpdd3dd);
|
|
|
|
if (res) OutTraceE("Device::BeginScene(8) ERROR: err=%x\n", res);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI extBeginScene9(void *lpdd3dd)
|
|
|
|
{
|
|
|
|
ULONG res;
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceB("Device::BeginScene(9): d3dd=%x\n", lpdd3dd);
|
2014-01-03 11:38:52 -05:00
|
|
|
res=(*pBeginScene9)(lpdd3dd);
|
|
|
|
if (res) OutTraceE("Device::BeginScene(9) ERROR: err=%x\n", res);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI extEndScene8(void *lpdd3dd)
|
|
|
|
{
|
|
|
|
ULONG res;
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceB("Device::EndScene(8): d3dd=%x\n", lpdd3dd);
|
2014-01-03 11:38:52 -05:00
|
|
|
res=(*pEndScene8)(lpdd3dd);
|
|
|
|
if (res) OutTraceE("Device::EndScene(8) ERROR: err=%x\n", res);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI extEndScene9(void *lpdd3dd)
|
|
|
|
{
|
|
|
|
ULONG res;
|
2014-10-06 12:39:20 -04:00
|
|
|
OutTraceB("Device::EndScene(9): d3dd=%x\n", lpdd3dd);
|
2014-01-03 11:38:52 -05:00
|
|
|
res=(*pEndScene9)(lpdd3dd);
|
|
|
|
if (res) OutTraceE("Device::EndScene(9) ERROR: err=%x\n", res);
|
|
|
|
return res;
|
|
|
|
}
|
2014-03-15 12:38:56 -04:00
|
|
|
|
|
|
|
ULONG WINAPI extSetTexture8(void *lpd3dd, DWORD Stage, void* pTexture)
|
|
|
|
{
|
2015-10-05 12:40:44 -04:00
|
|
|
ULONG ret;
|
|
|
|
if (dxw.dwFlags4 & NOTEXTURES) {
|
|
|
|
(*pSetTexture8)(lpd3dd, Stage, NULL);
|
|
|
|
OutTraceD3D("Device::SetTexture(8): d3dd=%x stage=%x\n", lpd3dd, Stage);
|
|
|
|
return DD_OK;
|
|
|
|
}
|
|
|
|
ret = (*pSetTexture8)(lpd3dd, Stage, pTexture);
|
|
|
|
OutTraceD3D("Device::SetTexture(8): d3dd=%x stage=%x texture=%x ret=%x\n", lpd3dd, Stage, pTexture, ret);
|
|
|
|
if(pTexture) D3D8TextureHandling((void *)pTexture, Stage);
|
|
|
|
return ret;
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
ULONG WINAPI extSetTexture9(void *lpd3dd, DWORD Stage, void* pTexture)
|
|
|
|
{
|
2015-10-05 12:40:44 -04:00
|
|
|
ULONG ret;
|
|
|
|
if (dxw.dwFlags4 & NOTEXTURES) {
|
|
|
|
(*pSetTexture9)(lpd3dd, Stage, NULL);
|
|
|
|
OutTraceD3D("Device::SetTexture(9): d3dd=%x stage=%x\n", lpd3dd, Stage);
|
|
|
|
return DD_OK;
|
|
|
|
}
|
|
|
|
ret = (*pSetTexture9)(lpd3dd, Stage, pTexture);
|
|
|
|
OutTraceD3D("Device::SetTexture(9): d3dd=%x stage=%x texture=%x ret=%x\n", lpd3dd, Stage, pTexture, ret);
|
2015-12-15 11:42:37 -05:00
|
|
|
if(pTexture) D3D9TextureHandling((void *)pTexture, (int)Stage);
|
2015-10-05 12:40:44 -04:00
|
|
|
return ret;
|
2014-03-15 12:38:56 -04:00
|
|
|
}
|
2014-05-20 12:39:14 -04:00
|
|
|
|
|
|
|
BOOL WINAPI extShowCursor8(void *lpd3dd, BOOL bShow)
|
|
|
|
{
|
|
|
|
BOOL res, bNew;
|
|
|
|
bNew=bShow;
|
|
|
|
if(dxw.dwFlags2 & SHOWHWCURSOR) bNew=TRUE;
|
|
|
|
if(dxw.dwFlags1 & HIDEHWCURSOR) bNew=FALSE;
|
|
|
|
res=(*pShowCursor8)(lpd3dd, bNew);
|
|
|
|
if(bNew==bShow)
|
|
|
|
OutTraceD3D("Device::ShowCursor(8): d3dd=%x show=%x res=%x\n", lpd3dd, bNew, res);
|
|
|
|
else
|
|
|
|
OutTraceD3D("Device::ShowCursor(8): d3dd=%x show=%x->%x res=%x\n", lpd3dd, bShow, bNew, res);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI extShowCursor9(void *lpd3dd, BOOL bShow)
|
|
|
|
{
|
|
|
|
BOOL res, bNew;
|
|
|
|
bNew=bShow;
|
|
|
|
if(dxw.dwFlags2 & SHOWHWCURSOR) bNew=TRUE;
|
|
|
|
if(dxw.dwFlags1 & HIDEHWCURSOR) bNew=FALSE;
|
|
|
|
res=(*pShowCursor9)(lpd3dd, bNew);
|
|
|
|
if(bNew==bShow)
|
|
|
|
OutTraceD3D("Device::ShowCursor(9): d3dd=%x show=%x res=%x\n", lpd3dd, bNew, res);
|
|
|
|
else
|
|
|
|
OutTraceD3D("Device::ShowCursor(9): d3dd=%x show=%x->%x res=%x\n", lpd3dd, bShow, bNew, res);
|
|
|
|
return res;
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
|
|
|
|
void WINAPI voidDebugSetLevel(void)
|
|
|
|
{
|
2014-10-30 12:39:54 -04:00
|
|
|
OutTraceD3D("DebugSetLevel: SUPPRESS\n");
|
2014-10-06 12:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void WINAPI voidDebugSetMute(void)
|
|
|
|
{
|
2014-10-30 12:39:54 -04:00
|
|
|
OutTraceD3D("DebugSetMute: SUPPRESS\n");
|
2014-10-06 12:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL WINAPI voidDisableD3DSpy(void)
|
|
|
|
{
|
2014-10-30 12:39:54 -04:00
|
|
|
OutTraceD3D("DisableD3DSpy: SUPPRESS\n");
|
2014-10-06 12:39:20 -04:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI voidDirect3DShaderValidatorCreate9(void)
|
|
|
|
{
|
2014-10-30 12:39:54 -04:00
|
|
|
OutTraceD3D("Direct3DShaderValidatorCreate9: SUPPRESS\n");
|
2014-10-06 12:39:20 -04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
static HRESULT WINAPI extCheckDeviceType(CheckDeviceType_Type pCheckDeviceType, void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed)
|
2014-10-06 12:39:20 -04:00
|
|
|
{
|
2015-03-22 12:40:33 -04:00
|
|
|
HRESULT res;
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("CheckDeviceType: d3d=%x adapter=%d windowed=%x\n", lpd3d, Adapter, bWindowed);
|
2015-03-22 12:40:33 -04:00
|
|
|
if(dxw.Windowize) bWindowed = TRUE;
|
|
|
|
res = (*pCheckDeviceType)(lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed);
|
|
|
|
OutTraceD3D("CheckDeviceType: res=%x\n", res);
|
|
|
|
return res;
|
2014-10-06 12:39:20 -04:00
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extCheckDeviceType8(void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed)
|
|
|
|
{ return extCheckDeviceType(pCheckDeviceType8, lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); }
|
|
|
|
HRESULT WINAPI extCheckDeviceType9(void *lpd3d, UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed)
|
|
|
|
{ return extCheckDeviceType(pCheckDeviceType9, lpd3d, Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); }
|
2014-10-06 12:39:20 -04:00
|
|
|
|
2015-07-01 12:40:14 -04:00
|
|
|
static char *ExplainD3D9DeviceType(D3DDEVTYPE DeviceType)
|
|
|
|
{
|
|
|
|
char *s;
|
|
|
|
switch(DeviceType){
|
|
|
|
case D3DDEVTYPE_HAL: s="HAL"; break;
|
|
|
|
case D3DDEVTYPE_NULLREF: s="NULLREF"; break;
|
|
|
|
case D3DDEVTYPE_REF: s="REF"; break;
|
|
|
|
case D3DDEVTYPE_SW: s="SW"; break;
|
|
|
|
default: s="unknown"; break;
|
|
|
|
}
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
2015-01-24 11:40:16 -05:00
|
|
|
HRESULT WINAPI extD3DGetDeviceCaps(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps, int version)
|
2014-10-06 12:39:20 -04:00
|
|
|
{
|
2015-07-01 12:40:14 -04:00
|
|
|
HRESULT res;
|
2015-01-24 11:40:16 -05:00
|
|
|
OutTraceD3D("GetDeviceCaps(%d): d3d=%x adapter=%d devtype=%x(%s)\n", version, lpd3d, Adapter, DeviceType, ExplainD3D9DeviceType(DeviceType));
|
2016-04-17 12:45:41 -04:00
|
|
|
|
|
|
|
if(version == 8)
|
|
|
|
res=(*pD3DGetDeviceCaps8)(lpd3d, Adapter, DeviceType, (D3DCAPS8 *)pCaps);
|
|
|
|
else
|
|
|
|
res=(*pD3DGetDeviceCaps9)(lpd3d, Adapter, DeviceType, pCaps);
|
|
|
|
|
2015-07-01 12:40:14 -04:00
|
|
|
if(res){
|
|
|
|
OutTraceE("GetDeviceCaps: ERROR: err=%x\n", res);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
if(IsDebug){
|
2015-01-24 11:40:16 -05:00
|
|
|
OutTrace("GetDeviceCaps:\n\t"
|
|
|
|
"DeviceType=%x(%s)\n\t"
|
|
|
|
"Caps=%x Caps2=%x Caps3=%x\n\t"
|
|
|
|
"PresentationIntervals=%x\n\t"
|
|
|
|
"CursorCaps=%x DevCaps=%x\n\t"
|
|
|
|
"PrimitiveMiscCaps=%x\n\t"
|
|
|
|
"RasterCaps=%x\n\t"
|
|
|
|
"ZCmpCaps=%x\n\t"
|
|
|
|
"SrcBlendCaps=%x\n\t"
|
|
|
|
"DestBlendCaps=%x\n\t"
|
|
|
|
"AlphaCmpCaps=%x\n\t"
|
|
|
|
"ShadeCaps=%x\n\t"
|
|
|
|
"TextureCaps=%x\n\t",
|
|
|
|
pCaps->DeviceType, ExplainD3D9DeviceType(pCaps->DeviceType),
|
|
|
|
pCaps->Caps, pCaps->Caps2, pCaps->Caps3,
|
|
|
|
pCaps->PresentationIntervals,
|
|
|
|
pCaps->CursorCaps, pCaps->DevCaps,
|
|
|
|
pCaps->PrimitiveMiscCaps,
|
|
|
|
pCaps->RasterCaps,
|
|
|
|
pCaps->ZCmpCaps,
|
|
|
|
pCaps->SrcBlendCaps,
|
|
|
|
pCaps->DestBlendCaps,
|
|
|
|
pCaps->AlphaCmpCaps,
|
|
|
|
pCaps->ShadeCaps,
|
|
|
|
pCaps->TextureCaps);
|
|
|
|
OutTrace(
|
|
|
|
"TextureFilterCaps=%x\n\t"
|
|
|
|
"CubeTextureFilterCaps=%x\n\t"
|
|
|
|
"VolumeTextureFilterCaps=%x\n\t"
|
|
|
|
"TextureAddressCaps=%x\n\t"
|
|
|
|
"VolumeTextureAddressCaps=%x\n\t"
|
|
|
|
"LineCaps=%x\n\t"
|
|
|
|
"StencilCaps=%x\n\t"
|
|
|
|
"FVFCaps=%x\n\t"
|
|
|
|
"TextureOpCaps=%x\n\t"
|
|
|
|
"VertexProcessingCaps=%x\n\t",
|
|
|
|
pCaps->TextureFilterCaps,
|
|
|
|
pCaps->CubeTextureFilterCaps,
|
|
|
|
pCaps->VolumeTextureFilterCaps,
|
|
|
|
pCaps->TextureAddressCaps,
|
|
|
|
pCaps->VolumeTextureAddressCaps,
|
|
|
|
pCaps->LineCaps,
|
|
|
|
pCaps->StencilCaps,
|
|
|
|
pCaps->FVFCaps,
|
|
|
|
pCaps->TextureOpCaps,
|
|
|
|
pCaps->VertexProcessingCaps);
|
|
|
|
OutTrace(
|
|
|
|
"MaxTexture(Width x Height)=(%dx%d)\n\t"
|
|
|
|
"MaxVolumeExtent=%d\n\t"
|
|
|
|
"MaxTextureRepeat=%d\n\t"
|
|
|
|
"MaxTextureAspectRatio=%d\n\t"
|
|
|
|
"MaxAnisotropy=%d\n\t"
|
|
|
|
"MaxActiveLights=%d\n\t"
|
|
|
|
"MaxUserClipPlanes=%x\n\t"
|
|
|
|
"MaxUserClipPlanes=%x\n\t"
|
|
|
|
"MaxVertexW=%f\n\t"
|
|
|
|
"GuardBandLeft=%f\n\t"
|
|
|
|
"GuardBandTop=%f\n\t"
|
|
|
|
"GuardBandRight=%f\n\t"
|
|
|
|
"GuardBandBottom=%f\n\t"
|
|
|
|
"ExtentsAdjust=%f\n\t"
|
|
|
|
"MaxPointSize=%f\n\t"
|
|
|
|
"MaxTextureBlendStages=%d\n\t"
|
|
|
|
"MaxSimultaneousTextures=%x\n\t"
|
|
|
|
"MaxVertexBlendMatrices=%x\n\t"
|
|
|
|
"MaxVertexBlendMatrixIndex=%x\n\t"
|
|
|
|
"MaxPrimitiveCount=%d\n\t"
|
|
|
|
"MaxVertexIndex=%x\n\t"
|
|
|
|
"MaxStreams=%x\n\t"
|
|
|
|
"MaxStreamStride=%x\n\t"
|
|
|
|
"VertexShaderVersion=%x\n\t"
|
|
|
|
"MaxVertexShaderConst=%d\n\t"
|
|
|
|
"PixelShaderVersion=%x\n\t"
|
|
|
|
"PixelShader1xMaxValue=%f\n\t",
|
|
|
|
pCaps->MaxTextureWidth, pCaps->MaxTextureHeight,
|
|
|
|
pCaps->MaxVolumeExtent,
|
|
|
|
pCaps->MaxTextureRepeat,
|
|
|
|
pCaps->MaxTextureAspectRatio,
|
|
|
|
pCaps->MaxAnisotropy,
|
|
|
|
pCaps->MaxActiveLights,
|
|
|
|
pCaps->MaxUserClipPlanes,
|
|
|
|
pCaps->MaxUserClipPlanes,
|
|
|
|
pCaps->MaxVertexW,
|
|
|
|
pCaps->GuardBandLeft,
|
|
|
|
pCaps->GuardBandTop,
|
|
|
|
pCaps->GuardBandRight,
|
|
|
|
pCaps->GuardBandBottom,
|
|
|
|
pCaps->ExtentsAdjust,
|
|
|
|
pCaps->MaxPointSize,
|
|
|
|
pCaps->MaxTextureBlendStages,
|
|
|
|
pCaps->MaxSimultaneousTextures,
|
|
|
|
pCaps->MaxVertexBlendMatrices,
|
|
|
|
pCaps->MaxVertexBlendMatrixIndex,
|
|
|
|
pCaps->MaxPrimitiveCount,
|
|
|
|
pCaps->MaxVertexIndex,
|
|
|
|
pCaps->MaxStreams,
|
|
|
|
pCaps->MaxStreamStride,
|
|
|
|
pCaps->VertexShaderVersion,
|
|
|
|
pCaps->MaxVertexShaderConst,
|
|
|
|
pCaps->PixelShaderVersion,
|
|
|
|
pCaps->PixelShader1xMaxValue);
|
|
|
|
if(version == 9) OutTrace(
|
|
|
|
"DevCaps2=%x Reserved5=%x\n\t"
|
|
|
|
"MaxNpatchTessellationLevel=%f\n\t"
|
|
|
|
"MasterAdapterOrdinal=%i\n\t"
|
|
|
|
"AdapterOrdinalInGroup=%i\n\t"
|
|
|
|
"NumberOfAdaptersInGroup=%i\n\t"
|
|
|
|
"DeclTypes=%x\n\t"
|
|
|
|
"NumSimultaneousRTs=%x\n\t"
|
|
|
|
"StretchRectFilterCaps=%x\n\t"
|
|
|
|
"VertexTextureFilterCaps=%x\n\t"
|
|
|
|
"MaxVShaderInstructionsExecuted=%x\n\t"
|
|
|
|
"MaxPShaderInstructionsExecuted=%x\n\t"
|
|
|
|
"MaxVertexShader30InstructionSlots=%x\n\t"
|
|
|
|
"MaxPixelShader30InstructionSlots=%x\n",
|
|
|
|
pCaps->DevCaps2, pCaps->Reserved5,
|
|
|
|
pCaps->MaxNpatchTessellationLevel,
|
|
|
|
pCaps->MasterAdapterOrdinal,
|
|
|
|
pCaps->AdapterOrdinalInGroup,
|
|
|
|
pCaps->NumberOfAdaptersInGroup,
|
|
|
|
pCaps->DeclTypes,
|
|
|
|
pCaps->NumSimultaneousRTs,
|
|
|
|
pCaps->StretchRectFilterCaps,
|
|
|
|
pCaps->VertexTextureFilterCaps,
|
|
|
|
pCaps->MaxVShaderInstructionsExecuted,
|
|
|
|
pCaps->MaxPShaderInstructionsExecuted,
|
|
|
|
pCaps->MaxVertexShader30InstructionSlots,
|
|
|
|
pCaps->MaxPixelShader30InstructionSlots);
|
2015-07-01 12:40:14 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return res;
|
2014-10-06 12:39:20 -04:00
|
|
|
}
|
|
|
|
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extD3DGetDeviceCaps8(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8 *pCaps)
|
2016-04-20 12:45:44 -04:00
|
|
|
{ return extD3DGetDeviceCaps(lpd3d, Adapter, DeviceType, (D3DCAPS9 *)pCaps, 8); }
|
2016-04-17 12:45:41 -04:00
|
|
|
HRESULT WINAPI extD3DGetDeviceCaps9(void *lpd3d, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9 *pCaps)
|
2016-04-20 12:45:44 -04:00
|
|
|
{ return extD3DGetDeviceCaps(lpd3d, Adapter, DeviceType, pCaps, 9); }
|
2015-01-24 11:40:16 -05:00
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
static HMONITOR WINAPI extGetAdapterMonitor(GetAdapterMonitor_Type pGetAdapterMonitor, void *lpd3d, UINT Adapter)
|
2014-10-06 12:39:20 -04:00
|
|
|
{
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("GetAdapterMonitor: d3d=%x adapter=%d\n", lpd3d, Adapter);
|
2016-04-20 12:45:44 -04:00
|
|
|
if((dxw.dwFlags2 & HIDEMULTIMONITOR) && (Adapter != D3DADAPTER_DEFAULT)){
|
|
|
|
OutTraceD3D("GetAdapterMonitor: HIDE adapter=%d\n", Adapter);
|
|
|
|
return NULL;
|
|
|
|
}
|
2014-10-06 12:39:20 -04:00
|
|
|
return (*pGetAdapterMonitor)(lpd3d, Adapter);
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
HMONITOR WINAPI extGetAdapterMonitor8(void *lpd3d, UINT Adapter)
|
|
|
|
{ return extGetAdapterMonitor(pGetAdapterMonitor8, lpd3d, Adapter); }
|
|
|
|
HMONITOR WINAPI extGetAdapterMonitor9(void *lpd3d, UINT Adapter)
|
|
|
|
{ return extGetAdapterMonitor(pGetAdapterMonitor9, lpd3d, Adapter); }
|
|
|
|
|
|
|
|
|
|
|
|
static UINT WINAPI extGetAvailableTextureMem(GetAvailableTextureMem_Type pGetAvailableTextureMem, void *lpd3dd)
|
2015-07-01 12:40:14 -04:00
|
|
|
{
|
|
|
|
const UINT TextureMemoryLimit = 1024 * 1024 * 1024; // 1GB
|
|
|
|
// const DWORD dwMaxMem = 0x70000000; = 1.8G
|
|
|
|
UINT AvailableTextureMem = (*pGetAvailableTextureMem)(lpd3dd);
|
|
|
|
OutTraceD3D("GetAvailableTextureMem: lpd3dd=%x AvailableTextureMem=%u(%dMB)\n", lpd3dd, AvailableTextureMem, AvailableTextureMem>>20);
|
2016-07-09 12:47:08 -04:00
|
|
|
|
|
|
|
if(dxw.bHintActive && (AvailableTextureMem > TextureMemoryLimit)) ShowHint(HINT_LIMITMEM);
|
|
|
|
|
2015-07-01 12:40:14 -04:00
|
|
|
if((dxw.dwFlags2 & LIMITRESOURCES) && (AvailableTextureMem > TextureMemoryLimit)){
|
|
|
|
OutTraceDW("GetAvailableTextureMem: LIMIT AvailableTextureMem=%u->%u\n", AvailableTextureMem, TextureMemoryLimit);
|
|
|
|
AvailableTextureMem = TextureMemoryLimit;
|
|
|
|
}
|
2015-01-24 11:40:16 -05:00
|
|
|
if(dxw.dwFlags5 & STRESSRESOURCES) AvailableTextureMem = 0xFFFFFFFF;
|
2016-07-09 12:47:08 -04:00
|
|
|
|
2015-07-01 12:40:14 -04:00
|
|
|
return AvailableTextureMem;
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
UINT WINAPI extGetAvailableTextureMem8(void *lpd3dd)
|
|
|
|
{ return extGetAvailableTextureMem(pGetAvailableTextureMem8, lpd3dd); }
|
|
|
|
UINT WINAPI extGetAvailableTextureMem9(void *lpd3dd)
|
|
|
|
{ return extGetAvailableTextureMem(pGetAvailableTextureMem9, lpd3dd); }
|
|
|
|
|
|
|
|
static HRESULT WINAPI extTestCooperativeLevel(TestCooperativeLevel_Type pTestCooperativeLevel, void *lpd3dd)
|
2014-10-06 12:39:20 -04:00
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
res = (*pTestCooperativeLevel)(lpd3dd);
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceB("TestCooperativeLevel: d3dd=%x res=%x\n", lpd3dd, res);
|
2014-10-06 12:39:20 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extTestCooperativeLevel8(void *lpd3dd)
|
|
|
|
{ return extTestCooperativeLevel(pTestCooperativeLevel8, lpd3dd); }
|
|
|
|
HRESULT WINAPI extTestCooperativeLevel9(void *lpd3dd)
|
|
|
|
{ return extTestCooperativeLevel(pTestCooperativeLevel9, lpd3dd); }
|
|
|
|
|
2014-10-06 12:39:20 -04:00
|
|
|
HRESULT WINAPI extGetSwapChain(void *lpd3dd, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("GetSwapChain: d3dd=%x SwapChain=%d\n", lpd3dd, iSwapChain);
|
2014-10-06 12:39:20 -04:00
|
|
|
res = (*pGetSwapChain)(lpd3dd, iSwapChain, pSwapChain);
|
2015-07-04 12:40:35 -04:00
|
|
|
if(res) OutTraceE("GetSwapChain ERROR: res=%x(%s)\n", res, ExplainDDError(res));
|
2014-10-06 12:39:20 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
UINT WINAPI extGetNumberOfSwapChains(void *lpd3dd)
|
|
|
|
{
|
|
|
|
UINT res;
|
|
|
|
res = (*pGetNumberOfSwapChains)(lpd3dd);
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("GetNumberOfSwapChains: d3dd=%x res=%d\n", lpd3dd, res);
|
2014-10-06 12:39:20 -04:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extBeginStateBlock8(void *lpd3dd)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("BeginStateBlock(8): d3dd=%x\n", lpd3dd);
|
2014-10-06 12:39:20 -04:00
|
|
|
res = (*pBeginStateBlock8)(lpd3dd);
|
|
|
|
HookD3DDevice8(&lpd3dd);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extBeginStateBlock9(void *lpd3dd)
|
|
|
|
{
|
|
|
|
// v2.02.78: D3DDevice9::BeginStateBlock refreshes the COM D3DDevice9 method pointers, so that
|
|
|
|
// you need to hook the device object again. This operation fixes the switch to fullscreen mode
|
|
|
|
// in "Freedom Force vs. the Third Reich".
|
|
|
|
HRESULT res;
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("BeginStateBlock(9): d3dd=%x\n", lpd3dd);
|
2014-10-06 12:39:20 -04:00
|
|
|
res = (*pBeginStateBlock9)(lpd3dd);
|
|
|
|
HookD3DDevice9(&lpd3dd);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extEndStateBlock8(void *lpd3dd, DWORD *pToken)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("EndStateBlock(8): d3dd=%x\n", lpd3dd);
|
2014-10-06 12:39:20 -04:00
|
|
|
res = (*pEndStateBlock8)(lpd3dd, pToken);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extEndStateBlock9(void *lpd3dd, IDirect3DStateBlock9** ppSB)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
2015-07-01 12:40:14 -04:00
|
|
|
OutTraceD3D("EndStateBlock(9): d3dd=%x\n", lpd3dd);
|
2014-10-06 12:39:20 -04:00
|
|
|
res = (*pEndStateBlock9)(lpd3dd, ppSB);
|
|
|
|
return res;
|
2014-08-13 12:39:40 -04:00
|
|
|
}
|
2014-12-13 11:40:09 -05:00
|
|
|
|
|
|
|
HRESULT WINAPI extCreateTexture8(void *lpd3dd, UINT Width, UINT Height, UINT Levels,
|
|
|
|
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool,
|
|
|
|
void **ppTexture)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
OutTraceD3D("CreateTexture(8): lpd3dd=%x size=(%dx%d) levels=%d usage=%x format=%d pool=%x\n",
|
|
|
|
lpd3dd, Width, Height, Levels, Usage, Format, Pool);
|
|
|
|
res=(*pCreateTexture8)(lpd3dd, Width, Height, Levels, Usage, Format, Pool, ppTexture);
|
|
|
|
if (res)
|
|
|
|
OutTraceE("CreateTexture(8) ERROR: err=%x\n", res);
|
|
|
|
else {
|
|
|
|
OutTraceD3D("CreateTexture(8): lpTexture=%x\n", *ppTexture);
|
|
|
|
HookD3DTexture8(ppTexture);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extCreateTexture9(void *lpd3dd, UINT Width, UINT Height, UINT Levels,
|
|
|
|
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool,
|
|
|
|
void **ppTexture, HANDLE *pSharedHandle)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
OutTraceD3D("CreateTexture(9): lpd3dd=%x size=(%dx%d) levels=%d usage=%x format=%d pool=%x\n",
|
|
|
|
lpd3dd, Width, Height, Levels, Usage, Format, Pool, ppTexture, pSharedHandle);
|
|
|
|
res=(*pCreateTexture9)(lpd3dd, Width, Height, Levels, Usage, Format, Pool, ppTexture, pSharedHandle);
|
|
|
|
if (res)
|
|
|
|
OutTraceE("CreateTexture(9) ERROR: err=%x\n", res);
|
|
|
|
else {
|
|
|
|
OutTraceD3D("CreateTexture(9): lpTexture=%x\n", *ppTexture);
|
|
|
|
HookD3DTexture9(ppTexture);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
static HRESULT WINAPI extLockRect(LockRect_Type pLockRect, void *lpd3dtex, UINT Level, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, DWORD Flags)
|
2014-12-13 11:40:09 -05:00
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
if(IsTraceD3D){
|
|
|
|
char sRect[81];
|
|
|
|
if(pRect)
|
|
|
|
sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", pRect->left, pRect->top, pRect->right, pRect->bottom);
|
|
|
|
else
|
|
|
|
strcpy_s(sRect, 80, "NULL");
|
|
|
|
OutTrace("Texture::LockRect: lpd3dtex=%x level=%d rect=%s flags=%x\n", lpd3dtex, Level, sRect, Flags);
|
|
|
|
}
|
|
|
|
res=(*pLockRect)(lpd3dtex, Level, pLockedRect, pRect, Flags);
|
|
|
|
if (res) OutTraceE("Device::LockRect ERROR: err=%x\n", res);
|
|
|
|
else {
|
|
|
|
OutTraceD3D("Device::LockRect: pBits=%x pitch=%d\n", pLockedRect->pBits, pLockedRect->Pitch);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
HRESULT WINAPI extLockRect8(void *lpd3dtex, UINT Level, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, DWORD Flags)
|
|
|
|
{ return extLockRect(pLockRect8, lpd3dtex, Level, pLockedRect, pRect, Flags); }
|
|
|
|
HRESULT WINAPI extLockRect9(void *lpd3dtex, UINT Level, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, DWORD Flags)
|
|
|
|
{ return extLockRect(pLockRect9, lpd3dtex, Level, pLockedRect, pRect, Flags); }
|
|
|
|
|
2014-12-13 11:40:09 -05:00
|
|
|
typedef void (*TextureHandling_Type)(void *, int);
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
static HRESULT WINAPI extUnlockRect(UnlockRect_Type pUnlockRect, void *lpd3dtex, UINT Level, TextureHandling_Type TextureHandling)
|
2014-12-13 11:40:09 -05:00
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
OutTraceD3D("Texture::UnlockRect: lpd3dtex=%x level=%d\n", lpd3dtex, Level);
|
|
|
|
res=(*pUnlockRect)(lpd3dtex, Level);
|
|
|
|
|
|
|
|
if(TextureHandling) TextureHandling(lpd3dtex, Level);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT WINAPI extUnlockRect8(void *lpd3dtex, UINT Level)
|
2016-04-20 12:45:44 -04:00
|
|
|
{ return extUnlockRect(pUnlockRect8, lpd3dtex, Level, D3D8TextureHandling); }
|
2014-12-13 11:40:09 -05:00
|
|
|
HRESULT WINAPI extUnlockRect9(void *lpd3dtex, UINT Level)
|
2016-04-20 12:45:44 -04:00
|
|
|
{ return extUnlockRect(pUnlockRect9, lpd3dtex, Level, D3D9TextureHandling); }
|
2015-10-05 12:40:44 -04:00
|
|
|
|
2016-06-21 12:46:09 -04:00
|
|
|
void WINAPI extD3DPERF_SetOptions(DWORD dwOptions)
|
|
|
|
{
|
|
|
|
if(dwOptions) OutTraceD3D("circumvent D3DPERF_SetOptions\n");
|
|
|
|
pD3DPERF_SetOptions(0);
|
|
|
|
}
|
|
|
|
|
2016-12-04 11:45:35 -05:00
|
|
|
void RestoreD3DSurfaces(BOOL bFullScreen)
|
|
|
|
{
|
|
|
|
//DWORD param[64];
|
|
|
|
//HRESULT res;
|
|
|
|
|
|
|
|
// a well programmed D3D game should provide to Reset by itself, so the best thing to do is NOTHING
|
|
|
|
return;
|
|
|
|
|
|
|
|
//if(lpD3DActiveDevice){
|
|
|
|
// OutTrace("RestoreD3DSurfaces(%d): reset device %x fullscreen=%x\n", dwD3DVersion, lpD3DActiveDevice, bFullScreen);
|
|
|
|
// RECT Desktop;
|
|
|
|
// memcpy(param, gActiveDeviceParams, sizeof(param));
|
|
|
|
// if(bFullScreen){
|
|
|
|
// (*pGetClientRect)(0, &Desktop);
|
|
|
|
// param[0] = Desktop.right; // BackBufferWidth
|
|
|
|
// param[1] = Desktop.bottom; // BackBufferHeight
|
|
|
|
// }
|
|
|
|
// res=(*pReset)(lpD3DActiveDevice, (D3DPRESENT_PARAMETERS *)param);
|
|
|
|
// if(res != DD_OK) OutTraceE("RestoreD3DSurfaces: Reset size=(%dx%d) err=%x(%s)\n",
|
|
|
|
// param[0], param[1], res, ExplainDDError(res));
|
|
|
|
//}
|
|
|
|
}
|
2016-07-09 12:47:08 -04:00
|
|
|
|
|
|
|
UINT WINAPI extGetAdapterModeCount8(void *lpd3d, UINT Adapter)
|
|
|
|
{
|
|
|
|
UINT ret;
|
|
|
|
OutTraceD3D("GetAdapterModeCount(8): d3d=%x adapter=%d\n", lpd3d, Adapter);
|
|
|
|
ret = (*pGetAdapterModeCount8)(lpd3d, Adapter);
|
|
|
|
if(dxw.dwFlags7 & ENUM16BITMODES){
|
|
|
|
OutTraceDW("GetAdapterModeCount(8): DOUBLED MODES %d->%d\n", ret, ret*2);
|
|
|
|
ret = ret * 2;
|
|
|
|
}
|
|
|
|
OutTraceD3D("GetAdapterModeCount(8): ret=%d\n", ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
UINT WINAPI extGetAdapterModeCount9(void *lpd3d, UINT Adapter, D3DFORMAT Format)
|
|
|
|
{
|
|
|
|
UINT ret;
|
|
|
|
OutTraceD3D("GetAdapterModeCount(9): d3d=%x adapter=%d format=%d(%s)\n",
|
|
|
|
lpd3d, Adapter, Format, ExplainD3DSurfaceFormat(Format));
|
|
|
|
ret = (*pGetAdapterModeCount9)(lpd3d, Adapter, Format);
|
|
|
|
if(dxw.dwFlags7 & ENUM16BITMODES){
|
|
|
|
OutTraceDW("GetAdapterModeCount(9): DOUBLED MODES %d->%d\n", ret, ret*2);
|
|
|
|
ret = ret * 2;
|
|
|
|
}
|
|
|
|
OutTraceD3D("GetAdapterModeCount(9): ret=%d\n", ret);
|
|
|
|
return ret;
|
|
|
|
}
|