diff --git a/examples/osgmemorytest/osgmemorytest.cpp b/examples/osgmemorytest/osgmemorytest.cpp index e6e861bdf..349bc54f8 100644 --- a/examples/osgmemorytest/osgmemorytest.cpp +++ b/examples/osgmemorytest/osgmemorytest.cpp @@ -29,101 +29,54 @@ class MemoryTest : public osg::Referenced public: }; +class GLObject : public osg::Referenced +{ + public: + virtual void apply(osg::State& state) = 0; +}; + class GLMemoryTest : public MemoryTest { public: - virtual void allocate(osg::State& state) = 0; + virtual GLObject* allocate() = 0; }; +///////////////////////////////////////////////////////////////////////// +// +// Context test class ContextTest : public MemoryTest { public: - virtual osg::GraphicsContext* allocate() = 0; -}; - -///////////////////////////////////////////////////////////////////////// -// -// PBuffer test -class PBufferTest : public ContextTest -{ - public: - PBufferTest(int width, int height): + ContextTest(int width, int height, bool pbuffer): _width(width), - _height(height) {} + _height(height), + _pbuffer(pbuffer) {} - virtual bool requiresContext() { return false; } - virtual osg::GraphicsContext* allocate() - { - osg::ref_ptr traits = new osg::GraphicsContext::Traits; - traits->width = _width; - traits->height = _height; - traits->pbuffer = true; - - osg::ref_ptr pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get()); - if (pbuffer.valid()) - { - if (pbuffer->realize()) - { - pbuffer->makeCurrent(); - pbuffer->releaseContext(); - - return pbuffer.release(); - } - else - { - throw "Failed to realize Pixelbuffer"; - } - } - else - { - throw "Failed to created PixelBuffer"; - } - return 0; - } - - - protected: - - int _width; - int _height; -}; - -///////////////////////////////////////////////////////////////////////// -// -// Window test -class WindowTest : public ContextTest -{ - public: - WindowTest(int width, int height): - _width(width), - _height(height) {} - - virtual bool requiresContext() { return false; } virtual osg::GraphicsContext* allocate() { osg::ref_ptr traits = new osg::GraphicsContext::Traits; traits->width = _width; traits->height = _height; traits->windowDecoration = true; + traits->pbuffer = _pbuffer; osg::ref_ptr window = osg::GraphicsContext::createGraphicsContext(traits.get()); if (window.valid()) { if (window->realize()) { - window->makeCurrent(); - window->releaseContext(); - return window.release(); } else { - throw "Failed to realize GraphicsWindow"; + if (_pbuffer) throw "Failed to realize PixelBuffer"; + else throw "Failed to realize GraphicsWindow"; } } else { - throw "Failed to created GraphicsWindow"; + if (_pbuffer) throw "Failed to create PixelBuffer"; + else throw "Failed to create GraphicsWindow"; } return 0; } @@ -133,23 +86,44 @@ class WindowTest : public ContextTest int _width; int _height; + bool _pbuffer; }; +//////////////////////////////////////////////////////////////////////// +// +// Wrap StateAttribute +class StateAttributeObject : public GLObject +{ + public: + + StateAttributeObject(osg::StateAttribute* sa): _attribute(sa) {} + + void apply(osg::State& state) + { + _attribute->apply(state); + + if (state.checkGLErrors(_attribute.get())) + { + throw "OpenGL error"; + } + } + + osg::ref_ptr _attribute; +}; ///////////////////////////////////////////////////////////////////////// // -// Window test +// Texture test class TextureTest : public GLMemoryTest { public: + TextureTest(int width=1, int height=1, int depth=1): _width(width), _height(height), _depth(depth) {} - virtual bool requiresContext() { return true; } - - virtual void allocate(osg::State& state) + virtual GLObject* allocate() { if (_depth>1) { @@ -158,11 +132,9 @@ class TextureTest : public GLMemoryTest osg::ref_ptr texture = new osg::Texture3D; texture->setImage(image.get()); + texture->setResizeNonPowerOfTwoHint(false); - texture->apply(state); - - _textures.push_back(texture.get()); - + return new StateAttributeObject(texture.get()); } if (_height>1) { @@ -171,10 +143,9 @@ class TextureTest : public GLMemoryTest osg::ref_ptr texture = new osg::Texture2D; texture->setImage(image.get()); + texture->setResizeNonPowerOfTwoHint(false); - texture->apply(state); - - _textures.push_back(texture.get()); + return new StateAttributeObject(texture.get()); } if (_width>1) { @@ -183,27 +154,50 @@ class TextureTest : public GLMemoryTest osg::ref_ptr texture = new osg::Texture1D; texture->setImage(image.get()); + texture->setResizeNonPowerOfTwoHint(false); - texture->apply(state); - - _textures.push_back(texture.get()); + return new StateAttributeObject(texture.get()); } else { - throw "Invalid texture size of 0,0,0."; + throw "Invalid texture size of 0,0,0"; } - + return 0; } protected: - virtual ~TextureTest() + int _width; + int _height; + int _depth; +}; + +///////////////////////////////////////////////////////////////////////// +// +// Texture test +class FboTest : public GLMemoryTest +{ + public: + + FboTest(int width=1024, int height=1024, int depth=2): + _width(width), + _height(height), + _depth(depth) {} + + virtual GLObject* allocate() { + osg::ref_ptr fbo = new osg::FrameBufferObject; + + if (_depth>=1) fbo->setAttachment(osg::Camera::COLOR_BUFFER, osg::FrameBufferAttachment(new osg::RenderBuffer(_width, _height, GL_RGBA))); + if (_depth>=2) fbo->setAttachment(osg::Camera::DEPTH_BUFFER, osg::FrameBufferAttachment(new osg::RenderBuffer(_width, _height, GL_DEPTH_COMPONENT24))); + + return new StateAttributeObject(fbo.get()); } - typedef std::list< osg::ref_ptr > Textures; - Textures _textures; + + protected: + int _width; int _height; int _depth; @@ -217,17 +211,21 @@ int main( int argc, char **argv ) Tests tests; int width, height, depth; - while(arguments.read("--pbuffer",width,height)) { tests.push_back(new PBufferTest(width,height)); } - while(arguments.read("--pbuffer")) { tests.push_back(new PBufferTest(1024,1024)); } + while(arguments.read("--pbuffer",width,height)) { tests.push_back(new ContextTest(width, height, true)); } + while(arguments.read("--pbuffer")) { tests.push_back(new ContextTest(512, 512, true)); } - while(arguments.read("--window",width,height)) { tests.push_back(new WindowTest(width,height)); } - while(arguments.read("--window")) { tests.push_back(new WindowTest(1024,1024)); } + while(arguments.read("--window",width,height)) { tests.push_back(new ContextTest(width, height, false)); } + while(arguments.read("--window")) { tests.push_back(new ContextTest(512,512, false)); } while(arguments.read("--texture",width,height,depth)) { tests.push_back(new TextureTest(width,height,depth)); } while(arguments.read("--texture",width,height)) { tests.push_back(new TextureTest(width,height,1)); } while(arguments.read("--texture",width)) { tests.push_back(new TextureTest(width,1,1)); } - int maxNumContextIterations = 1000; + while(arguments.read("--fbo",width,height,depth)) { tests.push_back(new FboTest(width,height,depth)); } + while(arguments.read("--fbo",width,height)) { tests.push_back(new FboTest(width,height,2)); } + while(arguments.read("--fbo")) { tests.push_back(new FboTest(1024,1024,2)); } + + int maxNumContextIterations = 1; while(arguments.read("-c",maxNumContextIterations)) {} int maxNumGLIterations = 1000; @@ -236,7 +234,6 @@ int main( int argc, char **argv ) typedef std::list< osg::ref_ptr > GLMemoryTests; typedef std::list< osg::ref_ptr > ContextTests; - ContextTests contextTests; GLMemoryTests glMemoryTests; @@ -257,11 +254,26 @@ int main( int argc, char **argv ) } typedef std::list< osg::ref_ptr > Contexts; + typedef std::list< osg::ref_ptr > GLObjects; Contexts allocatedContexts; + GLObjects glObjects; int numContextIterations = 0; + int numGLObjectIterations = 0; + int numGLObjectsApplied = 0; try { + for(; numGLObjectIterations glObject = (*itr)->allocate(); + if (glObject.valid()) glObjects.push_back(glObject.get()); + } + } + for(;numContextIterations context = (*itr)->allocate(); if (context.valid()) { - context->makeCurrent(); - context->releaseContext(); - allocatedContexts.push_back(context); + + context->makeCurrent(); + + for(GLObjects::iterator gitr = glObjects.begin(); + gitr != glObjects.end(); + ++gitr) + { + (*gitr)->apply(*(context->getState())); + ++numGLObjectsApplied; + } + + context->releaseContext(); } } } } catch(const char* errorString) { - printf("Exception caught, number of iterations completed = %i, error = %s\n",numContextIterations, errorString); + printf("Exception caught, contexts completed = %i, gl objects successfully applied =%i, error = %s\n",numContextIterations, numGLObjectsApplied, errorString); return 1; } catch(...) { - printf("Exception caught, number of iterations completed = %i\n",numContextIterations); + printf("Exception caught, contexts completed = %i, gl objects successfully applied =%i\n",numContextIterations, numGLObjectsApplied); return 1; } - printf("Successful completion, number of iterations completed = %i\n",numContextIterations); + printf("Successful completion, contexts created = %i, gl objects applied =%i\n",numContextIterations, numGLObjectsApplied); return 0; }