Add red color to Tracy profiler zones that cause CPU waiting to improve profiling

This commit is contained in:
Wojtek Figat
2025-06-11 14:56:43 +02:00
parent d6eb647d59
commit e9835766bc
10 changed files with 24 additions and 3 deletions

View File

@@ -494,6 +494,9 @@ bool Asset::WaitForLoaded(double timeoutInMilliseconds) const
} }
PROFILE_CPU(); PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
const StringView path(GetPath());
ZoneText(*path, path.Length());
Content::WaitForTask(loadingTask, timeoutInMilliseconds); Content::WaitForTask(loadingTask, timeoutInMilliseconds);

View File

@@ -1128,6 +1128,8 @@ void Content::WaitForTask(ContentLoadTask* loadingTask, double timeoutInMillisec
localQueue.Clear(); localQueue.Clear();
} }
PROFILE_CPU_NAMED("Inline");
ZoneColor(0xffaaaaaa);
thread->Run(tmp); thread->Run(tmp);
} }
else else

View File

@@ -3,11 +3,12 @@
#if GRAPHICS_API_DIRECTX11 #if GRAPHICS_API_DIRECTX11
#include "GPUSwapChainDX11.h" #include "GPUSwapChainDX11.h"
#include "GPUContextDX11.h"
#include "Engine/Platform/Window.h" #include "Engine/Platform/Window.h"
#include "Engine/Graphics/RenderTools.h" #include "Engine/Graphics/RenderTools.h"
#include "Engine/GraphicsDevice/DirectX/RenderToolsDX.h" #include "Engine/GraphicsDevice/DirectX/RenderToolsDX.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Profiler/ProfilerMemory.h" #include "Engine/Profiler/ProfilerMemory.h"
#include "GPUContextDX11.h"
GPUSwapChainDX11::GPUSwapChainDX11(GPUDeviceDX11* device, Window* window) GPUSwapChainDX11::GPUSwapChainDX11(GPUDeviceDX11* device, Window* window)
: GPUResourceDX11(device, StringView::Empty) : GPUResourceDX11(device, StringView::Empty)
@@ -140,6 +141,9 @@ GPUTextureView* GPUSwapChainDX11::GetBackBufferView()
void GPUSwapChainDX11::Present(bool vsync) void GPUSwapChainDX11::Present(bool vsync)
{ {
PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
// Present frame // Present frame
ASSERT(_swapChain); ASSERT(_swapChain);
UINT presentFlags = 0; UINT presentFlags = 0;

View File

@@ -6,6 +6,7 @@
#include "GPUDeviceDX12.h" #include "GPUDeviceDX12.h"
#include "Engine/Threading/Threading.h" #include "Engine/Threading/Threading.h"
#include "Engine/GraphicsDevice/DirectX/RenderToolsDX.h" #include "Engine/GraphicsDevice/DirectX/RenderToolsDX.h"
#include "Engine/Profiler/ProfilerCPU.h"
FenceDX12::FenceDX12(GPUDeviceDX12* device) FenceDX12::FenceDX12(GPUDeviceDX12* device)
: _currentValue(1) : _currentValue(1)
@@ -64,12 +65,12 @@ void FenceDX12::WaitCPU(uint64 value)
{ {
if (IsFenceComplete(value)) if (IsFenceComplete(value))
return; return;
PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
ScopeLock lock(_locker); ScopeLock lock(_locker);
_fence->SetEventOnCompletion(value, _event); _fence->SetEventOnCompletion(value, _event);
WaitForSingleObject(_event, INFINITE); WaitForSingleObject(_event, INFINITE);
_lastCompletedValue = _fence->GetCompletedValue(); _lastCompletedValue = _fence->GetCompletedValue();
} }

View File

@@ -6,6 +6,7 @@
#include "GPUContextDX12.h" #include "GPUContextDX12.h"
#include "../IncludeDirectXHeaders.h" #include "../IncludeDirectXHeaders.h"
#include "Engine/GraphicsDevice/DirectX/RenderToolsDX.h" #include "Engine/GraphicsDevice/DirectX/RenderToolsDX.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Profiler/ProfilerMemory.h" #include "Engine/Profiler/ProfilerMemory.h"
void BackBufferDX12::Setup(GPUSwapChainDX12* window, ID3D12Resource* backbuffer) void BackBufferDX12::Setup(GPUSwapChainDX12* window, ID3D12Resource* backbuffer)
@@ -364,6 +365,8 @@ void GPUSwapChainDX12::End(RenderTask* task)
void GPUSwapChainDX12::Present(bool vsync) void GPUSwapChainDX12::Present(bool vsync)
{ {
PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
#if PLATFORM_XBOX_SCARLETT || PLATFORM_XBOX_ONE #if PLATFORM_XBOX_SCARLETT || PLATFORM_XBOX_ONE
ID3D12Resource* backBuffer = _backBuffers[_currentFrameIndex].GetResource(); ID3D12Resource* backBuffer = _backBuffers[_currentFrameIndex].GetResource();
D3D12XBOX_PRESENT_PLANE_PARAMETERS planeParameters = {}; D3D12XBOX_PRESENT_PLANE_PARAMETERS planeParameters = {};

View File

@@ -2094,6 +2094,7 @@ void GPUDeviceVulkan::WaitForGPU()
if (Device != VK_NULL_HANDLE) if (Device != VK_NULL_HANDLE)
{ {
PROFILE_CPU(); PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
VALIDATE_VULKAN_RESULT(vkDeviceWaitIdle(Device)); VALIDATE_VULKAN_RESULT(vkDeviceWaitIdle(Device));
} }
} }

View File

@@ -553,6 +553,7 @@ void GPUSwapChainVulkan::Present(bool vsync)
if (_acquiredImageIndex == -1) if (_acquiredImageIndex == -1)
return; return;
PROFILE_CPU(); PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
// Ensure that backbuffer has been acquired before presenting it to the window // Ensure that backbuffer has been acquired before presenting it to the window
const auto backBuffer = (GPUTextureViewVulkan*)GetBackBufferView(); const auto backBuffer = (GPUTextureViewVulkan*)GetBackBufferView();

View File

@@ -412,3 +412,6 @@ struct TIsPODType<ProfilerCPU::Event>
#define PROFILE_CPU_ACTOR(actor) #define PROFILE_CPU_ACTOR(actor)
#endif #endif
// CPU-wait zones can be marked with red color for better readability
#define TracyWaitZoneColor 0xba1904

View File

@@ -385,6 +385,7 @@ void JobSystem::Wait(int64 label)
{ {
#if JOB_SYSTEM_ENABLED #if JOB_SYSTEM_ENABLED
PROFILE_CPU(); PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
while (Platform::AtomicRead(&ExitFlag) == 0) while (Platform::AtomicRead(&ExitFlag) == 0)
{ {

View File

@@ -40,6 +40,7 @@ void Task::Cancel()
bool Task::Wait(double timeoutMilliseconds) const bool Task::Wait(double timeoutMilliseconds) const
{ {
PROFILE_CPU(); PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
const double startTime = Platform::GetTimeSeconds(); const double startTime = Platform::GetTimeSeconds();
// TODO: no active waiting! use a semaphore! // TODO: no active waiting! use a semaphore!
@@ -76,6 +77,7 @@ bool Task::Wait(double timeoutMilliseconds) const
bool Task::WaitAll(const Span<Task*>& tasks, double timeoutMilliseconds) bool Task::WaitAll(const Span<Task*>& tasks, double timeoutMilliseconds)
{ {
PROFILE_CPU(); PROFILE_CPU();
ZoneColor(TracyWaitZoneColor);
for (int32 i = 0; i < tasks.Length(); i++) for (int32 i = 0; i < tasks.Length(); i++)
{ {
if (tasks[i]->Wait()) if (tasks[i]->Wait())