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() {