From b9662e5af85fa29392d8dcce8fd30720886f75e4 Mon Sep 17 00:00:00 2001 From: Dale Glass Date: Sat, 11 Nov 2023 21:03:16 +0100 Subject: [PATCH] Separate plugin initialization, allow dumping plugin info --- interface/src/Application.cpp | 16 +++++----- interface/src/Application.h | 2 +- interface/src/main.cpp | 59 +++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b05fb876a7..5a8eab34e8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -764,14 +764,12 @@ bool setupEssentials(const QCommandLineParser& parser, bool runningMarkerExisted } } - // Tell the plugin manager about our statically linked plugins + DependencyManager::set(); - DependencyManager::set(); + + // Tell the plugin manager about our statically linked plugins auto pluginManager = PluginManager::getInstance(); - pluginManager->setInputPluginProvider([] { return getInputPlugins(); }); - pluginManager->setDisplayPluginProvider([] { return getDisplayPlugins(); }); - pluginManager->setInputPluginSettingsPersister([](const InputPluginList& plugins) { saveInputPluginSettings(plugins); }); if (auto steamClient = pluginManager->getSteamClientPlugin()) { steamClient->init(); } @@ -1040,8 +1038,12 @@ Application::Application( DependencyManager::set(); } -void Application::initializePlugins() { - +void Application::initializePluginManager() { + DependencyManager::set(); + auto pluginManager = PluginManager::getInstance(); + pluginManager->setInputPluginProvider([] { return getInputPlugins(); }); + pluginManager->setDisplayPluginProvider([] { return getDisplayPlugins(); }); + pluginManager->setInputPluginSettingsPersister([](const InputPluginList& plugins) { saveInputPluginSettings(plugins); }); } void Application::initialize(const QCommandLineParser &parser) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 992b55a3b8..9663966df4 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -124,7 +124,7 @@ class Application : public QApplication, public: - void initializePlugins(); + void initializePluginManager(); /** * @brief Initialize everything diff --git a/interface/src/main.cpp b/interface/src/main.cpp index b9501419f1..d8e2457b40 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "AddressManager.h" #include "Application.h" @@ -33,6 +34,9 @@ #include "MainWindow.h" #include "Profile.h" #include "LogHandler.h" +#include +#include +#include #ifdef Q_OS_WIN #include @@ -63,6 +67,7 @@ int main(int argc, const char* argv[]) { } #endif + // Setup QCoreApplication settings, install log message handler setupHifiApplication(BuildInfo::INTERFACE_NAME); // Journald by default in user applications is probably a bit too modern still. @@ -258,6 +263,10 @@ int main(int argc, const char* argv[]) { "Logging options, comma separated: color,nocolor,process_id,thread_id,milliseconds,keep_repeats,journald,nojournald", "options" ); + QCommandLineOption getPluginsOption( + "getPlugins", + "Print out a list of plugins in JSON" + ); QCommandLineOption abortAfterStartupOption( "abortAfterStartup", "Debug option. Aborts right after startup." @@ -311,6 +320,7 @@ int main(int argc, const char* argv[]) { parser.addOption(logOption); parser.addOption(abortAfterStartupOption); parser.addOption(abortAfterInitOption); + parser.addOption(getPluginsOption); QString applicationPath; @@ -355,6 +365,55 @@ int main(int argc, const char* argv[]) { } } + app.initializePluginManager(); + + if (parser.isSet(getPluginsOption)) { + auto pluginManager = PluginManager::getInstance(); + + QJsonObject inputJson; + for (const auto &plugin : pluginManager->getInputPlugins()) { + QJsonObject data; + data["subdeviceNames"] = QJsonArray::fromStringList(plugin->getSubdeviceNames()); + data["deviceName"] = plugin->getDeviceName(); + data["configurable"] = plugin->configurable(); + data["isHandController"] = plugin->isHandController(); + data["isHeadController"] = plugin->isHeadController(); + + inputJson[plugin->getName()] = data; + } + + QJsonObject displayJson; + for (const auto &plugin : pluginManager->getDisplayPlugins()) { + QJsonObject data; + data["isHmd"] = plugin->isHmd(); + data["isStereo"] = plugin->isStereo(); + data["targetFramerate"] = plugin->getTargetFrameRate(); + data["hasAsyncReprojection"] = plugin->hasAsyncReprojection(); + + displayJson[plugin->getName()] = data; + } + + QJsonArray codecsArray; + for (const auto &plugin : pluginManager->getCodecPlugins()) { + codecsArray.append(plugin->getName()); + } + + QJsonObject staticJson; + staticJson["steamAvailable"] = (pluginManager->getSteamClientPlugin() == nullptr); + staticJson["oculusAvailable"] = (pluginManager->getOculusPlatformPlugin() == nullptr); + + QJsonObject root; + root["input"] = inputJson; + root["display"] = displayJson; + root["codec"] = codecsArray; + root["staticPlugins"] = staticJson; + + std::cout << QJsonDocument(root).toJson().toStdString() << "\n"; + + return 0; + } + + // Act on arguments for early termination. if (parser.isSet(versionOption)) { parser.showVersion();