mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2024-11-14 10:50:13 +01:00
4d99b6affd
Fix race condition when renderer was found and we were hooking a library func
105 lines
2.9 KiB
C++
105 lines
2.9 KiB
C++
#ifndef __INCLUDED_RENDERER_DETECTOR_H__
|
|
#define __INCLUDED_RENDERER_DETECTOR_H__
|
|
|
|
#include "Base_Hook.h"
|
|
#include <thread>
|
|
|
|
#ifndef NO_OVERLAY
|
|
#ifdef __WINDOWS__
|
|
|
|
struct IDXGISwapChain;
|
|
struct IDirect3DDevice9;
|
|
struct IDirect3DDevice9Ex;
|
|
|
|
class Renderer_Detector
|
|
{
|
|
private:
|
|
// Variables
|
|
std::thread* _hook_thread;
|
|
std::mutex _found_mutex;
|
|
unsigned int _hook_retries;
|
|
bool _renderer_found; // Is the renderer hooked ?
|
|
bool _dx9_hooked;
|
|
bool _dx10_hooked;
|
|
bool _dx11_hooked;
|
|
bool _dx12_hooked;
|
|
bool _dxgi_hooked;
|
|
bool _ogl_hooked; // wglMakeCurrent is hooked ? (opengl)
|
|
Base_Hook* rendererdetect_hook;
|
|
Base_Hook* game_renderer;
|
|
|
|
ATOM atom;
|
|
HWND dummy_hWnd;
|
|
|
|
// Functions
|
|
Renderer_Detector();
|
|
~Renderer_Detector();
|
|
|
|
static HRESULT STDMETHODCALLTYPE MyIDXGISwapChain_Present(IDXGISwapChain* _this, UINT SyncInterval, UINT Flags);
|
|
static HRESULT STDMETHODCALLTYPE MyPresent(IDirect3DDevice9* _this, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion);
|
|
static HRESULT STDMETHODCALLTYPE MyPresentEx(IDirect3DDevice9Ex* _this, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags);
|
|
static BOOL WINAPI MywglMakeCurrent(HDC hDC, HGLRC hGLRC);
|
|
|
|
void HookDXGIPresent(IDXGISwapChain* pSwapChain);
|
|
void HookDX9Present(IDirect3DDevice9* pDevice, bool ex);
|
|
void HookwglMakeCurrent(decltype(wglMakeCurrent)* wglMakeCurrent);
|
|
|
|
void hook_dx9();
|
|
void hook_dx10();
|
|
void hook_dx11();
|
|
void hook_dx12();
|
|
void hook_opengl();
|
|
|
|
void create_hwnd();
|
|
void destroy_hwnd();
|
|
void create_hook(const char* libname);
|
|
bool stop_retry();
|
|
|
|
static void find_renderer_proc(Renderer_Detector* _this);
|
|
|
|
public:
|
|
void find_renderer();
|
|
void renderer_found(Base_Hook* hook);
|
|
Base_Hook* get_renderer() const;
|
|
static Renderer_Detector& Inst();
|
|
};
|
|
|
|
#elif defined __LINUX__
|
|
#include "linux/OpenGLX_Hook.h"
|
|
|
|
class Renderer_Detector
|
|
{
|
|
// Variables
|
|
std::thread* _hook_thread;
|
|
std::mutex _found_mutex;
|
|
unsigned int _hook_retries;
|
|
bool _oglx_hooked;
|
|
bool _renderer_found; // Is the renderer hooked ?
|
|
Base_Hook* rendererdetect_hook;
|
|
Base_Hook* game_renderer;
|
|
|
|
// Functions
|
|
Renderer_Detector();
|
|
~Renderer_Detector();
|
|
|
|
static void MyglXSwapBuffers(Display *dpy, GLXDrawable drawable);
|
|
|
|
void HookglXSwapBuffers(decltype(glXSwapBuffers)* glXSwapBuffers);
|
|
|
|
void hook_openglx(const char* libname);
|
|
|
|
void create_hook(const char* libname);
|
|
bool stop_retry();
|
|
|
|
static void find_renderer_proc(Renderer_Detector* _this);
|
|
|
|
public:
|
|
void find_renderer();
|
|
void renderer_found(Base_Hook* hook);
|
|
Base_Hook* get_renderer() const;
|
|
static Renderer_Detector& Inst();
|
|
};
|
|
|
|
#endif//__WINDOWS__
|
|
#endif//NO_OVERLAY
|
|
#endif//__INCLUDED_RENDERER_DETECTOR_H__
|