Hash :
eb63016d
Author :
Date :
2020-02-04T16:15:41
Add environment overrides for ANGLE features. Allows the application to override ANGLE behaviour without having to modify the code or use the ANGLE extension. Useful for testing with the command graph refactor. Adds a new string utility for parsing lists of strings from environment variables. Bug: angleproject:4029 Change-Id: Ibae93b743c0c385392cd259d9604ce2f2ed988dc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2037784 Reviewed-by: Courtney Goeltzenleuchter <courtneygo@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Overlay.cpp:
// Implements the Overlay class.
//
#include "libANGLE/Overlay.h"
#include "common/string_utils.h"
#include "common/system_utils.h"
#include "libANGLE/Context.h"
#include "libANGLE/Overlay_font_autogen.h"
#include "libANGLE/renderer/GLImplFactory.h"
#include "libANGLE/renderer/OverlayImpl.h"
#include <numeric>
namespace gl
{
namespace
{
constexpr std::pair<const char *, WidgetId> kWidgetNames[] = {
{"FPS", WidgetId::FPS},
{"VulkanLastValidationMessage", WidgetId::VulkanLastValidationMessage},
{"VulkanValidationMessageCount", WidgetId::VulkanValidationMessageCount},
{"VulkanCommandGraphSize", WidgetId::VulkanCommandGraphSize},
{"VulkanRenderPassCount", WidgetId::VulkanRenderPassCount},
{"VulkanSecondaryCommandBufferPoolWaste", WidgetId::VulkanSecondaryCommandBufferPoolWaste},
};
} // namespace
OverlayState::OverlayState() : mEnabledWidgetCount(0), mOverlayWidgets{} {}
OverlayState::~OverlayState() = default;
Overlay::Overlay(rx::GLImplFactory *factory)
: mLastPerSecondUpdate(0), mImplementation(factory->createOverlay(mState))
{}
Overlay::~Overlay() = default;
angle::Result Overlay::init(const Context *context)
{
initOverlayWidgets();
mLastPerSecondUpdate = angle::GetCurrentTime();
ASSERT(std::all_of(
mState.mOverlayWidgets.begin(), mState.mOverlayWidgets.end(),
[](const std::unique_ptr<overlay::Widget> &widget) { return widget.get() != nullptr; }));
enableOverlayWidgetsFromEnvironment();
return mImplementation->init(context);
}
void Overlay::destroy(const gl::Context *context)
{
ASSERT(mImplementation);
mImplementation->onDestroy(context);
}
void Overlay::enableOverlayWidgetsFromEnvironment()
{
std::vector<std::string> enabledWidgets =
angle::GetStringsFromEnvironmentVar("ANGLE_OVERLAY", ":");
for (const std::pair<const char *, WidgetId> &widgetName : kWidgetNames)
{
if (std::find(enabledWidgets.begin(), enabledWidgets.end(), widgetName.first) !=
enabledWidgets.end())
{
mState.mOverlayWidgets[widgetName.second]->enabled = true;
++mState.mEnabledWidgetCount;
}
}
}
void Overlay::onSwap() const
{
// Increment FPS counter.
getPerSecondWidget(WidgetId::FPS)->add(1);
// Update per second values every second.
double currentTime = angle::GetCurrentTime();
double timeDiff = currentTime - mLastPerSecondUpdate;
if (timeDiff >= 1.0)
{
for (const std::unique_ptr<overlay::Widget> &widget : mState.mOverlayWidgets)
{
if (widget->type == WidgetType::PerSecond)
{
overlay::PerSecond *perSecond =
reinterpret_cast<overlay::PerSecond *>(widget.get());
perSecond->lastPerSecondCount = static_cast<size_t>(perSecond->count / timeDiff);
perSecond->count = 0;
}
}
mLastPerSecondUpdate += 1.0;
}
}
DummyOverlay::DummyOverlay(rx::GLImplFactory *implFactory) {}
DummyOverlay::~DummyOverlay() = default;
} // namespace gl