summaryrefslogtreecommitdiffstats
path: root/sys/glsink/glvideo.c
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2007-12-22 05:01:58 +0000
committerDavid Schleef <ds@schleef.org>2007-12-22 05:01:58 +0000
commit11b0b3dd23e7f44adeea7639a515f6d00f96df82 (patch)
tree63e4a96e8f99635b5d82dbc95c059455c659bbf0 /sys/glsink/glvideo.c
parent21962cbffe8d7255726b34bfc3a773ffcc3fa43b (diff)
downloadgst-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/glvideo.c')
-rw-r--r--sys/glsink/glvideo.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/sys/glsink/glvideo.c b/sys/glsink/glvideo.c
index f7328153..8bc8f9f0 100644
--- a/sys/glsink/glvideo.c
+++ b/sys/glsink/glvideo.c
@@ -247,11 +247,13 @@ gst_gl_display_lock (GstGLDisplay * display)
{
g_mutex_lock (display->lock);
glXMakeCurrent (display->display, display->window, display->context);
+ gst_gl_display_check_error (display, __LINE__);
}
void
gst_gl_display_unlock (GstGLDisplay * display)
{
+ gst_gl_display_check_error (display, __LINE__);
glXMakeCurrent (display->display, None, NULL);
g_mutex_unlock (display->lock);
}
@@ -346,6 +348,17 @@ gst_gl_display_clear (GstGLDisplay * display)
gst_gl_display_unlock (display);
}
+void
+gst_gl_display_check_error (GstGLDisplay * display, int line)
+{
+ GLenum err = glGetError ();
+
+ if (err) {
+ GST_ERROR ("GL Error 0x%x at line %d", (int) err, line);
+ g_assert (0);
+ }
+}
+
static void
@@ -629,3 +642,103 @@ gst_gl_display_draw_image (GstGLDisplay * display, GstGLImageType type,
gst_gl_display_unlock (display);
}
+
+void
+gst_gl_display_draw_rbo (GstGLDisplay * display, GLuint rbo,
+ int width, int height)
+{
+ GLuint texture;
+ GLuint fbo;
+
+ g_return_if_fail (width > 0);
+ g_return_if_fail (height > 0);
+ g_return_if_fail (rbo != None);
+
+ gst_gl_display_lock (display);
+
+ g_assert (display->window != None);
+ g_assert (display->context != NULL);
+
+ gst_gl_display_update_attributes (display);
+
+ glViewport (0, 0, display->win_width, display->win_height);
+
+ glClearColor (0.3, 0.3, 0.3, 1.0);
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+
+ glDisable (GL_CULL_FACE);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ glColor4f (1, 1, 1, 1);
+
+ glGenFramebuffersEXT (1, &fbo);
+ glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fbo);
+
+ glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rbo);
+
+ glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT);
+ glReadBuffer (GL_COLOR_ATTACHMENT0_EXT);
+
+ g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
+ GL_FRAMEBUFFER_COMPLETE_EXT);
+
+#if 1
+ {
+ void *buffer;
+
+ buffer = malloc (320 * 240 * 4);
+ memset (buffer, random (), 320 * 240 * 4);
+ free (buffer);
+ }
+#endif
+
+ glEnable (GL_TEXTURE_RECTANGLE_ARB);
+ glGenTextures (1, &texture);
+ glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture);
+ glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, width, height, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB, texture, 0);
+
+ glDrawBuffer (0);
+ glReadBuffer (0);
+ glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
+ glColor4f (1, 0, 1, 1);
+ gst_gl_display_check_error (display, __LINE__);
+//glBindTexture (GL_TEXTURE_RECTANGLE_ARB, 0);
+ glBegin (GL_QUADS);
+
+ glNormal3f (0, 0, -1);
+
+ glTexCoord2f (width, 0);
+ glVertex3f (0.9, 0.9, 0);
+ glTexCoord2f (0, 0);
+ glVertex3f (-0.9, 0.9, 0);
+ glTexCoord2f (0, height);
+ glVertex3f (-0.9, -0.9, 0);
+ glTexCoord2f (width, height);
+ glVertex3f (0.9, -0.9, 0);
+ glEnd ();
+ gst_gl_display_check_error (display, __LINE__);
+ glDeleteTextures (1, &texture);
+
+ glDeleteFramebuffersEXT (1, &fbo);
+ gst_gl_display_check_error (display, __LINE__);
+
+ glXSwapBuffers (display->display, display->window);
+
+ gst_gl_display_unlock (display);
+}