Overlay.cpp (3082B)
1 // 2 // Copyright 2019 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // Overlay.cpp: 7 // Implements the Overlay class. 8 // 9 10 #include "libANGLE/Overlay.h" 11 12 #include "common/string_utils.h" 13 #include "common/system_utils.h" 14 #include "libANGLE/Context.h" 15 #include "libANGLE/Overlay_font_autogen.h" 16 #include "libANGLE/renderer/GLImplFactory.h" 17 #include "libANGLE/renderer/OverlayImpl.h" 18 19 #include <numeric> 20 21 namespace gl 22 { 23 namespace 24 { 25 #define ANGLE_WIDGET_NAME_PROC(WIDGET_ID) {ANGLE_STRINGIFY(WIDGET_ID), WidgetId::WIDGET_ID}, 26 27 constexpr std::pair<const char *, WidgetId> kWidgetNames[] = { 28 ANGLE_WIDGET_ID_X(ANGLE_WIDGET_NAME_PROC)}; 29 } // namespace 30 31 OverlayState::OverlayState() : mEnabledWidgetCount(0), mOverlayWidgets{} {} 32 OverlayState::~OverlayState() = default; 33 34 Overlay::Overlay(rx::GLImplFactory *factory) 35 : mLastPerSecondUpdate(0), mImplementation(factory->createOverlay(mState)) 36 {} 37 Overlay::~Overlay() = default; 38 39 void Overlay::init() 40 { 41 initOverlayWidgets(); 42 mLastPerSecondUpdate = angle::GetCurrentSystemTime(); 43 44 ASSERT(std::all_of( 45 mState.mOverlayWidgets.begin(), mState.mOverlayWidgets.end(), 46 [](const std::unique_ptr<overlay::Widget> &widget) { return widget.get() != nullptr; })); 47 48 enableOverlayWidgetsFromEnvironment(); 49 } 50 51 void Overlay::destroy(const gl::Context *context) 52 { 53 ASSERT(mImplementation); 54 mImplementation->onDestroy(context); 55 } 56 57 void Overlay::enableOverlayWidgetsFromEnvironment() 58 { 59 std::vector<std::string> enabledWidgets = angle::GetStringsFromEnvironmentVarOrAndroidProperty( 60 "ANGLE_OVERLAY", "debug.angle.overlay", ":"); 61 62 for (const std::pair<const char *, WidgetId> &widgetName : kWidgetNames) 63 { 64 for (const std::string &enabledWidget : enabledWidgets) 65 { 66 if (angle::NamesMatchWithWildcard(enabledWidget.c_str(), widgetName.first)) 67 { 68 mState.mOverlayWidgets[widgetName.second]->enabled = true; 69 ++mState.mEnabledWidgetCount; 70 break; 71 } 72 } 73 } 74 } 75 76 void Overlay::onSwap() const 77 { 78 // Increment FPS counter. 79 getPerSecondWidget(WidgetId::FPS)->add(1); 80 81 // Update per second values every second. 82 double currentTime = angle::GetCurrentSystemTime(); 83 double timeDiff = currentTime - mLastPerSecondUpdate; 84 if (timeDiff >= 1.0) 85 { 86 for (const std::unique_ptr<overlay::Widget> &widget : mState.mOverlayWidgets) 87 { 88 if (widget->type == WidgetType::PerSecond) 89 { 90 overlay::PerSecond *perSecond = 91 reinterpret_cast<overlay::PerSecond *>(widget.get()); 92 perSecond->lastPerSecondCount = static_cast<size_t>(perSecond->count / timeDiff); 93 perSecond->count = 0; 94 } 95 } 96 mLastPerSecondUpdate += 1.0; 97 } 98 } 99 100 MockOverlay::MockOverlay(rx::GLImplFactory *implFactory) {} 101 MockOverlay::~MockOverlay() = default; 102 103 } // namespace gl