From 0443a985bddd0976b9cf9d3ca3af27a0ac6b3e86 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 3 Nov 2021 17:14:24 +0000 Subject: [PATCH] wip: move gfx to gfxhook, some borderless window stuff --- chunihook/config.c | 3 +- chunihook/config.h | 2 +- chunihook/dllmain.c | 5 +- chunihook/meson.build | 1 + divahook/dllmain.c | 1 - gfxhook/config.c | 18 +++++++ gfxhook/config.h | 7 +++ {hooklib/gfx => gfxhook}/d3d11.c | 31 ++---------- {hooklib/gfx => gfxhook}/d3d11.h | 2 +- {hooklib/gfx => gfxhook}/d3d9.c | 10 ++-- {hooklib/gfx => gfxhook}/d3d9.h | 2 +- {hooklib/gfx => gfxhook}/dxgi.c | 4 +- {hooklib/gfx => gfxhook}/dxgi.h | 2 +- gfxhook/gfx.c | 50 +++++++++++++++++++ {hooklib/gfx => gfxhook}/gfx.h | 2 - gfxhook/meson.build | 27 +++++++++++ hooklib/gfx/gfx.c => gfxhook/util.c | 75 +++++++++++++++-------------- gfxhook/util.h | 7 +++ hooklib/config.c | 12 ----- hooklib/config.h | 3 -- hooklib/meson.build | 8 --- idzhook/config.c | 3 +- idzhook/config.h | 3 +- idzhook/dllmain.c | 7 +-- idzhook/meson.build | 1 + meson.build | 2 + mu3hook/config.c | 3 +- mu3hook/config.h | 3 +- mu3hook/dllmain.c | 9 ++-- mu3hook/meson.build | 1 + 30 files changed, 193 insertions(+), 111 deletions(-) create mode 100644 gfxhook/config.c create mode 100644 gfxhook/config.h rename {hooklib/gfx => gfxhook}/d3d11.c (85%) rename {hooklib/gfx => gfxhook}/d3d11.h (78%) rename {hooklib/gfx => gfxhook}/d3d9.c (94%) rename {hooklib/gfx => gfxhook}/d3d9.h (78%) rename {hooklib/gfx => gfxhook}/dxgi.c (99%) rename {hooklib/gfx => gfxhook}/dxgi.h (78%) create mode 100644 gfxhook/gfx.c rename {hooklib/gfx => gfxhook}/gfx.h (85%) create mode 100644 gfxhook/meson.build rename hooklib/gfx/gfx.c => gfxhook/util.c (57%) create mode 100644 gfxhook/util.h diff --git a/chunihook/config.c b/chunihook/config.c index 9216d6a..0f049b2 100644 --- a/chunihook/config.c +++ b/chunihook/config.c @@ -12,8 +12,9 @@ #include "chunihook/config.h" +#include "gfxhook/config.h" + #include "hooklib/config.h" -#include "hooklib/gfx/gfx.h" #include "platform/config.h" #include "platform/platform.h" diff --git a/chunihook/config.h b/chunihook/config.h index ded7a82..7740822 100644 --- a/chunihook/config.h +++ b/chunihook/config.h @@ -10,7 +10,7 @@ #include "chunihook/chuni-dll.h" #include "chunihook/slider.h" -#include "hooklib/gfx/gfx.h" +#include "gfxhook/gfx.h" #include "platform/platform.h" diff --git a/chunihook/dllmain.c b/chunihook/dllmain.c index b209c3f..e0db84c 100644 --- a/chunihook/dllmain.c +++ b/chunihook/dllmain.c @@ -12,10 +12,11 @@ #include "chuniio/chuniio.h" +#include "gfxhook/d3d9.h" +#include "gfxhook/gfx.h" + #include "hook/process.h" -#include "hooklib/gfx/d3d9.h" -#include "hooklib/gfx/gfx.h" #include "hooklib/serial.h" #include "hooklib/spike.h" diff --git a/chunihook/meson.build b/chunihook/meson.build index e2dfa08..3f4a35d 100644 --- a/chunihook/meson.build +++ b/chunihook/meson.build @@ -14,6 +14,7 @@ shared_library( amex_lib, board_lib, chuniio_lib, + gfxhook_lib, hooklib_lib, jvs_lib, platform_lib, diff --git a/divahook/dllmain.c b/divahook/dllmain.c index d06949c..fb3c678 100644 --- a/divahook/dllmain.c +++ b/divahook/dllmain.c @@ -13,7 +13,6 @@ #include "hook/process.h" -#include "hooklib/gfx/gfx.h" #include "hooklib/serial.h" #include "hooklib/spike.h" diff --git a/gfxhook/config.c b/gfxhook/config.c new file mode 100644 index 0000000..230ee0d --- /dev/null +++ b/gfxhook/config.c @@ -0,0 +1,18 @@ +#include + +#include +#include +#include + +#include "gfxhook/config.h" + +void gfx_config_load(struct gfx_config *cfg, const wchar_t *filename) +{ + assert(cfg != NULL); + assert(filename != NULL); + + cfg->enable = GetPrivateProfileIntW(L"gfx", L"enable", 1, filename); + cfg->windowed = GetPrivateProfileIntW(L"gfx", L"windowed", 0, filename); + cfg->framed = GetPrivateProfileIntW(L"gfx", L"framed", 1, filename); + cfg->monitor = GetPrivateProfileIntW(L"gfx", L"monitor", 0, filename); +} diff --git a/gfxhook/config.h b/gfxhook/config.h new file mode 100644 index 0000000..a6ced69 --- /dev/null +++ b/gfxhook/config.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +#include "gfxhook/gfx.h" + +void gfx_config_load(struct gfx_config *cfg, const wchar_t *filename); diff --git a/hooklib/gfx/d3d11.c b/gfxhook/d3d11.c similarity index 85% rename from hooklib/gfx/d3d11.c rename to gfxhook/d3d11.c index 37f7fb7..4313431 100644 --- a/hooklib/gfx/d3d11.c +++ b/gfxhook/d3d11.c @@ -6,12 +6,13 @@ #include #include +#include "gfxhook/gfx.h" +#include "gfxhook/util.h" + #include "hook/com-proxy.h" #include "hook/table.h" -#include "hooklib/config.h" #include "hooklib/dll.h" -#include "hooklib/gfx/gfx.h" #include "util/dprintf.h" @@ -176,30 +177,8 @@ HRESULT WINAPI D3D11CreateDeviceAndSwapChain( } if (hwnd != NULL) { - /* - * Ensure window is maximized to avoid a Windows 10 issue where a - * fullscreen swap chain is not created because the window is minimized - * at the time of creation. - */ - ShowWindow(hwnd, SW_RESTORE); - - if (!gfx_config.framed && width > 0 && height > 0) { - dprintf("DXGI: Resizing window to %ldx%ld\n", width, height); - - SetWindowLongPtrW(hwnd, GWL_STYLE, WS_POPUP); - SetWindowLongPtrW(hwnd, GWL_EXSTYLE, WS_EX_TOPMOST); - - SetWindowPos( - hwnd, - HWND_TOP, - 0, - 0, - width, - height, - SWP_FRAMECHANGED | SWP_NOSENDCHANGING); - - ShowWindow(hwnd, SW_SHOWMAXIMIZED); - } + gfx_util_ensure_win_visible(hwnd); + gfx_util_borderless_fullscreen_windowed(hwnd, width, height); } return next_D3D11CreateDeviceAndSwapChain( diff --git a/hooklib/gfx/d3d11.h b/gfxhook/d3d11.h similarity index 78% rename from hooklib/gfx/d3d11.h rename to gfxhook/d3d11.h index 7126d2e..c7cca9f 100644 --- a/hooklib/gfx/d3d11.h +++ b/gfxhook/d3d11.h @@ -2,6 +2,6 @@ #include -#include "hooklib/gfx/gfx.h" +#include "gfxhook/gfx.h" void gfx_d3d11_hook_init(const struct gfx_config *cfg, HINSTANCE self); diff --git a/hooklib/gfx/d3d9.c b/gfxhook/d3d9.c similarity index 94% rename from hooklib/gfx/d3d9.c rename to gfxhook/d3d9.c index d3b810a..4c39178 100644 --- a/hooklib/gfx/d3d9.c +++ b/gfxhook/d3d9.c @@ -8,9 +8,11 @@ #include "hook/com-proxy.h" #include "hook/table.h" -#include "hooklib/config.h" #include "hooklib/dll.h" -#include "hooklib/gfx/gfx.h" + +#include "gfxhook/config.h" +#include "gfxhook/gfx.h" +#include "gfxhook/util.h" #include "util/dprintf.h" @@ -144,10 +146,10 @@ static HRESULT STDMETHODCALLTYPE my_CreateDevice( } if (gfx_config.framed) { - gfx_frame_window(hwnd); + gfx_util_frame_window(hwnd); } - dprintf("Gfx: IDirect3D9:: Using Display No %x\n", gfx_config.monitor); + dprintf("Gfx: Using adapter %d\n", gfx_config.monitor); return IDirect3D9_CreateDevice(real, gfx_config.monitor, type, hwnd, flags, pp, pdev); } diff --git a/hooklib/gfx/d3d9.h b/gfxhook/d3d9.h similarity index 78% rename from hooklib/gfx/d3d9.h rename to gfxhook/d3d9.h index fb5607a..90acdf4 100644 --- a/hooklib/gfx/d3d9.h +++ b/gfxhook/d3d9.h @@ -2,6 +2,6 @@ #include -#include "hooklib/gfx/gfx.h" +#include "gfxhook/gfx.h" void gfx_d3d9_hook_init(const struct gfx_config *cfg, HINSTANCE self); diff --git a/hooklib/gfx/dxgi.c b/gfxhook/dxgi.c similarity index 99% rename from hooklib/gfx/dxgi.c rename to gfxhook/dxgi.c index a7b9c5c..4de0f74 100644 --- a/hooklib/gfx/dxgi.c +++ b/gfxhook/dxgi.c @@ -5,12 +5,12 @@ #include #include +#include "gfxhook/gfx.h" + #include "hook/com-proxy.h" #include "hook/table.h" -#include "hooklib/config.h" #include "hooklib/dll.h" -#include "hooklib/gfx/gfx.h" #include "util/dprintf.h" diff --git a/hooklib/gfx/dxgi.h b/gfxhook/dxgi.h similarity index 78% rename from hooklib/gfx/dxgi.h rename to gfxhook/dxgi.h index 114822e..1834300 100644 --- a/hooklib/gfx/dxgi.h +++ b/gfxhook/dxgi.h @@ -2,6 +2,6 @@ #include -#include "hooklib/gfx/gfx.h" +#include "gfxhook/gfx.h" void gfx_dxgi_hook_init(const struct gfx_config *cfg, HINSTANCE self); diff --git a/gfxhook/gfx.c b/gfxhook/gfx.c new file mode 100644 index 0000000..34533af --- /dev/null +++ b/gfxhook/gfx.c @@ -0,0 +1,50 @@ +#include + +#include +#include +#include + +#include "gfxhook/config.h" +#include "gfxhook/gfx.h" + +#include "hook/table.h" + +#include "util/dprintf.h" + +typedef BOOL (WINAPI *ShowWindow_t)(HWND hWnd, int nCmdShow); + +static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow); + +static struct gfx_config gfx_config; +static ShowWindow_t next_ShowWindow; + +static const struct hook_symbol gfx_hooks[] = { + { + .name = "ShowWindow", + .patch = hook_ShowWindow, + .link = (void **) &next_ShowWindow, + }, +}; + +void gfx_hook_init(const struct gfx_config *cfg, HINSTANCE self) +{ + assert(cfg != NULL); + + if (!cfg->enable) { + return; + } + + memcpy(&gfx_config, cfg, sizeof(*cfg)); + hook_table_apply(NULL, "user32.dll", gfx_hooks, _countof(gfx_hooks)); +} + +static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow) +{ + dprintf("Gfx: ShowWindow hook hit\n"); + + if (!gfx_config.framed && nCmdShow == SW_RESTORE) { + nCmdShow = SW_SHOW; + } + + return next_ShowWindow(hWnd, nCmdShow); +} diff --git a/hooklib/gfx/gfx.h b/gfxhook/gfx.h similarity index 85% rename from hooklib/gfx/gfx.h rename to gfxhook/gfx.h index 8273a8c..9182371 100644 --- a/hooklib/gfx/gfx.h +++ b/gfxhook/gfx.h @@ -12,5 +12,3 @@ struct gfx_config { }; void gfx_hook_init(const struct gfx_config *cfg, HINSTANCE self); - -HRESULT gfx_frame_window(HWND hwnd); diff --git a/gfxhook/meson.build b/gfxhook/meson.build new file mode 100644 index 0000000..f37accb --- /dev/null +++ b/gfxhook/meson.build @@ -0,0 +1,27 @@ +gfxhook_lib = static_library( + 'gfxhook', + include_directories : inc, + implicit_include_directories : false, + c_pch : '../precompiled.h', + dependencies : [ + capnhook.get_variable('hook_dep'), + ], + link_with : [ + hooklib_lib, + util_lib, + ], + sources : [ + 'config.c', + 'config.h', + 'd3d9.c', + 'd3d9.h', + 'd3d11.c', + 'd3d11.h', + 'dxgi.c', + 'dxgi.h', + 'gfx.c', + 'gfx.h', + 'util.c', + 'util.h', + ], +) diff --git a/hooklib/gfx/gfx.c b/gfxhook/util.c similarity index 57% rename from hooklib/gfx/gfx.c rename to gfxhook/util.c index ff3b1bd..14268f3 100644 --- a/hooklib/gfx/gfx.c +++ b/gfxhook/util.c @@ -1,55 +1,60 @@ #include -#include #include -#include -#include "hook/table.h" - -#include "hooklib/config.h" -#include "hooklib/gfx/gfx.h" +#include "gfxhook/util.h" #include "util/dprintf.h" -typedef BOOL (WINAPI *ShowWindow_t)(HWND hWnd, int nCmdShow); - -static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow); - -static struct gfx_config gfx_config; -static ShowWindow_t next_ShowWindow; - -static const struct hook_symbol gfx_hooks[] = { - { - .name = "ShowWindow", - .patch = hook_ShowWindow, - .link = (void **) &next_ShowWindow, - }, -}; - -void gfx_hook_init(const struct gfx_config *cfg, HINSTANCE self) +void gfx_util_ensure_win_visible(HWND hwnd) { - assert(cfg != NULL); + /* + * Ensure window is maximized to avoid a Windows 10 issue where a + * fullscreen swap chain is not created because the window is minimized + * at the time of creation. + */ + ShowWindow(hwnd, SW_RESTORE); +} + +void gfx_util_borderless_fullscreen_windowed(HWND hwnd, LONG width, LONG height) +{ + BOOL ok; + HRESULT hr; + + dprintf("Gfx: Resizing window to %ldx%ld\n", width, height); + + SetWindowLongPtrW(hwnd, GWL_STYLE, WS_POPUP); + SetWindowLongPtrW(hwnd, GWL_EXSTYLE, WS_EX_TOPMOST); + + ok = SetWindowPos( + hwnd, + HWND_TOP, + 0, + 0, + width, + height, + SWP_FRAMECHANGED | SWP_NOSENDCHANGING); + + if (!ok) { + /* come on... */ + hr = HRESULT_FROM_WIN32(GetLastError()); + dprintf("Gfx: SetWindowPos failed: %x\n", (int) hr); - if (!cfg->enable) { return; } - memcpy(&gfx_config, cfg, sizeof(*cfg)); - hook_table_apply(NULL, "user32.dll", gfx_hooks, _countof(gfx_hooks)); -} + ok = ShowWindow(hwnd, SW_SHOWMAXIMIZED); -static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow) -{ - dprintf("Gfx: ShowWindow hook hit\n"); + if (!ok) { + /* come on... */ + hr = HRESULT_FROM_WIN32(GetLastError()); + dprintf("Gfx: ShowWindow failed: %x\n", (int) hr); - if (!gfx_config.framed && nCmdShow == SW_RESTORE) { - nCmdShow = SW_SHOW; + return; } - - return next_ShowWindow(hWnd, nCmdShow); } -HRESULT gfx_frame_window(HWND hwnd) +HRESULT gfx_util_frame_window(HWND hwnd) { HRESULT hr; DWORD error; diff --git a/gfxhook/util.h b/gfxhook/util.h new file mode 100644 index 0000000..b300bba --- /dev/null +++ b/gfxhook/util.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +void gfx_util_ensure_win_visible(HWND hwnd); +void gfx_util_borderless_fullscreen_windowed(HWND hwnd, LONG width, LONG height); +HRESULT gfx_util_frame_window(HWND hwnd); diff --git a/hooklib/config.c b/hooklib/config.c index 5f5c080..5fc9383 100644 --- a/hooklib/config.c +++ b/hooklib/config.c @@ -6,7 +6,6 @@ #include "hooklib/config.h" #include "hooklib/dvd.h" -#include "hooklib/gfx/gfx.h" void dvd_config_load(struct dvd_config *cfg, const wchar_t *filename) { @@ -15,14 +14,3 @@ void dvd_config_load(struct dvd_config *cfg, const wchar_t *filename) cfg->enable = GetPrivateProfileIntW(L"dvd", L"enable", 1, filename); } - -void gfx_config_load(struct gfx_config *cfg, const wchar_t *filename) -{ - assert(cfg != NULL); - assert(filename != NULL); - - cfg->enable = GetPrivateProfileIntW(L"gfx", L"enable", 1, filename); - cfg->windowed = GetPrivateProfileIntW(L"gfx", L"windowed", 0, filename); - cfg->framed = GetPrivateProfileIntW(L"gfx", L"framed", 1, filename); - cfg->monitor = GetPrivateProfileIntW(L"gfx", L"monitor", 0, filename); -} diff --git a/hooklib/config.h b/hooklib/config.h index 0c19443..5da045d 100644 --- a/hooklib/config.h +++ b/hooklib/config.h @@ -1,10 +1,7 @@ #pragma once -#include #include #include "hooklib/dvd.h" -#include "hooklib/gfx/gfx.h" void dvd_config_load(struct dvd_config *cfg, const wchar_t *filename); -void gfx_config_load(struct gfx_config *cfg, const wchar_t *filename); diff --git a/hooklib/meson.build b/hooklib/meson.build index 1a78069..ce1c96e 100644 --- a/hooklib/meson.build +++ b/hooklib/meson.build @@ -17,14 +17,6 @@ hooklib_lib = static_library( 'dvd.h', 'fdshark.c', 'fdshark.h', - 'gfx/d3d9.c', - 'gfx/d3d9.h', - 'gfx/d3d11.c', - 'gfx/d3d11.h', - 'gfx/dxgi.c', - 'gfx/dxgi.h', - 'gfx/gfx.c', - 'gfx/gfx.h', 'path.c', 'path.h', 'reg.c', diff --git a/idzhook/config.c b/idzhook/config.c index bf95f1b..db83b9f 100644 --- a/idzhook/config.c +++ b/idzhook/config.c @@ -7,9 +7,10 @@ #include "board/config.h" #include "board/sg-reader.h" +#include "gfxhook/config.h" + #include "hooklib/config.h" #include "hooklib/dvd.h" -#include "hooklib/gfx/gfx.h" #include "idzhook/config.h" #include "idzhook/idz-dll.h" diff --git a/idzhook/config.h b/idzhook/config.h index 4ebb548..0684949 100644 --- a/idzhook/config.h +++ b/idzhook/config.h @@ -7,8 +7,9 @@ #include "board/sg-reader.h" +#include "gfxhook/gfx.h" + #include "hooklib/dvd.h" -#include "hooklib/gfx/gfx.h" #include "idzhook/idz-dll.h" #include "idzhook/zinput.h" diff --git a/idzhook/dllmain.c b/idzhook/dllmain.c index 545261d..80b8c66 100644 --- a/idzhook/dllmain.c +++ b/idzhook/dllmain.c @@ -9,12 +9,13 @@ #include "board/sg-reader.h" +#include "gfxhook/d3d11.h" +#include "gfxhook/dxgi.h" +#include "gfxhook/gfx.h" + #include "hook/process.h" #include "hooklib/dvd.h" -#include "hooklib/gfx/d3d11.h" -#include "hooklib/gfx/dxgi.h" -#include "hooklib/gfx/gfx.h" #include "hooklib/serial.h" #include "hooklib/spike.h" diff --git a/idzhook/meson.build b/idzhook/meson.build index 17b6484..ab90815 100644 --- a/idzhook/meson.build +++ b/idzhook/meson.build @@ -15,6 +15,7 @@ shared_library( aimeio_lib, amex_lib, board_lib, + gfxhook_lib, hooklib_lib, idzio_lib, jvs_lib, diff --git a/meson.build b/meson.build index d24723f..caca31f 100644 --- a/meson.build +++ b/meson.build @@ -50,6 +50,8 @@ subdir('jvs') subdir('platform') subdir('util') +subdir('gfxhook') + subdir('aimeio') subdir('chuniio') subdir('divaio') diff --git a/mu3hook/config.c b/mu3hook/config.c index 28f06b7..6e3991d 100644 --- a/mu3hook/config.c +++ b/mu3hook/config.c @@ -3,9 +3,10 @@ #include "board/config.h" +#include "gfxhook/config.h" + #include "hooklib/config.h" #include "hooklib/dvd.h" -#include "hooklib/gfx/gfx.h" #include "mu3hook/config.h" diff --git a/mu3hook/config.h b/mu3hook/config.h index 2e285e6..58af239 100644 --- a/mu3hook/config.h +++ b/mu3hook/config.h @@ -4,8 +4,9 @@ #include "board/config.h" +#include "gfxhook/gfx.h" + #include "hooklib/dvd.h" -#include "hooklib/gfx/gfx.h" #include "mu3hook/mu3-dll.h" diff --git a/mu3hook/dllmain.c b/mu3hook/dllmain.c index 55f676b..fc4b1ab 100644 --- a/mu3hook/dllmain.c +++ b/mu3hook/dllmain.c @@ -6,13 +6,14 @@ #include "board/sg-reader.h" #include "board/vfd.h" +#include "gfxhook/d3d9.h" +#include "gfxhook/d3d11.h" +#include "gfxhook/dxgi.h" +#include "gfxhook/gfx.h" + #include "hook/process.h" #include "hooklib/dvd.h" -#include "hooklib/gfx/d3d9.h" -#include "hooklib/gfx/d3d11.h" -#include "hooklib/gfx/dxgi.h" -#include "hooklib/gfx/gfx.h" #include "hooklib/serial.h" #include "hooklib/spike.h" diff --git a/mu3hook/meson.build b/mu3hook/meson.build index 7ce2398..27ba7f7 100644 --- a/mu3hook/meson.build +++ b/mu3hook/meson.build @@ -13,6 +13,7 @@ shared_library( link_with : [ aimeio_lib, board_lib, + gfxhook_lib, hooklib_lib, mu3io_lib, platform_lib,