Apart from copying the renderdoc.dll
and renderdoc_api.h
files
from RenderDoc installation path, into the raylib project, we also need to
create two files, a cpp and a header. I call them raylib_renderdoc.h
and
raylib_renderdoc.cpp
.
In the header we add:
/**********************************************************************************************
*
* RenderDoc integration
*
**********************************************************************************************/
#ifndef RAYLIB_RENDERDOC_H
#define RAYLIB_RENDERDOC_H
void* LoadRenderDoc();
void UnloadRenderDoc();
bool RenderDocIsFrameCapturing();
void RenderDocBeginFrameCapture();
void RenderDocEndFrameCapture();
#endif //RAYLIB_RENDERDOC_H
and in the cpp:
#ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
#endif // WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <assert.h>
#include "3rdparty/renderdoc_app.h"
#include "raylib_renderdoc.h"
pRENDERDOC_GetAPI RENDERDOC_GetAPI;
static RENDERDOC_API_1_1_2* rdoc_api = NULL;
static void* renderdoc_dll = NULL;
void* LoadRenderDoc()
{
if (NULL != rdoc_api)
{
return renderdoc_dll;
}
void* renderdoc_dll = (void*)LoadLibraryA("renderdoc.dll");
if(NULL != renderdoc_dll)
{
pRENDERDOC_GetAPI RENDERDOC_GetAPI =
(pRENDERDOC_GetAPI)GetProcAddress((HMODULE)renderdoc_dll, "RENDERDOC_GetAPI");
int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&rdoc_api);
assert(ret == 1);
}
else
{
renderdoc_dll = NULL;
}
return renderdoc_dll;
}
void UnloadRenderDoc()
{
if (NULL != renderdoc_dll)
{
// Once RenderDoc is loaded there shouldn't be calls
// to Shutdown or unload RenderDoc DLL.
// https://github.com/bkaradzic/bgfx/issues/1192
//
// rdoc_api->Shutdown();
}
}
bool RenderDocIsFrameCapturing()
{
if (NULL != rdoc_api) return rdoc_api->IsFrameCapturing();
return false;
}
void RenderDocBeginFrameCapture()
{
// To start a frame capture, call StartFrameCapture.
// You can specify NULL, NULL for the device to capture on if you have only one device and
// either no windows at all or only one window, and it will capture from that device.
// See the documentation below for a longer explanation
if (NULL != rdoc_api)
{
rdoc_api->StartFrameCapture(NULL, NULL);
}
}
void RenderDocEndFrameCapture()
{
// stop the capture
if (NULL != rdoc_api)
{
rdoc_api->EndFrameCapture(NULL, NULL);
}
}
Then in the main.cpp we have:
#include "raylib_renderdoc.h"
#include <raylib.h>
int main(void)
{
LoadRenderDoc();
InitWindow(width, height, "Window Title");
...
while (!WindowShouldClose())
{
if (RenderDocIsFrameCapturing())
{
RenderDocBeginFrameCapture();
}
BeginDrawing ();
...
EndDrawing();
if (RenderDocIsFrameCapturing())
{
RenderDocEndFrameCapture();
}
}
CloseWindow();
UnloadRenderDoc();
return 0;
}
We need to call LoadRenderDoc
before any graphics context has been created, which in our
case is created through raylib's InitWindow
. Within the loop the first thing we do is
to query whether a capture has been triggered somehow and call RenderDocBeginFrameCapture
,
while at the end of the frame we call RenderDocEndFrameCapture
as the last thing of the
frame in order to capture the full frame. RenderDoc's integration tutorial has a call
for UnloadingRenderDoc
too, but it seems it's not a best practice. I've added it as a
placeholder mostly, but it's not needed according to bkaradzic/bgfx#1192.