[492/906] glwindow: properly fails if resource not found

This commit is contained in:
Julien Isorce 2012-04-13 15:08:00 +02:00 committed by Tim-Philipp Müller
parent badaaaec34
commit bd0982d057
4 changed files with 134 additions and 48 deletions

View file

@ -174,19 +174,26 @@ gst_gl_window_new (DWORD_PTR external_gl_context)
x, y, 0, 0, (HWND) NULL, (HMENU) NULL, hinstance, window); x, y, 0, 0, (HWND) NULL, (HMENU) NULL, hinstance, window);
if (!priv->internal_win_id) { if (!priv->internal_win_id) {
g_debug ("failed to create gl window: %lud\n", g_debug ("failed to create gl window\n");
(gulong) priv->internal_win_id); goto failure;
return NULL;
} }
g_debug ("gl window created: %lud\n", (gulong) priv->internal_win_id); g_debug ("gl window created: %lud\n", (gulong) priv->internal_win_id);
//device is set in the window_proc //device is set in the window_proc
g_return_val_if_fail (priv->device, NULL); if (!priv->display) {
g_debug ("failed to create display\n");
goto failure;
}
ShowCursor (TRUE); ShowCursor (TRUE);
return window; return window;
failure:
g_mutex_unlock (priv->x_lock);
g_object_unref (G_OBJECT (window));
return NULL;
} }
GQuark GQuark

View file

@ -178,21 +178,26 @@ gst_gl_window_new (gulong external_gl_context)
x, y, 0, 0, (HWND) NULL, (HMENU) NULL, hinstance, window); x, y, 0, 0, (HWND) NULL, (HMENU) NULL, hinstance, window);
if (!priv->internal_win_id) { if (!priv->internal_win_id) {
g_debug ("failed to create gl window: %d\n", priv->internal_win_id); g_debug ("failed to create gl window\n");
return NULL; goto failure;
} }
g_debug ("gl window created: %d\n", priv->internal_win_id); g_debug ("gl window created: %d\n", priv->internal_win_id);
//display is set in the window_proc //display is set in the window_proc
if (!priv->display) { if (!priv->display) {
g_object_unref (G_OBJECT (window)); g_debug ("failed to create display\n");
return NULL; goto failure;
} }
ShowCursor (TRUE); ShowCursor (TRUE);
return window; return window;
failure:
g_mutex_unlock (priv->x_lock);
g_object_unref (G_OBJECT (window));
return NULL;
} }
GQuark GQuark

View file

@ -283,8 +283,10 @@ gst_gl_window_new (gulong external_gl_context)
g_mutex_lock (priv->x_lock); g_mutex_lock (priv->x_lock);
priv->device = XOpenDisplay (priv->display_name); priv->device = XOpenDisplay (priv->display_name);
if (priv->device == NULL) if (priv->device == NULL) {
goto no_display; g_debug ("XOpenDisplay failed\n");
goto failure;
}
XSynchronize (priv->device, FALSE); XSynchronize (priv->device, FALSE);
@ -312,14 +314,16 @@ gst_gl_window_new (gulong external_gl_context)
priv->connection = ConnectionNumber (priv->device); priv->connection = ConnectionNumber (priv->device);
ret = glXQueryExtension (priv->device, &error_base, &event_base); ret = glXQueryExtension (priv->device, &error_base, &event_base);
if (!ret) if (!ret) {
g_debug ("No GLX extension"); g_debug ("No GLX extension\n");
goto failure;
}
priv->visual_info = glXChooseVisual (priv->device, priv->screen_num, attrib); priv->visual_info = glXChooseVisual (priv->device, priv->screen_num, attrib);
if (!priv->visual_info) { if (!priv->visual_info) {
g_warning ("glx visual is null (bad attributes)\n"); g_debug ("glx visual is null (bad attributes)\n");
return NULL; goto failure;
} }
if (priv->visual_info->visual != priv->visual) if (priv->visual_info->visual != priv->visual)
@ -386,6 +390,11 @@ gst_gl_window_new (gulong external_gl_context)
glXCreateContext (priv->device, priv->visual_info, glXCreateContext (priv->device, priv->visual_info,
(GLXContext) external_gl_context, TRUE); (GLXContext) external_gl_context, TRUE);
if (!priv->gl_context) {
g_debug ("failed to create opengl context\n");
goto failure;
}
g_debug ("gl context id: %ld\n", (gulong) priv->gl_context); g_debug ("gl context id: %ld\n", (gulong) priv->gl_context);
if (!glXIsDirect (priv->device, priv->gl_context)) if (!glXIsDirect (priv->device, priv->gl_context))
@ -404,8 +413,10 @@ gst_gl_window_new (gulong external_gl_context)
ret = glXMakeCurrent (priv->device, priv->internal_win_id, priv->gl_context); ret = glXMakeCurrent (priv->device, priv->internal_win_id, priv->gl_context);
if (!ret) if (!ret) {
g_debug ("failed to make opengl context current\n"); g_debug ("failed to make opengl context current\n");
goto failure;
}
if (glXIsDirect (priv->device, priv->gl_context)) if (glXIsDirect (priv->device, priv->gl_context))
g_debug ("Direct Rendering: yes\n"); g_debug ("Direct Rendering: yes\n");
@ -416,9 +427,9 @@ gst_gl_window_new (gulong external_gl_context)
return window; return window;
no_display: failure:
g_mutex_unlock (priv->x_lock); g_mutex_unlock (priv->x_lock);
g_object_unref (window); g_object_unref (G_OBJECT (window));
return NULL; return NULL;
} }

