diff options
author | David Schleef <ds@schleef.org> | 2008-01-06 03:01:39 +0000 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2008-01-06 03:01:39 +0000 |
commit | b37e08cb29ddca72161a8098690ba52e5594153d (patch) | |
tree | a1323d58d34e815589e88792662d80e6f6ff2da3 /sys/glsink/gstgldisplay.c | |
parent | 540c7d46c5627d7c8f229756c4885dac90f77311 (diff) | |
download | gst-plugins-bad-b37e08cb29ddca72161a8098690ba52e5594153d.tar.gz gst-plugins-bad-b37e08cb29ddca72161a8098690ba52e5594153d.tar.bz2 gst-plugins-bad-b37e08cb29ddca72161a8098690ba52e5594153d.zip |
sys/glsink/: Handle xoverlay exposes correctly. This means glimagesink works correctly most of the time in totem (fu...
Original commit message from CVS:
* sys/glsink/glimagesink.c:
* sys/glsink/glimagesink.h:
* sys/glsink/gstglbuffer.h:
* sys/glsink/gstgldisplay.c:
* sys/glsink/gstgldisplay.h:
* sys/glsink/gstglupload.c:
Handle xoverlay exposes correctly. This means glimagesink works
correctly most of the time in totem (fullscreening being an
execption). Doesn't handle expose events directly to the GL
window.
Diffstat (limited to 'sys/glsink/gstgldisplay.c')
-rw-r--r-- | sys/glsink/gstgldisplay.c | 63 |
1 files changed, 53 insertions, 10 deletions
diff --git a/sys/glsink/gstgldisplay.c b/sys/glsink/gstgldisplay.c index d90e5e72..99a732e2 100644 --- a/sys/glsink/gstgldisplay.c +++ b/sys/glsink/gstgldisplay.c @@ -345,18 +345,49 @@ gst_gl_display_set_window (GstGLDisplay * display, Window window) { g_mutex_lock (display->lock); - if (window != display->parent_window) { - gst_gl_display_destroy_tmp_window (display); - + if (display->display == NULL) { display->parent_window = window; + } else { + if (window != display->parent_window) { + XSync (display->display, False); + + gst_gl_display_destroy_tmp_window (display); - gst_gl_display_init_tmp_window (display); + display->parent_window = window; + + gst_gl_display_init_tmp_window (display); + } } g_mutex_unlock (display->lock); } void +gst_gl_display_update_window (GstGLDisplay * display) +{ + XWindowAttributes attr; + + g_return_if_fail (display != NULL); + + g_mutex_lock (display->lock); + if (display->window != None && display->parent_window != None) { + XSync (display->display, False); + XGetWindowAttributes (display->display, display->parent_window, &attr); + + GST_DEBUG ("new size %d %d", attr.width, attr.height); + + if (display->win_width != attr.width || display->win_height != attr.height) { + XResizeWindow (display->display, display->window, + attr.width, attr.height); + //XSync (display->display, False); + } + display->win_width = attr.width; + display->win_height = attr.height; + } + g_mutex_unlock (display->lock); +} + +void gst_gl_display_update_attributes (GstGLDisplay * display) { XWindowAttributes attr; @@ -376,6 +407,17 @@ gst_gl_display_update_attributes (GstGLDisplay * display) } void +gst_gl_display_set_window_size (GstGLDisplay * display, int width, int height) +{ + if (display->win_width != width || display->win_height != height) { + display->win_width = width; + display->win_height = height; + XResizeWindow (display->display, display->window, width, height); + XSync (display->display, False); + } +} + +void gst_gl_display_clear (GstGLDisplay * display) { gst_gl_display_lock (display); @@ -752,7 +794,7 @@ gst_gl_display_draw_image (GstGLDisplay * display, GstVideoFormat type, void gst_gl_display_draw_texture (GstGLDisplay * display, GLuint texture, - int width, int height) + int width, int height, gboolean sync) { g_return_if_fail (width > 0); g_return_if_fail (height > 0); @@ -763,7 +805,7 @@ gst_gl_display_draw_texture (GstGLDisplay * display, GLuint texture, g_assert (display->window != None); g_assert (display->context != NULL); - gst_gl_display_update_attributes (display); + //gst_gl_display_update_attributes (display); #if 0 /* Doesn't work */ { @@ -778,10 +820,11 @@ gst_gl_display_draw_texture (GstGLDisplay * display, GLuint texture, } #endif -#if 1 - /* Doesn't work */ - glXSwapIntervalSGI (1); -#endif + if (sync) { + glXSwapIntervalSGI (1); + } else { + glXSwapIntervalSGI (0); + } glViewport (0, 0, display->win_width, display->win_height); |