summaryrefslogtreecommitdiff
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
parent46ccaf371609cf8a32753c75db5dd3eb35ae27c0 (diff)
Clean up the fbo component, fix related issues
-rw-r--r--tests/CMakeLists.txt6
-rw-r--r--tests/OffscreenContext.mm34
-rw-r--r--tests/cgalpngtest.cc6
-rw-r--r--tests/csgtestcore.cc33
-rw-r--r--tests/fbo.cc87
-rw-r--r--tests/fbo.h23
-rw-r--r--tests/fboutils.cc61
-rw-r--r--tests/fboutils.h10
-rw-r--r--tests/system-gl.h8
9 files changed, 155 insertions, 113 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 4ef7bf3..eb3e911 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -186,7 +186,7 @@ target_link_libraries(cgaltest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${QT_
#
# cgalpngtest
#
-add_executable(cgalpngtest cgalpngtest.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fboutils.cc
+add_executable(cgalpngtest cgalpngtest.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fbo.cc
../src/CGALRenderer.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc
../src/CSGTermEvaluator.cc ../src/CGALEvaluator.cc ../src/CGALCache.cc
../src/PolySetCGALEvaluator.cc ../src/qhash.cc
@@ -199,7 +199,7 @@ target_link_libraries(cgalpngtest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${
# opencsgtest
#
-add_executable(opencsgtest opencsgtest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fboutils.cc
+add_executable(opencsgtest opencsgtest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fbo.cc
../src/OpenCSGRenderer.cc ../src/ThrownTogetherRenderer.cc
../src/CSGTermEvaluator.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc
../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc
@@ -212,7 +212,7 @@ target_link_libraries(opencsgtest ${CGAL_LIBRARY} ${CGAL_3RD_PARTY_LIBRARIES} ${
# throwntogethertest
#
-add_executable(throwntogethertest throwntogethertest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fboutils.cc
+add_executable(throwntogethertest throwntogethertest.cc csgtestcore.cc OffscreenView.cc ${OFFSCREEN_CTX_SOURCE} imageutils.cc fbo.cc
../src/OpenCSGRenderer.cc ../src/ThrownTogetherRenderer.cc
../src/CSGTermEvaluator.cc ../src/CGAL_Nef_polyhedron.cc ../src/cgalutils.cc
../src/CGALEvaluator.cc ../src/CGALCache.cc ../src/PolySetCGALEvaluator.cc ../src/qhash.cc
diff --git a/tests/OffscreenContext.mm b/tests/OffscreenContext.mm
index 90af712..eb2f777 100644
--- a/tests/OffscreenContext.mm
+++ b/tests/OffscreenContext.mm
@@ -1,16 +1,19 @@
#include "OffscreenContext.h"
#include "imageutils.h"
-#include "fboutils.h"
+#include "fbo.h"
#import <AppKit/AppKit.h> // for NSOpenGL...
+
+#define REPORTGLERROR(task) { GLenum tGLErr = glGetError(); if (tGLErr != GL_NO_ERROR) { std::cout << "OpenGL error " << tGLErr << " while " << task << "\n"; } }
+
struct OffscreenContext
{
NSOpenGLContext *openGLContext;
NSAutoreleasePool *pool;
int width;
int height;
- GLuint fbo;
+ fbo_t *fbo;
};
@@ -42,15 +45,38 @@ OffscreenContext *create_offscreen_context(int w, int h)
}
[ctx->openGLContext makeCurrentContext];
+
+ glewInit();
+#ifdef DEBUG
+ cout << "GLEW version " << glewGetString(GLEW_VERSION) << "\n";
+ cout << (const char *)glGetString(GL_RENDERER) << "(" << (const char *)glGetString(GL_VENDOR) << ")\n"
+ << "OpenGL version " << (const char *)glGetString(GL_VERSION) << "\n";
+ cout << "Extensions: " << (const char *)glGetString(GL_EXTENSIONS) << "\n";
+
+
+ if (GLEW_ARB_framebuffer_object) {
+ cout << "ARB_FBO supported\n";
+ }
+ if (GLEW_EXT_framebuffer_object) {
+ cout << "EXT_FBO supported\n";
+ }
+ if (GLEW_EXT_packed_depth_stencil) {
+ cout << "EXT_packed_depth_stencil\n";
+ }
+#endif
- ctx->fbo = fbo_create(w, h);
+ ctx->fbo = fbo_new();
+ if (!fbo_init(ctx->fbo, w, h)) {
+ return NULL;
+ }
return ctx;
}
bool teardown_offscreen_context(OffscreenContext *ctx)
{
- fbo_unbind();
+ fbo_unbind(ctx->fbo);
+ fbo_delete(ctx->fbo);
/*
* Cleanup
diff --git a/tests/cgalpngtest.cc b/tests/cgalpngtest.cc
index cae5c67..638c088 100644
--- a/tests/cgalpngtest.cc
+++ b/tests/cgalpngtest.cc
@@ -181,7 +181,11 @@ int main(int argc, char **argv)
// match with csgtest ends
csgInfo.glview = new OffscreenView(512,512);
- //glewInit();
+ GLenum err = glewInit();
+ if (GLEW_OK != err) {
+ fprintf(stderr, "Unable to init GLEW: %s\n", glewGetErrorString(err));
+ exit(1);
+ }
#ifdef DEBUG
cout << "GLEW version " << glewGetString(GLEW_VERSION) << "\n";
cout << (const char *)glGetString(GL_RENDERER) << "(" << (const char *)glGetString(GL_VENDOR) << ")\n"
diff --git a/tests/csgtestcore.cc b/tests/csgtestcore.cc
index dd7830b..6ef05f3 100644
--- a/tests/csgtestcore.cc
+++ b/tests/csgtestcore.cc
@@ -1,7 +1,7 @@
// csg test core, used by throwntegether test and opencsg test
#include "csgtestcore.h"
-#include <GL/glew.h>
+#include "system-gl.h"
#include "openscad.h"
#include "handle_dep.h"
#include "builtin.h"
@@ -51,9 +51,9 @@ public:
CsgInfo::CsgInfo() {
root_norm_term = NULL;
root_chain = NULL;
- highlight_terms = vector<CSGTerm*>();
+ highlight_terms = std::vector<CSGTerm*>();
highlights_chain = NULL;
- background_terms = vector<CSGTerm*>();
+ background_terms = std::vector<CSGTerm*>();
background_chain = NULL;
glview = NULL;
}
@@ -74,7 +74,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
exit(1);
}
- const char *filename = argv[1];
+ std::string filename(argv[1]);
initialize_builtin_functions();
initialize_builtin_modules();
@@ -124,11 +124,11 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
AbstractModule *root_module;
ModuleInstantiation root_inst;
- QFileInfo fileInfo(filename);
+ QFileInfo fileInfo(filename.c_str());
handle_dep(filename);
- FILE *fp = fopen(filename, "rt");
+ FILE *fp = fopen(filename.c_str(), "rt");
if (!fp) {
- fprintf(stderr, "Can't open input file `%s'!\n", filename);
+ fprintf(stderr, "Can't open input file `%s'!\n", filename.c_str());
exit(1);
} else {
std::stringstream text;
@@ -229,25 +229,6 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
Vector3d camerapos = center - radius*1.8*cameradir;
csgInfo.glview->setCamera(camerapos, center);
- glewInit();
-#ifdef DEBUG
- cout << "GLEW version " << glewGetString(GLEW_VERSION) << "\n";
- cout << (const char *)glGetString(GL_RENDERER) << "(" << (const char *)glGetString(GL_VENDOR) << ")\n"
- << "OpenGL version " << (const char *)glGetString(GL_VERSION) << "\n";
- cout << "Extensions: " << (const char *)glGetString(GL_EXTENSIONS) << "\n";
-
-
- if (GLEW_ARB_framebuffer_object) {
- cout << "ARB_FBO supported\n";
- }
- if (GLEW_EXT_framebuffer_object) {
- cout << "EXT_FBO supported\n";
- }
- if (GLEW_EXT_packed_depth_stencil) {
- cout << "EXT_packed_depth_stencil\n";
- }
-#endif
-
OpenCSGRenderer opencsgRenderer(csgInfo.root_chain, csgInfo.highlights_chain, csgInfo.background_chain, csgInfo.glview->shaderinfo);
ThrownTogetherRenderer thrownTogetherRenderer(csgInfo.root_chain, csgInfo.highlights_chain, csgInfo.background_chain);
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);
+}
diff --git a/tests/fbo.h b/tests/fbo.h
new file mode 100644
index 0000000..1ee9007
--- /dev/null
+++ b/tests/fbo.h
@@ -0,0 +1,23 @@
+#ifndef FBO_H_
+#define FBO_H_
+
+#include "system-gl.h"
+#include <stddef.h> // size_t
+
+struct fbo_t
+{
+ GLuint fbo_id;
+ GLuint old_fbo_id;
+
+ GLuint renderbuf_id;
+ GLuint depthbuf_id;
+};
+
+fbo_t *fbo_new();
+bool fbo_init(fbo_t *fbo, size_t width, size_t height);
+bool fbo_resize(fbo_t *fbo, size_t width, size_t height);
+void fbo_delete(fbo_t *fbo);
+GLuint fbo_bind(fbo_t *fbo);
+void fbo_unbind(fbo_t *fbo);
+
+#endif
diff --git a/tests/fboutils.cc b/tests/fboutils.cc
deleted file mode 100644
index d0430df..0000000
--- a/tests/fboutils.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-#include "fboutils.h"
-#include <iostream>
-
-GLuint fbo_create(GLsizei width, GLsizei height)
-{
- // Test if framebuffer objects are supported
- // FIXME: Use GLEW
- const GLubyte* strExt = glGetString(GL_EXTENSIONS);
- GLboolean fboSupported = gluCheckExtension((const GLubyte*)"GL_EXT_framebuffer_object", strExt);
- if (!fboSupported) {
- std::cerr << "Your system does not support framebuffer extension - unable to render scene\n";
- return 0;
- }
-
- // Create an FBO
- GLuint fbo = 0;
- GLuint renderBuffer = 0;
- GLuint depthBuffer = 0;
- // Depth buffer to use for depth testing - optional if you're not using depth testing
- glGenRenderbuffersEXT(1, &depthBuffer);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBuffer);
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height);
- REPORTGLERROR("creating depth render buffer");
-
- // Render buffer to use for imaging
- glGenRenderbuffersEXT(1, &renderBuffer);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer);
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height);
- REPORTGLERROR("creating color render buffer");
- glGenFramebuffersEXT(1, &fbo);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
- REPORTGLERROR("binding framebuffer");
-
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- GL_RENDERBUFFER_EXT, renderBuffer);
- REPORTGLERROR("specifying color render buffer");
-
- if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) {
- std::cerr << "Problem with OpenGL framebuffer after specifying color render buffer.\n";
- return 0;
- }
-
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer);
- REPORTGLERROR("specifying depth render buffer");
-
- if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) {
- std::cerr << "Problem with OpenGL framebuffer after specifying depth render buffer.\n";
- return 0;
- }
- return fbo;
-}
-
-void fbo_bind(GLuint fbo)
-{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
-}
-
-void fbo_unbind()
-{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-}
diff --git a/tests/fboutils.h b/tests/fboutils.h
deleted file mode 100644
index 0e5c32e..0000000
--- a/tests/fboutils.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef FBOUTILS_H_
-#define FBOUTILS_H_
-
-#include "system-gl.h"
-
-GLuint fbo_create(GLsizei width, GLsizei height);
-void fbo_bind(GLuint fbo);
-void fbo_unbind();
-
-#endif
diff --git a/tests/system-gl.h b/tests/system-gl.h
index ddc2cf2..0f983cf 100644
--- a/tests/system-gl.h
+++ b/tests/system-gl.h
@@ -1,14 +1,6 @@
#ifndef SYSTEMGL_H_
#define SYSTEMGL_H_
-#ifdef __APPLE__
-#include <OpenGL/OpenGL.h>
-#include <OpenGL/glu.h> // for gluCheckExtension
-#else
#include <GL/glew.h>
-#include <GL/gl.h>
-#endif
-
-#define REPORTGLERROR(task) { GLenum tGLErr = glGetError(); if (tGLErr != GL_NO_ERROR) { std::cout << "OpenGL error " << tGLErr << " while " << task << "\n"; } }
#endif
contact: Jan Huwald // Impressum