From 52bac63cd785a4b4034ee5f06ade80af1be2f18e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sun, 26 Oct 2025 22:43:43 -0700 Subject: [PATCH] Updated RenderDoc interface. --- src/bgfx.cpp | 36 +++++++++++++++++++++++++++++++++--- src/debug_renderdoc.cpp | 33 ++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 67045b50d..899d6cf14 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -20,6 +20,8 @@ # endif // WIN32_LEAN_AND_MEAN # include # include +#elif BX_PLATFORM_LINUX +# include // dl_iterate_phdr #endif // BX_PLATFORM_* BX_ERROR_RESULT(BGFX_ERROR_TEXTURE_VALIDATION, BX_MAKEFOURCC('b', 'g', 0, 1) ); @@ -2663,11 +2665,39 @@ namespace bgfx } } } -#else - BX_UNUSED(_name); -#endif // BX_PLATFORM_WINDOWS return NULL; +#elif BX_PLATFORM_LINUX + struct DlIterateCallbackData + { + const char* name; + void* ptr; + } cbData = + { + .name = _name, + .ptr = NULL, + }; + + auto dlIterateCb = [](struct dl_phdr_info* _info, size_t /* _size */, void* _data) -> int + { + DlIterateCallbackData& data = *(DlIterateCallbackData*)_data; + + if (bx::hasSuffix(_info->dlpi_name, data.name) ) + { + data.ptr = dlopen(_info->dlpi_name, RTLD_NOW | RTLD_NOLOAD); + return 1; + } + + return 0; + }; + + dl_iterate_phdr(dlIterateCb, &cbData); + + return cbData.ptr; +#else + BX_UNUSED(_name); + return NULL; +#endif // BX_PLATFORM_WINDOWS } bool windowsVersionIs(Condition::Enum _op, uint32_t _version, uint32_t _build) diff --git a/src/debug_renderdoc.cpp b/src/debug_renderdoc.cpp index 1116f9add..ee03b8544 100644 --- a/src/debug_renderdoc.cpp +++ b/src/debug_renderdoc.cpp @@ -11,7 +11,7 @@ namespace bgfx { pRENDERDOC_GetAPI RENDERDOC_GetAPI; - static RENDERDOC_API_1_1_2* s_renderDoc = NULL; + static RENDERDOC_API_1_6_0* s_renderDoc = NULL; static void* s_renderDocDll = NULL; void* loadRenderDoc() @@ -27,18 +27,25 @@ namespace bgfx return NULL; } + const char* renderDocDllName = +#if BX_PLATFORM_WINDOWS + "renderdoc.dll" +#else + "librenderdoc.so" +#endif // BX_PLATFORM_WINDOWS + ; + // If RenderDoc is already injected in the process then use the already present DLL - void* renderDocDll = findModule("renderdoc.dll"); + void* renderDocDll = findModule(renderDocDllName); + if (NULL == renderDocDll) { - // TODO: try common installation paths before looking in current directory - renderDocDll = bx::dlopen( -#if BX_PLATFORM_WINDOWS - "renderdoc.dll" -#else - "./librenderdoc.so" -#endif // BX_PLATFORM_WINDOWS - ); + BX_TRACE("Loading RenderDoc..."); + renderDocDll = bx::dlopen(renderDocDllName); + } + else + { + BX_TRACE("RenderDoc is already loaded."); } if (NULL != renderDocDll) @@ -46,7 +53,7 @@ namespace bgfx 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) ) + && 1 == RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_6_0, (void**)&s_renderDoc) ) { s_renderDoc->SetCaptureFilePathTemplate(BGFX_CONFIG_RENDERDOC_LOG_FILEPATH); @@ -55,8 +62,8 @@ namespace bgfx 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->SetCaptureOptionU32(eRENDERDOC_Option_AllowVSync, 1); + s_renderDoc->SetCaptureOptionU32(eRENDERDOC_Option_APIValidation, 1); s_renderDoc->MaskOverlayBits(eRENDERDOC_Overlay_None, eRENDERDOC_Overlay_None);