diff options
author | David Schleef <ds@schleef.org> | 2007-12-22 05:01:58 +0000 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2007-12-22 05:01:58 +0000 |
commit | 11b0b3dd23e7f44adeea7639a515f6d00f96df82 (patch) | |
tree | 63e4a96e8f99635b5d82dbc95c059455c659bbf0 /sys/glsink/gstglbuffer.c | |
parent | 21962cbffe8d7255726b34bfc3a773ffcc3fa43b (diff) | |
download | gst-plugins-bad-11b0b3dd23e7f44adeea7639a515f6d00f96df82.tar.gz gst-plugins-bad-11b0b3dd23e7f44adeea7639a515f6d00f96df82.tar.bz2 gst-plugins-bad-11b0b3dd23e7f44adeea7639a515f6d00f96df82.zip |
sys/glsink/: A careful read of the documentation reveals that I can't use renderbuffers as textures. Duh. Checkpoin...
Original commit message from CVS:
* sys/glsink/glextensions.c:
* sys/glsink/glextensions.h:
* sys/glsink/glvideo.c:
* sys/glsink/glvideo.h:
* sys/glsink/gstglbuffer.c:
* sys/glsink/gstgldownload.c:
* sys/glsink/gstglupload.c:
A careful read of the documentation reveals that I can't use
renderbuffers as textures. Duh. Checkpoint because I'm about
to rewrite a bunch of code.
Diffstat (limited to 'sys/glsink/gstglbuffer.c')
-rw-r--r-- | sys/glsink/gstglbuffer.c | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/sys/glsink/gstglbuffer.c b/sys/glsink/gstglbuffer.c index 04421ce7..da4093d4 100644 --- a/sys/glsink/gstglbuffer.c +++ b/sys/glsink/gstglbuffer.c @@ -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); |