Integrate RenderDoc frame capture into D3D12 minimal test

- Add SetDevice() and GetNumCaptures() methods to RenderDocCapture
- Fix initialization order: RenderDoc before D3D12, then SetDevice after
- Use nullptr for window param in StartFrameCapture/EndFrameCapture
- Add BeginCapture at frame 29, EndCapture at frame 30
- Set capture file path template to .\minimal_frame30
- Copy renderdoc.dll (26MB redistributable) to test output
- Engine/third_party/renderdoc/ now contains working renderdoc.dll
This commit is contained in:
2026-03-23 17:47:43 +08:00
parent 1cc545a91f
commit e9f4f2dc49
6 changed files with 37 additions and 4 deletions

View File

@@ -39,6 +39,9 @@ add_custom_command(TARGET D3D12_Minimal POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/GT.ppm
$<TARGET_FILE_DIR:D3D12_Minimal>/
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${ENGINE_ROOT_DIR}/third_party/renderdoc/renderdoc.dll
$<TARGET_FILE_DIR:D3D12_Minimal>/
)
add_test(NAME D3D12_Minimal_Integration

View File

@@ -24,6 +24,7 @@
#include "XCEngine/Debug/Logger.h"
#include "XCEngine/Debug/ConsoleLogSink.h"
#include "XCEngine/Debug/FileLogSink.h"
#include "XCEngine/Debug/RenderDocCapture.h"
#include "XCEngine/Containers/String.h"
using namespace XCEngine::RHI;
@@ -228,12 +229,22 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
return -1;
}
// Initialize RenderDoc capture (MUST be before D3D12 init)
if (!RenderDocCapture::Get().Initialize(nullptr, gHWND)) {
Log("[WARNING] Failed to initialize RenderDoc, frame capture will not be available");
} else {
RenderDocCapture::Get().SetCaptureFilePath(".\\minimal_frame30");
}
// Initialize D3D12
if (!InitD3D12()) {
MessageBox(NULL, L"Failed to initialize D3D12", L"Error", MB_OK);
return -1;
}
// Set device for RenderDoc (must be called after D3D12 init)
RenderDocCapture::Get().SetDevice(gDevice.GetDevice());
// Show window
ShowWindow(gHWND, nShowCmd);
UpdateWindow(gHWND);
@@ -267,7 +278,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
frameCount++;
if (frameCount >= targetFrameCount) {
Log("[INFO] Reached target frame count %d - taking screenshot before present!", targetFrameCount);
Log("[INFO] Reached target frame count %d - ending capture and taking screenshot!", targetFrameCount);
RenderDocCapture::Get().EndCapture();
ExecuteCommandList();
WaitForGPU();
Log("[INFO] GPU idle, taking screenshot...");
@@ -282,9 +294,14 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
} else {
Log("[ERROR] Screenshot failed");
}
Log("[INFO] RenderDoc capture completed");
break;
}
if (frameCount == targetFrameCount - 1) {
RenderDocCapture::Get().BeginCapture("Minimal_Test_Frame30");
}
EndRender();
// Execute
@@ -296,6 +313,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
}
// Shutdown
RenderDocCapture::Get().Shutdown();
gCommandList.Shutdown();
gCommandAllocator.Shutdown();
gSwapChain.Shutdown();