[041/906] * sys/glsink/glextensions.c: * sys/glsink/glextensions.h: * sys/glsink...
authorDavid Schleef <ds@schleef.org>
Sat, 22 Dec 2007 05:01:57 +0000 (05:01 +0000)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:15 +0000 (19:31 +0000)
gst-libs/gst/gl/glextensions.c
gst-libs/gst/gl/glextensions.h
gst-libs/gst/gl/gstglbuffer.c

index 6c48e8b..6926a97 100644 (file)
@@ -179,3 +179,5 @@ DEFINE_FUNC (glFramebufferRenderbufferEXT, (GLenum target, GLenum attachment,
 DEFINE_FUNC (glGetFramebufferAttachmentParameterivEXT, (GLenum target,
         GLenum pname, GLint * params), (target, pname, params));
 DEFINE_FUNC (glGenerateMipmapEXT, (GLenum target), (target));
+
+DEFINE_FUNC (glWindowPos2iARB, (GLint x, GLint y), (x, y));
index 48161c4..7ef0186 100644 (file)
@@ -54,5 +54,7 @@ void glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum pname,
     GLint *params);
 void glGenerateMipmapEXT (GLenum target);
 
+void glWindowPos2iARB (GLint x, GLint y);
+
 #endif
 
index 04421ce..da4093d 100644 (file)
@@ -5,6 +5,8 @@
 
 #include <gstglbuffer.h>
 #include <glvideo.h>
+#include <GL/glext.h>
+#include <unistd.h>
 #include "glextensions.h"
 
 #include <string.h>
@@ -86,7 +88,7 @@ gst_gl_buffer_new (GstGLDisplay * display, GstVideoFormat format,
   GstGLBuffer *buffer;
   XGCValues values = { 0 };
 
-  g_return_val_if_fail (format == GST_VIDEO_FORMAT_BGRx, NULL);
+  g_return_val_if_fail (format == GST_VIDEO_FORMAT_RGB, NULL);
   g_return_val_if_fail (width > 0, NULL);
   g_return_val_if_fail (height > 0, NULL);
 
@@ -112,17 +114,35 @@ gst_gl_buffer_new (GstGLDisplay * display, GstVideoFormat format,
     }
     case GST_GL_BUFFER_RBO:
     {
+      GLuint fbo;
+
       gst_gl_display_lock (buffer->display);
 
+      glGenFramebuffersEXT (1, &fbo);
+      glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fbo);
+
       glGenRenderbuffersEXT (1, &buffer->rbo);
+      gst_gl_display_check_error (buffer->display, __LINE__);
       glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, buffer->rbo);
+      gst_gl_display_check_error (buffer->display, __LINE__);
 
       glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT,
           GL_COLOR_ATTACHMENT1_EXT, GL_RENDERBUFFER_EXT, buffer->rbo);
+      gst_gl_display_check_error (buffer->display, __LINE__);
       glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_RGB,
           buffer->width, buffer->height);
+      gst_gl_display_check_error (buffer->display, __LINE__);
 
+      glDrawBuffer (GL_COLOR_ATTACHMENT1_EXT);
+      glReadBuffer (GL_COLOR_ATTACHMENT1_EXT);
+      {
+        GLint status;
 
+        status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT);
+        g_assert (status == GL_FRAMEBUFFER_COMPLETE_EXT);
+      }
+
+      glDeleteFramebuffersEXT (1, &fbo);
 
       gst_gl_display_unlock (buffer->display);
       break;
@@ -170,6 +190,8 @@ gst_gl_buffer_upload (GstGLBuffer * buffer, void *data)
     {
       unsigned int fbo;
 
+      g_assert (glIsRenderbufferEXT (buffer->rbo));
+
       glGenFramebuffersEXT (1, &fbo);
       glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fbo);
 
@@ -177,11 +199,40 @@ gst_gl_buffer_upload (GstGLBuffer * buffer, void *data)
           GL_COLOR_ATTACHMENT1_EXT, GL_RENDERBUFFER_EXT, buffer->rbo);
 
       glDrawBuffer (GL_COLOR_ATTACHMENT1_EXT);
-      //glWindowPos2iARB(0, 0);
-      glDrawPixels (buffer->width, buffer->height, GL_RGBA,
+      glReadBuffer (GL_COLOR_ATTACHMENT1_EXT);
+
+      g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
+          GL_FRAMEBUFFER_COMPLETE_EXT);
+
+#if 0
+      {
+        void *newdata;
+
+        /* FIXME: Some timing issue causes this to work.  Note that
+         * we're not actually using the copied buffer. */
+
+        gst_gl_display_check_error (buffer->display, __LINE__);
+        glWindowPos2iARB (0, 0);
+        glDrawPixels (buffer->width, buffer->height, GL_RGB,
+            GL_UNSIGNED_BYTE, data);
+
+        newdata = malloc (4 * buffer->width * buffer->height);
+        //memcpy (newdata, data, 1*buffer->width*buffer->height);
+        memset (newdata, 255, 3 * buffer->width * buffer->height);
+        free (newdata);
+      }
+#else
+      gst_gl_display_check_error (buffer->display, __LINE__);
+      glWindowPos2iARB (0, 0);
+      glDrawPixels (buffer->width, buffer->height, GL_RGB,
           GL_UNSIGNED_BYTE, data);
+#endif
+      gst_gl_display_check_error (buffer->display, __LINE__);
 
       glDeleteFramebuffersEXT (1, &fbo);
+      gst_gl_display_check_error (buffer->display, __LINE__);
+
+      g_assert (glIsRenderbufferEXT (buffer->rbo));
 
       break;
     }
@@ -223,8 +274,13 @@ gst_gl_buffer_download (GstGLBuffer * buffer, void *data)
       glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT,
           GL_COLOR_ATTACHMENT1_EXT, GL_RENDERBUFFER_EXT, buffer->rbo);
 
+      glDrawBuffer (GL_COLOR_ATTACHMENT1_EXT);
       glReadBuffer (GL_COLOR_ATTACHMENT1_EXT);
-      glReadPixels (0, 0, buffer->width, buffer->height, GL_RGBA,
+
+      g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
+          GL_FRAMEBUFFER_COMPLETE_EXT);
+
+      glReadPixels (0, 0, buffer->width, buffer->height / 2, GL_RGBA,
           GL_UNSIGNED_BYTE, data);
 
       glDeleteFramebuffersEXT (1, &fbo);