From 69fec43309dbaa2a907dcd5517dbb99a73800d82 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 14 Sep 2014 13:17:00 +0100 Subject: [PATCH] Add API to set which keys trigger cap etc in-program * Not exposed in the UI to be able to configured just yet, but it can be set by a program that's renderdoc-aware. --- renderdoc/api/app/renderdoc_app.h | 48 +++++++++++++++ renderdoc/core/core.cpp | 82 ++++++++++++++++++++++--- renderdoc/core/core.h | 19 ++++++ renderdoc/driver/d3d11/d3d11_device.cpp | 47 ++++++++++++-- renderdoc/os/linux/linux_stringio.cpp | 37 +++++++++-- renderdoc/os/os_specific.h | 18 +----- renderdoc/os/win32/win32_stringio.cpp | 38 ++++++++++-- renderdoc/replay/entry_points.cpp | 12 ++++ 8 files changed, 264 insertions(+), 37 deletions(-) diff --git a/renderdoc/api/app/renderdoc_app.h b/renderdoc/api/app/renderdoc_app.h index 43c215895..faf48c242 100644 --- a/renderdoc/api/app/renderdoc_app.h +++ b/renderdoc/api/app/renderdoc_app.h @@ -125,6 +125,48 @@ struct CaptureOptions #endif }; +enum KeyButton +{ + eKey_0 = 0x30, // '0' + // ... + eKey_9 = 0x39, // '9' + eKey_A = 0x41, // 'A' + // ... + eKey_Z = 0x5A, // 'Z' + + eKey_Divide, + eKey_Multiply, + eKey_Subtract, + eKey_Plus, + + eKey_F1, + eKey_F2, + eKey_F3, + eKey_F4, + eKey_F5, + eKey_F6, + eKey_F7, + eKey_F8, + eKey_F9, + eKey_F10, + eKey_F11, + eKey_F12, + + eKey_Home, + eKey_End, + eKey_Insert, + eKey_Delete, + eKey_PageUp, + eKey_PageDn, + + eKey_Backspace, + eKey_Tab, + eKey_PrtScrn, + eKey_Pause, + + eKey_Max, +}; + enum InAppOverlay { eOverlay_Enabled = 0x1, @@ -176,6 +218,12 @@ typedef uint32_t (RENDERDOC_CC *pRENDERDOC_GetOverlayBits)(); extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_MaskOverlayBits(uint32_t And, uint32_t Or); typedef void (RENDERDOC_CC *pRENDERDOC_MaskOverlayBits)(uint32_t And, uint32_t Or); +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SetFocusToggleKeys(KeyButton *keys, int num); +typedef void (RENDERDOC_CC *pRENDERDOC_SetFocusToggleKeys)(KeyButton *keys, int num); + +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SetCaptureKeys(KeyButton *keys, int num); +typedef void (RENDERDOC_CC *pRENDERDOC_SetCaptureKeys)(KeyButton *keys, int num); + ////////////////////////////////////////////////////////////////////////// // Injection/execution capture functions. ////////////////////////////////////////////////////////////////////////// diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 2ed5cb72d..635360a05 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -40,6 +40,10 @@ string ToStrHelper::Get(const RDCDriver &el) { TOSTR_CASE_STRINGIZE(RDC_Unknown) TOSTR_CASE_STRINGIZE(RDC_D3D11) + TOSTR_CASE_STRINGIZE(RDC_OpenGL) + TOSTR_CASE_STRINGIZE(RDC_Mantle) + TOSTR_CASE_STRINGIZE(RDC_D3D10) + TOSTR_CASE_STRINGIZE(RDC_D3D9) default: break; } @@ -49,6 +53,58 @@ string ToStrHelper::Get(const RDCDriver &el) return tostrBuf; } +template<> +string ToStrHelper::Get(const KeyButton &el) +{ + char alphanumericbuf[2] = { 'A', 0 }; + + // enums map straight to ascii + if( (el >= eKey_A && el <= eKey_Z) || (el >= eKey_0 && el <= eKey_9) ) + { + alphanumericbuf[0] = (char)el; + return alphanumericbuf; + } + + switch(el) + { + case eKey_Divide: return "/"; + case eKey_Multiply: return "*"; + case eKey_Subtract: return "-"; + case eKey_Plus: return "+"; + + case eKey_F1: return "F1"; + case eKey_F2: return "F2"; + case eKey_F3: return "F3"; + case eKey_F4: return "F4"; + case eKey_F5: return "F5"; + case eKey_F6: return "F6"; + case eKey_F7: return "F7"; + case eKey_F8: return "F8"; + case eKey_F9: return "F9"; + case eKey_F10: return "F10"; + case eKey_F11: return "F11"; + case eKey_F12: return "F12"; + + case eKey_Home: return "Home"; + case eKey_End: return "End"; + case eKey_Insert: return "Insert"; + case eKey_Delete: return "Delete"; + case eKey_PageUp: return "PageUp"; + case eKey_PageDn: return "PageDn"; + + case eKey_Backspace: return "Backspace"; + case eKey_Tab: return "Tab"; + case eKey_PrtScrn: return "PrtScrn"; + case eKey_Pause: return "Pause"; + default: break; + } + + char tostrBuf[256] = {0}; + StringFormat::snprintf(tostrBuf, 255, "KeyButton<%d>", el); + + return tostrBuf; +} + RenderDoc *RenderDoc::m_Inst = NULL; RenderDoc &RenderDoc::Inst() @@ -82,6 +138,13 @@ RenderDoc::RenderDoc() m_Focus = false; m_Cap = false; + m_FocusKeys.clear(); + m_FocusKeys.push_back(eKey_F11); + + m_CaptureKeys.clear(); + m_CaptureKeys.push_back(eKey_F12); + m_CaptureKeys.push_back(eKey_PrtScrn); + m_ProgressPtr = NULL; m_ExHandler = NULL; @@ -240,19 +303,22 @@ bool RenderDoc::EndFrameCapture(void *wnd) void RenderDoc::Tick() { - static bool prev_f11 = false; - static bool prev_f12 = false; + static bool prev_focus = false; + static bool prev_cap = false; - bool cur_f11 = Keyboard::GetKeyState(Keyboard::eKey_F11); - bool cur_f12 = Keyboard::GetKeyState(Keyboard::eKey_F12) || Keyboard::GetKeyState(Keyboard::eKey_PrtScrn); + bool cur_focus = false; + for(size_t i=0; i < m_FocusKeys.size(); i++) cur_focus |= Keyboard::GetKeyState(m_FocusKeys[i]); - if(!prev_f11 && cur_f11) + bool cur_cap = false; + for(size_t i=0; i < m_CaptureKeys.size(); i++) cur_cap |= Keyboard::GetKeyState(m_CaptureKeys[i]); + + if(!prev_focus && cur_focus) FocusToggle(); - if(!prev_f12 && cur_f12) + if(!prev_cap && cur_cap) TriggerCapture(); - prev_f11 = cur_f11; - prev_f12 = cur_f12; + prev_focus = cur_focus; + prev_cap = cur_cap; } bool RenderDoc::ShouldTriggerCapture(uint32_t frameNumber) diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index d46814c8c..83fad9ad5 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -232,6 +232,22 @@ class RenderDoc void QueueCapture(uint32_t frameNumber) { m_QueuedFrameCaptures.insert(frameNumber); } + void SetFocusKeys(KeyButton *keys, int num) + { + m_FocusKeys.resize(num); + if(keys && num > 0) + memcpy(&m_FocusKeys[0], keys, num*sizeof(KeyButton)); + } + void SetCaptureKeys(KeyButton *keys, int num) + { + m_CaptureKeys.resize(num); + if(keys && num > 0) + memcpy(&m_CaptureKeys[0], keys, num*sizeof(KeyButton)); + } + + const vector &GetFocusKeys() { return m_FocusKeys; } + const vector &GetCaptureKeys() { return m_CaptureKeys; } + bool ShouldFocusToggle() { bool ret = m_Focus; m_Focus = false; return ret; } bool ShouldTriggerCapture(uint32_t frameNumber); private: @@ -245,6 +261,9 @@ class RenderDoc bool m_Focus; bool m_Cap; + vector m_FocusKeys; + vector m_CaptureKeys; + wstring m_Target; wstring m_LogFile; wstring m_CurrentLogFile; diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index b04424a5a..f691e585a 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2907,15 +2907,35 @@ HRESULT WrappedID3D11Device::Present(IDXGISwapChain *swap, UINT SyncInterval, UI if(swap == m_SwapChain) { - string overlayText = "F12/PrtScr to capture."; + vector keys = RenderDoc::Inst().GetCaptureKeys(); + + string overlayText = ""; + + for(size_t i=0; i < keys.size(); i++) + { + if(i > 0) + overlayText += ", "; + + overlayText += ToStr::Get(keys[i]); + } + + if(!keys.empty()) + overlayText += " to capture."; if(overlay & eOverlay_FrameNumber) - overlayText += StringFormat::Fmt(" Frame: %d.", m_FrameCounter); + { + if(!overlayText.empty()) overlayText += " "; + overlayText += StringFormat::Fmt("Frame: %d.", m_FrameCounter); + } if(overlay & eOverlay_FrameRate) - overlayText += StringFormat::Fmt(" %.2lf ms (%.2lf .. %.2lf) (%.0lf FPS)", + { + if(!overlayText.empty()) overlayText += " "; + overlayText += StringFormat::Fmt("%.2lf ms (%.2lf .. %.2lf) (%.0lf FPS)", m_AvgFrametime, m_MinFrametime, m_MaxFrametime, 1000.0f/m_AvgFrametime); + } - GetDebugManager()->RenderText(0.0f, 0.0f, 1.0f, overlayText.c_str()); + if(!overlayText.empty()) + GetDebugManager()->RenderText(0.0f, 0.0f, 1.0f, overlayText.c_str()); size_t i=0; @@ -2945,7 +2965,24 @@ HRESULT WrappedID3D11Device::Present(IDXGISwapChain *swap, UINT SyncInterval, UI } else { - GetDebugManager()->RenderText(0.0f, 0.0f, 1.0f, "Inactive swapchain, F11 to cycle"); + vector keys = RenderDoc::Inst().GetFocusKeys(); + + string str = "Inactive swapchain."; + + for(size_t i=0; i < keys.size(); i++) + { + if(i == 0) + str += " "; + else + str += ", "; + + str += ToStr::Get(keys[i]); + } + + if(!keys.empty()) + str += " to cycle between swapchains"; + + GetDebugManager()->RenderText(0.0f, 0.0f, 1.0f, str.c_str()); } GetDebugManager()->SetOutputDimensions(w, h); diff --git a/renderdoc/os/linux/linux_stringio.cpp b/renderdoc/os/linux/linux_stringio.cpp index a4bb64447..1713bce33 100644 --- a/renderdoc/os/linux/linux_stringio.cpp +++ b/renderdoc/os/linux/linux_stringio.cpp @@ -63,15 +63,44 @@ namespace Keyboard KeySym ks = 0; if(CurrentXDisplay == NULL) return false; + + if(key >= eKey_A && key <= eKey_Z) ks = (int)key; + if(key >= eKey_0 && key <= eKey_9) ks = (int)key; switch(key) { - case eKey_F11: ks = XK_F11; break; - case eKey_F12: ks = XK_F12; break; - case eKey_PrtScrn: ks = XK_Print; break; + case eKey_Divide: ks = XK_KP_Divide; break; + case eKey_Multiply: ks = XK_KP_Multiply; break; + case eKey_Subtract: ks = XK_KP_Subtract; break; + case eKey_Plus: ks = XK_KP_Add; break; + case eKey_F1: ks = XK_F1; break; + case eKey_F2: ks = XK_F2; break; + case eKey_F3: ks = XK_F3; break; + case eKey_F4: ks = XK_F4; break; + case eKey_F5: ks = XK_F5; break; + case eKey_F6: ks = XK_F6; break; + case eKey_F7: ks = XK_F7; break; + case eKey_F8: ks = XK_F8; break; + case eKey_F9: ks = XK_F9; break; + case eKey_F10: ks = XK_F10; break; + case eKey_F11: ks = XK_F11; break; + case eKey_F12: ks = XK_F12; break; + case eKey_Home: ks = XK_Home; break; + case eKey_End: ks = XK_End; break; + case eKey_Insert: ks = XK_Insert; break; + case eKey_Delete: ks = XK_Delete; break; + case eKey_PageUp: ks = XK_Prior; break; + case eKey_PageDn: ks = XK_Next; break; + case eKey_Backspace: ks = XK_BackSpace; break; + case eKey_Tab: ks = XK_Tab; break; + case eKey_PrtScrn: ks = XK_Print; break; + case eKey_Pause: ks = XK_Pause; break; default: - return false; + break; } + + if(ks == 0) + return false; KeyCode kc = XKeysymToKeycode(CurrentXDisplay, ks); diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index 1746438e5..b47739359 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -188,24 +188,10 @@ namespace FileIO int fclose(FILE *f); }; +enum KeyButton; + namespace Keyboard { - enum KeyButton - { - eKey_0 = 0x30, // '0' - // ... - eKey_1 = 0x39, // '9' - eKey_A = 0x41, // 'A' - // ... - eKey_Z = 0x5A, // 'Z' - - eKey_F11, - eKey_F12, - eKey_PrtScrn, - - eKey_Max, - }; - void Init(); void AddInputWindow(void *wnd); void RemoveInputWindow(void *wnd); diff --git a/renderdoc/os/win32/win32_stringio.cpp b/renderdoc/os/win32/win32_stringio.cpp index c08c5eabe..e786dac98 100644 --- a/renderdoc/os/win32/win32_stringio.cpp +++ b/renderdoc/os/win32/win32_stringio.cpp @@ -24,6 +24,7 @@ #include "os/os_specific.h" +#include "api/app/renderdoc_app.h" #include #include @@ -73,15 +74,44 @@ namespace Keyboard bool GetKeyState(KeyButton key) { int vk = 0; + + if(key >= eKey_A && key <= eKey_Z) vk = (int)key; + if(key >= eKey_0 && key <= eKey_9) vk = (int)key; switch(key) { - case eKey_F11: vk = VK_F11; break; - case eKey_F12: vk = VK_F12; break; - case eKey_PrtScrn: vk = VK_SNAPSHOT; break; + case eKey_Divide: vk = VK_DIVIDE; break; + case eKey_Multiply: vk = VK_MULTIPLY; break; + case eKey_Subtract: vk = VK_SUBTRACT; break; + case eKey_Plus: vk = VK_ADD; break; + case eKey_F1: vk = VK_F1; break; + case eKey_F2: vk = VK_F2; break; + case eKey_F3: vk = VK_F3; break; + case eKey_F4: vk = VK_F4; break; + case eKey_F5: vk = VK_F5; break; + case eKey_F6: vk = VK_F6; break; + case eKey_F7: vk = VK_F7; break; + case eKey_F8: vk = VK_F8; break; + case eKey_F9: vk = VK_F9; break; + case eKey_F10: vk = VK_F10; break; + case eKey_F11: vk = VK_F11; break; + case eKey_F12: vk = VK_F12; break; + case eKey_Home: vk = VK_HOME; break; + case eKey_End: vk = VK_END; break; + case eKey_Insert: vk = VK_INSERT; break; + case eKey_Delete: vk = VK_DELETE; break; + case eKey_PageUp: vk = VK_PRIOR; break; + case eKey_PageDn: vk = VK_NEXT; break; + case eKey_Backspace: vk = VK_BACK; break; + case eKey_Tab: vk = VK_TAB; break; + case eKey_PrtScrn: vk = VK_SNAPSHOT; break; + case eKey_Pause: vk = VK_PAUSE; break; default: - return false; + break; } + + if(vk == 0) + return false; bool keydown = GetAsyncKeyState(vk) != 0; diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index f67b6e69a..c7537387d 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -261,6 +261,18 @@ void RENDERDOC_CC RENDERDOC_MaskOverlayBits(uint32_t And, uint32_t Or) RenderDoc::Inst().MaskOverlayBits(And, Or); } +extern "C" RENDERDOC_API +void RENDERDOC_CC RENDERDOC_SetFocusToggleKeys(KeyButton *keys, int num) +{ + RenderDoc::Inst().SetFocusKeys(keys, num); +} + +extern "C" RENDERDOC_API +void RENDERDOC_CC RENDERDOC_SetCaptureKeys(KeyButton *keys, int num) +{ + RenderDoc::Inst().SetCaptureKeys(keys, num); +} + extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_QueueCapture(uint32_t frameNumber) {