From: David Schleef Date: Sat, 22 Dec 2007 05:01:57 +0000 (+0000) Subject: [041/906] * sys/glsink/glextensions.c: * sys/glsink/glextensions.h: * sys/glsink... X-Git-Tag: 1.19.3~511^2~1989^2~2212 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c4a58e40e1e5173b969706fdc763dbaf9dc02f42;p=platform%2Fupstream%2Fgstreamer.git [041/906] * 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. --- diff --git a/gst-libs/gst/gl/glextensions.c b/gst-libs/gst/gl/glextensions.c index 6c48e8b..6926a97 100644 --- a/gst-libs/gst/gl/glextensions.c +++ b/gst-libs/gst/gl/glextensions.c @@ -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)); diff --git a/gst-libs/gst/gl/glextensions.h b/gst-libs/gst/gl/glextensions.h index 48161c4..7ef0186 100644 --- a/gst-libs/gst/gl/glextensions.h +++ b/gst-libs/gst/gl/glextensions.h @@ -54,5 +54,7 @@ void glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum pname, GLint *params); void glGenerateMipmapEXT (GLenum target); +void glWindowPos2iARB (GLint x, GLint y); + #endif diff --git a/gst-libs/gst/gl/gstglbuffer.c b/gst-libs/gst/gl/gstglbuffer.c index 04421ce..da4093d 100644 --- a/gst-libs/gst/gl/gstglbuffer.c +++ b/gst-libs/gst/gl/gstglbuffer.c @@ -5,6 +5,8 @@ #include #include +#include +#include #include "glextensions.h" #include @@ -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);