diff --git a/.gitmodules b/.gitmodules index d82f3ba..0109930 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,6 @@ path = third_party/imgui url = https://github.com/ocornut/imgui.git branch = docking +[submodule "third_party/tracy"] + path = third_party/tracy + url = https://github.com/wolfpld/tracy.git diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index dd5a483..f085d27 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -30,6 +30,7 @@ target_link_libraries(${ENGINE_NAME} PUBLIC glm imgui entt + Tracy::TracyClient ) target_link_libraries(${ENGINE_NAME} PRIVATE diff --git a/engine/src/application.cpp b/engine/src/application.cpp index b603bae..88ca4dd 100644 --- a/engine/src/application.cpp +++ b/engine/src/application.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -118,7 +119,10 @@ class Application::Impl { glm::vec2(static_cast(extent.width), static_cast(extent.height)), this->application.camera}; - this->application.onUpdate(frameInfo); + { + ZoneScopedN("Application::onUpdate"); + this->application.onUpdate(frameInfo); + } this->application.camera.setProjection( -frameInfo.currentFramebufferExtent.x / 2.f, frameInfo.currentFramebufferExtent.x / 2.f, @@ -134,7 +138,10 @@ class Application::Impl { sceneRenderer.beginFrame(renderContext.getFrameIndex()); panelRegistry.update(frameInfo); - this->application.onRender(); + { + ZoneScopedN("Application::onRender"); + this->application.onRender(); + } std::vector instances; instances.reserve(this->meshes.size() + this->drawCalls.size()); @@ -176,6 +183,7 @@ class Application::Impl { }, [&sceneRenderer, &sceneRegistry, &sceneViewRegistry, &viewsWithoutCamera, handle](vk::CommandBuffer commandBuffer) { + ZoneScopedN("scene view pass"); const SceneView& view = sceneViewRegistry.peek(handle); Entity camera = view.camera ? view.camera @@ -204,6 +212,7 @@ class Application::Impl { } }, [&](vk::CommandBuffer commandBuffer) { + ZoneScopedN("main pass"); modelRenderSystem.render(commandBuffer, instances, frameInfo); imguiRenderer.endFrame(commandBuffer); @@ -212,6 +221,7 @@ class Application::Impl { graph.execute(commandBuffer); renderContext.endFrame(); + FrameMark; frameIndex++; } diff --git a/engine/src/renderer/imgui_renderer.cpp b/engine/src/renderer/imgui_renderer.cpp index c48a378..5a28b5f 100644 --- a/engine/src/renderer/imgui_renderer.cpp +++ b/engine/src/renderer/imgui_renderer.cpp @@ -5,6 +5,8 @@ #include #include +#include + #include "resources/render_target.hpp" namespace sophia { @@ -79,6 +81,7 @@ ImGuiRenderer::~ImGuiRenderer() { } void ImGuiRenderer::beginFrame() { + ZoneScoped; releaseStaleTextures(); ImGui_ImplVulkan_NewFrame(); @@ -183,6 +186,7 @@ void ImGuiRenderer::applyLayoutIfNeeded(ImGuiID dockspaceId, } void ImGuiRenderer::endFrame(vk::CommandBuffer commandBuffer) { + ZoneScoped; ImGui::Render(); ImDrawData* mainDrawData = ImGui::GetDrawData(); diff --git a/engine/src/renderer/model_render_system.cpp b/engine/src/renderer/model_render_system.cpp index 47a83bb..0495b06 100644 --- a/engine/src/renderer/model_render_system.cpp +++ b/engine/src/renderer/model_render_system.cpp @@ -1,6 +1,7 @@ #include "renderer/model_render_system.hpp" #include +#include #include "shaders/model_render_system.frag.spv.h" #include "shaders/model_render_system.vert.spv.h" @@ -44,6 +45,7 @@ ModelRenderSystem::~ModelRenderSystem() { void ModelRenderSystem::render(vk::CommandBuffer commandBuffer, std::span instances, const FrameInfo& frameInfo) { + ZoneScoped; glm::mat4 viewProjection = frameInfo.camera.getViewProjection(); this->graphicsPipeline->bind(commandBuffer); diff --git a/engine/src/renderer/render_context.cpp b/engine/src/renderer/render_context.cpp index b6de112..67a293e 100644 --- a/engine/src/renderer/render_context.cpp +++ b/engine/src/renderer/render_context.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "vulkan/access.hpp" @@ -18,14 +19,19 @@ RenderContext::RenderContext(Window& window, Device& device) RenderContext::~RenderContext() { this->device.waitIdle(); } vk::CommandBuffer RenderContext::beginFrame() { + ZoneScoped; SOPHIA_ASSERT(!this->isFrameStarted, "Can't call beginFrame while already in progress"); FrameData& frame = this->frames[this->currentFrameIndex]; vk::Fence inFlightFence = frame.inFlight.get(); - vk::Result fenceResult = this->device.get()->waitForFences( - inFlightFence, vk::True, std::numeric_limits::max()); + vk::Result fenceResult; + { + ZoneScopedN("wait for frame fence"); + fenceResult = this->device.get()->waitForFences( + inFlightFence, vk::True, std::numeric_limits::max()); + } if (fenceResult != vk::Result::eSuccess) { log::error("failed to wait for fence: " + vk::to_string(fenceResult)); @@ -73,6 +79,7 @@ vk::CommandBuffer RenderContext::beginFrame() { } void RenderContext::endFrame() { + ZoneScoped; SOPHIA_ASSERT(this->isFrameStarted, "Can't call endFrame while no frame is in progress"); diff --git a/engine/src/renderer/render_graph.cpp b/engine/src/renderer/render_graph.cpp index 555e488..880dd5b 100644 --- a/engine/src/renderer/render_graph.cpp +++ b/engine/src/renderer/render_graph.cpp @@ -1,6 +1,7 @@ #include "renderer/render_graph.hpp" #include +#include #include #include "vulkan/debug_label.hpp" @@ -24,6 +25,7 @@ void RenderGraph::addPass(std::string name, const SetupFn& setup, } void RenderGraph::execute(vk::CommandBuffer commandBuffer) { + ZoneScoped; for (Pass& pass : this->passes) { this->recordPass(commandBuffer, pass); } diff --git a/engine/src/renderer/scene_renderer.cpp b/engine/src/renderer/scene_renderer.cpp index 9ba3d5f..92e2563 100644 --- a/engine/src/renderer/scene_renderer.cpp +++ b/engine/src/renderer/scene_renderer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include namespace sophia { @@ -15,11 +16,13 @@ SceneRenderer::SceneRenderer(const SceneRegistry& sceneRegistry, spriteRenderSystem{device, colorFormat, resources} {} void SceneRenderer::beginFrame(u32 frameIndex) { + ZoneScoped; this->spriteRenderSystem.beginFrame(frameIndex); } void SceneRenderer::render(vk::CommandBuffer commandBuffer, const SceneView& sceneView, Entity camera) { + ZoneScoped; SOPHIA_ASSERT(camera.hasComponent(), "camera does not have camera component!"); diff --git a/engine/src/renderer/sprite_render_system.cpp b/engine/src/renderer/sprite_render_system.cpp index 327e717..20c9aea 100644 --- a/engine/src/renderer/sprite_render_system.cpp +++ b/engine/src/renderer/sprite_render_system.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "shaders/sprite.frag.spv.h" #include "shaders/sprite.vert.spv.h" @@ -36,6 +37,7 @@ void SpriteRenderSystem::render(vk::CommandBuffer commandBuffer, const glm::mat4& viewProjection, std::span instances, std::span batches) { + ZoneScoped; if (instances.empty()) { return; } diff --git a/engine/src/resources/pools/render_target_pool.cpp b/engine/src/resources/pools/render_target_pool.cpp index fb3ee70..d34817c 100644 --- a/engine/src/resources/pools/render_target_pool.cpp +++ b/engine/src/resources/pools/render_target_pool.cpp @@ -1,5 +1,7 @@ #include "resources/pools/render_target_pool.hpp" +#include + namespace sophia { RenderTargetPool::RenderTargetPool(Device& device, vk::Format format) @@ -16,6 +18,7 @@ void RenderTargetPool::release(RenderTargetHandle handle) { } void RenderTargetPool::applyPendingResizes() { + ZoneScoped; pool.forEach([](RenderTarget& target) { target.applyPendingResize(); }); } diff --git a/engine/src/ui/panel_registry.cpp b/engine/src/ui/panel_registry.cpp index f372ffd..22aedd0 100644 --- a/engine/src/ui/panel_registry.cpp +++ b/engine/src/ui/panel_registry.cpp @@ -1,4 +1,5 @@ #include +#include namespace sophia { @@ -13,6 +14,7 @@ u32 PanelRegistry::visibleCount() const { } void PanelRegistry::update(const FrameInfo& frameInfo) { + ZoneScoped; pool.forEach([&frameInfo](Panel& panel) { if (panel.isVisible()) { panel.draw(frameInfo); diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 6c9df76..d8cb1c7 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -45,6 +45,12 @@ add_library(stb_image STATIC ) target_include_directories(stb_image PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/stb_image) +# Tracy profiler client (static). Configure with -DTRACY_ENABLE=OFF to compile +# all profiling macros out. +option(TRACY_ENABLE "Enable Tracy profiling" ON) +option(TRACY_ON_DEMAND "Only collect data while the viewer is connected" ON) +add_subdirectory(tracy) + # 5. IMGUI (static) set(IMGUI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/imgui) diff --git a/third_party/tracy b/third_party/tracy new file mode 160000 index 0000000..30997d5 --- /dev/null +++ b/third_party/tracy @@ -0,0 +1 @@ +Subproject commit 30997d5ca6bb632cc10807a1da8a6d3de0aeeb3c