mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-26 11:50:59 +00:00
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:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user