From 4988c1ccf71b46aaad4a87101c6a294dafea4ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 3 Aug 2016 12:55:31 +0200 Subject: [PATCH] Ability to control the amount of console output in engine initialization. --- src/Magnum/Context.cpp | 23 ++++++++++++++++------- src/Magnum/Context.h | 1 + src/Magnum/Implementation/State.cpp | 6 +++--- src/Magnum/Implementation/State.h | 2 +- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index e3d592218..91ee025de 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -25,6 +25,7 @@ #include "Context.h" +#include /* for initialization log redirection */ #include #include #include @@ -433,10 +434,15 @@ Context::Context(NoCreateT, Int argc, const char** argv, void functionLoader()): args.addOption("disable-workarounds") .setHelp("disable-workarounds", "driver workarounds to disable\n (see src/Magnum/Implementation/driverSpecific.cpp for detailed info)", "LIST") .addOption("disable-extensions").setHelp("disable-extensions", "OpenGL extensions to disable", "LIST") + .addOption("log", "default").setHelp("log", "Console logging", "default|quiet") .setFromEnvironment("disable-workarounds") .setFromEnvironment("disable-extensions") + .setFromEnvironment("log") .parse(argc, argv); + /* Decide whether to display initialization log */ + _displayInitializationLog = !(args.value("log") == "quiet" || args.value("log") == "QUIET"); + /* Disable driver workarounds */ for(auto&& workaround: Utility::String::splitWithoutEmptyParts(args.value("disable-workarounds"))) disableDriverWorkaround(workaround); @@ -652,14 +658,17 @@ bool Context::tryCreate() { CORRADE_ASSERT(!currentContext, "Context: Another context currently active", false); currentContext = this; + /* Decide whether to print the initialization output or not */ + std::ostream* output = _displayInitializationLog ? &std::cout : nullptr; + /* Print some info and initialize state tracker (which also prints some more info) */ - Debug() << "Renderer:" << rendererString() << "by" << vendorString(); - Debug() << "OpenGL version:" << versionString(); + Debug{output} << "Renderer:" << rendererString() << "by" << vendorString(); + Debug{output} << "OpenGL version:" << versionString(); /* Disable extensions as requested by the user */ if(!_disabledExtensions.empty()) { - Debug() << "Disabling extensions:"; + Debug{output} << "Disabling extensions:"; /* Put remaining extensions into the hashmap for faster lookup */ std::unordered_map allExtensions{std::move(futureExtensions)}; @@ -675,17 +684,17 @@ bool Context::tryCreate() { if(found == allExtensions.end()) continue; _extensionRequiredVersion[found->second._index] = Version::None; - Debug() << " " << extension; + Debug{output} << " " << extension; } } - _state = new Implementation::State(*this); + _state = new Implementation::State{*this, output}; /* Print a list of used workarounds */ if(!_driverWorkarounds.empty()) { - Debug() << "Using driver workarounds:"; + Debug{output} << "Using driver workarounds:"; for(const auto& workaround: _driverWorkarounds) - if(!workaround.second) Debug() << " " << workaround.first; + if(!workaround.second) Debug{output} << " " << workaround.first; } /* Initialize functionality based on current OpenGL version and extensions */ diff --git a/src/Magnum/Context.h b/src/Magnum/Context.h index e1cb51272..cacc5e740 100644 --- a/src/Magnum/Context.h +++ b/src/Magnum/Context.h @@ -531,6 +531,7 @@ class MAGNUM_EXPORT Context { /* True means known and disabled, false means known */ std::vector> _driverWorkarounds; std::vector _disabledExtensions; + bool _displayInitializationLog; }; CORRADE_ENUMSET_OPERATORS(Context::DetectedDrivers) diff --git a/src/Magnum/Implementation/State.cpp b/src/Magnum/Implementation/State.cpp index 3b14cbd06..ba92bf7dc 100644 --- a/src/Magnum/Implementation/State.cpp +++ b/src/Magnum/Implementation/State.cpp @@ -49,7 +49,7 @@ namespace Magnum { namespace Implementation { -State::State(Context& context) { +State::State(Context& context, std::ostream* const out) { /* List of extensions used in current context. Guesstimate count to avoid unnecessary reallocations. */ std::vector extensions; @@ -80,8 +80,8 @@ State::State(Context& context) { std::sort(extensions.begin(), extensions.end()); extensions.erase(std::unique(extensions.begin(), extensions.end()), extensions.end()); - Debug() << "Using optional features:"; - for(const auto& ext: extensions) Debug() << " " << ext; + Debug{out} << "Using optional features:"; + for(const auto& ext: extensions) Debug{out} << " " << ext; } State::~State() = default; diff --git a/src/Magnum/Implementation/State.h b/src/Magnum/Implementation/State.h index 1975ba37c..4ff17793b 100644 --- a/src/Magnum/Implementation/State.h +++ b/src/Magnum/Implementation/State.h @@ -51,7 +51,7 @@ struct TransformFeedbackState; struct State { /* Initializes context-based functionality */ - explicit State(Context& context); + explicit State(Context& context, std::ostream* out); ~State();