Some initial thoughts ...I assume each thread has it's own GLES context, and you are trying to get some kind of streaming load working?Exchange of surface and buffer data across contexts in GLES is not automatically synchronized; each context gets its own command stream and it will only be synchronized if you force it to be so. Do you have any synchronization in your application to ensure the glCopyTex call has actually run before you use the image in the other thread? As a simple test if you insert a glFinish after the call to glCopyTex, and only use the EGL image in the other thread after that call, does it work correctly? You can build something as a non-blocking equivalent using EGL fences. As a footnote - if you could cut down your application into a standalone test case it does make it much easier for us to help - the devil in most cases is in the detail, and if we can't see exactly what you are doing it is often very hard to reproduce, especially in cases with multiple contexts or threads!HTH, Iso