I want to read some info from the GPU Visualizer widget and use it in my plugin, but I have no idea how.
I guess this code is responsible for running the ProfileGPU
console command:
// Create and display profile visualizer data
if (RHIConfig::ShouldShowProfilerAfterProfilingGPU())
{
// execute on main thread
{
struct FDisplayProfilerVisualizer
{
void Thread( TSharedPtr<FVisualizerEvent> InVisualizerData, const FText InVsyncEnabledWarningText )
{
static FName TaskGraphModule(TEXT("TaskGraph"));
if (FModuleManager::Get().IsModuleLoaded(TaskGraphModule))
{
IProfileVisualizerModule& ProfileVisualizer = FModuleManager::GetModuleChecked<IProfileVisualizerModule>(TaskGraphModule);
// Display a warning if this is a GPU profile and the GPU was profiled with v-sync enabled (otherwise InVsyncEnabledWarningText is empty)
ProfileVisualizer.DisplayProfileVisualizer( InVisualizerData, TEXT("GPU"), InVsyncEnabledWarningText, FLinearColor::Red );
}
}
} DisplayProfilerVisualizer;
TSharedPtr<FVisualizerEvent> VisualizerData = CreateVisualizerData( EventTree );
DECLARE_CYCLE_STAT(TEXT("FSimpleDelegateGraphTask.DisplayProfilerVisualizer"),
STAT_FSimpleDelegateGraphTask_DisplayProfilerVisualizer,
STATGROUP_TaskGraphTasks);
FSimpleDelegateGraphTask::CreateAndDispatchWhenReady(
FSimpleDelegateGraphTask::FDelegate::CreateRaw(&DisplayProfilerVisualizer, &FDisplayProfilerVisualizer::Thread, VisualizerData, VsyncEnabledWarningText),
GET_STATID(STAT_FSimpleDelegateGraphTask_DisplayProfilerVisualizer), nullptr, ENamedThreads::GameThread
);
}
}
Any ideas on how to get the widget? Or maybe there is an easier way to get that info?
UPD
I made some investigation. RHI
handles GPU profiling logic, and it is done inside the FGPUProfiler
structure. However, the structure itself does not give any information, so it must be given by the rendering API. DirectX12 rendering module runs the profiler after rendering a frame. It stores some data on frame start and overrides it with another on frame end. On frame end, it can run the profiler if some boolean is true. I suppose that I need either get that whole dx class and simply run some method or maybe there are just methods to render a frame with info suitable for the FGPUProfiler
structure.
I think I am close to understanding how to make it work.