UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RealtimeGPUProfiler.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "Containers/Map.h"
9#include "CoreMinimal.h"
10#include "CoreTypes.h"
11#include "GpuProfilerTrace.h"
12#include "HAL/CriticalSection.h"
13#include "MultiGPU.h"
16#include "RHI.h"
17#include "RHICommandList.h"
18#include "RHIBreadcrumbs.h"
19#include "RenderingThread.h"
20#include "Stats/Stats.h"
21#include "UObject/NameTypes.h"
22#include <tuple>
23
24#define WANTS_DRAW_MESH_EVENTS (WITH_PROFILEGPU && WITH_RHI_BREADCRUMBS)
25
26#if WITH_RHI_BREADCRUMBS
27
29 {
30 private:
32
33 public:
34 template <typename TDesc, typename... TValues>
37 {
39
41 [
42 Event = Event,
43 Args = MoveTemp(Args)
44 ](FRHICommandListImmediate& RHICmdList) mutable
45 {
46 Event->Emplace(RHICmdList, MoveTemp(Args));
47 });
48 }
49
51 {
53
55 {
56 delete Event;
57 });
58 }
59 };
60
61 #define RHI_BREADCRUMB_EVENT_GAMETHREAD_PRIVATE_IMPL(Stat, Condition, StaticName, Format, ...) \
62 TOptional<FRHIBreadcrumbScope_GameThread> PREPROCESSOR_JOIN(BreadcrumbScope, __LINE__); \
63 do \
64 { \
65 if (Condition) \
66 { \
67 PREPROCESSOR_JOIN(BreadcrumbScope, __LINE__).Emplace( \
68 RHI_BREADCRUMB_DESC_COPY_VALUES( \
69 StaticName \
70 , Format \
71 , Stat \
72 )(__VA_ARGS__) \
73 ); \
74 } \
75 } while(false)
76
77 // Note, the varargs are deprecated and ignored in these two macros.
78 #define RHI_BREADCRUMB_EVENT_GAMETHREAD( StaticName, ...) RHI_BREADCRUMB_EVENT_GAMETHREAD_PRIVATE_IMPL(RHI_GPU_STAT_ARGS_NONE, true, TEXT(StaticName), nullptr, ##__VA_ARGS__)
79 #define RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD( Condition, StaticName, ...) RHI_BREADCRUMB_EVENT_GAMETHREAD_PRIVATE_IMPL(RHI_GPU_STAT_ARGS_NONE, Condition, TEXT(StaticName), nullptr, ##__VA_ARGS__)
80
81 // Format versions of the breadcrumb macros.
82 #define RHI_BREADCRUMB_EVENT_GAMETHREAD_F( StaticName, Format, ...) RHI_BREADCRUMB_EVENT_GAMETHREAD_PRIVATE_IMPL(RHI_GPU_STAT_ARGS_NONE, true, TEXT(StaticName), TEXT(Format), ##__VA_ARGS__)
83 #define RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD_F(Condition, StaticName, Format, ...) RHI_BREADCRUMB_EVENT_GAMETHREAD_PRIVATE_IMPL(RHI_GPU_STAT_ARGS_NONE, Condition, TEXT(StaticName), TEXT(Format), ##__VA_ARGS__)
84
85 // Used only for back compat with SCOPED_DRAW_EVENTF_GAMETHREAD
86 #define RHI_BREADCRUMB_EVENT_GAMETHREAD_STR_DEPRECATED( StaticName, Format, ...) RHI_BREADCRUMB_EVENT_GAMETHREAD_PRIVATE_IMPL(RHI_GPU_STAT_ARGS_NONE, true, TEXT(StaticName), Format , ##__VA_ARGS__)
87
88#else
89
90 #define RHI_BREADCRUMB_EVENT_GAMETHREAD(...) do { } while(0)
91 #define RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD(...) do { } while(0)
92 #define RHI_BREADCRUMB_EVENT_GAMETHREAD_F(...) do { } while(0)
93 #define RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD_F(...) do { } while(0)
94 #define RHI_BREADCRUMB_EVENT_GAMETHREAD_STR_DEPRECATED(...) do { } while(0)
95
96#endif
97
98// Macros to allow for scoping of draw events outside of RHI function implementations
99// Render-thread event macros:
100#define SCOPED_DRAW_EVENT(RHICmdList, Name) RHI_BREADCRUMB_EVENT(RHICmdList, #Name);
101#define SCOPED_DRAW_EVENTF(RHICmdList, Name, Format, ...) RHI_BREADCRUMB_EVENT_F_STR_DEPRECATED(RHICmdList, #Name, Format, ##__VA_ARGS__);
102#define SCOPED_CONDITIONAL_DRAW_EVENT(RHICmdList, Name, Condition) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, #Name);
103#define SCOPED_CONDITIONAL_DRAW_EVENTF(RHICmdList, Name, Condition, Format, ...) RHI_BREADCRUMB_EVENT_F_CONDITIONAL_STR_DEPRECATED(RHICmdList, Condition, #Name, Format, ##__VA_ARGS__);
104
105// Non-render-thread event macros:
106#define SCOPED_DRAW_EVENT_GAMETHREAD(Name) UE_DEPRECATED_MACRO(5.6, "SCOPED_DRAW_EVENT_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_GAMETHREAD instead." ) RHI_BREADCRUMB_EVENT_GAMETHREAD(#Name);
107#define SCOPED_DRAW_EVENTF_GAMETHREAD(Name, Format, ...) UE_DEPRECATED_MACRO(5.6, "SCOPED_DRAW_EVENTF_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_GAMETHREAD_F instead." ) RHI_BREADCRUMB_EVENT_GAMETHREAD_STR_DEPRECATED(#Name, Format, ##__VA_ARGS__);
108#define SCOPED_CONDITIONAL_DRAW_EVENT_GAMETHREAD(Name, Condition) UE_DEPRECATED_MACRO(5.6, "SCOPED_CONDITIONAL_DRAW_EVENT_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD(Condition, #Name);
109#define SCOPED_CONDITIONAL_DRAW_EVENTF_GAMETHREAD(Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.6, "SCOPED_CONDITIONAL_DRAW_EVENTF_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD_F instead.") RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD_F(Condition, #Name, Format, ##__VA_ARGS__);
110
111// Deprecated macros
112#define BEGIN_DRAW_EVENTF(RHICmdList, Name, Event, Format, ...) UE_DEPRECATED_MACRO(5.5, "BEGIN_DRAW_EVENTF has been deprecated. Equivalent functionality can be implemented by constructing / destructing an instance of FRHIBreadcrumbEventManual." )
113#define STOP_DRAW_EVENT(Event) UE_DEPRECATED_MACRO(5.5, "STOP_DRAW_EVENT has been deprecated. Equivalent functionality can be implemented by constructing / destructing an instance of FRHIBreadcrumbEventManual." )
114#define STOP_DRAW_EVENT_GAMETHREAD(...) UE_DEPRECATED_MACRO(5.5, "STOP_DRAW_EVENT_GAMETHREAD has been deprecated. Equivalent functionality can be implemented by constructing / destructing an instance of FRHIBreadcrumbScope_GameThread." )
115#define BEGIN_DRAW_EVENTF_GAMETHREAD(...) UE_DEPRECATED_MACRO(5.5, "BEGIN_DRAW_EVENTF_GAMETHREAD has been deprecated. Equivalent functionality can be implemented by constructing / destructing an instance of FRHIBreadcrumbScope_GameThread." )
116#define BEGIN_DRAW_EVENTF_COLOR_GAMETHREAD(...) UE_DEPRECATED_MACRO(5.5, "BEGIN_DRAW_EVENTF_COLOR_GAMETHREAD has been deprecated. Equivalent functionality can be implemented by constructing / destructing an instance of FRHIBreadcrumbScope_GameThread.")
117#define SCOPED_DRAW_EVENT_COLOR(RHICmdList, Color, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_DRAW_EVENT_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, #Name)
118#define SCOPED_GPU_EVENT(RHICmdList, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_GPU_EVENT has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, #Name)
119#define SCOPED_GPU_EVENT_COLOR(RHICmdList, Color, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_GPU_EVENT_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, #Name)
120#define SCOPED_COMPUTE_EVENT(RHICmdList, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_COMPUTE_EVENT has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, #Name)
121#define SCOPED_COMPUTE_EVENT_COLOR(RHICmdList, Color, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_COMPUTE_EVENT_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, #Name)
122#define SCOPED_DRAW_EVENTF_COLOR(RHICmdList, Color, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_DRAW_EVENTF_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, Format, ##__VA_ARGS__)
123#define SCOPED_GPU_EVENTF(RHICmdList, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_GPU_EVENTF has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, Format, ##__VA_ARGS__)
124#define SCOPED_GPU_EVENTF_COLOR(RHICmdList, Color, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_GPU_EVENTF_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, Format, ##__VA_ARGS__)
125#define SCOPED_COMPUTE_EVENTF(RHICmdList, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_COMPUTE_EVENTF has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, Format, ##__VA_ARGS__)
126#define SCOPED_COMPUTE_EVENTF_COLOR(RHICmdList, Color, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_COMPUTE_EVENTF_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT instead." ) RHI_BREADCRUMB_EVENT(RHICmdList, Format, ##__VA_ARGS__)
127#define SCOPED_CONDITIONAL_DRAW_EVENT_COLOR(RHICmdList, Name, Color, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_DRAW_EVENT_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, #Name)
128#define SCOPED_CONDITIONAL_GPU_EVENT(RHICmdList, Name, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_GPU_EVENT has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, #Name)
129#define SCOPED_CONDITIONAL_GPU_EVENT_COLOR(RHICmdList, Name, Color, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_GPU_EVENT_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, #Name)
130#define SCOPED_CONDITIONAL_COMPUTE_EVENT(RHICmdList, Name, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_COMPUTE_EVENT has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, #Name)
131#define SCOPED_CONDITIONAL_COMPUTE_EVENT_COLOR(RHICmdList, Name, Color, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_COMPUTE_EVENT_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, #Name)
132#define SCOPED_CONDITIONAL_DRAW_EVENTF_COLOR(RHICmdList, Color, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_DRAW_EVENTF_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, Format, ##__VA_ARGS__)
133#define SCOPED_CONDITIONAL_GPU_EVENTF(RHICmdList, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_GPU_EVENTF has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, Format, ##__VA_ARGS__)
134#define SCOPED_CONDITIONAL_GPU_EVENTF_COLOR(RHICmdList, Color, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_GPU_EVENTF_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, Format, ##__VA_ARGS__)
135#define SCOPED_CONDITIONAL_COMPUTE_EVENTF(RHICmdList, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_COMPUTE_EVENTF has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, Format, ##__VA_ARGS__)
136#define SCOPED_CONDITIONAL_COMPUTE_EVENTF_COLOR(RHICmdList, Color, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_COMPUTE_EVENTF_COLOR has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL(RHICmdList, Condition, Format, ##__VA_ARGS__)
137#define BEGIN_DRAW_EVENTF_COLOR(RHICmdList, Color, Name, Event, Format, ...) UE_DEPRECATED_MACRO(5.5, "BEGIN_DRAW_EVENTF_COLOR has been deprecated. Use BEGIN_DRAW_EVENTF instead." ) BEGIN_DRAW_EVENTF(RHICmdList, Name, Event, Format, ##__VA_ARGS__)
138#define BEGIN_GPU_EVENTF(RHICmdList, Name, Event, Format, ...) UE_DEPRECATED_MACRO(5.5, "BEGIN_GPU_EVENTF has been deprecated. Use BEGIN_DRAW_EVENTF instead." ) BEGIN_DRAW_EVENTF(RHICmdList, Name, Event, Format, ##__VA_ARGS__)
139#define BEGIN_GPU_EVENTF_COLOR(RHICmdList, Color, Name, Event, Format, ...) UE_DEPRECATED_MACRO(5.5, "BEGIN_GPU_EVENTF_COLOR has been deprecated. Use BEGIN_DRAW_EVENTF instead." ) BEGIN_DRAW_EVENTF(RHICmdList, Name, Event, Format, ##__VA_ARGS__)
140#define STOP_GPU_EVENT(Event) UE_DEPRECATED_MACRO(5.5, "STOP_GPU_EVENT has been deprecated. Use STOP_DRAW_EVENT instead." ) STOP_DRAW_EVENT(Event)
141#define SCOPED_DRAW_EVENT_COLOR_GAMETHREAD(Color, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_DRAW_EVENT_COLOR_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_GAMETHREAD instead." ) RHI_BREADCRUMB_EVENT_GAMETHREAD(#Name)
142#define SCOPED_DRAW_EVENTF_COLOR_GAMETHREAD(Color, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_DRAW_EVENTF_COLOR_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_GAMETHREAD instead." ) RHI_BREADCRUMB_EVENT_GAMETHREAD(Format, ##__VA_ARGS__)
143#define SCOPED_CONDITIONAL_DRAW_EVENT_COLOR_GAMETHREAD(Name, Color, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_DRAW_EVENT_COLOR_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD instead." ) RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD(Condition, #Name)
144#define SCOPED_CONDITIONAL_DRAW_EVENTF_COLOR_GAMETHREAD(Color, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_CONDITIONAL_DRAW_EVENTF_COLOR_GAMETHREAD has been deprecated. Use RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD instead.") RHI_BREADCRUMB_EVENT_CONDITIONAL_GAMETHREAD(Condition, Format, ##__VA_ARGS__)
145#define SCOPED_RHI_DRAW_EVENT(RHICmdContext, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_DRAW_EVENT has been deprecated. Use standard RHI breadcrumb events instead." )
146#define SCOPED_RHI_DRAW_EVENTF(RHICmdContext, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_DRAW_EVENTF has been deprecated. Use standard RHI breadcrumb events instead." )
147#define SCOPED_RHI_CONDITIONAL_DRAW_EVENT(RHICmdContext, Name, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_CONDITIONAL_DRAW_EVENT has been deprecated. Use standard RHI breadcrumb events instead." )
148#define SCOPED_RHI_CONDITIONAL_DRAW_EVENTF(RHICmdContext, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_CONDITIONAL_DRAW_EVENTF has been deprecated. Use standard RHI breadcrumb events instead." )
149#define SCOPED_RHI_DRAW_EVENT_COLOR(RHICmdContext, Color, Name) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_DRAW_EVENT_COLOR has been deprecated. Use standard RHI breadcrumb events instead." )
150#define SCOPED_RHI_DRAW_EVENTF_COLOR(RHICmdContext, Color, Name, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_DRAW_EVENTF_COLOR has been deprecated. Use standard RHI breadcrumb events instead." )
151#define SCOPED_RHI_CONDITIONAL_DRAW_EVENT_COLOR(RHICmdContext, Color, Name, Condition) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_CONDITIONAL_DRAW_EVENT_COLOR has been deprecated. Use standard RHI breadcrumb events instead." )
152#define SCOPED_RHI_CONDITIONAL_DRAW_EVENTF_COLOR(RHICmdContext, Color, Name, Condition, Format, ...) UE_DEPRECATED_MACRO(5.5, "SCOPED_RHI_CONDITIONAL_DRAW_EVENTF_COLOR has been deprecated. Use standard RHI breadcrumb events instead.")
153
154#if RHI_NEW_GPU_PROFILER
155
156 #if HAS_GPU_STATS
157
158 #define DECLARE_GPU_STAT_NAME_TYPE(StatName, NameString) \
159 struct TRHIGPUStatNameProvider_##StatName \
160 { \
161 static constexpr TCHAR const* GetDisplayName() \
162 { \
163 return NameString; \
164 } \
165 static constexpr TCHAR const* GetStatName() \
166 { \
167 return TEXT(#StatName); \
168 } \
169 }
170
171 // Extern GPU stats are needed where a stat is used in multiple CPPs. Use the DECLARE_GPU_STAT_NAMED_EXTERN in the header and DEFINE_GPU_STAT in the CPPs
172 #define DECLARE_GPU_STAT_NAMED( StatName, NameString) DECLARE_GPU_STAT_NAME_TYPE(StatName, NameString); static UE::RHI::GPUProfiler::TGPUStat <TRHIGPUStatNameProvider_##StatName> GPUStat_##StatName
173 #define DECLARE_GPU_STAT_NAMED_EXTERN( StatName, NameString) DECLARE_GPU_STAT_NAME_TYPE(StatName, NameString); extern UE::RHI::GPUProfiler::TGPUStat <TRHIGPUStatNameProvider_##StatName> GPUStat_##StatName
174 #define DECLARE_GPU_DRAWCALL_STAT_NAMED( StatName, NameString) DECLARE_GPU_STAT_NAME_TYPE(StatName, NameString); static UE::RHI::GPUProfiler::TGPUStatWithDrawcallCategory<TRHIGPUStatNameProvider_##StatName> GPUStat_##StatName
175 #define DECLARE_GPU_DRAWCALL_STAT_NAMED_EXTERN(StatName, NameString) DECLARE_GPU_STAT_NAME_TYPE(StatName, NameString); extern UE::RHI::GPUProfiler::TGPUStatWithDrawcallCategory<TRHIGPUStatNameProvider_##StatName> GPUStat_##StatName
176
177 #define DECLARE_GPU_STAT( StatName) DECLARE_GPU_STAT_NAMED( StatName, TEXT(#StatName))
178 #define DECLARE_GPU_STAT_EXTERN( StatName) DECLARE_GPU_STAT_NAMED_EXTERN( StatName, TEXT(#StatName))
179 #define DECLARE_GPU_DRAWCALL_STAT( StatName) DECLARE_GPU_DRAWCALL_STAT_NAMED( StatName, TEXT(#StatName))
180 #define DECLARE_GPU_DRAWCALL_STAT_EXTERN(StatName) DECLARE_GPU_DRAWCALL_STAT_NAMED_EXTERN(StatName, TEXT(#StatName))
181
182 #define DEFINE_GPU_STAT( StatName) UE::RHI::GPUProfiler::TGPUStat <TRHIGPUStatNameProvider_##StatName> GPUStat_##StatName
183 #define DEFINE_GPU_DRAWCALL_STAT(StatName) UE::RHI::GPUProfiler::TGPUStatWithDrawcallCategory<TRHIGPUStatNameProvider_##StatName> GPUStat_##StatName
184
185 #else
186
187 #define DECLARE_GPU_STAT_NAMED(...)
188 #define DECLARE_GPU_STAT_NAMED_EXTERN(...)
189 #define DECLARE_GPU_DRAWCALL_STAT_NAMED(...)
190 #define DECLARE_GPU_DRAWCALL_STAT_NAMED_EXTERN(...)
191
192 #define DECLARE_GPU_STAT(...)
193 #define DECLARE_GPU_STAT_EXTERN(...)
194 #define DECLARE_GPU_DRAWCALL_STAT(...)
195 #define DECLARE_GPU_DRAWCALL_STAT_EXTERN(...)
196
197 #define DEFINE_GPU_STAT(...)
198 #define DEFINE_GPU_DRAWCALL_STAT(...)
199
200 #endif
201
202 // Empty when using the new RHI GPU profiler. GPU stats are handled via RHI_BREADCRUMB_EVENT_STAT etc.
203 // @todo deprecate
204 #define SCOPED_GPU_STAT_VERBOSE(...)
205 #define SCOPED_GPU_STAT(...)
206 #define GPU_STATS_BEGINFRAME(...)
207 #define GPU_STATS_ENDFRAME(...)
208 #define GPU_STATS_SUSPENDFRAME(...)
209
210#else
211
215
218
219#if HAS_GPU_STATS
220
221 // The DECLARE_GPU_STAT macros both declare and define a stat (for use in a single CPP)
222 #define DECLARE_GPU_STAT(StatName) DECLARE_FLOAT_COUNTER_STAT(TEXT(#StatName) , Stat_GPU_##StatName, STATGROUP_GPU ); CSV_DEFINE_STAT(GPU,StatName); static FRHIDrawStatsCategory DrawcallCountCategory_##StatName;
223 #define DECLARE_GPU_STAT_NAMED(StatName, NameString) DECLARE_FLOAT_COUNTER_STAT(NameString , Stat_GPU_##StatName, STATGROUP_GPU ); CSV_DEFINE_STAT(GPU,StatName); static FRHIDrawStatsCategory DrawcallCountCategory_##StatName;
224 #define DECLARE_GPU_DRAWCALL_STAT(StatName) DECLARE_FLOAT_COUNTER_STAT(TEXT(#StatName) , Stat_GPU_##StatName, STATGROUP_GPU ); CSV_DEFINE_STAT(GPU,StatName); static FRHIDrawStatsCategory DrawcallCountCategory_##StatName((TCHAR*)TEXT(#StatName));
225 #define DECLARE_GPU_DRAWCALL_STAT_NAMED(StatName, NameString) DECLARE_FLOAT_COUNTER_STAT(NameString , Stat_GPU_##StatName, STATGROUP_GPU ); CSV_DEFINE_STAT(GPU,StatName); static FRHIDrawStatsCategory DrawcallCountCategory_##StatName((TCHAR*)TEXT(#StatName));
226 #define DECLARE_GPU_DRAWCALL_STAT_EXTERN(StatName) DECLARE_FLOAT_COUNTER_STAT_EXTERN(TEXT(#StatName), Stat_GPU_##StatName, STATGROUP_GPU, ); CSV_DECLARE_STAT_EXTERN(GPU,StatName); extern FRHIDrawStatsCategory DrawcallCountCategory_##StatName;
227 #define DECLARE_GPU_DRAWCALL_STAT_NAMED_EXTERN(StatName, NameString) DECLARE_FLOAT_COUNTER_STAT_EXTERN(NameString , Stat_GPU_##StatName, STATGROUP_GPU, ); CSV_DECLARE_STAT_EXTERN(GPU,StatName); extern FRHIDrawStatsCategory DrawcallCountCategory_##StatName;
228
229 // Extern GPU stats are needed where a stat is used in multiple CPPs. Use the DECLARE_GPU_STAT_NAMED_EXTERN in the header and DEFINE_GPU_STAT in the CPPs
230 #define DECLARE_GPU_STAT_NAMED_EXTERN(StatName, NameString) DECLARE_FLOAT_COUNTER_STAT_EXTERN(NameString, Stat_GPU_##StatName, STATGROUP_GPU, ); CSV_DECLARE_STAT_EXTERN(GPU,StatName); extern FRHIDrawStatsCategory DrawcallCountCategory_##StatName;
231 #define DEFINE_GPU_STAT(StatName) DEFINE_STAT(Stat_GPU_##StatName); CSV_DEFINE_STAT(GPU,StatName); FRHIDrawStatsCategory DrawcallCountCategory_##StatName;
232 #define DEFINE_GPU_DRAWCALL_STAT(StatName) DEFINE_STAT(Stat_GPU_##StatName); CSV_DEFINE_STAT(GPU,StatName); FRHIDrawStatsCategory DrawcallCountCategory_##StatName((TCHAR*)TEXT(#StatName));
233
234 #define SCOPED_GPU_STAT_VERBOSE(RHICmdList, StatName, Description) \
235 FScopedGPUStatEvent PREPROCESSOR_JOIN(GPUStatEvent_##StatName,__LINE__)( \
236 RHICmdList \
237 , CSV_STAT_FNAME(StatName) \
238 , GET_STATID(Stat_GPU_##StatName) \
239 , Description \
240 ); \
241 FScopedDrawStatCategory PREPROCESSOR_JOIN(DrawCallScope_##StatName, __LINE__)( \
242 RHICmdList, DrawcallCountCategory_##StatName \
243 );
244
245 #define SCOPED_GPU_STAT(RHICmdList, StatName) SCOPED_GPU_STAT_VERBOSE(RHICmdList, StatName, nullptr)
246
247 #define GPU_STATS_BEGINFRAME(RHICmdList) FRealtimeGPUProfiler::Get()->BeginFrame(RHICmdList);
248 #define GPU_STATS_ENDFRAME(RHICmdList) FRealtimeGPUProfiler::Get()->EndFrame(RHICmdList);
249 #define GPU_STATS_SUSPENDFRAME() FRealtimeGPUProfiler::Get()->SuspendFrame();
250
251#else
252
253 #define DECLARE_GPU_STAT(StatName)
254 #define DECLARE_GPU_STAT_NAMED(StatName, NameString)
255 #define DECLARE_GPU_DRAWCALL_STAT(StatName)
256 #define DECLARE_GPU_DRAWCALL_STAT_NAMED(StatName, NameString)
257 #define DECLARE_GPU_DRAWCALL_STAT_EXTERN(StatName)
258 #define DECLARE_GPU_DRAWCALL_STAT_NAMED_EXTERN(StatName, NameString)
259
260 #define DECLARE_GPU_STAT_NAMED_EXTERN(StatName, NameString)
261 #define DEFINE_GPU_STAT(StatName)
262 #define DEFINE_GPU_DRAWCALL_STAT(StatName)
263
264 #define SCOPED_GPU_STAT_VERBOSE(RHICmdList, StatName, Description)
265 #define SCOPED_GPU_STAT(RHICmdList, StatName)
266
267 #define GPU_STATS_BEGINFRAME(RHICmdList)
268 #define GPU_STATS_ENDFRAME(RHICmdList)
269 #define GPU_STATS_SUSPENDFRAME()
270
271#endif
272
274
275#if HAS_GPU_STATS
276
278{
279public:
280 FRealtimeGPUProfilerQuery() = default;
282 : GPUMask(InGPUMask)
283 , Query(InQuery)
284 , Parent(Parent)
285 {}
286
287 RENDERCORE_API void Submit(FRHICommandList& RHICmdList, bool bBegin) const;
288
289 // RDG might create profiler events that are never submitted due to pass culling etc.
290 // This is called when FRDGScope_GPU instances are destructed, and will mark this query as discarded if it was never submitted.
291 RENDERCORE_API void Discard(bool bBegin);
292
293 operator bool() const { return Query != nullptr; }
294
295private:
296 FRHIGPUMask GPUMask;
299};
300
301#if GPUPROFILERTRACE_ENABLED
303{
305
306 static const uint64 HistoryCount = 64;
307
308 // Constructor memsets everything to zero, assuming structure is Plain Old Data. If any dynamic structures are
309 // added, you'll need a more generalized constructor that zeroes out all the uninitialized data.
310 bool UpdatedThisFrame;
313 uint64 AccumulatedTime; // Accumulated time could be computed, but may also be useful to inspect in the debugger
315};
316
318{
320 mutable FRWLock Mutex;
321};
322
324{
325 // Times are in microseconds
326 FString Description;
327 FRHIGPUMask GPUMask;
329 uint64 MinTime;
330 uint64 MaxTime;
331};
332#endif // GPUPROFILERTRACE_ENABLED
333
338{
340public:
341 // Singleton interface
343
345 static RENDERCORE_API void SafeRelease();
346
351
353 RENDERCORE_API FRealtimeGPUProfilerQuery PushEvent(FRHIGPUMask GPUMask, const FName& Name, const TStatId& Stat, const TCHAR* Description);
355
357 RENDERCORE_API void PushStat(FRHICommandListImmediate& RHICmdList, const FName& Name, const TStatId& Stat, const TCHAR* Description);
359
360#if GPUPROFILERTRACE_ENABLED
362#endif
363
364private:
366
368 void Cleanup();
369
371
374
376 bool bLocked = false;
377
378#if GPUPROFILERTRACE_ENABLED
380#endif
381};
382
387{
389 FRHICommandListBase* RHICmdList = nullptr;
390
391public:
392 RENDERCORE_API FScopedGPUStatEvent(FRHICommandListBase& InRHICmdList, const FName& Name, const TStatId& StatId, const TCHAR* Description);
394};
395
397{
398 FRHICommandListBase* const RHICmdList = nullptr;
400
401public:
404};
405
406#endif // HAS_GPU_STATS
407
408#endif // (RHI_NEW_GPU_PROFILER == 0)
#define check(expr)
Definition AssertionMacros.h:314
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
#define DECLARE_STATS_GROUP(GroupDesc, GroupId, GroupCat)
Definition Stats.h:689
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define CSV_DECLARE_CATEGORY_MODULE_EXTERN(Module_API, CategoryName)
Definition CsvProfiler.h:80
const bool
Definition NetworkReplayStreaming.h:178
RENDERCORE_API bool AreGPUStatsEnabled()
#define ENQUEUE_RENDER_COMMAND(Type)
Definition RenderingThread.h:1167
CORE_API bool IsInGameThread()
Definition ThreadingBase.cpp:185
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition NameTypes.h:617
Definition RHICommandList.h:455
Definition RHICommandList.h:4626
Definition RHICommandList.h:3819
Definition RHIResources.h:2444
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition Queue.h:48
Definition StaticArray.h:26
Definition UniquePtr.h:107
Definition CriticalSection.h:14
@ Description
Definition PathFollowingComponent.h:177
UE::FRecursiveMutex Mutex
Definition MeshPaintVirtualTexture.cpp:164
FORCEINLINE T * Get(const FObjectPtr &ObjectPtr)
Definition ObjectPtr.h:426
Definition RHIStats.h:110
Definition MultiGPU.h:33
Definition Optional.h:131
Definition LightweightStats.h:416