summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-07-06 13:28:05 +0300
committerJan Schmidt <jan@centricular.com>2015-07-08 22:29:27 +1000
commit34622c3961729dd6fbf386bec56afacdbfcb3f00 (patch)
treea609721e310acb9ac2477fc92ee82b340fda0b2a /gst-libs
parent7d08d565273b9a3d21d5c080b8c4770d0b91a5ed (diff)
downloadgstreamer-plugins-bad-34622c3961729dd6fbf386bec56afacdbfcb3f00.tar.gz
gl/eagl: Don't call anything synchronously from the main thread
This will deadlock if the main thread is the one who creates the GstGLContext. All things we call from the main thread should be possible from any thread. https://bugzilla.gnome.org/show_bug.cgi?id=751101
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/gl/eagl/gstglcontext_eagl.m104
1 files changed, 49 insertions, 55 deletions
diff --git a/gst-libs/gst/gl/eagl/gstglcontext_eagl.m b/gst-libs/gst/gl/eagl/gstglcontext_eagl.m
index 9fb29e65e..aaabfe256 100644
--- a/gst-libs/gst/gl/eagl/gstglcontext_eagl.m
+++ b/gst-libs/gst/gl/eagl/gstglcontext_eagl.m
@@ -143,12 +143,12 @@ gst_gl_context_eagl_release_layer (GstGLContext * context)
void
gst_gl_context_eagl_update_layer (GstGLContext * context)
{
- __block GLuint framebuffer;
- __block GLuint color_renderbuffer;
- __block GLuint depth_renderbuffer;
- __block GLint width;
- __block GLint height;
- __block CAEAGLLayer *eagl_layer;
+ GLuint framebuffer;
+ GLuint color_renderbuffer;
+ GLuint depth_renderbuffer;
+ GLint width;
+ GLint height;
+ CAEAGLLayer *eagl_layer;
GLenum status;
GstGLContextEagl *context_eagl = GST_GL_CONTEXT_EAGL (context);
GstGLContextEaglPrivate *priv = context_eagl->priv;
@@ -168,33 +168,31 @@ gst_gl_context_eagl_update_layer (GstGLContext * context)
if (priv->eagl_layer)
gst_gl_context_eagl_release_layer (context);
- dispatch_sync (dispatch_get_main_queue (), ^{
- eagl_layer = (CAEAGLLayer *)[window_handle layer];
- [EAGLContext setCurrentContext:priv->eagl_context];
-
- /* Allocate framebuffer */
- glGenFramebuffers (1, &framebuffer);
- glBindFramebuffer (GL_FRAMEBUFFER, framebuffer);
- /* Allocate color render buffer */
- glGenRenderbuffers (1, &color_renderbuffer);
- glBindRenderbuffer (GL_RENDERBUFFER, color_renderbuffer);
- [priv->eagl_context renderbufferStorage: GL_RENDERBUFFER fromDrawable:eagl_layer];
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_RENDERBUFFER, color_renderbuffer);
- /* Get renderbuffer width/height */
- glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,
- &width);
- glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT,
- &height);
- /* allocate depth render buffer */
- glGenRenderbuffers (1, &depth_renderbuffer);
- glBindRenderbuffer (GL_RENDERBUFFER, depth_renderbuffer);
- glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width,
- height);
- glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, depth_renderbuffer);
- [EAGLContext setCurrentContext:nil];
- });
+ eagl_layer = (CAEAGLLayer *)[window_handle layer];
+ [EAGLContext setCurrentContext:priv->eagl_context];
+
+ /* Allocate framebuffer */
+ glGenFramebuffers (1, &framebuffer);
+ glBindFramebuffer (GL_FRAMEBUFFER, framebuffer);
+ /* Allocate color render buffer */
+ glGenRenderbuffers (1, &color_renderbuffer);
+ glBindRenderbuffer (GL_RENDERBUFFER, color_renderbuffer);
+ [priv->eagl_context renderbufferStorage: GL_RENDERBUFFER fromDrawable:eagl_layer];
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_RENDERBUFFER, color_renderbuffer);
+ /* Get renderbuffer width/height */
+ glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH,
+ &width);
+ glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT,
+ &height);
+ /* allocate depth render buffer */
+ glGenRenderbuffers (1, &depth_renderbuffer);
+ glBindRenderbuffer (GL_RENDERBUFFER, depth_renderbuffer);
+ glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width,
+ height);
+ glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+ GL_RENDERBUFFER, depth_renderbuffer);
+ [EAGLContext setCurrentContext:nil];
[EAGLContext setCurrentContext:priv->eagl_context];
@@ -224,19 +222,17 @@ gst_gl_context_eagl_create_context (GstGLContext * context, GstGLAPI gl_api,
GstGLContextEagl *context_eagl = GST_GL_CONTEXT_EAGL (context);
GstGLContextEaglPrivate *priv = context_eagl->priv;
- dispatch_sync (dispatch_get_main_queue (), ^{
- if (other_context) {
- EAGLContext *external_gl_context = (EAGLContext *)
- gst_gl_context_get_gl_context (other_context);
- EAGLSharegroup *share_group = [external_gl_context sharegroup];
+ if (other_context) {
+ EAGLContext *external_gl_context = (EAGLContext *)
+ gst_gl_context_get_gl_context (other_context);
+ EAGLSharegroup *share_group = [external_gl_context sharegroup];
+
+ priv->eagl_context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2 sharegroup:share_group];
+ [share_group release];
+ } else {
+ priv->eagl_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
+ }
- priv->eagl_context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2 sharegroup:share_group];
- [share_group release];
- } else {
- priv->eagl_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
- }
- });
-
priv->eagl_layer = NULL;
priv->framebuffer = 0;
priv->color_renderbuffer = 0;
@@ -285,16 +281,14 @@ gst_gl_context_eagl_choose_format (GstGLContext * context, GError ** error)
return TRUE;
}
- dispatch_sync (dispatch_get_main_queue (), ^{
- CAEAGLLayer *eagl_layer;
- NSDictionary * dict =[NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
- kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
-
- eagl_layer = (CAEAGLLayer *)[window_handle layer];
- [eagl_layer setOpaque:YES];
- [eagl_layer setDrawableProperties:dict];
- });
+ CAEAGLLayer *eagl_layer;
+ NSDictionary * dict =[NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
+ kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
+
+ eagl_layer = (CAEAGLLayer *)[window_handle layer];
+ [eagl_layer setOpaque:YES];
+ [eagl_layer setDrawableProperties:dict];
gst_object_unref (window);