summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderdoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderdoc.cpp')
-rw-r--r--3rdparty/bgfx/src/renderdoc.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/3rdparty/bgfx/src/renderdoc.cpp b/3rdparty/bgfx/src/renderdoc.cpp
new file mode 100644
index 00000000000..c6adc5f0c8f
--- /dev/null
+++ b/3rdparty/bgfx/src/renderdoc.cpp
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
+ * License: http://www.opensource.org/licenses/BSD-2-Clause
+ */
+
+#include "bgfx_p.h"
+
+#if BGFX_CONFIG_DEBUG_PIX && !BGFX_CONFIG_RENDERER_OPENGLES && (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::stricmp(_name, moduleName) )
+ {
+ return true;
+ }
+ }
+ }
+ }
+#endif // BX_PLATFORM_WINDOWS
+ BX_UNUSED(_name);
+ return false;
+ }
+
+#define RENDERDOC_IMPORT \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_SetLogFile); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_GetCapture); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_SetCaptureOptions); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_SetActiveWindow); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_TriggerCapture); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_StartFrameCapture); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_EndFrameCapture); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_GetOverlayBits); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_MaskOverlayBits); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_SetFocusToggleKeys); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_SetCaptureKeys); \
+ RENDERDOC_IMPORT_FUNC(RENDERDOC_InitRemoteAccess);
+
+#define RENDERDOC_IMPORT_FUNC(_func) p##_func _func
+ RENDERDOC_IMPORT
+#undef RENDERDOC_IMPORT_FUNC
+
+ pRENDERDOC_GetAPIVersion RENDERDOC_GetAPIVersion;
+
+ void* loadRenderDoc()
+ {
+ // 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("renderdoc.dll");
+
+ if (NULL != renderdocdll)
+ {
+ RENDERDOC_GetAPIVersion = (pRENDERDOC_GetAPIVersion)bx::dlsym(renderdocdll, "RENDERDOC_GetAPIVersion");
+ if (NULL != RENDERDOC_GetAPIVersion
+ && RENDERDOC_API_VERSION == RENDERDOC_GetAPIVersion() )
+ {
+#define RENDERDOC_IMPORT_FUNC(_func) \
+ _func = (p##_func)bx::dlsym(renderdocdll, #_func); \
+ BX_TRACE("%p " #_func, _func);
+RENDERDOC_IMPORT
+#undef RENDERDOC_IMPORT_FUNC
+
+ RENDERDOC_SetLogFile("temp/bgfx");
+
+ RENDERDOC_SetFocusToggleKeys(NULL, 0);
+
+ KeyButton captureKey = eKey_F11;
+ RENDERDOC_SetCaptureKeys(&captureKey, 1);
+
+ CaptureOptions opt;
+ memset(&opt, 0, sizeof(opt) );
+ opt.AllowVSync = 1;
+ opt.SaveAllInitials = 1;
+ RENDERDOC_SetCaptureOptions(&opt);
+
+ uint32_t ident = 0;
+ RENDERDOC_InitRemoteAccess(&ident);
+
+ RENDERDOC_MaskOverlayBits(eOverlay_None, eOverlay_None);
+ }
+ else
+ {
+ bx::dlclose(renderdocdll);
+ renderdocdll = NULL;
+ }
+ }
+
+ return renderdocdll;
+ }
+
+ void unloadRenderDoc(void* _renderdocdll)
+ {
+ if (NULL != _renderdocdll)
+ {
+ bx::dlclose(_renderdocdll);
+ }
+ }
+
+} // namespace bgfx
+
+#else
+
+namespace bgfx
+{
+
+ void* loadRenderDoc()
+ {
+ return NULL;
+ }
+
+ void unloadRenderDoc(void*)
+ {
+ }
+
+} // namespace bgfx
+
+#endif // BGFX_CONFIG_DEBUG_PIX && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)