1
0
mirror of https://github.com/djhackersdev/bemanitools.git synced 2025-01-19 15:18:38 +01:00

d3d9ex: override adapter mode information when all the info is pre-provided by the user

This speeds up IIDX load times, as well as allows you to use "unsupported" resolutions/refresh rates on weird monitors
This commit is contained in:
Will Xyen 2021-02-05 01:12:16 -08:00
parent 18f6d9ef70
commit 18842a1dd3

View File

@ -45,6 +45,18 @@ static HRESULT STDCALL my_CreateDeviceEx(
D3DDISPLAYMODEEX *fdm,
IDirect3DDevice9Ex **pdev);
static HRESULT STDCALL my_EnumAdapterModes(
IDirect3D9Ex *self,
UINT Adapter,
D3DFORMAT Format,
UINT Mode,
D3DDISPLAYMODE *pMode);
static UINT STDCALL my_GetAdapterModeCount(
IDirect3D9Ex *self,
UINT Adapter,
D3DFORMAT Format);
static HRESULT STDCALL my_Direct3DCreate9Ex(UINT sdk_ver, IDirect3D9Ex **api);
static WNDPROC real_WndProc;
@ -96,6 +108,17 @@ static int32_t d3d9ex_force_orientation = -1;
static int32_t d3d9ex_force_screen_res_width = -1;
static int32_t d3d9ex_force_screen_res_height = -1;
static bool check_d3d9ex_force_enum()
{
if (d3d9ex_force_refresh_rate != -1 &&
d3d9ex_force_screen_res_width != -1 &&
d3d9ex_force_screen_res_height != -1) {
return true;
}
return false;
}
/* ------------------------------------------------------------------------- */
static const struct hook_symbol d3d9ex_hook_syms[] = {
@ -412,6 +435,54 @@ static HRESULT STDCALL my_CreateDeviceEx(
return hr;
}
static HRESULT STDCALL my_EnumAdapterModes(
IDirect3D9Ex *self,
UINT Adapter,
D3DFORMAT Format,
UINT Mode,
D3DDISPLAYMODE *pMode)
{
IDirect3D9Ex *real = com_proxy_downcast(self)->real;
HRESULT hr;
if (d3d9ex_device_adapter>= 0) {
Adapter = d3d9ex_device_adapter;
}
hr = IDirect3D9Ex_EnumAdapterModes(real, Adapter, Format, Mode, pMode);
if (check_d3d9ex_force_enum()) {
log_info("EnumAdapterModes: Forcing mode");
pMode->Width = d3d9ex_force_screen_res_width;
pMode->Height = d3d9ex_force_screen_res_height;
pMode->RefreshRate = d3d9ex_force_refresh_rate;
}
return hr;
}
static UINT STDCALL my_GetAdapterModeCount(
IDirect3D9Ex *self,
UINT Adapter,
D3DFORMAT Format)
{
IDirect3D9Ex *real = com_proxy_downcast(self)->real;
UINT res;
if (d3d9ex_device_adapter>= 0) {
Adapter = d3d9ex_device_adapter;
}
res = IDirect3D9Ex_GetAdapterModeCount(real, Adapter, Format);
if (check_d3d9ex_force_enum()) {
log_info("GetAdapterModeCount: Forcing single return");
res = 1;
}
return res;
}
static HRESULT STDCALL my_Direct3DCreate9Ex(UINT sdk_ver, IDirect3D9Ex **api)
{
HRESULT hr;
@ -434,6 +505,8 @@ static HRESULT STDCALL my_Direct3DCreate9Ex(UINT sdk_ver, IDirect3D9Ex **api)
api_vtbl = api_proxy->vptr;
api_vtbl->CreateDeviceEx = my_CreateDeviceEx;
api_vtbl->EnumAdapterModes = my_EnumAdapterModes;
api_vtbl->GetAdapterModeCount = my_GetAdapterModeCount;
*api = (IDirect3D9Ex *) api_proxy;