Added support for windowed mode GUI rendering

This commit is contained in:
KnucklesB
2024-06-11 20:36:35 -03:00
parent 1d4a5167e5
commit f598906ab5

View File

@@ -687,21 +687,36 @@ HRESULT __stdcall hookD3D11Present(IDXGISwapChain* pSwapChain, UINT SyncInterval
pSwapChain->GetDesc(&sd); pSwapChain->GetDesc(&sd);
window = sd.OutputWindow; window = sd.OutputWindow;
ID3D11Texture2D* pBackBuffer; ID3D11Texture2D* pBackBuffer;
pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer); if (SUCCEEDED(pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer))) {
pDevice->CreateRenderTargetView(pBackBuffer, NULL, &mainRenderTargetViewD3D11); pDevice->CreateRenderTargetView(pBackBuffer, NULL, &mainRenderTargetViewD3D11);
pBackBuffer->Release(); pBackBuffer->Release();
oWndProc = (WNDPROC)SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)WndProc); oWndProc = (WNDPROC)SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)WndProc);
auto context = ImGui::CreateContext();
ImGui::SetCurrentContext(context); ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
InitStyle(); InitStyle();
ImGui_ImplWin32_Init(window); ImGui_ImplWin32_Init(window);
ImGui_ImplDX11_Init(pDevice, pContext); ImGui_ImplDX11_Init(pDevice, pContext);
initonce = true; initonce = true;
} }
else {
return phookD3D11Present(pSwapChain, SyncInterval, Flags);
}
}
else else
return phookD3D11Present(pSwapChain, SyncInterval, Flags); return phookD3D11Present(pSwapChain, SyncInterval, Flags);
} }
if (mainRenderTargetViewD3D11) {
pContext->OMSetRenderTargets(1, &mainRenderTargetViewD3D11, NULL);
}
if (GetKeyDown(KeyCode::Insert)) {
pressed = true;
}
if (GetKeyDown(KeyCode::Insert)) { if (GetKeyDown(KeyCode::Insert)) {
pressed = true; pressed = true;
} }
@@ -750,10 +765,32 @@ HRESULT __stdcall hookD3D11Present(IDXGISwapChain* pSwapChain, UINT SyncInterval
return phookD3D11Present(pSwapChain, SyncInterval, Flags); return phookD3D11Present(pSwapChain, SyncInterval, Flags);
} }
typedef HRESULT(__stdcall* D3D11ResizeBuffersHook)(IDXGISwapChain* pSwapChain, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags);
DWORD_PTR* pSwapChainVtable = NULL; DWORD_PTR* pSwapChainVtable = NULL;
DWORD_PTR* pContextVTable = NULL; DWORD_PTR* pContextVTable = NULL;
DWORD_PTR* pDeviceVTable = NULL; DWORD_PTR* pDeviceVTable = NULL;
IDXGISwapChain* pSwapChain; IDXGISwapChain* pSwapChain;
D3D11ResizeBuffersHook phookResizeBuffers = NULL;
HRESULT __stdcall hookResizeBuffers(IDXGISwapChain* pSwapChain, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags) {
if (mainRenderTargetViewD3D11) {
mainRenderTargetViewD3D11->Release();
mainRenderTargetViewD3D11 = NULL;
}
HRESULT hr = phookResizeBuffers(pSwapChain, BufferCount, Width, Height, NewFormat, SwapChainFlags);
ID3D11Texture2D* pBackBuffer;
if (SUCCEEDED(hr) && SUCCEEDED(pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer))) {
pDevice->CreateRenderTargetView(pBackBuffer, NULL, &mainRenderTargetViewD3D11);
pBackBuffer->Release();
}
return hr;
}
bool HookDX11() { bool HookDX11() {
HMODULE hDXGIDLL = GetModuleHandle(L"dxgi.dll"); HMODULE hDXGIDLL = GetModuleHandle(L"dxgi.dll");
while (!hDXGIDLL) { while (!hDXGIDLL) {
@@ -827,6 +864,10 @@ bool HookDX11() {
if (MH_CreateHook((DWORD_PTR*)pSwapChainVtable[8], hookD3D11Present, reinterpret_cast<void**>(&phookD3D11Present)) != MH_OK) { return false; } if (MH_CreateHook((DWORD_PTR*)pSwapChainVtable[8], hookD3D11Present, reinterpret_cast<void**>(&phookD3D11Present)) != MH_OK) { return false; }
if (MH_EnableHook((DWORD_PTR*)pSwapChainVtable[8]) != MH_OK) { return false; } if (MH_EnableHook((DWORD_PTR*)pSwapChainVtable[8]) != MH_OK) { return false; }
if (MH_CreateHook((DWORD_PTR*)pSwapChainVtable[13], hookResizeBuffers, reinterpret_cast<void**>(&phookResizeBuffers)) != MH_OK) { return false; }
if (MH_EnableHook((DWORD_PTR*)pSwapChainVtable[13]) != MH_OK) { return false; }
DWORD dwOld; DWORD dwOld;
VirtualProtect(phookD3D11Present, 2, PAGE_EXECUTE_READWRITE, &dwOld); VirtualProtect(phookD3D11Present, 2, PAGE_EXECUTE_READWRITE, &dwOld);