From 87dd8a46f8e4204d2c3c9bfdd29b7313a4206a51 Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Tue, 6 Dec 2016 16:09:20 -0800 Subject: [PATCH 1/2] Preserve and restore the GL context when resizing QML surfaces --- libraries/gl/src/gl/GLHelpers.cpp | 12 +++++ libraries/gl/src/gl/GLHelpers.h | 5 ++ libraries/gl/src/gl/OffscreenQmlSurface.cpp | 57 +++++++++++---------- 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/libraries/gl/src/gl/GLHelpers.cpp b/libraries/gl/src/gl/GLHelpers.cpp index dca1214b32..ab91ca0902 100644 --- a/libraries/gl/src/gl/GLHelpers.cpp +++ b/libraries/gl/src/gl/GLHelpers.cpp @@ -69,3 +69,15 @@ QThread* RENDER_THREAD = nullptr; bool isRenderThread() { return QThread::currentThread() == RENDER_THREAD; } + +namespace gl { + void withSavedContext(const std::function& f) { + // Save the original GL context, because creating a QML surface will create a new context + QOpenGLContext * savedContext = QOpenGLContext::currentContext(); + QSurface * savedSurface = savedContext ? savedContext->surface() : nullptr; + f(); + if (savedContext) { + savedContext->makeCurrent(savedSurface); + } + } +} diff --git a/libraries/gl/src/gl/GLHelpers.h b/libraries/gl/src/gl/GLHelpers.h index daa181467d..84229b97d2 100644 --- a/libraries/gl/src/gl/GLHelpers.h +++ b/libraries/gl/src/gl/GLHelpers.h @@ -10,6 +10,7 @@ #ifndef hifi_GLHelpers_h #define hifi_GLHelpers_h +#include #include // 16 bits of depth precision @@ -34,4 +35,8 @@ int glVersionToInteger(QString glVersion); bool isRenderThread(); +namespace gl { + void withSavedContext(const std::function& f); +} + #endif diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 06f755c1dd..cde779d101 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -467,40 +467,41 @@ void OffscreenQmlSurface::resize(const QSize& newSize_, bool forceResize) { } qCDebug(glLogging) << "Offscreen UI resizing to " << newSize.width() << "x" << newSize.height(); + gl::withSavedContext([&] { + _canvas->makeCurrent(); - _canvas->makeCurrent(); - - // Release hold on the textures of the old size - if (uvec2() != _size) { - // If the most recent texture was unused, we can directly recycle it - if (_latestTextureAndFence.first) { - offscreenTextures.releaseTexture(_latestTextureAndFence); - _latestTextureAndFence = { 0, 0 }; + // Release hold on the textures of the old size + if (uvec2() != _size) { + // If the most recent texture was unused, we can directly recycle it + if (_latestTextureAndFence.first) { + offscreenTextures.releaseTexture(_latestTextureAndFence); + _latestTextureAndFence = { 0, 0 }; + } + offscreenTextures.releaseSize(_size); } - offscreenTextures.releaseSize(_size); - } - _size = newOffscreenSize; + _size = newOffscreenSize; - // Acquire the new texture size - if (uvec2() != _size) { - offscreenTextures.acquireSize(_size); - if (_depthStencil) { - glDeleteRenderbuffers(1, &_depthStencil); - _depthStencil = 0; + // Acquire the new texture size + if (uvec2() != _size) { + offscreenTextures.acquireSize(_size); + if (_depthStencil) { + glDeleteRenderbuffers(1, &_depthStencil); + _depthStencil = 0; + } + glGenRenderbuffers(1, &_depthStencil); + glBindRenderbuffer(GL_RENDERBUFFER, _depthStencil); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _size.x, _size.y); + if (!_fbo) { + glGenFramebuffers(1, &_fbo); + } + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthStencil); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } - glGenRenderbuffers(1, &_depthStencil); - glBindRenderbuffer(GL_RENDERBUFFER, _depthStencil); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _size.x, _size.y); - if (!_fbo) { - glGenFramebuffers(1, &_fbo); - } - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); - glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthStencil); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - } - _canvas->doneCurrent(); + _canvas->doneCurrent(); + }); } QQuickItem* OffscreenQmlSurface::getRootItem() { From f7e8d47426278f0f0e4e9fd22aefff079d7cea6f Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Wed, 7 Dec 2016 12:21:13 -0800 Subject: [PATCH 2/2] Revert "Updated the Qt audio plugins" This reverts commit b888ce890c732f416362ea09185add9c8b468e69. --- cmake/externals/wasapi/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/externals/wasapi/CMakeLists.txt b/cmake/externals/wasapi/CMakeLists.txt index 7cfca4f3ba..67f47d68fc 100644 --- a/cmake/externals/wasapi/CMakeLists.txt +++ b/cmake/externals/wasapi/CMakeLists.txt @@ -6,8 +6,8 @@ if (WIN32) include(ExternalProject) ExternalProject_Add( ${EXTERNAL_NAME} - URL http://hifi-public.s3.amazonaws.com/dependencies/qtaudio_wasapi5.zip - URL_MD5 0530753e855ffc00232cc969bf1c84a8 + URL http://hifi-public.s3.amazonaws.com/dependencies/qtaudio_wasapi4.zip + URL_MD5 2abde5340a64d387848f12b9536a7e85 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND ""