diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index bbc36e8623..9e98b51442 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -620,6 +620,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : // enable mouse tracking; otherwise, we only get drag events _glWidget->setMouseTracking(true); + _glWidget->makeCurrent(); + _glWidget->initializeGL(); _offscreenContext = new OffscreenGLCanvas(); _offscreenContext->create(_glWidget->context()->contextHandle()); @@ -1194,6 +1196,9 @@ void Application::paintGL() { QSize size = getDeviceSize(); renderArgs._viewport = glm::ivec4(0, 0, size.width(), size.height()); _applicationOverlay.renderOverlay(&renderArgs); + gpu::FramebufferPointer overlayFramebuffer = _applicationOverlay.getOverlayFramebuffer(); + + } { diff --git a/interface/src/PluginContainerProxy.cpp b/interface/src/PluginContainerProxy.cpp index aae94162ad..048f079653 100644 --- a/interface/src/PluginContainerProxy.cpp +++ b/interface/src/PluginContainerProxy.cpp @@ -150,7 +150,7 @@ void PluginContainerProxy::showDisplayPluginsTools() { DependencyManager::get()->hmdTools(true); } -QGLWidget* PluginContainerProxy::getPrimaryWidget() { +GLWidget* PluginContainerProxy::getPrimaryWidget() { return qApp->_glWidget; } diff --git a/interface/src/PluginContainerProxy.h b/interface/src/PluginContainerProxy.h index 5d974f0a0c..3adc696ba9 100644 --- a/interface/src/PluginContainerProxy.h +++ b/interface/src/PluginContainerProxy.h @@ -27,7 +27,7 @@ class PluginContainerProxy : public QObject, PluginContainer { virtual bool makeRenderingContextCurrent() override; virtual void releaseSceneTexture(uint32_t texture) override; virtual void releaseOverlayTexture(uint32_t texture) override; - virtual QGLWidget* getPrimaryWidget() override; + virtual GLWidget* getPrimaryWidget() override; virtual QWindow* getPrimaryWindow() override; virtual QOpenGLContext* getPrimaryContext() override; virtual bool isForeground() override; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 12aa37cd56..cec84c74d4 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -145,8 +146,6 @@ private: QGLContext* _context { nullptr }; }; -bool OpenGLDisplayPlugin::_vsyncSupported = false; - OpenGLDisplayPlugin::OpenGLDisplayPlugin() { _sceneTextureEscrow.setRecycler([this](GLuint texture){ cleanupForSceneTexture(texture); @@ -172,19 +171,14 @@ void OpenGLDisplayPlugin::cleanupForSceneTexture(uint32_t sceneTexture) { void OpenGLDisplayPlugin::activate() { - _timer.start(2); + _timer.start(1); + _vsyncSupported = _container->getPrimaryWidget()->isVsyncSupported(); // Start the present thread if necessary auto presentThread = DependencyManager::get(); if (!presentThread) { auto widget = _container->getPrimaryWidget(); - // TODO: write the proper code for linux -#if defined(Q_OS_WIN) - widget->makeCurrent(); - _vsyncSupported = wglewGetExtension("WGL_EXT_swap_control"); - widget->doneCurrent(); -#endif DependencyManager::set(); presentThread = DependencyManager::get(); @@ -195,7 +189,6 @@ void OpenGLDisplayPlugin::activate() { } presentThread->setNewDisplayPlugin(this); DisplayPlugin::activate(); - emit requestRender(); } void OpenGLDisplayPlugin::stop() { diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 747d8b810b..ef78374994 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -81,7 +81,7 @@ protected: GLTextureEscrow _overlayTextureEscrow; GLTextureEscrow _sceneTextureEscrow; - static bool _vsyncSupported; + bool _vsyncSupported { false }; }; diff --git a/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp index b215b19b15..c1922599a5 100644 --- a/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/WindowOpenGLDisplayPlugin.cpp @@ -7,7 +7,7 @@ // #include "WindowOpenGLDisplayPlugin.h" -#include +#include #include "plugins/PluginContainer.h" diff --git a/libraries/gl/src/gl/GLWidget.cpp b/libraries/gl/src/gl/GLWidget.cpp index 310675c01f..c67dec1e51 100644 --- a/libraries/gl/src/gl/GLWidget.cpp +++ b/libraries/gl/src/gl/GLWidget.cpp @@ -7,6 +7,7 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include "GLWidget.h" @@ -16,11 +17,14 @@ #include #include +#include #include #include + #include "GLHelpers.h" + GLWidget::GLWidget() : QGLWidget(getDefaultGLFormat()) { #ifdef Q_OS_LINUX // Cause GLWidget::eventFilter to be called. @@ -42,6 +46,12 @@ void GLWidget::initializeGL() { setAcceptDrops(true); // Note, we *DO NOT* want Qt to automatically swap buffers for us. This results in the "ringing" bug mentioned in WL#19514 when we're throttling the framerate. setAutoBufferSwap(false); + + // TODO: write the proper code for linux + makeCurrent(); +#if defined(Q_OS_WIN) + _vsyncSupported = context()->contextHandle()->hasExtension("WGL_EXT_swap_control");; +#endif } void GLWidget::paintEvent(QPaintEvent* event) { @@ -112,3 +122,8 @@ bool GLWidget::eventFilter(QObject*, QEvent* event) { } return false; } + +bool GLWidget::isVsyncSupported() const { + return _vsyncSupported; +} + diff --git a/libraries/gl/src/gl/GLWidget.h b/libraries/gl/src/gl/GLWidget.h index df4a73ac50..5b391aa6cd 100644 --- a/libraries/gl/src/gl/GLWidget.h +++ b/libraries/gl/src/gl/GLWidget.h @@ -21,15 +21,19 @@ public: int getDeviceWidth() const; int getDeviceHeight() const; QSize getDeviceSize() const { return QSize(getDeviceWidth(), getDeviceHeight()); } + bool isVsyncSupported() const; + virtual void initializeGL() override; protected: - virtual void initializeGL() override; virtual bool event(QEvent* event) override; virtual void paintEvent(QPaintEvent* event) override; virtual void resizeEvent(QResizeEvent* event) override; private slots: virtual bool eventFilter(QObject*, QEvent* event) override; + +private: + bool _vsyncSupported { false }; }; diff --git a/libraries/plugins/src/plugins/PluginContainer.h b/libraries/plugins/src/plugins/PluginContainer.h index 6732bc02ba..19859fd98b 100644 --- a/libraries/plugins/src/plugins/PluginContainer.h +++ b/libraries/plugins/src/plugins/PluginContainer.h @@ -16,7 +16,7 @@ #include "Forward.h" class QAction; -class QGLWidget; +class GLWidget; class QScreen; class QOpenGLContext; class QWindow; @@ -41,7 +41,7 @@ public: virtual bool makeRenderingContextCurrent() = 0; virtual void releaseSceneTexture(uint32_t texture) = 0; virtual void releaseOverlayTexture(uint32_t texture) = 0; - virtual QGLWidget* getPrimaryWidget() = 0; + virtual GLWidget* getPrimaryWidget() = 0; virtual QWindow* getPrimaryWindow() = 0; virtual QOpenGLContext* getPrimaryContext() = 0; virtual bool isForeground() = 0; diff --git a/tests/controllers/src/main.cpp b/tests/controllers/src/main.cpp index 8514d33d2e..fe49c2b385 100644 --- a/tests/controllers/src/main.cpp +++ b/tests/controllers/src/main.cpp @@ -94,7 +94,7 @@ public: virtual bool makeRenderingContextCurrent() override { return true; } virtual void releaseSceneTexture(uint32_t texture) override {} virtual void releaseOverlayTexture(uint32_t texture) override {} - virtual QGLWidget* getPrimaryWidget() override { return nullptr; } + virtual GLWidget* getPrimaryWidget() override { return nullptr; } virtual QWindow* getPrimaryWindow() override { return nullptr; } virtual QOpenGLContext* getPrimaryContext() override { return nullptr; } virtual bool isForeground() override { return true; }