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.
This commit is contained in:
baldurk
2014-09-14 13:17:00 +01:00
parent 599a182c30
commit 69fec43309
8 changed files with 264 additions and 37 deletions
+48
View File
@@ -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.
//////////////////////////////////////////////////////////////////////////
+74 -8
View File
@@ -40,6 +40,10 @@ string ToStrHelper<false, RDCDriver>::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<false, RDCDriver>::Get(const RDCDriver &el)
return tostrBuf;
}
template<>
string ToStrHelper<false, KeyButton>::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)
+19
View File
@@ -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<KeyButton> &GetFocusKeys() { return m_FocusKeys; }
const vector<KeyButton> &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<KeyButton> m_FocusKeys;
vector<KeyButton> m_CaptureKeys;
wstring m_Target;
wstring m_LogFile;
wstring m_CurrentLogFile;
+42 -5
View File
@@ -2907,15 +2907,35 @@ HRESULT WrappedID3D11Device::Present(IDXGISwapChain *swap, UINT SyncInterval, UI
if(swap == m_SwapChain)
{
string overlayText = "F12/PrtScr to capture.";
vector<KeyButton> 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<KeyButton> 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);
+33 -4
View File
@@ -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);
+2 -16
View File
@@ -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);
+34 -4
View File
@@ -24,6 +24,7 @@
#include "os/os_specific.h"
#include "api/app/renderdoc_app.h"
#include <time.h>
#include <stdio.h>
@@ -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;
+12
View File
@@ -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)
{