summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/ios/qioscontext.mm
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@digia.com>2014-03-27 14:58:23 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-28 13:01:52 +0100
commitfb3577039ca89011748ed64ad3f807e009559407 (patch)
treefb6d8d2ef103c81167786c85008a10698c8618d5 /src/plugins/platforms/ios/qioscontext.mm
parentc0701f3789acf3234e9f6431b4e8c7dc3ccefabb (diff)
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 <gunnar.sletta@jollamobile.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/plugins/platforms/ios/qioscontext.mm')
-rw-r--r--src/plugins/platforms/ios/qioscontext.mm16
1 files changed, 16 insertions, 0 deletions
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<QIOSWindow *>(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;
}