Переглянути джерело

Updated RenderDoc interface.

Бранимир Караџић 1 місяць тому
батько
коміт
52bac63cd7
2 змінених файлів з 52 додано та 15 видалено
  1. 32 2
      src/bgfx.cpp
  2. 20 13
      src/debug_renderdoc.cpp

+ 32 - 2
src/bgfx.cpp

@@ -20,6 +20,8 @@
 #	endif // WIN32_LEAN_AND_MEAN
 #	endif // WIN32_LEAN_AND_MEAN
 #	include <windows.h>
 #	include <windows.h>
 #	include <psapi.h>
 #	include <psapi.h>
+#elif BX_PLATFORM_LINUX
+#	include <link.h> // dl_iterate_phdr
 #endif // BX_PLATFORM_*
 #endif // BX_PLATFORM_*
 
 
 BX_ERROR_RESULT(BGFX_ERROR_TEXTURE_VALIDATION,      BX_MAKEFOURCC('b', 'g', 0, 1) );
 BX_ERROR_RESULT(BGFX_ERROR_TEXTURE_VALIDATION,      BX_MAKEFOURCC('b', 'g', 0, 1) );
@@ -2663,11 +2665,39 @@ namespace bgfx
 				}
 				}
 			}
 			}
 		}
 		}
+
+		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
 #else
 		BX_UNUSED(_name);
 		BX_UNUSED(_name);
-#endif // BX_PLATFORM_WINDOWS
-
 		return NULL;
 		return NULL;
+#endif // BX_PLATFORM_WINDOWS
 	}
 	}
 
 
 	bool windowsVersionIs(Condition::Enum _op, uint32_t _version, uint32_t _build)
 	bool windowsVersionIs(Condition::Enum _op, uint32_t _version, uint32_t _build)

+ 20 - 13
src/debug_renderdoc.cpp

@@ -11,7 +11,7 @@
 namespace bgfx
 namespace bgfx
 {
 {
 	pRENDERDOC_GetAPI RENDERDOC_GetAPI;
 	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;
 	static void* s_renderDocDll = NULL;
 
 
 	void* loadRenderDoc()
 	void* loadRenderDoc()
@@ -27,18 +27,25 @@ namespace bgfx
 			return NULL;
 			return NULL;
 		}
 		}
 
 
-		// If RenderDoc is already injected in the process then use the already present DLL
-		void* renderDocDll = findModule("renderdoc.dll");
-		if (NULL == renderDocDll)
-		{
-			// TODO: try common installation paths before looking in current directory
-			renderDocDll = bx::dlopen(
+		const char* renderDocDllName =
 #if BX_PLATFORM_WINDOWS
 #if BX_PLATFORM_WINDOWS
-					"renderdoc.dll"
+			"renderdoc.dll"
 #else
 #else
-					"./librenderdoc.so"
+			"librenderdoc.so"
 #endif // BX_PLATFORM_WINDOWS
 #endif // BX_PLATFORM_WINDOWS
-					);
+			;
+
+		// If RenderDoc is already injected in the process then use the already present DLL
+		void* renderDocDll = findModule(renderDocDllName);
+
+		if (NULL == renderDocDll)
+		{
+			BX_TRACE("Loading RenderDoc...");
+			renderDocDll = bx::dlopen(renderDocDllName);
+		}
+		else
+		{
+			BX_TRACE("RenderDoc is already loaded.");
 		}
 		}
 
 
 		if (NULL != renderDocDll)
 		if (NULL != renderDocDll)
@@ -46,7 +53,7 @@ namespace bgfx
 			RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)bx::dlsym(renderDocDll, "RENDERDOC_GetAPI");
 			RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)bx::dlsym(renderDocDll, "RENDERDOC_GetAPI");
 
 
 			if (NULL != 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);
 				s_renderDoc->SetCaptureFilePathTemplate(BGFX_CONFIG_RENDERDOC_LOG_FILEPATH);
 
 
@@ -55,8 +62,8 @@ namespace bgfx
 				RENDERDOC_InputButton captureKeys[] = BGFX_CONFIG_RENDERDOC_CAPTURE_KEYS;
 				RENDERDOC_InputButton captureKeys[] = BGFX_CONFIG_RENDERDOC_CAPTURE_KEYS;
 				s_renderDoc->SetCaptureKeys(captureKeys, BX_COUNTOF(captureKeys) );
 				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);
 				s_renderDoc->MaskOverlayBits(eRENDERDOC_Overlay_None, eRENDERDOC_Overlay_None);