eglglessink: Don't set the EAGLContext of the main thread and don't reuse it either
authorSebastian Dröge <sebastian@centricular.com>
Thu, 19 Dec 2013 20:36:50 +0000 (21:36 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 26 Dec 2013 07:58:27 +0000 (08:58 +0100)
... instead create a new context for every sink instance.

https://bugzilla.gnome.org/show_bug.cgi?id=720421

ext/eglgles/gstegladaptation_eagl.m

index 142bc95009aa8854b1a3b9f0d1dd440889013989..9d7d608c46e74bd60fd5fac0bc2cac88331d554e 100644 (file)
@@ -113,14 +113,9 @@ gst_egl_adaptation_create_egl_context (GstEglAdaptationContext * ctx)
   __block EAGLContext *context;
 
   dispatch_sync(dispatch_get_main_queue(), ^{
-    EAGLContext *cur_ctx = [EAGLContext currentContext];
-    if (cur_ctx) {
-      context = cur_ctx;
-    } else {
-      context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
-      if (context == nil) {
-        GST_ERROR_OBJECT (ctx->element, "Failed to create EAGL GLES2 context");
-      }
+    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
+    if (context == nil) {
+      GST_ERROR_OBJECT (ctx->element, "Failed to create EAGL GLES2 context");
     }
   });
 
@@ -154,10 +149,6 @@ gst_egl_adaptation_context_make_current (GstEglAdaptationContext * ctx,
       return FALSE;
     }
     ctx_to_set = ctx->eaglctx->eagl_context;
-    dispatch_sync(dispatch_get_main_queue(), ^{
-      [EAGLContext setCurrentContext: ctx_to_set];
-    });
-
   } else {
     GST_DEBUG_OBJECT (ctx->element, "Detaching context from thread %p",
         g_thread_self ());
@@ -184,6 +175,8 @@ gst_egl_adaptation_create_surface (GstEglAdaptationContext * ctx)
 
   dispatch_sync(dispatch_get_main_queue(), ^{
 
+    gst_egl_adaptation_context_make_current (ctx, TRUE);
+
     if (ctx->eaglctx->framebuffer) {
       framebuffer = ctx->eaglctx->framebuffer;
     } else {
@@ -209,6 +202,8 @@ gst_egl_adaptation_create_surface (GstEglAdaptationContext * ctx)
     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                               GL_RENDERBUFFER, depthRenderbuffer);
+
+    gst_egl_adaptation_context_make_current (ctx, FALSE);
   });
 
   glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);