UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GPUProfiler.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 GPUProfiler.h: Hierarchical GPU Profiler.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "Misc/TVariant.h"
12
13#include "RHIBreadcrumbs.h"
14#include "RHIStats.h"
15
19
20#if RHI_NEW_GPU_PROFILER
21
23{
24 struct FQueue
25 {
26 enum class EType : uint8
27 {
29 Compute,
30 Copy,
32 };
33
34 union
35 {
36 struct
37 {
42 };
44 };
45
46 FQueue() = default;
47
49 : Type (Type)
50 , GPU (GPU)
51 , Index (Index)
52 , Padding(0)
53 {}
54
55 constexpr bool operator == (FQueue const& RHS) const
56 {
57 return Value == RHS.Value;
58 }
59
60 constexpr bool operator != (FQueue const& RHS) const
61 {
62 return !(*this == RHS);
63 }
64
65 friend uint32 GetTypeHash(FQueue const& Queue)
66 {
67 return GetTypeHash(Queue.Value);
68 }
69
70 TCHAR const* GetTypeString() const
71 {
72 switch (Type)
73 {
74 case EType::Graphics: return TEXT("Graphics");
75 case EType::Compute: return TEXT("Compute");
76 case EType::Copy: return TEXT("Copy");
77 case EType::SwapChain: return TEXT("Swapchain");
78 default: return TEXT("<unknown>");
79 }
80 }
81 };
82
83 struct FEvent
84 {
85 //
86 // All timestamps are relative to FPlatformTime::Cycles64().
87 // TOP = Top of Pipe. Timestamps written by the GPU's command processor before work begins.
88 // BOP = Bottom of Pipe. Timestamps written after the GPU completes work.
89 //
90
91 // Inserted on each call to RHIEndFrame. Marks the end of a profiler frame.
93 {
94 // CPU timestamp from the platform RHI's submission thread where the frame boundary occured.
96
97 // The index of the frame that just ended.
98 // Very first frame of the engine is frame 0 (from boot to first call to RHIEndFrame).
100
101 #if STATS
102 // Should be TOptional<int64> but it is not trivially destructible
103 bool bStatsFrameSet;
105 #endif
106
107 #if WITH_RHI_BREADCRUMBS
108 // The RHI breadcrumb currently at the top of the stack at the frame boundary.
110 #endif
111
132 };
133
134 // When present in the stream, overrides the total GPU time stat with the value it contains.
135 // Used for platform RHIs which don't support accurate GPU timing.
137 {
138 // Same frequency as FPlatformTime::Cycles64()
140
144 };
145
146 #if WITH_RHI_BREADCRUMBS
147 struct FBeginBreadcrumb
148 {
150 uint64 GPUTimestampTOP;
151
154 , GPUTimestampTOP(GPUTimestampTOP)
155 {}
156 };
157
158 struct FEndBreadcrumb
159 {
161 uint64 GPUTimestampBOP = 0;
162
165 , GPUTimestampBOP(GPUTimestampBOP)
166 {}
167 };
168 #endif
169
170 // Inserted when the GPU starts work on a queue.
172 {
173 // CPU timestamp of when the work was submitted to the driver for execution on the GPU.
175
176 // TOP timestamp of when the work actually started on the GPU.
178
183 };
184
185 // Inserted when the GPU completes work on a queue and goes idle.
194
195 struct FStats
196 {
201
202 operator bool() const
203 {
204 return NumDraws > 0
205 || NumDispatches > 0
206 || NumPrimitives > 0
207 || NumVertices > 0;
208 }
209 };
210
211 // Can only be inserted when the GPU is marked "idle", i.e. after an FEndWork event.
213 {
214 //
215 // Timestamp when the fence signal was enqueued to the GPU/driver.
216 //
217 // The signal on the GPU doesn't happen until after the previous FEndWork
218 // event's BOP timestamp, or this CPU timestamp, whichever is later.
219 //
221
222 // The fence value signaled.
224
229 };
230
231 // Can only be inserted when the GPU is marked "idle", i.e. after an FEndWork event.
233 {
234 // Timestamp when the fence wait was enqueued to the GPU/driver.
236
237 // The fence value awaited.
239
240 // The queue the GPU is waiting for a fence signal from.
242
248 };
249
250 struct FFlip
251 {
253 };
254
255 struct FVsync
256 {
258 };
259
262 , FFrameTime
263 #if WITH_RHI_BREADCRUMBS
266 #endif
267 , FBeginWork
268 , FEndWork
269 , FStats
271 , FWaitFence
272 , FFlip
273 , FVsync
274 >;
275
276 enum class EType
277 {
278 FrameBoundary = FStorage::IndexOfType<FFrameBoundary >(),
279 FrameTime = FStorage::IndexOfType<FFrameTime >(),
280 #if WITH_RHI_BREADCRUMBS
281 BeginBreadcrumb = FStorage::IndexOfType<FBeginBreadcrumb>(),
282 EndBreadcrumb = FStorage::IndexOfType<FEndBreadcrumb >(),
283 #endif
284 BeginWork = FStorage::IndexOfType<FBeginWork >(),
285 EndWork = FStorage::IndexOfType<FEndWork >(),
286 Stats = FStorage::IndexOfType<FStats >(),
287 SignalFence = FStorage::IndexOfType<FSignalFence >(),
288 WaitFence = FStorage::IndexOfType<FWaitFence >(),
289 Flip = FStorage::IndexOfType<FFlip >(),
290 VSync = FStorage::IndexOfType<FVsync >()
291 };
292
294
296 {
297 return static_cast<EType>(Value.GetIndex());
298 }
299
300 template <typename T>
301 FEvent(T const& Value)
302 : Value(TInPlaceType<T>(), Value)
303 {}
304
305 FEvent(FEvent const&) = delete;
306 FEvent(FEvent&&) = delete;
307 };
308
310 {
311 friend struct FEventSink;
312
313 private:
314 struct FChunk
315 {
316 struct FHeader
317 {
318 FChunk* Next = nullptr;
320
321 #if WITH_RHI_BREADCRUMBS
323 #endif
324 } Header;
325
326 static constexpr uint32 ChunkSizeInBytes = 16 * 1024;
327 static constexpr uint32 RemainingBytes = ChunkSizeInBytes - Align<uint32>(sizeof(FHeader), alignof(FHeader));
328 static constexpr uint32 MaxEventsPerChunk = RemainingBytes / Align<uint32>(sizeof(FEvent), alignof(FEvent));
329
330 TStaticArray<TTypeCompatibleBytes<FEvent>, MaxEventsPerChunk> Elements;
331
333
334 void* operator new(size_t Size)
335 {
336 check(Size == sizeof(FChunk));
337
338 void* Memory = MemoryPool.Pop();
339 if (!Memory)
340 {
341 Memory = FMemory::Malloc(sizeof(FChunk), alignof(FChunk));
342 }
343
344 // UE-295331 Investigation : Fill memory with garbage on allocation to catch use-after-free etc.
345 FMemory::Memset(Memory, 0xf7, sizeof(FChunk));
346
347 return Memory;
348 }
349
350 void operator delete(void* Pointer)
351 {
352 // UE-295331 Investigation : Fill memory with garbage on deallocation to catch use-after-free etc.
353 FMemory::Memset(Pointer, 0xe5, sizeof(FChunk));
354
355 MemoryPool.Push(Pointer);
356 }
357
358 FEvent* GetElement(uint32 Index)
359 {
360 return Elements[Index].GetTypedPtr();
361 }
362 };
363
364 static_assert(sizeof(FChunk) <= FChunk::ChunkSizeInBytes, "Incorrect FChunk size.");
365
366 FChunk* First = nullptr;
367 FChunk* Current = nullptr;
368
369 public:
371
373 : Queue(Queue)
374 {}
375
376 FEventStream(FEventStream const&) = delete;
377
379 : First (Other.First)
381 , Queue (Other.Queue)
382 {
383 Other.First = nullptr;
384 Other.Current = nullptr;
385 }
386
388 {
389 while (First)
390 {
391 FChunk* Next = First->Header.Next;
392 delete First;
393 First = Next;
394 }
395 }
396
397 template <typename TEventType, typename... TArgs>
399 {
400 static_assert(std::is_trivially_destructible_v<TEventType>, "Destructors are not called on GPU profiler events, so the types must be trivially destructible.");
401
402 if (!Current)
403 {
404 Current = new FChunk;
405 if (!First)
406 {
407 First = Current;
408 }
409 }
410
411 if (Current->Header.Num >= FChunk::MaxEventsPerChunk)
412 {
413 FChunk* NewChunk = new FChunk;
414 Current->Header.Next = NewChunk;
416 }
417
418 FEvent* Event = Current->GetElement(Current->Header.Num++);
419 new (Event) FEvent(TEventType(Forward<TArgs>(Args)...));
420
421 TEventType& Data = Event->Value.Get<TEventType>();
422
423 #if WITH_RHI_BREADCRUMBS
424 if constexpr (
425 std::is_same_v<UE::RHI::GPUProfiler::FEvent::FBeginBreadcrumb, TEventType> ||
426 std::is_same_v<UE::RHI::GPUProfiler::FEvent::FEndBreadcrumb , TEventType> ||
427 std::is_same_v<UE::RHI::GPUProfiler::FEvent::FFrameBoundary , TEventType>
428 )
429 {
430 if (Data.Breadcrumb)
431 {
432 // Attach the breadcrumb allocator for begin/end breadcrumb events.
433 // This keeps the breadcrumbs alive until the events have been consumed by the profilers.
434 Current->Header.BreadcrumbAllocators.AddUnique(Data.Breadcrumb->Allocator);
435 }
436 }
437 #endif
438
439 return Data;
440 }
441
442 bool IsEmpty() const
443 {
444 return First == nullptr;
445 }
446
448 {
449 check(Queue == Other.Queue);
450
451 if (IsEmpty())
452 {
453 Current = Other.Current;
454 First = Other.First;
455 }
456 else if (!Other.IsEmpty())
457 {
458 Current->Header.Next = Other.First;
459 Current = Other.Current;
460 }
461
462 Other.Current = nullptr;
463 Other.First = nullptr;
464 }
465 };
466
468 {
469 protected:
471 {
473
474 private:
476
477 FEventStream::FChunk* Current;
478 uint32 Index = 0;
479
480 public:
482 : Stream(Stream)
483 , Current(Stream->First)
484 {}
485
486 FEvent const* Peek() const
487 {
488 return Current ? Current->GetElement(Index) : nullptr;
489 }
490
491 FEvent const* Pop()
492 {
493 FEvent const* Result = Peek();
494 if (Result)
495 {
496 ++Index;
497
498 while (Current && Index >= Current->Header.Num)
499 {
500 Current = Current->Header.Next;
501 Index = 0;
502 }
503 }
504
505 return Result;
506 }
507 };
508
511
512 FEventSink(FEventSink const&) = delete;
514
515 public:
518 };
519
522
523 struct FGPUStat
524 {
525 enum class EType
526 {
527 Busy,
528 Wait,
529 Idle
530 };
531
532 TCHAR const* const StatName;
533 TCHAR const* const DisplayName;
534
535 #if CSV_PROFILER_STATS
537 #endif
538
539 private:
540 #if STATS
541 static FString GetIDString(FQueue Queue, bool bFriendly);
542 static TCHAR const* GetTypeString(EType Type);
543
544 struct FStatCategory
545 {
546 FAnsiString const GroupName;
547 FString const GroupDesc;
548
549 FStatCategory(FQueue Queue);
550
552 static FStatCategory& GetCategory(FQueue Queue);
553 };
554
555 struct FStatInstance
556 {
557 struct FInner
558 {
559 #if STATS
560 FName StatName;
562 #endif
563 };
564
565 FInner Busy, Wait, Idle;
566 };
567
569
570 FStatInstance::FInner& GetStatInstance(FQueue Queue, EType Type);
571 #endif
572
573 public:
578
579 #if STATS
580 TStatId GetStatId(FQueue Queue, EType Type);
581 #endif
582 };
583
584 template <typename TNameProvider>
585 struct TGPUStat : public FGPUStat
586 {
588 : FGPUStat(TNameProvider::GetStatName(), TNameProvider::GetDisplayName())
589 {}
590 };
591
592 template <typename TNameProvider>
593 struct TGPUStatWithDrawcallCategory : public TGPUStat<TNameProvider>
594 {
595 #if HAS_GPU_STATS
597 #endif
598 };
599
601}
602
603#else
604
607{
608public:
610 NumDraws(0),
611 NumPrimitives(0),
612 NumVertices(0),
613 NumDispatches(0),
614 GroupCount(FIntVector(0, 0, 0)),
616 NumTotalDraws(0),
619 TimingResult(0),
620 NumEvents(0)
621 {
622 }
623
625 {
626 NumDraws = rhs.NumDraws;
627 NumPrimitives = rhs.NumPrimitives;
628 NumVertices = rhs.NumVertices;
629 NumDispatches = rhs.NumDispatches;
630 NumTotalDispatches = rhs.NumTotalDispatches;
631 NumTotalDraws = rhs.NumDraws;
632 NumTotalPrimitives = rhs.NumPrimitives;
633 NumTotalVertices = rhs.NumVertices;
634 TimingResult = rhs.TimingResult;
635 NumEvents = rhs.NumEvents;
636 }
637
639 uint32 NumDraws;
640
642 uint32 NumPrimitives;
643
645 uint32 NumVertices;
646
648 uint32 NumDispatches;
651
654
657
660
662 float TimingResult;
663
666
668 {
669 NumDraws += rhs.NumDraws;
670 NumPrimitives += rhs.NumPrimitives;
671 NumVertices += rhs.NumVertices;
672 NumDispatches += rhs.NumDispatches;
673 NumTotalDispatches += rhs.NumTotalDispatches;
674 NumTotalDraws += rhs.NumDraws;
675 NumTotalPrimitives += rhs.NumPrimitives;
676 NumTotalVertices += rhs.NumVertices;
677 TimingResult += rhs.TimingResult;
678 NumEvents += rhs.NumEvents;
679
680 return *this;
681 }
682};
683
685class FGPUProfilerEventNode : public FGPUProfilerEventNodeStats
686{
687public:
688 FGPUProfilerEventNode(const TCHAR* InName, FGPUProfilerEventNode* InParent) :
690 Name(InName),
692 {
693 }
694
696
697 FString Name;
698
700 FGPUProfilerEventNode* Parent;
701
704
705 virtual float GetTiming() { return 0.0f; }
706 virtual void StartTiming() {}
707 virtual void StopTiming() {}
708};
709
711struct FGPUProfilerEventNodeFrame
712{
713 virtual ~FGPUProfilerEventNodeFrame() {}
714
717
719 virtual void StartFrame() {}
720
722 virtual void EndFrame() {}
723
725 RHI_API void DumpEventTree();
726
728 virtual float GetRootTimingResults() { return 0.0f; }
729
731 virtual void LogDisjointQuery() {}
732
733 virtual bool PlatformDisablesVSync() const { return false; }
734};
735
741{
744};
745
749struct FGPUTiming
750{
751public:
757 static bool IsSupported()
758 {
759 return GIsSupported;
760 }
761
767 static uint64 GetTimingFrequency(uint32 GPUIndex = 0)
768 {
769 return GTimingFrequency[GPUIndex];
770 }
771
777 static FGPUTimingCalibrationTimestamp GetCalibrationTimestamp(uint32 GPUIndex = 0)
778 {
779 return GCalibrationTimestamp[GPUIndex];
780 }
781
782 typedef void (PlatformStaticInitialize)(void*);
783 static void StaticInitialize(void* UserData, PlatformStaticInitialize* PlatformFunction)
784 {
786 {
787 (*PlatformFunction)(UserData);
788
789 if (GetTimingFrequency() != 0)
790 {
791 GIsSupported = true;
792 }
793 else
794 {
795 GIsSupported = false;
796 }
797
799 }
800 }
801
802protected:
805
807 RHI_API static bool GIsSupported;
808
809 static void SetTimingFrequency(uint64 TimingFrequency, uint32 GPUIndex = 0)
810 {
812 }
813
814 static void SetCalibrationTimestamp(FGPUTimingCalibrationTimestamp CalibrationTimestamp, uint32 GPUIndex = 0)
815 {
817 }
818
819private:
822
829};
830
835struct FGPUProfiler
836{
838 bool bTrackingEvents;
839
842
845
848
851
854
857
860
862 FGPUProfilerEventNodeFrame* CurrentEventNodeFrame = nullptr;
863
865 FGPUProfilerEventNode* CurrentEventNode;
866
867 int32 StackDepth;
868
869 FGPUProfiler() :
880 StackDepth(0)
881 {
882 }
883
884 virtual ~FGPUProfiler()
885 {
886 }
887
888 void RegisterGPUWork(uint32 NumDraws, uint32 NumPrimitives, uint32 NumVertices)
889 {
891 {
893 CurrentEventNode->NumDraws += NumDraws;
894 CurrentEventNode->NumPrimitives += NumPrimitives;
895 CurrentEventNode->NumVertices += NumVertices;
896 }
897 }
898
899 void RegisterGPUWork(uint32 NumPrimitives = 0, uint32 NumVertices = 0)
900 {
901 RegisterGPUWork(1, NumPrimitives, NumVertices);
902 }
903
904 void RegisterGPUDispatch(FIntVector GroupCount)
905 {
907 {
909 CurrentEventNode->NumDispatches++;
910 CurrentEventNode->GroupCount = GroupCount;
911 }
912 }
913
914 virtual FGPUProfilerEventNode* CreateEventNode(const TCHAR* InName, FGPUProfilerEventNode* InParent)
915 {
916 return new FGPUProfilerEventNode(InName, InParent);
917 }
918
919 RHI_API virtual void PushEvent(const TCHAR* Name, FColor Color);
920 RHI_API virtual void PopEvent();
921
922 bool IsProfilingGPU() const { return bTrackingEvents; }
923};
924
925#endif
926
927//
928// Type used to pipe GPU frame timings from the end-of-pipe / RHI threads up to the game / render threads.
929// Stores a history of GPU frame timings, which can be retrieved by engine code via:
930//
931// static FRHIGPUFrameTimeHistory::FState GPUFrameTimeState;
932// uint64 GPUFrameTimeCycles64;
933// while (GPUFrameTimeState.PopFrameCycles(GPUFrameTimeCycles64) != FRHIGPUFrameTimeHistory::EResult::Empty)
934// {
935// ...
936// }
937//
939{
940public:
941 enum class EResult
942 {
943 // The next frame timing has been retrieved
944 Ok,
945
946 // The next frame timing has been retrieved, but the client has also missed some frames.
947 Disjoint,
948
949 // No new frame timing data available.
950 Empty
951 };
952
953 class FState
954 {
956 uint64 NextIndex = 0;
957 public:
959 };
960
961private:
962 // Total number of GPU frame timings to store
963 static constexpr uint32 MaxLength = 16;
964
965 uint64 NextIndex = 0;
967
969
970 EResult PopFrameCycles(FState& State, uint64& OutCycles64);
971
972public:
973 // Called by platform RHIs to submit new GPU timing data
974 RHI_API void PushFrameCycles(double GPUFrequency, uint64 GPUCycles);
975};
976
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define NULL
Definition oodle2base.h:134
#define check(expr)
Definition AssertionMacros.h:314
@ InPlace
Definition CoreMiscDefines.h:162
#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::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
RHI_API FRHIGPUFrameTimeHistory GRHIGPUFrameTimeHistory
Definition GPUProfiler.cpp:2672
const bool
Definition NetworkReplayStreaming.h:178
#define WITH_RHI_BREADCRUMBS
Definition RHIBreadcrumbs.h:25
FStringBuilderBase & operator+=(FStringBuilderBase &Builder, ANSICHAR Char)
Definition StringBuilder.h:582
CORE_API bool IsInRHIThread()
Definition ThreadingBase.cpp:339
CORE_API bool IsInRenderingThread()
Definition ThreadingBase.cpp:273
uint32 Size
Definition VulkanMemory.cpp:4034
if(Failed) console_printf("Failed.\n")
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Event.h:21
Definition NameTypes.h:617
Definition GPUProfiler.h:954
RHI_API EResult PopFrameCycles(uint64 &OutCycles64)
Definition GPUProfiler.cpp:2674
Definition GPUProfiler.h:939
EResult
Definition GPUProfiler.h:942
RHI_API void PushFrameCycles(double GPUFrequency, uint64 GPUCycles)
Definition GPUProfiler.cpp:2706
Definition RefCounting.h:252
Definition ArrayView.h:139
Definition Array.h:670
Definition LockFreeList.h:904
Definition UnrealString.h.inl:34
Definition SharedPointer.h:153
Definition StaticArray.h:26
Definition UniquePtr.h:107
SIZE_T GetIndex() const
Definition TVariant.h:231
Definition GPUProfiler.h:310
bool IsEmpty() const
Definition GPUProfiler.h:442
FQueue const Queue
Definition GPUProfiler.h:370
FEventStream(FQueue const Queue)
Definition GPUProfiler.h:372
TEventType & Emplace(TArgs &&... Args)
Definition GPUProfiler.h:398
void Append(FEventStream &&Other)
Definition GPUProfiler.h:447
FEventStream(FEventStream &&Other)
Definition GPUProfiler.h:378
FEventStream(FEventStream const &)=delete
~FEventStream()
Definition GPUProfiler.h:387
Definition GpuProfilerTrace.cpp:270
RHI_API void ProcessEvents(TArrayView< FEventStream > EventStreams)
RHI_API void InitializeQueues(TConstArrayView< FQueue > Queues)
RHI_API bool IsProfiling()
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition Color.h:486
static UE_FORCEINLINE_HINT void * Memset(void *Dest, uint8 Char, SIZE_T Count)
Definition UnrealMemory.h:119
Definition RHIStats.h:110
Definition TVariant.h:13
Definition Optional.h:131
Definition LightweightStats.h:416
FEvent const * Peek() const
Definition GPUProfiler.h:486
FIterator(TSharedRef< FEventStream > const &Stream)
Definition GPUProfiler.h:481
FEvent const * Pop()
Definition GPUProfiler.h:491
friend FEventSink
Definition GPUProfiler.h:472
Definition GPUProfiler.h:468
FEventSink(FEventSink const &)=delete
virtual void ProcessStreams(TConstArrayView< TSharedRef< FEventStream > > EventStreams)=0
FEventSink(FEventSink &&)=delete
virtual void InitializeQueues(TConstArrayView< FQueue > Queues)=0
uint32 Num
Definition GPUProfiler.h:319
FChunk * Next
Definition GPUProfiler.h:318
Definition GPUProfiler.h:172
uint64 GPUTimestampTOP
Definition GPUProfiler.h:177
FBeginWork(uint64 CPUTimestamp, uint64 GPUTimestampTOP=0)
Definition GPUProfiler.h:179
uint64 CPUTimestamp
Definition GPUProfiler.h:174
Definition GPUProfiler.h:187
uint64 GPUTimestampBOP
Definition GPUProfiler.h:188
FEndWork(uint64 GPUTimestampBOP=0)
Definition GPUProfiler.h:190
Definition GPUProfiler.h:251
uint64 GPUTimestamp
Definition GPUProfiler.h:252
FFrameBoundary(uint64 CPUTimestamp, uint32 FrameNumber)
Definition GPUProfiler.h:112
uint64 CPUTimestamp
Definition GPUProfiler.h:95
uint32 FrameNumber
Definition GPUProfiler.h:99
Definition GPUProfiler.h:137
uint64 TotalGPUTime
Definition GPUProfiler.h:139
FFrameTime(uint64 InTotalGPUTime)
Definition GPUProfiler.h:141
Definition GPUProfiler.h:213
uint64 CPUTimestamp
Definition GPUProfiler.h:220
uint64 Value
Definition GPUProfiler.h:223
FSignalFence(uint64 CPUTimestamp, uint64 Value)
Definition GPUProfiler.h:225
Definition GPUProfiler.h:196
uint32 NumDraws
Definition GPUProfiler.h:197
uint32 NumPrimitives
Definition GPUProfiler.h:199
uint32 NumDispatches
Definition GPUProfiler.h:198
uint32 NumVertices
Definition GPUProfiler.h:200
Definition GPUProfiler.h:256
uint64 GPUTimestamp
Definition GPUProfiler.h:257
Definition GPUProfiler.h:233
FQueue Queue
Definition GPUProfiler.h:241
FWaitFence(uint64 CPUTimestamp, uint64 Value, FQueue Queue)
Definition GPUProfiler.h:243
uint64 Value
Definition GPUProfiler.h:238
uint64 CPUTimestamp
Definition GPUProfiler.h:235
Definition GPUProfiler.h:84
FEvent(FEvent const &)=delete
EType GetType() const
Definition GPUProfiler.h:295
FEvent(T const &Value)
Definition GPUProfiler.h:301
FStorage Value
Definition GPUProfiler.h:293
EType
Definition GPUProfiler.h:277
FEvent(FEvent &&)=delete
Definition GPUProfiler.h:524
FGPUStat(TCHAR const *StatName, TCHAR const *DisplayName)
Definition GPUProfiler.h:574
TCHAR const *const DisplayName
Definition GPUProfiler.h:533
EType
Definition GPUProfiler.h:526
TCHAR const *const StatName
Definition GPUProfiler.h:532
Definition GPUProfiler.h:25
uint32 Value
Definition GPUProfiler.h:43
uint8 GPU
Definition GPUProfiler.h:39
constexpr bool operator!=(FQueue const &RHS) const
Definition GPUProfiler.h:60
EType Type
Definition GPUProfiler.h:38
constexpr bool operator==(FQueue const &RHS) const
Definition GPUProfiler.h:55
friend uint32 GetTypeHash(FQueue const &Queue)
Definition GPUProfiler.h:65
TCHAR const * GetTypeString() const
Definition GPUProfiler.h:70
uint8 Index
Definition GPUProfiler.h:40
EType
Definition GPUProfiler.h:27
constexpr FQueue(EType Type, uint8 GPU, uint8 Index)
Definition GPUProfiler.h:48
uint8 Padding
Definition GPUProfiler.h:41
Definition GPUProfiler.h:586
TGPUStat()
Definition GPUProfiler.h:587