eagl: Don't dispatch_sync() to the main thread if we are on the main thread

This will otherwise deadlock.

https://bugzilla.gnome.org/show_bug.cgi?id=751101
This commit is contained in:
Sebastian Dröge 2015-06-23 11:05:06 +02:00
parent 1ece34af2c
commit 0bff481011

View file

@ -168,7 +168,7 @@ gst_gl_context_eagl_update_layer (GstGLContext * context)
if (priv->eagl_layer) if (priv->eagl_layer)
gst_gl_context_eagl_release_layer (context); gst_gl_context_eagl_release_layer (context);
dispatch_sync (dispatch_get_main_queue (), ^{ void (^create_block) (void) = ^{
eagl_layer = (CAEAGLLayer *)[window_handle layer]; eagl_layer = (CAEAGLLayer *)[window_handle layer];
[EAGLContext setCurrentContext:priv->eagl_context]; [EAGLContext setCurrentContext:priv->eagl_context];
@ -194,7 +194,13 @@ gst_gl_context_eagl_update_layer (GstGLContext * context)
glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, depth_renderbuffer); GL_RENDERBUFFER, depth_renderbuffer);
[EAGLContext setCurrentContext:nil]; [EAGLContext setCurrentContext:nil];
}); };
if ([NSThread isMainThread]) {
create_block ();
} else {
dispatch_sync (dispatch_get_main_queue (), create_block);
}
[EAGLContext setCurrentContext:priv->eagl_context]; [EAGLContext setCurrentContext:priv->eagl_context];
@ -224,7 +230,7 @@ gst_gl_context_eagl_create_context (GstGLContext * context, GstGLAPI gl_api,
GstGLContextEagl *context_eagl = GST_GL_CONTEXT_EAGL (context); GstGLContextEagl *context_eagl = GST_GL_CONTEXT_EAGL (context);
GstGLContextEaglPrivate *priv = context_eagl->priv; GstGLContextEaglPrivate *priv = context_eagl->priv;
dispatch_sync (dispatch_get_main_queue (), ^{ void (^create_block) (void) = ^{
if (other_context) { if (other_context) {
EAGLContext *external_gl_context = (EAGLContext *) EAGLContext *external_gl_context = (EAGLContext *)
gst_gl_context_get_gl_context (other_context); gst_gl_context_get_gl_context (other_context);
@ -235,7 +241,13 @@ gst_gl_context_eagl_create_context (GstGLContext * context, GstGLAPI gl_api,
} else { } else {
priv->eagl_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; priv->eagl_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
} }
}); };
if ([NSThread isMainThread]) {
create_block ();
} else {
dispatch_sync (dispatch_get_main_queue (), create_block);
}
priv->eagl_layer = NULL; priv->eagl_layer = NULL;
priv->framebuffer = 0; priv->framebuffer = 0;
@ -285,16 +297,25 @@ gst_gl_context_eagl_choose_format (GstGLContext * context, GError ** error)
return TRUE; return TRUE;
} }
dispatch_sync (dispatch_get_main_queue (), ^{ void (^create_block) (void) = ^{
CAEAGLLayer *eagl_layer; CAEAGLLayer *eagl_layer;
NSDictionary * dict =[NSDictionary dictionaryWithObjectsAndKeys: NSDictionary * dict =[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, [NSNumber numberWithBool:NO],
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8,
kEAGLDrawablePropertyColorFormat,
nil];
eagl_layer = (CAEAGLLayer *)[window_handle layer]; eagl_layer = (CAEAGLLayer *)[window_handle layer];
[eagl_layer setOpaque:YES]; [eagl_layer setOpaque:YES];
[eagl_layer setDrawableProperties:dict]; [eagl_layer setDrawableProperties:dict];
}); };
if ([NSThread isMainThread]) {
create_block ();
} else {
dispatch_sync (dispatch_get_main_queue (), create_block);
}
gst_object_unref (window); gst_object_unref (window);