OpenGL ES and external display on iOS

996 Views Asked by At

I'm rendering using OpenGL ES on the main iPad (or iPhone, iPod Touch) screen, and I'd like to render on an external screen, with the content "moving over" to the external screen as soon as the user connects one (and moving back to the main screen when the external screen is disconnected). I use a library that makes the OpenGL calls (at least those that are platform-independent, i.e. not integration like EAGL and CAEAGL) but has little state. What would be the best way (in terms of performance, then maintenance) to go about doing it?

  • I don't suppose it's supported, and even if it was, I don't suppose it's recommended to just move over the CAEAGLLayer-backed view to the new window
  • Otherwise, I therefore have two drawables. Should I keep one EAGLContext, detach it from the CAEAGLLayer of the main screen, and attach it to the CAEAGLLayer of the external display (and the reverse when the user disconnects the external display)?
  • Should I have two contexts, and try and keep using the same wrapper library instance (which will therefore have to be reconfigured, though it would have to be to an extent anyway even if I kept one context, due to different screen aspect ratio, pixel aspect ratio, etc.)
  • Should I have two contexts, and one instance of the wrapper library per context (advantage is that I can make the library instance an ivar of my custom CAEAGLLayer-backed UIView).
  • Should I use two contexts but use a sharegroup so that some of the resources can be shared?

What does Apple recommend (if there is one recommendation)? And how have you guys done it (don't tell me it's an uncommon feature!)?

2

There are 2 best solutions below

1
On BEST ANSWER

It works very well with one context and two drawables. One just has to be careful to destroy the renderbuffer before detaching from the old CAEAGLLayer, and reallocate a new one with the new CAEAGLLayer; most the code to do that is provided in the EAGLView class of the OpenGL ES app template in Xcode. And of course, one needs to reconfigure the objects that are drawing the OpenGL with the size of the new layer.

1
On

Apple has a fine sample project named GLAirplay for that szenario provided.

You can find it here.