Files
xemu/hw/xbox/nv2a/pgraph/debug_renderdoc.c
Erik Abairandmborgerson 428c975f09 nv2a: Allow multiframe RenderDoc captures with nv2a traces
Allows multiple frames to be captured at once by holding shift while pressing
F10.

Temporarily toggles nv2a trace messages if control is held while pressing F10.
2025-05-15 08:37:13 -07:00

98 lines
2.6 KiB
C

/*
* Geforce NV2A PGRAPH Renderdoc Helpers
*
* Copyright (c) 2024 Matt Borgerson
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#include "qemu/osdep.h"
#include <stdint.h>
#include <stdbool.h>
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
#include "thirdparty/renderdoc_app.h"
#include "hw/xbox/nv2a/debug.h"
#ifdef _WIN32
#include <libloaderapi.h>
#else
#include <dlfcn.h>
#endif
static RENDERDOC_API_1_6_0 *rdoc_api = NULL;
int renderdoc_capture_frames = 0;
bool renderdoc_trace_frames = false;
void nv2a_dbg_renderdoc_init(void)
{
if (rdoc_api) {
return;
}
#ifdef _WIN32
HMODULE renderdoc = GetModuleHandleA("renderdoc.dll");
if (!renderdoc) {
fprintf(stderr, "Error: Failed to open renderdoc library: 0x%lx\n",
GetLastError());
return;
}
pRENDERDOC_GetAPI RENDERDOC_GetAPI =
(pRENDERDOC_GetAPI)GetProcAddress(renderdoc, "RENDERDOC_GetAPI");
#else // _WIN32
#ifdef __APPLE__
void *renderdoc = dlopen("librenderdoc.dylib", RTLD_LAZY);
#else
void *renderdoc = dlopen("librenderdoc.so", RTLD_LAZY);
#endif
if (!renderdoc) {
fprintf(stderr, "Error: Failed to open renderdoc library: %s\n",
dlerror());
return;
}
pRENDERDOC_GetAPI RENDERDOC_GetAPI =
(pRENDERDOC_GetAPI)dlsym(renderdoc, "RENDERDOC_GetAPI");
#endif // _WIN32
if (!RENDERDOC_GetAPI) {
fprintf(stderr, "Error: Could not get RENDERDOC_GetAPI address\n");
return;
}
int ret =
RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_6_0, (void **)&rdoc_api);
if (ret != 1) {
fprintf(stderr, "Error: Failed to retrieve RenderDoc API.\n");
}
}
void *nv2a_dbg_renderdoc_get_api(void)
{
return (void*)rdoc_api;
}
bool nv2a_dbg_renderdoc_available(void)
{
return rdoc_api != NULL;
}
void nv2a_dbg_renderdoc_capture_frames(int num_frames, bool trace)
{
renderdoc_capture_frames += num_frames;
renderdoc_trace_frames = trace;
}