diff options
Diffstat (limited to 'src/debug/HyprDebugOverlay.cpp')
| -rw-r--r-- | src/debug/HyprDebugOverlay.cpp | 268 |
1 files changed, 0 insertions, 268 deletions
diff --git a/src/debug/HyprDebugOverlay.cpp b/src/debug/HyprDebugOverlay.cpp deleted file mode 100644 index 17ce12fa..00000000 --- a/src/debug/HyprDebugOverlay.cpp +++ /dev/null @@ -1,268 +0,0 @@ -#include <pango/pangocairo.h> -#include "HyprDebugOverlay.hpp" -#include "config/ConfigValue.hpp" -#include "../Compositor.hpp" -#include "../render/pass/TexPassElement.hpp" -#include "../render/Renderer.hpp" -#include "../managers/animation/AnimationManager.hpp" -#include "../desktop/state/FocusState.hpp" - -CHyprDebugOverlay::CHyprDebugOverlay() { - m_texture = g_pHyprRenderer->createTexture(); -} - -void CHyprMonitorDebugOverlay::renderData(PHLMONITOR pMonitor, float durationUs) { - static auto PDEBUGOVERLAY = CConfigValue<Hyprlang::INT>("debug:overlay"); - - if (!*PDEBUGOVERLAY) - return; - - m_lastRenderTimes.emplace_back(durationUs / 1000.f); - - if (m_lastRenderTimes.size() > sc<long unsigned int>(pMonitor->m_refreshRate)) - m_lastRenderTimes.pop_front(); - - if (!m_monitor) - m_monitor = pMonitor; -} - -void CHyprMonitorDebugOverlay::renderDataNoOverlay(PHLMONITOR pMonitor, float durationUs) { - static auto PDEBUGOVERLAY = CConfigValue<Hyprlang::INT>("debug:overlay"); - - if (!*PDEBUGOVERLAY) - return; - - m_lastRenderTimesNoOverlay.emplace_back(durationUs / 1000.f); - - if (m_lastRenderTimesNoOverlay.size() > sc<long unsigned int>(pMonitor->m_refreshRate)) - m_lastRenderTimesNoOverlay.pop_front(); - - if (!m_monitor) - m_monitor = pMonitor; -} - -void CHyprMonitorDebugOverlay::frameData(PHLMONITOR pMonitor) { - static auto PDEBUGOVERLAY = CConfigValue<Hyprlang::INT>("debug:overlay"); - - if (!*PDEBUGOVERLAY) - return; - - m_lastFrametimes.emplace_back(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - m_lastFrame).count() / 1000.f); - - if (m_lastFrametimes.size() > sc<long unsigned int>(pMonitor->m_refreshRate)) - m_lastFrametimes.pop_front(); - - m_lastFrame = std::chrono::high_resolution_clock::now(); - - if (!m_monitor) - m_monitor = pMonitor; - - // anim data too - const auto PMONITORFORTICKS = g_pHyprRenderer->m_mostHzMonitor ? g_pHyprRenderer->m_mostHzMonitor.lock() : Desktop::focusState()->monitor(); - if (PMONITORFORTICKS == pMonitor) { - if (m_lastAnimationTicks.size() > sc<long unsigned int>(PMONITORFORTICKS->m_refreshRate)) - m_lastAnimationTicks.pop_front(); - - m_lastAnimationTicks.push_back(g_pAnimationManager->m_lastTickTimeMs); - } -} - -int CHyprMonitorDebugOverlay::draw(int offset) { - - if (!m_monitor) - return 0; - - // get avg fps - float avgFrametime = 0; - float maxFrametime = 0; - float minFrametime = 9999; - for (auto const& ft : m_lastFrametimes) { - if (ft > maxFrametime) - maxFrametime = ft; - if (ft < minFrametime) - minFrametime = ft; - avgFrametime += ft; - } - float varFrametime = maxFrametime - minFrametime; - avgFrametime /= m_lastFrametimes.empty() ? 1 : m_lastFrametimes.size(); - - float avgRenderTime = 0; - float maxRenderTime = 0; - float minRenderTime = 9999; - for (auto const& rt : m_lastRenderTimes) { - if (rt > maxRenderTime) - maxRenderTime = rt; - if (rt < minRenderTime) - minRenderTime = rt; - avgRenderTime += rt; - } - float varRenderTime = maxRenderTime - minRenderTime; - avgRenderTime /= m_lastRenderTimes.empty() ? 1 : m_lastRenderTimes.size(); - - float avgRenderTimeNoOverlay = 0; - float maxRenderTimeNoOverlay = 0; - float minRenderTimeNoOverlay = 9999; - for (auto const& rt : m_lastRenderTimesNoOverlay) { - if (rt > maxRenderTimeNoOverlay) - maxRenderTimeNoOverlay = rt; - if (rt < minRenderTimeNoOverlay) - minRenderTimeNoOverlay = rt; - avgRenderTimeNoOverlay += rt; - } - float varRenderTimeNoOverlay = maxRenderTimeNoOverlay - minRenderTimeNoOverlay; - avgRenderTimeNoOverlay /= m_lastRenderTimes.empty() ? 1 : m_lastRenderTimes.size(); - - float avgAnimMgrTick = 0; - float maxAnimMgrTick = 0; - float minAnimMgrTick = 9999; - for (auto const& at : m_lastAnimationTicks) { - if (at > maxAnimMgrTick) - maxAnimMgrTick = at; - if (at < minAnimMgrTick) - minAnimMgrTick = at; - avgAnimMgrTick += at; - } - float varAnimMgrTick = maxAnimMgrTick - minAnimMgrTick; - avgAnimMgrTick /= m_lastAnimationTicks.empty() ? 1 : m_lastAnimationTicks.size(); - - const float FPS = 1.f / (avgFrametime / 1000.f); // frametimes are in ms - const float idealFPS = m_lastFrametimes.size(); - - static auto fontFamily = CConfigValue<std::string>("misc:font_family"); - PangoLayout* layoutText = pango_cairo_create_layout(g_pDebugOverlay->m_cairo); - PangoFontDescription* pangoFD = pango_font_description_new(); - - pango_font_description_set_family(pangoFD, (*fontFamily).c_str()); - pango_font_description_set_style(pangoFD, PANGO_STYLE_NORMAL); - pango_font_description_set_weight(pangoFD, PANGO_WEIGHT_NORMAL); - - float maxTextW = 0; - int fontSize = 0; - auto cr = g_pDebugOverlay->m_cairo; - - auto showText = [cr, layoutText, pangoFD, &maxTextW, &fontSize](const char* text, int size) { - if (fontSize != size) { - pango_font_description_set_absolute_size(pangoFD, size * PANGO_SCALE); - pango_layout_set_font_description(layoutText, pangoFD); - fontSize = size; - } - - pango_layout_set_text(layoutText, text, -1); - pango_cairo_show_layout(cr, layoutText); - - int textW = 0, textH = 0; - pango_layout_get_size(layoutText, &textW, &textH); - textW /= PANGO_SCALE; - textH /= PANGO_SCALE; - if (textW > maxTextW) - maxTextW = textW; - - // move to next line - cairo_rel_move_to(cr, 0, fontSize + 1); - }; - - const int MARGIN_TOP = 8; - const int MARGIN_LEFT = 4; - cairo_move_to(cr, MARGIN_LEFT, MARGIN_TOP + offset); - cairo_set_source_rgba(g_pDebugOverlay->m_cairo, 1.f, 1.f, 1.f, 1.f); - - std::string text; - showText(m_monitor->m_name.c_str(), 10); - - if (FPS > idealFPS * 0.95f) - cairo_set_source_rgba(g_pDebugOverlay->m_cairo, 0.2f, 1.f, 0.2f, 1.f); - else if (FPS > idealFPS * 0.8f) - cairo_set_source_rgba(g_pDebugOverlay->m_cairo, 1.f, 1.f, 0.2f, 1.f); - else - cairo_set_source_rgba(g_pDebugOverlay->m_cairo, 1.f, 0.2f, 0.2f, 1.f); - - text = std::format("{} FPS", sc<int>(FPS)); - showText(text.c_str(), 16); - - cairo_set_source_rgba(g_pDebugOverlay->m_cairo, 1.f, 1.f, 1.f, 1.f); - - text = std::format("Avg Frametime: {:.2f}ms (var {:.2f}ms)", avgFrametime, varFrametime); - showText(text.c_str(), 10); - - text = std::format("Avg Rendertime: {:.2f}ms (var {:.2f}ms)", avgRenderTime, varRenderTime); - showText(text.c_str(), 10); - - text = std::format("Avg Rendertime (No Overlay): {:.2f}ms (var {:.2f}ms)", avgRenderTimeNoOverlay, varRenderTimeNoOverlay); - showText(text.c_str(), 10); - - text = std::format("Avg Anim Tick: {:.2f}ms (var {:.2f}ms) ({:.2f} TPS)", avgAnimMgrTick, varAnimMgrTick, 1.0 / (avgAnimMgrTick / 1000.0)); - showText(text.c_str(), 10); - - pango_font_description_free(pangoFD); - g_object_unref(layoutText); - - double posX = 0, posY = 0; - cairo_get_current_point(cr, &posX, &posY); - - g_pHyprRenderer->damageBox(m_lastDrawnBox); - m_lastDrawnBox = {sc<int>(g_pCompositor->m_monitors.front()->m_position.x) + MARGIN_LEFT - 1, - sc<int>(g_pCompositor->m_monitors.front()->m_position.y) + offset + MARGIN_TOP - 1, sc<int>(maxTextW) + 2, posY - offset - MARGIN_TOP + 2}; - g_pHyprRenderer->damageBox(m_lastDrawnBox); - - return posY - offset; -} - -void CHyprDebugOverlay::renderData(PHLMONITOR pMonitor, float durationUs) { - static auto PDEBUGOVERLAY = CConfigValue<Hyprlang::INT>("debug:overlay"); - - if (!*PDEBUGOVERLAY) - return; - - m_monitorOverlays[pMonitor].renderData(pMonitor, durationUs); -} - -void CHyprDebugOverlay::renderDataNoOverlay(PHLMONITOR pMonitor, float durationUs) { - static auto PDEBUGOVERLAY = CConfigValue<Hyprlang::INT>("debug:overlay"); - - if (!*PDEBUGOVERLAY) - return; - - m_monitorOverlays[pMonitor].renderDataNoOverlay(pMonitor, durationUs); -} - -void CHyprDebugOverlay::frameData(PHLMONITOR pMonitor) { - static auto PDEBUGOVERLAY = CConfigValue<Hyprlang::INT>("debug:overlay"); - - if (!*PDEBUGOVERLAY) - return; - - m_monitorOverlays[pMonitor].frameData(pMonitor); -} - -void CHyprDebugOverlay::draw() { - - const auto PMONITOR = g_pCompositor->m_monitors.front(); - - if (!m_cairoSurface || !m_cairo) { - m_cairoSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y); - m_cairo = cairo_create(m_cairoSurface); - } - - // clear the pixmap - cairo_save(m_cairo); - cairo_set_operator(m_cairo, CAIRO_OPERATOR_CLEAR); - cairo_paint(m_cairo); - cairo_restore(m_cairo); - - // draw the things - int offsetY = 0; - for (auto const& m : g_pCompositor->m_monitors) { - offsetY += m_monitorOverlays[m].draw(offsetY); - offsetY += 5; // for padding between mons - } - - cairo_surface_flush(m_cairoSurface); - - // copy the data to an OpenGL texture we have - m_texture = g_pHyprRenderer->createTexture(m_cairoSurface); - - CTexPassElement::SRenderData data; - data.tex = m_texture; - data.box = {0, 0, PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y}; - g_pHyprRenderer->m_renderPass.add(makeUnique<CTexPassElement>(std::move(data))); -} |
