diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 280f2c5d1f..0c2cd49ef5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -199,6 +199,8 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).append("/script.js"); #endif +QJsonObject Application::_glData {}; + Setting::Handle maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS); const QHash Application::_acceptedExtensions { @@ -1303,7 +1305,9 @@ void Application::initializeGL() { InfoView::show(INFO_HELP_PATH, true); } + extern void setupPreferences(); + void Application::initializeUi() { AddressBarDialog::registerType(); ErrorDialog::registerType(); @@ -1315,6 +1319,12 @@ void Application::initializeUi() { auto offscreenUi = DependencyManager::get(); offscreenUi->create(_offscreenContext->getContext()); + + auto rootContext = offscreenUi->getRootContext(); + + // First set the GL property, so the desktop can use it for graphics workarounds + rootContext->setContextProperty("GL", _glData); + offscreenUi->setProxyWindow(_window->windowHandle()); offscreenUi->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/")); // OffscreenUi is a subclass of OffscreenQmlSurface specifically designed to @@ -1325,7 +1335,6 @@ void Application::initializeUi() { // do better detection in the offscreen UI of what has focus offscreenUi->setNavigationFocused(false); - auto rootContext = offscreenUi->getRootContext(); auto engine = rootContext->engine(); connect(engine, &QQmlEngine::quit, [] { qApp->quit(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 116d2b2137..4f1badf0be 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -96,6 +96,9 @@ public: static void initPlugins(); static void shutdownPlugins(); + // Expose the gl metadata to QML + static void setGL(const QJsonObject& glData) { _glData = glData; } + Application(int& argc, char** argv, QElapsedTimer& startup_time); ~Application(); @@ -379,6 +382,8 @@ private: void maybeToggleMenuVisible(QMouseEvent* event) const; + static QJsonObject _glData; + MainWindow* _window; QElapsedTimer& _sessionRunTimer; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 9c07912b99..4fce190c2c 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -44,7 +44,7 @@ int main(int argc, const char* argv[]) { MiniDmpSender mpSender { BUG_SPLAT_DATABASE, BUG_SPLAT_APPLICATION_NAME, qPrintable(BuildInfo::VERSION), nullptr, BUG_SPLAT_FLAGS }; #endif - + QString applicationName = "High Fidelity Interface - " + qgetenv("USERNAME"); bool instanceMightBeRunning = true; @@ -105,13 +105,14 @@ int main(int argc, const char* argv[]) { // This is done separately from the main Application so that start-up and shut-down logic within the main Application is // not made more complicated than it already is. bool override = false; - QString glVersion; + QJsonObject glData; { OpenGLVersionChecker openGLVersionChecker(argc, const_cast(argv)); bool valid = true; - glVersion = openGLVersionChecker.checkVersion(valid, override); + glData = openGLVersionChecker.checkVersion(valid, override); if (!valid) { if (override) { + auto glVersion = glData["version"].toString(); qCDebug(interfaceapp, "Running on insufficient OpenGL version: %s.", glVersion.toStdString().c_str()); } else { qCDebug(interfaceapp, "Early exit due to OpenGL version."); @@ -139,21 +140,23 @@ int main(int argc, const char* argv[]) { // or in the main window ctor, before GL startup. Application::initPlugins(); + // GL must be available to the root QML context on startup. + Application::setGL(glData); + int exitCode; { QSettings::setDefaultFormat(QSettings::IniFormat); Application app(argc, const_cast(argv), startupTime); - // If we failed the OpenGLVersion check, log it. if (override) { auto& accountManager = AccountManager::getInstance(); if (accountManager.isLoggedIn()) { - UserActivityLogger::getInstance().insufficientGLVersion(glVersion); + UserActivityLogger::getInstance().insufficientGLVersion(glData); } else { - QObject::connect(&AccountManager::getInstance(), &AccountManager::loginComplete, [glVersion](){ + QObject::connect(&AccountManager::getInstance(), &AccountManager::loginComplete, [glData](){ static bool loggedInsufficientGL = false; if (!loggedInsufficientGL) { - UserActivityLogger::getInstance().insufficientGLVersion(glVersion); + UserActivityLogger::getInstance().insufficientGLVersion(glData); loggedInsufficientGL = true; } }); diff --git a/libraries/gl/src/gl/OpenGLVersionChecker.cpp b/libraries/gl/src/gl/OpenGLVersionChecker.cpp index 9a8c9f7a20..05dfc05457 100644 --- a/libraries/gl/src/gl/OpenGLVersionChecker.cpp +++ b/libraries/gl/src/gl/OpenGLVersionChecker.cpp @@ -13,6 +13,7 @@ #include #include +#include #include "Config.h" #include "GLWidget.h" @@ -22,7 +23,7 @@ OpenGLVersionChecker::OpenGLVersionChecker(int& argc, char** argv) : { } -QString OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { +QJsonObject OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { valid = true; override = false; @@ -38,12 +39,15 @@ QString OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { messageBox.setStandardButtons(QMessageBox::Ok); messageBox.setDefaultButton(QMessageBox::Ok); messageBox.exec(); - return QString(); + return QJsonObject(); } // Retrieve OpenGL version glWidget->initializeGL(); QString glVersion = QString((const char*)glGetString(GL_VERSION)); + QString glslVersion = QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); + QString glVendor = QString((const char*) glGetString(GL_VENDOR)); + QString glRenderer = QString((const char*)glGetString(GL_RENDERER)); delete glWidget; // Compare against minimum @@ -72,5 +76,10 @@ QString OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { override = messageBox.exec() == QMessageBox::Ignore; } - return glVersion; + return QJsonObject{ + { "version", glVersion }, + { "slVersion", glslVersion }, + { "vendor", glVendor }, + { "renderer", glRenderer }, + }; } diff --git a/libraries/gl/src/gl/OpenGLVersionChecker.h b/libraries/gl/src/gl/OpenGLVersionChecker.h index 1e45052626..913675af24 100644 --- a/libraries/gl/src/gl/OpenGLVersionChecker.h +++ b/libraries/gl/src/gl/OpenGLVersionChecker.h @@ -19,7 +19,7 @@ class OpenGLVersionChecker : public QApplication { public: OpenGLVersionChecker(int& argc, char** argv); - static QString checkVersion(bool& valid, bool& override); + static QJsonObject checkVersion(bool& valid, bool& override); }; #endif // hifi_OpenGLVersionChecker_h diff --git a/libraries/networking/src/UserActivityLogger.cpp b/libraries/networking/src/UserActivityLogger.cpp index 5fcc8a40c3..8eefaac9b0 100644 --- a/libraries/networking/src/UserActivityLogger.cpp +++ b/libraries/networking/src/UserActivityLogger.cpp @@ -85,11 +85,11 @@ void UserActivityLogger::launch(QString applicationVersion, bool previousSession logAction(ACTION_NAME, actionDetails); } -void UserActivityLogger::insufficientGLVersion(QString glVersion) { +void UserActivityLogger::insufficientGLVersion(const QJsonObject& glData) { const QString ACTION_NAME = "insufficient_gl"; QJsonObject actionDetails; - QString GL_VERSION = "glVersion"; - actionDetails.insert(GL_VERSION, glVersion); + QString GL_DATA = "glData"; + actionDetails.insert(GL_DATA, glData); logAction(ACTION_NAME, actionDetails); } diff --git a/libraries/networking/src/UserActivityLogger.h b/libraries/networking/src/UserActivityLogger.h index acc3b685cd..c48169d207 100644 --- a/libraries/networking/src/UserActivityLogger.h +++ b/libraries/networking/src/UserActivityLogger.h @@ -31,7 +31,7 @@ public slots: void launch(QString applicationVersion, bool previousSessionCrashed, int previousSessionRuntime); - void insufficientGLVersion(QString glVersion); + void insufficientGLVersion(const QJsonObject& glData); void changedDisplayName(QString displayName); void changedModel(QString typeOfModel, QString modelURL); @@ -48,4 +48,4 @@ private: bool _disabled; }; -#endif // hifi_UserActivityLogger_h \ No newline at end of file +#endif // hifi_UserActivityLogger_h