libgstgl: eagl: handle CALayer resize
authorAlessandro Decina <alessandro.d@gmail.com>
Tue, 24 Feb 2015 03:23:49 +0000 (14:23 +1100)
committerAlessandro Decina <alessandro.d@gmail.com>
Tue, 24 Feb 2015 03:23:49 +0000 (14:23 +1100)
gst-libs/gst/gl/eagl/gstglcontext_eagl.h
gst-libs/gst/gl/eagl/gstglcontext_eagl.m
gst-libs/gst/gl/eagl/gstglwindow_eagl.m

index fca51772a2b71efdd401a6932f9b0a3b4928980b..b621b3504bb2bbaaec0372b7d4753a2866e5d26d 100644 (file)
@@ -59,6 +59,7 @@ GType gst_gl_context_eagl_get_type (void);
 
 GstGLContextEagl * gst_gl_context_eagl_new (void);
 
+void gst_gl_context_eagl_resize (GstGLContextEagl * eagl_context);
 void gst_gl_context_eagl_prepare_draw (GstGLContextEagl * context);
 void gst_gl_context_eagl_finish_draw (GstGLContextEagl * context);
 guintptr gst_gl_context_eagl_get_current_context (void);
index ab8691277343cd38e462c38b5639e3aab44717db..e01fa62169ad8043caa4e5a6cf656ad80e4fd06d 100644 (file)
@@ -99,6 +99,22 @@ gst_gl_context_eagl_new (void)
   return context;
 }
 
+void
+gst_gl_context_eagl_resize (GstGLContextEagl * eagl_context)
+{
+  int width, height;
+
+  glBindRenderbuffer (GL_RENDERBUFFER, eagl_context->priv->color_renderbuffer);
+  [eagl_context->priv->eagl_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:eagl_context->priv->eagl_layer];
+  glGetRenderbufferParameteriv (GL_RENDERBUFFER,
+      GL_RENDERBUFFER_WIDTH, &width);
+  glGetRenderbufferParameteriv (GL_RENDERBUFFER,
+      GL_RENDERBUFFER_HEIGHT, &height);
+  glBindRenderbuffer (GL_RENDERBUFFER, eagl_context->priv->depth_renderbuffer);
+  glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width,
+      height);
+}
+
 static gboolean
 gst_gl_context_eagl_create_context (GstGLContext * context, GstGLAPI gl_api,
     GstGLContext * other_context, GError ** error)
index c54c7bc26ecfd118aa374911f22f65679af5e6d5..edb0cb4c8b52924d41906b178c8914c0638af8be 100644 (file)
@@ -244,14 +244,17 @@ draw_cb (gpointer data)
     eagl_layer = (CAEAGLLayer *)[window_eagl->priv->view layer];
     size = eagl_layer.frame.size;
 
-    if (window_eagl->priv->window_width != window_eagl->priv->preferred_width ||
-        window_eagl->priv->window_height != window_eagl->priv->preferred_height) {
-      window_eagl->priv->window_width = window_eagl->priv->preferred_width;
-      window_eagl->priv->window_height = window_eagl->priv->preferred_height;
+    if (window_eagl->priv->window_width != size.width ||
+        window_eagl->priv->window_height != size.height) {
+
+      window_eagl->priv->window_width = size.width;
+      window_eagl->priv->window_height = size.height;
+
+      gst_gl_context_eagl_resize (eagl_context);
 
       if (window->resize)
-        window->resize (window->resize_data, window_eagl->priv->preferred_width,
-            window_eagl->priv->preferred_height);
+        window->resize (window->resize_data, window_eagl->priv->window_width,
+            window_eagl->priv->window_height);
     }
   }