123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
- */
- #include "bgfx_p.h"
- #if BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX
- # if BX_PLATFORM_WINDOWS
- # include <psapi.h>
- # endif // BX_PLATFORM_WINDOWS
- # include <renderdoc/renderdoc_app.h>
- namespace bgfx
- {
- bool findModule(const char* _name)
- {
- #if BX_PLATFORM_WINDOWS
- HANDLE process = GetCurrentProcess();
- DWORD size;
- BOOL result = EnumProcessModules(process
- , NULL
- , 0
- , &size
- );
- if (0 != result)
- {
- HMODULE* modules = (HMODULE*)alloca(size);
- result = EnumProcessModules(process
- , modules
- , size
- , &size
- );
- if (0 != result)
- {
- char moduleName[MAX_PATH];
- for (uint32_t ii = 0, num = uint32_t(size/sizeof(HMODULE) ); ii < num; ++ii)
- {
- result = GetModuleBaseNameA(process
- , modules[ii]
- , moduleName
- , BX_COUNTOF(moduleName)
- );
- if (0 != result
- && 0 == bx::strCmpI(_name, moduleName) )
- {
- return true;
- }
- }
- }
- }
- #endif // BX_PLATFORM_WINDOWS
- BX_UNUSED(_name);
- return false;
- }
- pRENDERDOC_GetAPI RENDERDOC_GetAPI;
- static RENDERDOC_API_1_1_2* s_renderDoc = NULL;
- static void* s_renderDocDll = NULL;
- void* loadRenderDoc()
- {
- if (NULL != s_renderDoc)
- {
- return s_renderDocDll;
- }
- // Skip loading RenderDoc when IntelGPA is present to avoid RenderDoc crash.
- if (findModule(BX_ARCH_32BIT ? "shimloader32.dll" : "shimloader64.dll") )
- {
- return NULL;
- }
- void* renderDocDll = bx::dlopen(
- #if BX_PLATFORM_WINDOWS
- "renderdoc.dll"
- #else
- "./librenderdoc.so"
- #endif // BX_PLATFORM_WINDOWS
- );
- if (NULL != renderDocDll)
- {
- RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)bx::dlsym(renderDocDll, "RENDERDOC_GetAPI");
- if (NULL != RENDERDOC_GetAPI
- && 1 == RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&s_renderDoc) )
- {
- s_renderDoc->SetCaptureFilePathTemplate(BGFX_CONFIG_RENDERDOC_LOG_FILEPATH);
- s_renderDoc->SetFocusToggleKeys(NULL, 0);
- RENDERDOC_InputButton captureKeys[] = BGFX_CONFIG_RENDERDOC_CAPTURE_KEYS;
- s_renderDoc->SetCaptureKeys(captureKeys, BX_COUNTOF(captureKeys) );
- s_renderDoc->SetCaptureOptionU32(eRENDERDOC_Option_AllowVSync, 1);
- s_renderDoc->SetCaptureOptionU32(eRENDERDOC_Option_SaveAllInitials, 1);
- s_renderDoc->MaskOverlayBits(eRENDERDOC_Overlay_None, eRENDERDOC_Overlay_None);
- s_renderDocDll = renderDocDll;
- }
- else
- {
- bx::dlclose(renderDocDll);
- renderDocDll = NULL;
- }
- }
- return renderDocDll;
- }
- void unloadRenderDoc(void* _renderdocdll)
- {
- if (NULL != _renderdocdll)
- {
- // BK - Once RenderDoc is loaded there shouldn't be calls
- // to Shutdown or unload RenderDoc DLL.
- // https://github.com/bkaradzic/bgfx/issues/1192
- //
- // s_renderDoc->Shutdown();
- // bx::dlclose(_renderdocdll);
- }
- }
- void renderDocTriggerCapture()
- {
- if (NULL != s_renderDoc)
- {
- s_renderDoc->TriggerCapture();
- }
- }
- } // namespace bgfx
- #else
- namespace bgfx
- {
- void* loadRenderDoc()
- {
- return NULL;
- }
- void unloadRenderDoc(void*)
- {
- }
- void renderDocTriggerCapture()
- {
- }
- } // namespace bgfx
- #endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX
|