| 68 | static void* s_renderDocDll = NULL; |
| 69 | |
| 70 | void* loadRenderDoc() |
| 71 | { |
| 72 | if (NULL != s_renderDoc) |
| 73 | { |
| 74 | return s_renderDocDll; |
| 75 | } |
| 76 | |
| 77 | // Skip loading RenderDoc when IntelGPA is present to avoid RenderDoc crash. |
| 78 | if (findModule(BX_ARCH_32BIT ? "shimloader32.dll" : "shimloader64.dll") ) |
| 79 | { |
| 80 | return NULL; |
| 81 | } |
| 82 | |
| 83 | // If RenderDoc is already injected in the process then use the already present DLL |
| 84 | void* renderDocDll = findModule("renderdoc.dll"); |
| 85 | if (NULL == renderDocDll) |
| 86 | { |
| 87 | // TODO: try common installation paths before looking in current directory |
| 88 | renderDocDll = bx::dlopen( |
| 89 | #if BX_PLATFORM_WINDOWS |
| 90 | "renderdoc.dll" |
| 91 | #else |
| 92 | "./librenderdoc.so" |
| 93 | #endif // BX_PLATFORM_WINDOWS |
| 94 | ); |
| 95 | } |
| 96 | |
| 97 | if (NULL != renderDocDll) |
| 98 | { |
| 99 | RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)bx::dlsym(renderDocDll, "RENDERDOC_GetAPI"); |
| 100 | |
| 101 | if (NULL != RENDERDOC_GetAPI |
| 102 | && 1 == RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&s_renderDoc) ) |
| 103 | { |
| 104 | s_renderDoc->SetCaptureFilePathTemplate(BGFX_CONFIG_RENDERDOC_LOG_FILEPATH); |
| 105 | |
| 106 | s_renderDoc->SetFocusToggleKeys(NULL, 0); |
| 107 | |
| 108 | RENDERDOC_InputButton captureKeys[] = BGFX_CONFIG_RENDERDOC_CAPTURE_KEYS; |
| 109 | s_renderDoc->SetCaptureKeys(captureKeys, BX_COUNTOF(captureKeys) ); |
| 110 | |
| 111 | s_renderDoc->SetCaptureOptionU32(eRENDERDOC_Option_AllowVSync, 1); |
| 112 | s_renderDoc->SetCaptureOptionU32(eRENDERDOC_Option_SaveAllInitials, 1); |
| 113 | |
| 114 | s_renderDoc->MaskOverlayBits(eRENDERDOC_Overlay_None, eRENDERDOC_Overlay_None); |
| 115 | |
| 116 | s_renderDocDll = renderDocDll; |
| 117 | } |
| 118 | else |
| 119 | { |
| 120 | bx::dlclose(renderDocDll); |
| 121 | renderDocDll = NULL; |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | return renderDocDll; |
| 126 | } |
| 127 | |