aboutsummaryrefslogtreecommitdiff
path: root/vendor/zgui/libs/imgui_test_engine/imgui_te_perftool.h
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/zgui/libs/imgui_test_engine/imgui_te_perftool.h')
-rw-r--r--vendor/zgui/libs/imgui_test_engine/imgui_te_perftool.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/vendor/zgui/libs/imgui_test_engine/imgui_te_perftool.h b/vendor/zgui/libs/imgui_test_engine/imgui_te_perftool.h
new file mode 100644
index 0000000..d75e667
--- /dev/null
+++ b/vendor/zgui/libs/imgui_test_engine/imgui_te_perftool.h
@@ -0,0 +1,131 @@
+// dear imgui test engine
+// (performance tool)
+// Browse and visualize samples recorded by ctx->PerfCapture() calls.
+// User access via 'Test Engine UI -> Tools -> Perf Tool'
+
+#pragma once
+
+#include "imgui.h"
+
+// Forward Declaration
+struct ImGuiPerfToolColumnInfo;
+struct ImGuiTestEngine;
+struct ImGuiCsvParser;
+
+// Configuration
+#define IMGUI_PERFLOG_DEFAULT_FILENAME "output/imgui_perflog.csv"
+
+// [Internal] Perf log entry. Changes to this struct should be reflected in ImGuiTestContext::PerfCapture() and ImGuiTestEngine_Start().
+// This struct assumes strings stored here will be available until next ImGuiPerfTool::Clear() call. Fortunately we do not have to actively
+// manage lifetime of these strings. New entries are created only in two cases:
+// 1. ImGuiTestEngine_PerfToolAppendToCSV() call after perf test has run. This call receives ImGuiPerfToolEntry with const strings stored indefinitely by application.
+// 2. As a consequence of ImGuiPerfTool::LoadCSV() call, we persist the ImGuiCSVParser instance, which keeps parsed CSV text, from which strings are referenced.
+// As a result our solution also doesn't make many allocations.
+struct IMGUI_API ImGuiPerfToolEntry
+{
+ ImU64 Timestamp = 0; // Title of a particular batch of perftool entries.
+ const char* Category = NULL; // Name of category perf test is in.
+ const char* TestName = NULL; // Name of perf test.
+ double DtDeltaMs = 0.0; // Result of perf test.
+ double DtDeltaMsMin = +FLT_MAX; // May be used by perftool.
+ double DtDeltaMsMax = -FLT_MAX; // May be used by perftool.
+ int NumSamples = 1; // Number aggregated samples.
+ int PerfStressAmount = 0; //
+ const char* GitBranchName = NULL; // Build information.
+ const char* BuildType = NULL; //
+ const char* Cpu = NULL; //
+ const char* OS = NULL; //
+ const char* Compiler = NULL; //
+ const char* Date = NULL; // Date of this entry or min date of combined entries.
+ //const char* DateMax = NULL; // Max date of combined entries, or NULL.
+ double VsBaseline = 0.0; // Percent difference vs baseline.
+ int LabelIndex = 0; // Index of TestName in ImGuiPerfTool::_LabelsVisible.
+
+ ImGuiPerfToolEntry() { }
+ ImGuiPerfToolEntry(const ImGuiPerfToolEntry& rhs) { Set(rhs); }
+ ImGuiPerfToolEntry& operator=(const ImGuiPerfToolEntry& rhs){ Set(rhs); return *this; }
+ void Set(const ImGuiPerfToolEntry& rhs);
+};
+
+// [Internal] Perf log batch.
+struct ImGuiPerfToolBatch
+{
+ ImU64 BatchID = 0; // Timestamp of the batch, or unique ID of the build in combined mode.
+ int NumSamples = 0; // A number of unique batches aggregated.
+ int BranchIndex = 0; // For per-branch color mapping.
+ ImVector<ImGuiPerfToolEntry> Entries; // Aggregated perf test entries. Order follows ImGuiPerfTool::_LabelsVisible order.
+ ~ImGuiPerfToolBatch() { Entries.clear_destruct(); } // FIXME: Misleading: nothing to destruct in that struct?
+};
+
+enum ImGuiPerfToolDisplayType : int
+{
+ ImGuiPerfToolDisplayType_Simple, // Each run will be displayed individually.
+ ImGuiPerfToolDisplayType_PerBranchColors, // Use one bar color per branch.
+ ImGuiPerfToolDisplayType_CombineByBuildInfo, // Entries with same build information will be averaged.
+};
+
+//
+struct IMGUI_API ImGuiPerfTool
+{
+ ImVector<ImGuiPerfToolEntry> _SrcData; // Raw entries from CSV file (with string pointer into CSV data).
+ ImVector<const char*> _Labels;
+ ImVector<const char*> _LabelsVisible; // ImPlot requires a pointer of all labels beforehand. Always contains a dummy "" entry at the end!
+ ImVector<ImGuiPerfToolBatch> _Batches;
+ ImGuiStorage _LabelBarCounts; // Number bars each label will render.
+ int _NumVisibleBuilds = 0; // Cached number of visible builds.
+ int _NumUniqueBuilds = 0; // Cached number of unique builds.
+ ImGuiPerfToolDisplayType _DisplayType = ImGuiPerfToolDisplayType_CombineByBuildInfo;
+ int _BaselineBatchIndex = 0; // Index of baseline build.
+ ImU64 _BaselineTimestamp = 0;
+ ImU64 _BaselineBuildId = 0;
+ char _Filter[128]; // Context menu filtering substring.
+ char _FilterDateFrom[11] = {};
+ char _FilterDateTo[11] = {};
+ float _InfoTableHeight = 180.0f;
+ int _AlignStress = 0; // Alignment values for build info components, so they look aligned in the legend.
+ int _AlignType = 0;
+ int _AlignOs = 0;
+ int _AlignCpu = 0;
+ int _AlignCompiler = 0;
+ int _AlignBranch = 0;
+ int _AlignSamples = 0;
+ bool _InfoTableSortDirty = false;
+ ImVector<ImU64> _InfoTableSort; // _InfoTableSort[_LabelsVisible.Size * _Batches.Size]. Contains sorted batch indices for each label.
+ const ImGuiTableSortSpecs* _InfoTableSortSpecs = NULL; // Current table sort specs.
+ ImGuiStorage _TempSet; // Used as a set
+ int _TableHoveredTest = -1; // Index within _VisibleLabelPointers array.
+ int _TableHoveredBatch = -1;
+ int _PlotHoverTest = -1;
+ int _PlotHoverBatch = -1;
+ bool _PlotHoverTestLabel = false;
+ bool _ReportGenerating = false;
+ ImGuiStorage _Visibility;
+ ImGuiCsvParser* _CsvParser = NULL; // We keep this around and point to its fields
+
+ ImGuiPerfTool();
+ ~ImGuiPerfTool();
+
+ void Clear();
+ bool LoadCSV(const char* filename = NULL);
+ void AddEntry(ImGuiPerfToolEntry* entry);
+
+ void ShowPerfToolWindow(ImGuiTestEngine* engine, bool* p_open);
+ void ViewOnly(const char* perf_name);
+ void ViewOnly(const char** perf_names);
+ ImGuiPerfToolEntry* GetEntryByBatchIdx(int idx, const char* perf_name = NULL);
+ bool SaveHtmlReport(const char* file_name, const char* image_file = NULL);
+ inline bool Empty() { return _SrcData.empty(); }
+
+ void _Rebuild();
+ bool _IsVisibleBuild(ImGuiPerfToolBatch* batch);
+ bool _IsVisibleBuild(ImGuiPerfToolEntry* batch);
+ bool _IsVisibleTest(const char* test_name);
+ void _CalculateLegendAlignment();
+ void _ShowEntriesPlot();
+ void _ShowEntriesTable();
+ void _SetBaseline(int batch_index);
+ void _AddSettingsHandler();
+ void _UnpackSortedKey(ImU64 key, int* batch_index, int* entry_index, int* monotonic_index = NULL);
+};
+
+IMGUI_API void ImGuiTestEngine_PerfToolAppendToCSV(ImGuiPerfTool* perf_log, ImGuiPerfToolEntry* entry, const char* filename = NULL);