diff options
| author | Marius Kintel <marius@kintel.net> | 2011-10-04 21:24:32 (GMT) | 
|---|---|---|
| committer | Marius Kintel <marius@kintel.net> | 2011-10-04 21:24:32 (GMT) | 
| commit | 6395435db71d279a83ea4a484fd13a3cf913d593 (patch) | |
| tree | 2ab4e0ceeea7d5fac2589dfc3ab3e105d59d8332 /tests | |
| parent | 46ccaf371609cf8a32753c75db5dd3eb35ae27c0 (diff) | |
Clean up the fbo component, fix related issues
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | tests/OffscreenContext.mm | 34 | ||||
| -rw-r--r-- | tests/cgalpngtest.cc | 6 | ||||
| -rw-r--r-- | tests/csgtestcore.cc | 33 | ||||
| -rw-r--r-- | tests/fbo.cc | 87 | ||||
| -rw-r--r-- | tests/fbo.h | 23 | ||||
| -rw-r--r-- | tests/fboutils.cc | 61 | ||||
| -rw-r--r-- | tests/fboutils.h | 10 | ||||
| -rw-r--r-- | tests/system-gl.h | 8 | 
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 | 