View file

@ -107,19 +107,25 @@ gst_gl_window_finalize (GObject * object)
g_mutex_lock (priv->x_lock); g_mutex_lock (priv->x_lock);
g_debug ("about to finalize gl window\n");
priv->parent = 0; priv->parent = 0;
XUnmapWindow (priv->device, priv->internal_win_id); if (priv->device)
XUnmapWindow (priv->device, priv->internal_win_id);
ret = if (priv->gl_context) {
eglMakeCurrent (priv->device, EGL_NO_SURFACE, EGL_NO_SURFACE, ret =
EGL_NO_CONTEXT); eglMakeCurrent (priv->device, EGL_NO_SURFACE, EGL_NO_SURFACE,
if (!ret) EGL_NO_CONTEXT);
g_debug ("failed to release opengl context\n"); if (!ret)
g_debug ("failed to release opengl context\n");
eglDestroyContext (priv->device, priv->gl_context); eglDestroyContext (priv->device, priv->gl_context);
}
eglTerminate (priv->device); if (priv->device)
eglTerminate (priv->device);
XFree (priv->visual_info); XFree (priv->visual_info);
@ -241,13 +247,50 @@ gst_gl_window_class_init (GstGLWindowClass * klass)
static void static void
gst_gl_window_init (GstGLWindow * window) gst_gl_window_init (GstGLWindow * window)
{ {
GstGLWindowPrivate *priv = NULL;
window->priv = GST_GL_WINDOW_GET_PRIVATE (window); window->priv = GST_GL_WINDOW_GET_PRIVATE (window);
priv = window->priv;
if (g_getenv ("GST_GL_WINDOW_DEBUG") != NULL) if (g_getenv ("GST_GL_WINDOW_DEBUG") != NULL)
_gst_gl_window_debug = TRUE; _gst_gl_window_debug = TRUE;
g_log_set_handler ("GstGLWindow", G_LOG_LEVEL_DEBUG, g_log_set_handler ("GstGLWindow", G_LOG_LEVEL_DEBUG,
gst_gl_window_log_handler, NULL); gst_gl_window_log_handler, NULL);
priv->x_lock = NULL;
priv->cond_send_message = NULL;
priv->running = FALSE;
priv->visible = FALSE;
priv->allow_extra_expose_events = FALSE;
/* X context */
priv->display_name = NULL;
priv->device = NULL;
priv->screen_num = 0;
priv->root = 0;
priv->depth = 0;
priv->device_width = 0;
priv->device_height = 0;
priv->connection = 0;
priv->visual_info = NULL;
priv->parent = 0;
priv->internal_win_id = 0;
/* We use a specific connection to send events */
priv->disp_send = NULL;
/* EGL */
priv->gl_context = EGL_NO_CONTEXT;
priv->gl_display = 0;
priv->gl_surface = EGL_NO_SURFACE;
/* frozen callbacks */
priv->draw_cb = NULL;
priv->draw_data = NULL;
priv->resize_cb = NULL;
priv->resize_data = NULL;
priv->close_cb = NULL;
priv->close_data = NULL;
} }
/* Must be called in the gl thread */ /* Must be called in the gl thread */
@ -341,6 +384,11 @@ gst_gl_window_new (gulong external_gl_context)
1, 1, 0, priv->visual_info->depth, InputOutput, 1, 1, 0, priv->visual_info->depth, InputOutput,
priv->visual_info->visual, mask, &win_attr); priv->visual_info->visual, mask, &win_attr);
if (!priv->internal_win_id) {
g_debug ("XCreateWindow failed\n");
goto failure;
}
XSync (priv->device, FALSE); XSync (priv->device, FALSE);
XSetWindowBackgroundPixmap (priv->device, priv->internal_win_id, None); XSetWindowBackgroundPixmap (priv->device, priv->internal_win_id, None);
@ -378,26 +426,32 @@ gst_gl_window_new (gulong external_gl_context)
if (eglInitialize (priv->gl_display, &majorVersion, &minorVersion)) if (eglInitialize (priv->gl_display, &majorVersion, &minorVersion))
g_debug ("egl initialized: %d.%d\n", majorVersion, minorVersion); g_debug ("egl initialized: %d.%d\n", majorVersion, minorVersion);
else else {
g_debug ("failed to initialize egl %ld, %s\n", (gulong) priv->gl_display, g_debug ("failed to initialize egl %ld, %s\n", (gulong) priv->gl_display,
EGLErrorString ()); EGLErrorString ());
goto failure;
}
if (eglChooseConfig (priv->gl_display, config_attrib, &config, 1, if (eglChooseConfig (priv->gl_display, config_attrib, &config, 1,
&numConfigs)) &numConfigs))
g_debug ("config set: %ld, %ld\n", (gulong) config, (gulong) numConfigs); g_debug ("config set: %ld, %ld\n", (gulong) config, (gulong) numConfigs);
else else {
g_debug ("failed to set config %ld, %s\n", (gulong) priv->gl_display, g_debug ("failed to set config %ld, %s\n", (gulong) priv->gl_display,
EGLErrorString ()); EGLErrorString ());
goto failure;
}
priv->gl_surface = priv->gl_surface =
eglCreateWindowSurface (priv->gl_display, config, eglCreateWindowSurface (priv->gl_display, config,
(EGLNativeWindowType) priv->internal_win_id, NULL); (EGLNativeWindowType) priv->internal_win_id, NULL);
if (priv->gl_surface != EGL_NO_SURFACE) if (priv->gl_surface != EGL_NO_SURFACE)
g_debug ("surface created: %ld\n", (gulong) priv->gl_surface); g_debug ("surface created: %ld\n", (gulong) priv->gl_surface);
else else {
g_debug ("failed to create surface %ld, %ld, %ld, %s\n", g_debug ("failed to create surface %ld, %ld, %ld, %s\n",
(gulong) priv->gl_display, (gulong) priv->gl_surface, (gulong) priv->gl_display, (gulong) priv->gl_surface,
(gulong) priv->gl_display, EGLErrorString ()); (gulong) priv->gl_display, EGLErrorString ());
goto failure;
}
g_debug ("about to create gl context\n"); g_debug ("about to create gl context\n");
@ -407,19 +461,28 @@ gst_gl_window_new (gulong external_gl_context)
if (priv->gl_context != EGL_NO_CONTEXT) if (priv->gl_context != EGL_NO_CONTEXT)
g_debug ("gl context created: %ld\n", (gulong) priv->gl_context); g_debug ("gl context created: %ld\n", (gulong) priv->gl_context);
else else {
g_debug ("failed to create glcontext %ld, %ld, %s\n", g_debug ("failed to create glcontext %ld, %ld, %s\n",
(gulong) priv->gl_context, (gulong) priv->gl_display, (gulong) priv->gl_context, (gulong) priv->gl_display,
EGLErrorString ()); EGLErrorString ());
goto failure;
}
if (!eglMakeCurrent (priv->gl_display, priv->gl_surface, priv->gl_surface, if (!eglMakeCurrent (priv->gl_display, priv->gl_surface, priv->gl_surface,
priv->gl_context)) priv->gl_context)) {
g_debug ("failed to make opengl context current %ld, %s\n", g_debug ("failed to make opengl context current %ld, %s\n",
(gulong) priv->gl_display, EGLErrorString ()); (gulong) priv->gl_display, EGLErrorString ());
goto failure;
}
g_mutex_unlock (priv->x_lock); g_mutex_unlock (priv->x_lock);
return window; return window;
failure:
g_mutex_unlock (priv->x_lock);
g_object_unref (G_OBJECT (window));
return NULL;
} }
GQuark GQuark
@ -673,13 +736,13 @@ gst_gl_window_run_loop (GstGLWindow * window)
if (priv->running) { if (priv->running) {
#if SIZEOF_VOID_P == 8 #if SIZEOF_VOID_P == 8
GstGLWindowCB custom_cb = GstGLWindowCB custom_cb =
(GstGLWindowCB) (((event.xclient. (GstGLWindowCB) (((event.xclient.data.
data.l[0] & 0xffffffff) << 32) | (event.xclient. l[0] & 0xffffffff) << 32) | (event.xclient.data.
data.l[1] & 0xffffffff)); l[1] & 0xffffffff));
gpointer custom_data = gpointer custom_data =
(gpointer) (((event.xclient. (gpointer) (((event.xclient.data.
data.l[2] & 0xffffffff) << 32) | (event.xclient. l[2] & 0xffffffff) << 32) | (event.xclient.data.
data.l[3] & 0xffffffff)); l[3] & 0xffffffff));
#else #else
GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0]; GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0];
gpointer custom_data = (gpointer) event.xclient.data.l[1]; gpointer custom_data = (gpointer) event.xclient.data.l[1];
@ -715,13 +778,13 @@ gst_gl_window_run_loop (GstGLWindow * window)
&& event.xclient.message_type == wm_quit_loop) { && event.xclient.message_type == wm_quit_loop) {
#if SIZEOF_VOID_P == 8 #if SIZEOF_VOID_P == 8
GstGLWindowCB destroy_cb = GstGLWindowCB destroy_cb =
(GstGLWindowCB) (((event.xclient. (GstGLWindowCB) (((event.xclient.data.
data.l[0] & 0xffffffff) << 32) | (event.xclient. l[0] & 0xffffffff) << 32) | (event.xclient.data.
data.l[1] & 0xffffffff)); l[1] & 0xffffffff));
gpointer destroy_data = gpointer destroy_data =
(gpointer) (((event.xclient. (gpointer) (((event.xclient.data.
data.l[2] & 0xffffffff) << 32) | (event.xclient. l[2] & 0xffffffff) << 32) | (event.xclient.data.
data.l[3] & 0xffffffff)); l[3] & 0xffffffff));
#else #else
GstGLWindowCB destroy_cb = (GstGLWindowCB) event.xclient.data.l[0]; GstGLWindowCB destroy_cb = (GstGLWindowCB) event.xclient.data.l[0];
gpointer destroy_data = (gpointer) event.xclient.data.l[1]; gpointer destroy_data = (gpointer) event.xclient.data.l[1];
@ -737,13 +800,13 @@ gst_gl_window_run_loop (GstGLWindow * window)
while (XCheckTypedEvent (priv->device, ClientMessage, &pending_event)) { while (XCheckTypedEvent (priv->device, ClientMessage, &pending_event)) {
#if SIZEOF_VOID_P == 8 #if SIZEOF_VOID_P == 8
GstGLWindowCB custom_cb = GstGLWindowCB custom_cb =
(GstGLWindowCB) (((event.xclient. (GstGLWindowCB) (((event.xclient.data.
data.l[0] & 0xffffffff) << 32) | (event.xclient. l[0] & 0xffffffff) << 32) | (event.xclient.data.
data.l[1] & 0xffffffff)); l[1] & 0xffffffff));
gpointer custom_data = gpointer custom_data =
(gpointer) (((event.xclient. (gpointer) (((event.xclient.data.
data.l[2] & 0xffffffff) << 32) | (event.xclient. l[2] & 0xffffffff) << 32) | (event.xclient.data.
data.l[3] & 0xffffffff)); l[3] & 0xffffffff));
#else #else
GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0]; GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0];
gpointer custom_data = (gpointer) event.xclient.data.l[1]; gpointer custom_data = (gpointer) event.xclient.data.l[1];