diff --git a/interface/resources/qml/controls-uit/ContentSection.qml b/interface/resources/qml/controls-uit/ContentSection.qml index 427146aabe..86549afc9f 100644 --- a/interface/resources/qml/controls-uit/ContentSection.qml +++ b/interface/resources/qml/controls-uit/ContentSection.qml @@ -116,7 +116,7 @@ Column { LinearGradient { id: bottomBar - visible: isCollapsible + visible: desktop.gradientsSupported && isCollapsible width: frame.width height: visible ? 4 : 0 x: -hifi.dimensions.contentMargin.x diff --git a/interface/resources/qml/desktop/Desktop.qml b/interface/resources/qml/desktop/Desktop.qml index d2a3d7f7b9..beea0d8c64 100644 --- a/interface/resources/qml/desktop/Desktop.qml +++ b/interface/resources/qml/desktop/Desktop.qml @@ -34,6 +34,10 @@ FocusScope { // The VR version of the primary menu property var rootMenu: Menu { objectName: "rootMenu" } + // FIXME: Alpha gradients display as fuschia under QtQuick 2.5 on OSX/AMD + // because shaders are 4.2, and do not include #version declarations. + property bool gradientsSupported: Qt.platform.os != "osx" && !~GL.vendor.indexOf("ATI") + readonly property alias zLevels: zLevels QtObject { id: zLevels; diff --git a/interface/resources/qml/windows-uit/Frame.qml b/interface/resources/qml/windows-uit/Frame.qml index 918ee21eec..f21097ea62 100644 --- a/interface/resources/qml/windows-uit/Frame.qml +++ b/interface/resources/qml/windows-uit/Frame.qml @@ -20,6 +20,8 @@ Item { default property var decoration + property bool gradientsSupported: desktop.gradientsSupported + readonly property int iconSize: 22 readonly property int frameMargin: 9 readonly property int frameMarginLeft: frameMargin @@ -59,9 +61,7 @@ Item { height: 1.66 * window.height x: (window.width - width) / 2 y: window.height / 2 - 0.375 * height - // FIXME: Alpha gradients display as fuschia under QtQuick 2.5 on OSX. - // Check again when have a later version of QtQuick. - visible: window && window.focus && pane.visible && Qt.platform.os != "osx" + visible: gradientsSupported && window && window.focus && pane.visible gradient: Gradient { // GradientStop position 0.5 is at full circumference of circle that fits inside the square. GradientStop { position: 0.0; color: "#ff000000" } // black, 100% opacity diff --git a/interface/resources/qml/windows-uit/Window.qml b/interface/resources/qml/windows-uit/Window.qml index 56f5e6c07d..32fc816173 100644 --- a/interface/resources/qml/windows-uit/Window.qml +++ b/interface/resources/qml/windows-uit/Window.qml @@ -51,6 +51,7 @@ Fadable { // property bool pinnable: false // property bool pinned: false property bool resizable: false + property bool gradientsSupported: desktop.gradientsSupported property vector2d minSize: Qt.vector2d(100, 100) property vector2d maxSize: Qt.vector2d(1280, 800) @@ -142,9 +143,7 @@ Fadable { } LinearGradient { - // FIXME: Alpha gradients display as fuschia under QtQuick 2.5 on OSX. - // Check again when have a later version of QtQuick. - visible: modality != Qt.ApplicationModal && Qt.platform.os != "osx" + visible: gradientsSupported && modality != Qt.ApplicationModal anchors.top: contentBackground.bottom anchors.left: contentBackground.left width: contentBackground.width - 1 diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4dbfb1cc8d..43c9813a51 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1334,7 +1334,9 @@ void Application::initializeGL() { InfoView::show(INFO_HELP_PATH, true); } + extern void setupPreferences(); + void Application::initializeUi() { AddressBarDialog::registerType(); ErrorDialog::registerType(); @@ -1346,6 +1348,9 @@ void Application::initializeUi() { auto offscreenUi = DependencyManager::get(); offscreenUi->create(_offscreenContext->getContext()); + + auto rootContext = offscreenUi->getRootContext(); + offscreenUi->setProxyWindow(_window->windowHandle()); offscreenUi->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/")); // OffscreenUi is a subclass of OffscreenQmlSurface specifically designed to @@ -1356,7 +1361,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/main.cpp b/interface/src/main.cpp index 9c07912b99..f41046f7c2 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."); @@ -148,12 +149,12 @@ int main(int argc, const char* argv[]) { 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/GLHelpers.cpp b/libraries/gl/src/gl/GLHelpers.cpp index ffeaed4e4f..302e0b8515 100644 --- a/libraries/gl/src/gl/GLHelpers.cpp +++ b/libraries/gl/src/gl/GLHelpers.cpp @@ -4,6 +4,7 @@ #include #include +#include const QSurfaceFormat& getDefaultOpenGLSurfaceFormat() { static QSurfaceFormat format; @@ -37,3 +38,21 @@ const QGLFormat& getDefaultGLFormat() { }); return glFormat; } + +QJsonObject getGLContextData() { + if (!QOpenGLContext::currentContext()) { + return QJsonObject(); + } + + 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)); + + return QJsonObject { + { "version", glVersion }, + { "slVersion", glslVersion }, + { "vendor", glVendor }, + { "renderer", glRenderer }, + }; +} diff --git a/libraries/gl/src/gl/GLHelpers.h b/libraries/gl/src/gl/GLHelpers.h index 6e3d678d0c..ddb254f1c5 100644 --- a/libraries/gl/src/gl/GLHelpers.h +++ b/libraries/gl/src/gl/GLHelpers.h @@ -10,6 +10,8 @@ #ifndef hifi_GLHelpers_h #define hifi_GLHelpers_h +#include + // 16 bits of depth precision #define DEFAULT_GL_DEPTH_BUFFER_BITS 16 // 8 bits of stencil buffer (typically you really only need 1 bit for functionality @@ -24,4 +26,6 @@ void setGLFormatVersion(F& format, int major = 4, int minor = 5) { format.setVer const QSurfaceFormat& getDefaultOpenGLSurfaceFormat(); const QGLFormat& getDefaultGLFormat(); +QJsonObject getGLContextData(); + #endif diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 5f86bc13ec..9dc475ab27 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -27,6 +27,7 @@ #include "OffscreenGLCanvas.h" #include "GLEscrow.h" +#include "GLHelpers.h" // Time between receiving a request to render the offscreen UI actually triggering @@ -222,6 +223,11 @@ void OffscreenQmlRenderThread::init() { return; } + // Expose GL data to QML + auto glData = getGLContextData(); + auto setGL = [=]{ _surface->getRootContext()->setContextProperty("GL", glData); }; + _surface->executeOnUiThread(setGL); + _renderControl->initialize(_canvas.getContext()); setupFbo(); _escrow.setRecycler([this](GLuint texture){ diff --git a/libraries/gl/src/gl/OpenGLVersionChecker.cpp b/libraries/gl/src/gl/OpenGLVersionChecker.cpp index 9a8c9f7a20..843385f720 100644 --- a/libraries/gl/src/gl/OpenGLVersionChecker.cpp +++ b/libraries/gl/src/gl/OpenGLVersionChecker.cpp @@ -13,16 +13,18 @@ #include #include +#include #include "Config.h" #include "GLWidget.h" +#include "GLHelpers.h" OpenGLVersionChecker::OpenGLVersionChecker(int& argc, char** argv) : QApplication(argc, argv) { } -QString OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { +QJsonObject OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { valid = true; override = false; @@ -38,12 +40,12 @@ 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)); + QJsonObject glData = getGLContextData(); delete glWidget; // Compare against minimum @@ -51,6 +53,8 @@ QString OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { // - major_number.minor_number // - major_number.minor_number.release_number // Reference: https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glGetString.xml + const QString version { "version" }; + QString glVersion = glData[version].toString(); QStringList versionParts = glVersion.split(QRegularExpression("[\\.\\s]")); int majorNumber = versionParts[0].toInt(); int minorNumber = versionParts[1].toInt(); @@ -72,5 +76,5 @@ QString OpenGLVersionChecker::checkVersion(bool& valid, bool& override) { override = messageBox.exec() == QMessageBox::Ignore; } - return glVersion; + return glData; } 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 diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 8cc0522ce5..3bf172dc6a 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -15,6 +15,8 @@ #include #include +#include + #include #include