Cogs.Core
TaskManagerInspector.cpp
1#include "Inspectors.h"
2
3#include "Context.h"
4#include "InspectorGuiHelper.h"
5#include "Services/TaskManager.h"
6
7#include "imgui.h"
8
9
10namespace {
11
12
13}
14
15
16void Cogs::Core::taskManagerInspector(Context* context, bool* show)
17{
18 if (*show) {
19 ImGui::SetNextWindowSize(ImVec2(600, 1000), ImGuiCond_Once);
20 guiBegin("Task Manager", show);
21
22 QueueState queueState;
23 std::vector<QueueWorkerState> workerStates;
24
25 size_t queueCount = context->taskManager->getQueueCount();
26 for (size_t q = 0; q < queueCount; q++) {
27 const std::string& name = context->taskManager->getQueueName((TaskQueueId)q).c_str();
28
29 if (ImGui::CollapsingHeader(name.c_str(), ImGuiTreeNodeFlags_DefaultOpen)) {
30
31 workerStates.clear();
32 context->taskManager->getQueueState(queueState, workerStates, (TaskQueueId)q);
33
34 ImGui::Columns(4, name.c_str());
35 ImGui::Text("Worker"); ImGui::NextColumn();
36 ImGui::Text("Utilization"); ImGui::NextColumn();
37 ImGui::Text("Tasks/s"); ImGui::NextColumn();
38 ImGui::Text("Tasks/frame"); ImGui::NextColumn();
39 ImGui::Separator();
40
41 for (size_t i = 0; i < workerStates.size(); i++) {
42 const QueueWorkerState& workerState = workerStates[i];
43 if (i == 0) {
44 ImGui::Text("main thread");
45 }
46 else {
47 ImGui::Text("worker %zu", i - 1);
48 }
49 ImGui::NextColumn();
50 ImGui::Text("%.1f%%", 100.f * workerState.utilization); ImGui::NextColumn();
51 ImGui::Text("%.1f", workerState.tasksPerSecond); ImGui::NextColumn();
52 ImGui::Text("%.1f", workerState.tasksPerFrame); ImGui::NextColumn();
53 }
54 ImGui::Separator();
55 ImGui::Text("Total"); ImGui::NextColumn();
56 ImGui::Text("%.1f%%", 100.f * queueState.load / (std::max(size_t(1), workerStates.size() - 1))); ImGui::NextColumn();
57 ImGui::Text("%.1f", queueState.tasksPerSecond); ImGui::NextColumn();
58 ImGui::Text("%.1f", queueState.tasksPerFrame); ImGui::NextColumn();
59 ImGui::Columns(1);
60 }
61 }
62 guiEnd();
63 }
64}