summaryrefslogtreecommitdiff
path: root/tests/fbo.cc
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2011-10-04 21:24:32 (GMT)
committerMarius Kintel <marius@kintel.net>2011-10-04 21:24:32 (GMT)
commit6395435db71d279a83ea4a484fd13a3cf913d593 (patch)
tree2ab4e0ceeea7d5fac2589dfc3ab3e105d59d8332 /tests/fbo.cc
parent46ccaf371609cf8a32753c75db5dd3eb35ae27c0 (diff)
Clean up the fbo component, fix related issues
Diffstat (limited to 'tests/fbo.cc')
-rw-r--r--tests/fbo.cc87
1 files changed, 87 insertions, 0 deletions
diff --git a/tests/fbo.cc b/tests/fbo.cc
new file mode 100644
index 0000000..2c7abb4
--- /dev/null
+++ b/tests/fbo.cc
@@ -0,0 +1,87 @@
+#include "fbo.h"
+#include <stdio.h>
+#include <iostream>
+
+fbo_t *fbo_new()
+{
+ fbo_t *fbo = new fbo_t;
+ fbo->fbo_id = 0;
+ fbo->old_fbo_id = 0;
+ fbo->renderbuf_id = 0;
+ fbo->depthbuf_id = 0;
+
+ return fbo;
+}
+
+#define REPORTGLERROR(task) { GLenum tGLErr = glGetError(); if (tGLErr != GL_NO_ERROR) { std::cout << "OpenGL error " << tGLErr << " while " << task << "\n"; } }
+
+bool fbo_init(fbo_t *fbo, size_t width, size_t height)
+{
+ if (!glewIsSupported("GL_ARB_framebuffer_object")) {
+ fprintf(stderr, "Framebuffer extension not found\n");
+ return false;
+ }
+
+ // Generate and bind FBO
+ glGenFramebuffersEXT(1, &fbo->fbo_id);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->fbo_id);
+ REPORTGLERROR("binding framebuffer");
+
+ // Generate depth and render buffers
+ glGenRenderbuffersEXT(1, &fbo->depthbuf_id);
+ glGenRenderbuffersEXT(1, &fbo->renderbuf_id);
+
+ // Create buffers with correct size
+ if (!fbo_resize(fbo, width, height)) return false;
+
+ // Attach render and depth buffers
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+ GL_RENDERBUFFER_EXT, fbo->renderbuf_id);
+ REPORTGLERROR("specifying color render buffer");
+
+ if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ fprintf(stderr, "Problem with OpenGL framebuffer after specifying color render buffer.\n");
+ return false;
+ }
+
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, fbo->depthbuf_id);
+ REPORTGLERROR("specifying depth render buffer");
+
+ if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ fprintf(stderr, "Problem with OpenGL framebuffer after specifying depth render buffer.\n");
+ return false;
+ }
+
+ return true;
+}
+
+bool fbo_resize(fbo_t *fbo, size_t width, size_t height)
+{
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo->depthbuf_id);
+ glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height);
+ REPORTGLERROR("creating depth render buffer");
+
+ glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo->renderbuf_id);
+ glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height);
+ REPORTGLERROR("creating color render buffer");
+
+ return true;
+}
+
+void fbo_delete(fbo_t *fbo)
+{
+ delete fbo;
+}
+
+GLuint fbo_bind(fbo_t *fbo)
+{
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *)&fbo->old_fbo_id);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->fbo_id);
+ return fbo->old_fbo_id;
+}
+
+void fbo_unbind(fbo_t *fbo)
+{
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->old_fbo_id);
+}
contact: Jan Huwald // Impressum