diff options
Diffstat (limited to 'sys/glsink/gstgldisplay.c')
-rw-r--r-- | sys/glsink/gstgldisplay.c | 90 |
1 files changed, 74 insertions, 16 deletions
diff --git a/sys/glsink/gstgldisplay.c b/sys/glsink/gstgldisplay.c index 6d93c889..f0995c1b 100644 --- a/sys/glsink/gstgldisplay.c +++ b/sys/glsink/gstgldisplay.c @@ -57,15 +57,17 @@ gst_gl_display_finalize (GObject * object) { GstGLDisplay *display = GST_GL_DISPLAY (object); - if (display->assigned_window == None) { + GST_DEBUG ("finalize %p", object); + + if (display->window != None) { XDestroyWindow (display->display, display->window); } if (display->context) { glXDestroyContext (display->display, display->context); } - if (display->visinfo) { - XFree (display->visinfo); - } + //if (display->visinfo) { + // XFree (display->visinfo); + //} if (display->display) { XCloseDisplay (display->display); } @@ -165,11 +167,28 @@ gst_gl_display_check_features (GstGLDisplay * display) GST_DEBUG ("No GLX extension"); return FALSE; } +#if 0 + { + int i; + int n; + + visinfo = XGetVisualInfo (display->display, 0, NULL, &n); + for (i = 0; i < n; i++) { + GST_ERROR ("%d: %d %ld", i, visinfo[i].depth, visinfo[i].visualid); + if (visinfo[i].depth == 32) + break; + } - visinfo = glXChooseVisual (display->display, scrnum, attrib); - if (visinfo == NULL) { - GST_DEBUG ("No usable visual"); - return FALSE; + visinfo += i; + } +#endif + + if (1) { + visinfo = glXChooseVisual (display->display, scrnum, attrib); + if (visinfo == NULL) { + GST_DEBUG ("No usable visual"); + return FALSE; + } } display->visinfo = visinfo; @@ -185,6 +204,8 @@ gst_gl_display_check_features (GstGLDisplay * display) mask = CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect; + GST_ERROR ("creating window with visual %ld", visinfo->visualid); + window = XCreateWindow (display->display, root, 0, 0, 100, 100, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr); @@ -245,8 +266,16 @@ gst_gl_display_can_handle_type (GstGLDisplay * display, GstVideoFormat type) void gst_gl_display_lock (GstGLDisplay * display) { + gboolean ret; + + g_assert (display->window != None); + g_assert (display->context != NULL); + g_mutex_lock (display->lock); - glXMakeCurrent (display->display, display->window, display->context); + ret = glXMakeCurrent (display->display, display->window, display->context); + if (!ret) { + g_warning ("glxMakeCurrent failed"); + } gst_gl_display_check_error (display, __LINE__); } @@ -265,7 +294,10 @@ gst_gl_display_init_tmp_window (GstGLDisplay * display) int scrnum; int mask; Window root; + Window parent_window; Screen *screen; + int width; + int height; GST_DEBUG ("creating temp window"); @@ -277,20 +309,29 @@ gst_gl_display_init_tmp_window (GstGLDisplay * display) attr.border_pixel = 0; attr.colormap = XCreateColormap (display->display, root, display->visinfo->visual, AllocNone); - attr.override_redirect = False; -#if 0 - if (display->parent_window) { + if (display->parent_window != None) { + XWindowAttributes parent_attr; + attr.override_redirect = True; + parent_window = display->parent_window; + + XGetWindowAttributes (display->display, parent_window, &parent_attr); + width = parent_attr.width; + height = parent_attr.height; + } else { + attr.override_redirect = False; + parent_window = root; + width = 100; + height = 100; } -#endif mask = CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect; display->window = XCreateWindow (display->display, - root, 0, 0, 100, 100, + parent_window, 0, 0, width, height, 0, display->visinfo->depth, InputOutput, display->visinfo->visual, mask, &attr); - //XMapWindow (display->display, display->window); + XMapWindow (display->display, display->window); XSync (display->display, FALSE); } @@ -305,6 +346,7 @@ gst_gl_display_set_window (GstGLDisplay * display, Window window) { g_mutex_lock (display->lock); +#if 0 if (window != display->assigned_window) { if (display->assigned_window == None) { gst_gl_display_destroy_tmp_window (display); @@ -316,6 +358,18 @@ gst_gl_display_set_window (GstGLDisplay * display, Window window) display->window = window; } } +#else + if (window != display->parent_window) { + gst_gl_display_destroy_tmp_window (display); + + display->parent_window = window; + + gst_gl_display_init_tmp_window (display); + + //XReparentWindow (display->display, display->window, + // display->assigned_window, 0, 0); + } +#endif g_mutex_unlock (display->lock); } @@ -327,6 +381,10 @@ gst_gl_display_update_attributes (GstGLDisplay * display) if (display->window != None) { XGetWindowAttributes (display->display, display->window, &attr); + + GST_DEBUG ("window visual %ld display visual %ld", + attr.visual->visualid, display->visinfo->visual->visualid); + display->win_width = attr.width; display->win_height = attr.height; } else { @@ -670,7 +728,7 @@ gst_gl_display_draw_image (GstGLDisplay * display, GstVideoFormat type, gst_gl_display_update_attributes (display); - //glXSwapIntervalSGI (1); + glXSwapIntervalSGI (1); glViewport (0, 0, display->win_width, display->win_height); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |