diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index 88460ddac..66e27f928 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -408,11 +408,16 @@ Context::Context(NoCreateT, Int argc, char** argv, void functionLoader()): _func Utility::Arguments args{"magnum"}; args.addOption("disable-workarounds").setHelpKey("disable-workarounds", "LIST") .setHelp("disable-workarounds", "driver workarounds to disable\n (see src/Magnum/Implementation/driverSpecific.cpp for detailed info)") + .addOption("disable-extensions").setHelpKey("disable-extensions", "LIST").setHelp("disable-extensions", "OpenGL extensions to disable") .parse(argc, argv); /* Disable driver workarounds */ for(auto&& workaround: Utility::String::splitWithoutEmptyParts(args.value("disable-workarounds"))) disableDriverWorkaround(workaround); + + /* Disable extensions */ + for(auto&& extension: Utility::String::splitWithoutEmptyParts(args.value("disable-extensions"))) + _disabledExtensions.push_back(extension); } Context::Context(Context&& other): _version{std::move(other._version)}, @@ -623,6 +628,29 @@ bool Context::tryCreate() { more info) */ Debug() << "Renderer:" << rendererString() << "by" << vendorString(); Debug() << "OpenGL version:" << versionString(); + + /* Disable extensions as requested by the user */ + if(!_disabledExtensions.empty()) { + Debug() << "Disabling extensions:"; + + /* Put remaining extensions into the hashmap for faster lookup */ + std::unordered_map allExtensions{std::move(futureExtensions)}; + for(std::size_t i = 0; i != future; ++i) + for(const Extension& extension: Extension::extensions(versions[i])) + allExtensions.emplace(extension._string, extension); + + /* Disable extensions that are known and supported and print a message + for each */ + for(auto&& extension: _disabledExtensions) { + auto found = allExtensions.find(extension); + /** @todo Error message here? I should not clutter the output at this point */ + if(found == allExtensions.end()) continue; + + _extensionRequiredVersion[found->second._index] = Version::None; + Debug() << " " << extension; + } + } + _state = new Implementation::State(*this); /* Print a list of used workarounds */ diff --git a/src/Magnum/Context.h b/src/Magnum/Context.h index 4a3e5368e..ec948646d 100644 --- a/src/Magnum/Context.h +++ b/src/Magnum/Context.h @@ -100,7 +100,7 @@ class. The options are as following: ``` Usage: - [--magnum-help] [--magnum-disable-workarounds LIST] ... + [--magnum-help] [--magnum-disable-workarounds LIST] [--magnum-disable-extensions LIST] ... Arguments: ... main application arguments @@ -108,6 +108,7 @@ Arguments: --magnum-help display this help message and exit --magnum-disable-workarounds LIST driver workarounds to disable (see src/Magnum/Implementation/driverSpecific.cpp for detailed info) + --magnum-disable-extensions LIST OpenGL extensions to disable ``` */ class MAGNUM_EXPORT Context { @@ -508,6 +509,7 @@ class MAGNUM_EXPORT Context { /* True means known and disabled, false means known */ std::vector> _driverWorkarounds; + std::vector _disabledExtensions; }; #ifndef MAGNUM_TARGET_WEBGL