Files
GTASource/game/renderer/Util/RenderDocManager.cpp
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

112 lines
3.1 KiB
C++

// =============================================================================================== //
// INCLUDES
// =============================================================================================== //
// rage includes
#include "bank/bank.h"
#include "bank/bkmgr.h"
#include "bank/console.h"
// game includes
#include "renderer/Util/RenderDocManager.h"
#if RENDERDOC_ENABLED
PARAM(renderdoc, "Enable RenderDoc frame capturing");
PARAM(renderdoc_overlay, "Enable RenderDoc overlay and F11 to do a capture");
PARAM(renderdoc_log, "Set name of RenderDocCapture");
XPARAM(noVendorAPI);
bool RenderDocManager::sm_IsEnabled = false;
char RenderDocManager::sm_logPath[256] = {"renderdoc_capture"};
HINSTANCE RenderDocManager::sm_RenderDocDLL = NULL;
RENDERDOC_API_1_4_1* RenderDocManager::sm_pAPI = NULL;
void RenderDocManager::Init()
{
if (!PARAM_renderdoc.Get())
{
return;
}
sm_RenderDocDLL = ::LoadLibrary("renderdoc.dll");
if(!sm_RenderDocDLL)
{
Warningf("Unable to load renderdoc.dll.");
return;
}
pRENDERDOC_GetAPI pGetAPI = (pRENDERDOC_GetAPI)::GetProcAddress(sm_RenderDocDLL, "RENDERDOC_GetAPI");
if (!pGetAPI(RENDERDOC_Version::eRENDERDOC_API_Version_1_4_1, (void**)&sm_pAPI)) {
Warningf("Invalid RenderDoc API version %d!", RENDERDOC_Version::eRENDERDOC_API_Version_1_4_1);
::FreeLibrary(sm_RenderDocDLL);
return;
}
if (PARAM_renderdoc_log.Get())
{
const char* pSavePath = NULL;
PARAM_renderdoc_log.Get(pSavePath);
Assertf(strlen(pSavePath) > 4, "Renderdoc logfile is too short (at least 5 characters)!");
strcpy(&sm_logPath[0], pSavePath);
}
sm_pAPI->SetLogFilePathTemplate(sm_logPath);
sm_pAPI->SetCaptureOptionU32(RENDERDOC_CaptureOption::eRENDERDOC_Option_AllowFullscreen, 1);
sm_pAPI->SetCaptureOptionU32(RENDERDOC_CaptureOption::eRENDERDOC_Option_AllowVSync, 1);
if(PARAM_renderdoc_overlay.Get())
{
sm_pAPI->MaskOverlayBits(RENDERDOC_OverlayBits::eRENDERDOC_Overlay_Default, RENDERDOC_OverlayBits::eRENDERDOC_Overlay_Default);
RENDERDOC_InputButton button = RENDERDOC_InputButton::eRENDERDOC_Key_F11;
sm_pAPI->SetCaptureKeys(&button, 1);
}
else
{
sm_pAPI->MaskOverlayBits(RENDERDOC_OverlayBits::eRENDERDOC_Overlay_None, RENDERDOC_OverlayBits::eRENDERDOC_Overlay_None);
sm_pAPI->SetCaptureKeys(NULL, 0);
}
sm_pAPI->SetFocusToggleKeys(NULL, 0);
sm_IsEnabled = true;
AssertMsg(sm_IsEnabled && PARAM_noVendorAPI.Get(), "RenderDoc is enabled but still using vendor API. Replaying a capture done using Vendor API on a different card manufacturer might not be possible. Use -noVendorAPI to disable vendor API.");
}
void RenderDocManager::TriggerCapture()
{
if(sm_IsEnabled)
{
sm_pAPI->TriggerCapture();
Displayf("RenderDoc Capture - Done! Capture saved to %s", sm_logPath);
}
}
void RenderDocManager::Shutdown()
{
if(sm_IsEnabled)
{
::FreeLibrary(sm_RenderDocDLL);
sm_RenderDocDLL = NULL;
sm_IsEnabled = false;
}
}
#if __BANK
void RenderDocManager::AddWidgets(bkBank *bk)
{
if(sm_IsEnabled)
{
bk->PushGroup("Renderdoc");
bk->AddButton("Trigger Capture", RenderDocManager::TriggerCapture);
bk->PopGroup();
}
}
#endif
#endif