diff --git a/renderdoc/driver/d3d11/d3d11_hooks.cpp b/renderdoc/driver/d3d11/d3d11_hooks.cpp index fe9086e1b..4501746d8 100644 --- a/renderdoc/driver/d3d11/d3d11_hooks.cpp +++ b/renderdoc/driver/d3d11/d3d11_hooks.cpp @@ -113,7 +113,6 @@ class D3D11Hook : LibraryHook public: D3D11Hook() { - LibraryHooks::GetInstance().RegisterHook(DLL_NAME, this); m_HasHooks = false; m_InsideCreate = false; } diff --git a/renderdoc/driver/d3d12/d3d12_hooks.cpp b/renderdoc/driver/d3d12/d3d12_hooks.cpp index 211c65f63..a6265bb62 100644 --- a/renderdoc/driver/d3d12/d3d12_hooks.cpp +++ b/renderdoc/driver/d3d12/d3d12_hooks.cpp @@ -90,7 +90,6 @@ class D3D12Hook : LibraryHook public: D3D12Hook() { - LibraryHooks::GetInstance().RegisterHook(DLL_NAME, this); m_HasHooks = false; m_InsideCreate = false; } diff --git a/renderdoc/driver/d3d8/d3d8_hooks.cpp b/renderdoc/driver/d3d8/d3d8_hooks.cpp index 25bad3f4f..f9ba288e5 100644 --- a/renderdoc/driver/d3d8/d3d8_hooks.cpp +++ b/renderdoc/driver/d3d8/d3d8_hooks.cpp @@ -33,12 +33,7 @@ typedef IDirect3D8 *(WINAPI *PFN_D3D8_CREATE)(UINT); class D3D8Hook : LibraryHook { public: - D3D8Hook() - { - LibraryHooks::GetInstance().RegisterHook(DLL_NAME, this); - m_HasHooks = false; - } - + D3D8Hook() { m_HasHooks = false; } bool CreateHooks(const char *libName) { bool success = true; diff --git a/renderdoc/driver/d3d9/d3d9_hooks.cpp b/renderdoc/driver/d3d9/d3d9_hooks.cpp index b4da647c6..388fa92ec 100644 --- a/renderdoc/driver/d3d9/d3d9_hooks.cpp +++ b/renderdoc/driver/d3d9/d3d9_hooks.cpp @@ -42,12 +42,7 @@ typedef IDirect3D9 *(WINAPI *PFN_D3D9_CREATE)(UINT); class D3D9Hook : LibraryHook { public: - D3D9Hook() - { - LibraryHooks::GetInstance().RegisterHook(DLL_NAME, this); - m_HasHooks = false; - } - + D3D9Hook() { m_HasHooks = false; } bool CreateHooks(const char *libName) { bool success = true; diff --git a/renderdoc/driver/dxgi/dxgi_hooks.cpp b/renderdoc/driver/dxgi/dxgi_hooks.cpp index 88b78d9dc..cb1543e8c 100644 --- a/renderdoc/driver/dxgi/dxgi_hooks.cpp +++ b/renderdoc/driver/dxgi/dxgi_hooks.cpp @@ -74,7 +74,6 @@ struct RenderDocAnalysis : IDXGraphicsAnalysis class DXGIHook : LibraryHook { public: - DXGIHook() { LibraryHooks::GetInstance().RegisterHook(DLL_NAME, this); } bool CreateHooks(const char *libName) { bool success = true; diff --git a/renderdoc/driver/gl/gl_hooks_egl.cpp b/renderdoc/driver/gl/gl_hooks_egl.cpp index 65f29fb76..1ccd9c2d1 100644 --- a/renderdoc/driver/gl/gl_hooks_egl.cpp +++ b/renderdoc/driver/gl/gl_hooks_egl.cpp @@ -37,8 +37,6 @@ class EGLHook : LibraryHook, public GLPlatform public: EGLHook() { - LibraryHooks::GetInstance().RegisterHook("libEGL.so", this); - m_HasHooks = false; m_GLDriver = NULL; diff --git a/renderdoc/driver/gl/gl_hooks_linux.cpp b/renderdoc/driver/gl/gl_hooks_linux.cpp index 103e995d9..08b88ed02 100644 --- a/renderdoc/driver/gl/gl_hooks_linux.cpp +++ b/renderdoc/driver/gl/gl_hooks_linux.cpp @@ -49,8 +49,6 @@ class OpenGLHook : LibraryHook, public GLPlatform public: OpenGLHook() { - LibraryHooks::GetInstance().RegisterHook("libGL.so", this); - m_HasHooks = false; m_GLDriver = NULL; diff --git a/renderdoc/driver/gl/gl_hooks_win32.cpp b/renderdoc/driver/gl/gl_hooks_win32.cpp index af785603c..18558cf85 100644 --- a/renderdoc/driver/gl/gl_hooks_win32.cpp +++ b/renderdoc/driver/gl/gl_hooks_win32.cpp @@ -667,8 +667,6 @@ class OpenGLHook : LibraryHook, public GLPlatform public: OpenGLHook() { - LibraryHooks::GetInstance().RegisterHook(DLL_NAME, this); - m_GLDriver = NULL; m_HasHooks = false; diff --git a/renderdoc/driver/vulkan/vk_layer.cpp b/renderdoc/driver/vulkan/vk_layer.cpp index dc09123c3..3a1f38c14 100644 --- a/renderdoc/driver/vulkan/vk_layer.cpp +++ b/renderdoc/driver/vulkan/vk_layer.cpp @@ -47,7 +47,7 @@ // set environment variables class VulkanHook : LibraryHook { - VulkanHook() { LibraryHooks::GetInstance().RegisterHook(VulkanLibraryName, this); } + VulkanHook() {} bool CreateHooks(const char *libName) { // we assume the implicit layer is registered - the UI will prompt the user about installing it. @@ -55,12 +55,12 @@ class VulkanHook : LibraryHook EnvMod::Set, EnvSep::NoSep, "ENABLE_VULKAN_RENDERDOC_CAPTURE", "1")); // check options to set further variables, and apply - OptionsUpdated(libName); + OptionsUpdated(); return true; } - void OptionsUpdated(const char *libName) + void OptionsUpdated() { if(RenderDoc::Inst().GetCaptureOptions().apiValidation) { diff --git a/renderdoc/hooks/hooks.cpp b/renderdoc/hooks/hooks.cpp index dc2794c7a..146d9c586 100644 --- a/renderdoc/hooks/hooks.cpp +++ b/renderdoc/hooks/hooks.cpp @@ -32,21 +32,16 @@ LibraryHooks &LibraryHooks::GetInstance() return instance; } -void LibraryHooks::RegisterHook(const char *libName, LibraryHook *hook) +void LibraryHooks::RegisterLibrary(LibraryHook *lib) { - m_Hooks[libName] = hook; + m_Libraries.push_back(lib); } void LibraryHooks::CreateHooks() { HOOKS_BEGIN(); - for(auto it = m_Hooks.begin(); it != m_Hooks.end(); ++it) - { - RDCDEBUG("Hooking %s", it->first); - - if(!it->second->CreateHooks(it->first)) - RDCWARN("Couldn't hook into %s", it->first); - } + for(LibraryHook *lib : m_Libraries) + lib->CreateHooks("dummy"); HOOKS_END(); } @@ -60,6 +55,6 @@ void LibraryHooks::RemoveHooks() void LibraryHooks::OptionsUpdated() { - for(auto it = m_Hooks.begin(); it != m_Hooks.end(); ++it) - it->second->OptionsUpdated(it->first); + for(LibraryHook *lib : m_Libraries) + lib->OptionsUpdated(); } diff --git a/renderdoc/hooks/hooks.h b/renderdoc/hooks/hooks.h index 35e647954..2a6fea528 100644 --- a/renderdoc/hooks/hooks.h +++ b/renderdoc/hooks/hooks.h @@ -78,13 +78,7 @@ private: #endif -// defines the interface that a library hooking class will implement. -// the libName is the name they used when registering -struct LibraryHook -{ - virtual bool CreateHooks(const char *libName) = 0; - virtual void OptionsUpdated(const char *libName) {} -}; +struct LibraryHook; // this singleton allows you to compile in code that defines a hook for a given library // (and it will be registered). Then when the renderdoc library is initialised in the target @@ -94,15 +88,21 @@ class LibraryHooks public: LibraryHooks() : m_HooksRemoved(false) {} static LibraryHooks &GetInstance(); - void RegisterHook(const char *libName, LibraryHook *hook); + void RegisterLibrary(LibraryHook *lib); void CreateHooks(); void OptionsUpdated(); void RemoveHooks(); private: - typedef map HookMap; - bool m_HooksRemoved; - HookMap m_Hooks; + std::vector m_Libraries; }; + +// defines the interface that a library hooking class will implement. +struct LibraryHook +{ + LibraryHook() { LibraryHooks::GetInstance().RegisterLibrary(this); } + virtual bool CreateHooks(const char *dummy) = 0; + virtual void OptionsUpdated() {} +}; \ No newline at end of file diff --git a/renderdoc/os/win32/sys_win32_hooks.cpp b/renderdoc/os/win32/sys_win32_hooks.cpp index 4baaf268b..1eae62160 100644 --- a/renderdoc/os/win32/sys_win32_hooks.cpp +++ b/renderdoc/os/win32/sys_win32_hooks.cpp @@ -75,7 +75,6 @@ class SysHook : LibraryHook public: SysHook() { - LibraryHooks::GetInstance().RegisterHook(DLL_NAME, this); m_HasHooks = false; m_WSARefCount = 1; }