From fb3577039ca89011748ed64ad3f807e009559407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 27 Mar 2014 14:58:23 +0100 Subject: iOS: Add support for offscreen GL surfaces without using hidden windows There's no need to create a hidden window to get a surface on iOS, as the platform supports FBOs. Note that defaultFramebufferObject() returns 0 in the case of offscreen surfaces, which is technically not a valid FBO on iOS due to the indirect rendering, but binding and rendering to the zero-FBO seems to be no-ops, so clients may safely call eg glBindFramebuffer(GL_FRAMEBUFFER, ctx->defaultFramebufferObject()) to restore the default FBO after drawing to its own FBO. Change-Id: I2e67f5d69c0698562052f5ac1df0bbfaa3337148 Reviewed-by: Gunnar Sletta Reviewed-by: Laszlo Agocs --- src/plugins/platforms/ios/qioscontext.mm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/plugins/platforms/ios/qioscontext.mm') diff --git a/src/plugins/platforms/ios/qioscontext.mm b/src/plugins/platforms/ios/qioscontext.mm index a35b4f164c..1ea040308f 100644 --- a/src/plugins/platforms/ios/qioscontext.mm +++ b/src/plugins/platforms/ios/qioscontext.mm @@ -113,6 +113,11 @@ bool QIOSContext::makeCurrent(QPlatformSurface *surface) Q_ASSERT(surface && surface->surface()->surfaceType() == QSurface::OpenGLSurface); [EAGLContext setCurrentContext:m_eaglContext]; + + // For offscreen surfaces we don't prepare a default FBO + if (surface->surface()->surfaceClass() == QSurface::Offscreen) + return true; + FramebufferObject &framebufferObject = backingFramebufferObjectFor(surface); // We bind the default FBO even if it's incomplete, so that clients who @@ -131,6 +136,10 @@ void QIOSContext::doneCurrent() void QIOSContext::swapBuffers(QPlatformSurface *surface) { Q_ASSERT(surface && surface->surface()->surfaceType() == QSurface::OpenGLSurface); + + if (surface->surface()->surfaceClass() == QSurface::Offscreen) + return; // Nothing to do + Q_ASSERT(surface->surface()->surfaceClass() == QSurface::Window); QIOSWindow *window = static_cast(surface); Q_ASSERT(m_framebufferObjects.contains(window)); @@ -213,6 +222,13 @@ QIOSContext::FramebufferObject &QIOSContext::backingFramebufferObjectFor(QPlatfo GLuint QIOSContext::defaultFramebufferObject(QPlatformSurface *surface) const { + if (surface->surface()->surfaceClass() == QSurface::Offscreen) { + // Binding and rendering to the zero-FBO on iOS seems to be + // no-ops, so we can safely return 0 here, even if it's not + // really a valid FBO on iOS. + return 0; + } + return backingFramebufferObjectFor(surface).handle; } -- cgit v1.2.3