Skip to content

Instantly share code, notes, and snippets.

@ifree
Created June 7, 2024 16:38
Show Gist options
  • Save ifree/944fe5649b62e14cc7ce2687298630c3 to your computer and use it in GitHub Desktop.
Save ifree/944fe5649b62e14cc7ce2687298630c3 to your computer and use it in GitHub Desktop.
Renderdoc in process frame capture
import ctypes
renderdoc_dll = ctypes.CDLL(r'renderdoc.[dll|so]')
# Calling convention
RENDERDOC_CC = ctypes.CFUNCTYPE
# Enums for capture options
class RENDERDOC_CaptureOption(ctypes.c_uint32):
eRENDERDOC_Option_AllowVSync = 0
eRENDERDOC_Option_AllowFullscreen = 1
eRENDERDOC_Option_APIValidation = 2
eRENDERDOC_Option_CaptureCallstacks = 3
eRENDERDOC_Option_CaptureCallstacksOnlyDraws = 4
eRENDERDOC_Option_DelayForDebugger = 5
eRENDERDOC_Option_VerifyBufferAccess = 6
eRENDERDOC_Option_HookIntoChildren = 7
eRENDERDOC_Option_RefAllResources = 8
eRENDERDOC_Option_SaveAllInitials = 9
eRENDERDOC_Option_CaptureAllCmdLists = 10
eRENDERDOC_Option_DebugOutputMute = 11
eRENDERDOC_Option_AllowUnsupportedVendorExtensions = 12
eRENDERDOC_Option_SoftMemoryLimit = 13
# Enums for input buttons
class RENDERDOC_InputButton(ctypes.c_uint32):
eRENDERDOC_Key_0 = 0x30
eRENDERDOC_Key_1 = 0x31
eRENDERDOC_Key_2 = 0x32
eRENDERDOC_Key_3 = 0x33
eRENDERDOC_Key_4 = 0x34
eRENDERDOC_Key_5 = 0x35
eRENDERDOC_Key_6 = 0x36
eRENDERDOC_Key_7 = 0x37
eRENDERDOC_Key_8 = 0x38
eRENDERDOC_Key_9 = 0x39
eRENDERDOC_Key_A = 0x41
eRENDERDOC_Key_B = 0x42
eRENDERDOC_Key_C = 0x43
eRENDERDOC_Key_D = 0x44
eRENDERDOC_Key_E = 0x45
eRENDERDOC_Key_F = 0x46
eRENDERDOC_Key_G = 0x47
eRENDERDOC_Key_H = 0x48
eRENDERDOC_Key_I = 0x49
eRENDERDOC_Key_J = 0x4A
eRENDERDOC_Key_K = 0x4B
eRENDERDOC_Key_L = 0x4C
eRENDERDOC_Key_M = 0x4D
eRENDERDOC_Key_N = 0x4E
eRENDERDOC_Key_O = 0x4F
eRENDERDOC_Key_P = 0x50
eRENDERDOC_Key_Q = 0x51
eRENDERDOC_Key_R = 0x52
eRENDERDOC_Key_S = 0x53
eRENDERDOC_Key_T = 0x54
eRENDERDOC_Key_U = 0x55
eRENDERDOC_Key_V = 0x56
eRENDERDOC_Key_W = 0x57
eRENDERDOC_Key_X = 0x58
eRENDERDOC_Key_Y = 0x59
eRENDERDOC_Key_Z = 0x5A
eRENDERDOC_Key_NonPrintable = 0x100
eRENDERDOC_Key_Divide = 0x101
eRENDERDOC_Key_Multiply = 0x102
eRENDERDOC_Key_Subtract = 0x103
eRENDERDOC_Key_Plus = 0x104
eRENDERDOC_Key_F1 = 0x105
eRENDERDOC_Key_F2 = 0x106
eRENDERDOC_Key_F3 = 0x107
eRENDERDOC_Key_F4 = 0x108
eRENDERDOC_Key_F5 = 0x109
eRENDERDOC_Key_F6 = 0x10A
eRENDERDOC_Key_F7 = 0x10B
eRENDERDOC_Key_F8 = 0x10C
eRENDERDOC_Key_F9 = 0x10D
eRENDERDOC_Key_F10 = 0x10E
eRENDERDOC_Key_F11 = 0x10F
eRENDERDOC_Key_F12 = 0x110
eRENDERDOC_Key_Home = 0x111
eRENDERDOC_Key_End = 0x112
eRENDERDOC_Key_Insert = 0x113
eRENDERDOC_Key_Delete = 0x114
eRENDERDOC_Key_PageUp = 0x115
eRENDERDOC_Key_PageDn = 0x116
eRENDERDOC_Key_Backspace = 0x117
eRENDERDOC_Key_Tab = 0x118
eRENDERDOC_Key_PrtScrn = 0x119
eRENDERDOC_Key_Pause = 0x11A
eRENDERDOC_Key_Max = 0x11B
# Enums for overlay bits
class RENDERDOC_OverlayBits(ctypes.c_uint32):
eRENDERDOC_Overlay_Enabled = 0x1
eRENDERDOC_Overlay_FrameRate = 0x2
eRENDERDOC_Overlay_FrameNumber = 0x4
eRENDERDOC_Overlay_CaptureList = 0x8
eRENDERDOC_Overlay_Default = 0xF
eRENDERDOC_Overlay_All = 0xFFFFFFFF
eRENDERDOC_Overlay_None = 0
class RENDERDOC_API_1_6_0(ctypes.Structure):
_fields_ = [
("GetAPIVersion", RENDERDOC_CC(None, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))),
("SetCaptureOptionU32", RENDERDOC_CC(ctypes.c_int, RENDERDOC_CaptureOption, ctypes.c_uint32)),
("SetCaptureOptionF32", RENDERDOC_CC(ctypes.c_int, RENDERDOC_CaptureOption, ctypes.c_float)),
("GetCaptureOptionU32", RENDERDOC_CC(ctypes.c_uint32, RENDERDOC_CaptureOption)),
("GetCaptureOptionF32", RENDERDOC_CC(ctypes.c_float, RENDERDOC_CaptureOption)),
("SetFocusToggleKeys", RENDERDOC_CC(None, ctypes.POINTER(RENDERDOC_InputButton), ctypes.c_int)),
("SetCaptureKeys", RENDERDOC_CC(None, ctypes.POINTER(RENDERDOC_InputButton), ctypes.c_int)),
("GetOverlayBits", RENDERDOC_CC(ctypes.c_uint32)),
("MaskOverlayBits", RENDERDOC_CC(None, ctypes.c_uint32, ctypes.c_uint32)),
("RemoveHooks", RENDERDOC_CC(None)),
("UnloadCrashHandler", RENDERDOC_CC(None)),
("SetCaptureFilePathTemplate", RENDERDOC_CC(None, ctypes.c_char_p)),
("GetCaptureFilePathTemplate", RENDERDOC_CC(ctypes.c_char_p)),
("GetNumCaptures", RENDERDOC_CC(ctypes.c_uint32)),
("GetCapture", RENDERDOC_CC(ctypes.c_uint32, ctypes.c_uint32, ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint64))),
("SetCaptureFileComments", RENDERDOC_CC(None, ctypes.c_char_p, ctypes.c_char_p)),
("IsTargetControlConnected", RENDERDOC_CC(ctypes.c_uint32)),
("LaunchReplayUI", RENDERDOC_CC(ctypes.c_uint32, ctypes.c_uint32, ctypes.c_char_p)),
("SetActiveWindow", RENDERDOC_CC(None, ctypes.c_void_p, ctypes.c_void_p)),
("TriggerCapture", RENDERDOC_CC(None)),
("StartFrameCapture", RENDERDOC_CC(None, ctypes.c_void_p, ctypes.c_void_p)),
("IsFrameCapturing", RENDERDOC_CC(ctypes.c_uint32)),
("EndFrameCapture", RENDERDOC_CC(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p)),
("DiscardFrameCapture", RENDERDOC_CC(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p)),
("SetCaptureTitle", RENDERDOC_CC(None, ctypes.c_char_p)),
]
pRENDERDOC_GetAPI = RENDERDOC_CC(ctypes.c_int, ctypes.c_uint32, ctypes.POINTER(ctypes.POINTER(RENDERDOC_API_1_6_0)))
# Get the RENDERDOC_GetAPI function from the DLL
RENDERDOC_GetAPI = pRENDERDOC_GetAPI(("RENDERDOC_GetAPI", renderdoc_dll))
# Create an instance of RENDERDOC_API_1_6_0
api = ctypes.POINTER(RENDERDOC_API_1_6_0)()
# Call RENDERDOC_GetAPI to fill the api structure
if RENDERDOC_GetAPI(10600, ctypes.byref(api)) == 0:
raise RuntimeError("Failed to get RenderDoc API")
major = ctypes.c_int()
minor = ctypes.c_int()
patch = ctypes.c_int()
api.contents.GetAPIVersion(ctypes.byref(major), ctypes.byref(minor), ctypes.byref(patch))
print(f"RenderDoc API Version: {major.value}.{minor.value}.{patch.value}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment