diff --git a/examples/osgscreencapture/osgscreencapture.cpp b/examples/osgscreencapture/osgscreencapture.cpp index 1be926d20..36014137a 100644 --- a/examples/osgscreencapture/osgscreencapture.cpp +++ b/examples/osgscreencapture/osgscreencapture.cpp @@ -137,9 +137,9 @@ class WindowCaptureCallback : public osg::Camera::DrawCallback void read() { - osg::GLBufferObject::Extensions* ext = osg::GLBufferObject::getExtensions(_gc->getState()->getContextID(),true); + osg::GL2Extensions* ext = osg::GL2Extensions::Get(_gc->getState()->getContextID(),true); - if (ext->isPBOSupported() && !_pboBuffer.empty()) + if (ext->isPBOSupported && !_pboBuffer.empty()) { if (_pboBuffer.size()==1) { @@ -158,9 +158,9 @@ class WindowCaptureCallback : public osg::Camera::DrawCallback void readPixels(); - void singlePBO(osg::GLBufferObject::Extensions* ext); + void singlePBO(osg::GL2Extensions* ext); - void multiPBO(osg::GLBufferObject::Extensions* ext); + void multiPBO(osg::GL2Extensions* ext); typedef std::vector< osg::ref_ptr > ImageBuffer; typedef std::vector< GLuint > PBOBuffer; @@ -325,7 +325,7 @@ void WindowCaptureCallback::ContextData::readPixels() _currentPboIndex = nextPboIndex; } -void WindowCaptureCallback::ContextData::singlePBO(osg::GLBufferObject::Extensions* ext) +void WindowCaptureCallback::ContextData::singlePBO(osg::GL2Extensions* ext) { // std::cout<<"singelPBO( "<<_fileName<<" image "<<_currentImageIndex<<" "<<_currentPboIndex< +#include #include #include #include @@ -248,7 +249,7 @@ class OSG_EXPORT GLBufferObject : public Referenced void assign(BufferObject* bufferObject); - bool isPBOSupported() const { return _extensions->isPBOSupported(); } + bool isPBOSupported() const { return _extensions->isPBOSupported; } static GLBufferObject* createGLBufferObject(unsigned int contextID, const BufferObject* bufferObject); @@ -258,7 +259,7 @@ class OSG_EXPORT GLBufferObject : public Referenced static void discardAllDeletedBufferObjects(unsigned int contextID); static void flushDeletedBufferObjects(unsigned int contextID,double currentTime, double& availbleTime); static void releaseGLBufferObject(unsigned int contextID, GLBufferObject* to); - +#if 0 /** Extensions class which encapsulates the querying of extensions and * associated function pointers, and provide convenience wrappers to * check for the extensions or use the associated functions.*/ @@ -343,6 +344,7 @@ class OSG_EXPORT GLBufferObject : public Referenced * typically used when you have different extensions supported across graphics pipes * but need to ensure that they all use the same low common denominator extensions.*/ static void setExtensions(unsigned int contextID,Extensions* extensions); +#endif bool hasAllBufferDataBeenRead() const; @@ -380,7 +382,7 @@ class OSG_EXPORT GLBufferObject : public Referenced unsigned int _frameLastUsed; public: - Extensions* _extensions; + GL2Extensions* _extensions; }; diff --git a/include/osg/GL2Extensions b/include/osg/GL2Extensions index b4223a326..995036967 100644 --- a/include/osg/GL2Extensions +++ b/include/osg/GL2Extensions @@ -719,10 +719,29 @@ class OSG_EXPORT GL2Extensions : public osg::Referenced void (GL_APIENTRY * glGetActiveAtomicCounterBufferiv)( GLuint program, GLuint bufferIndex, GLenum pname, GLint* params ); void (GL_APIENTRY * glDispatchCompute)( GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ ); + // Buffer Object extensions + bool isBufferObjectSupported; + bool isPBOSupported; + bool isTBOSupported; + + void (GL_APIENTRY * glGenBuffers) (GLsizei n, GLuint *buffers); + void (GL_APIENTRY * glBindBuffer) (GLenum target, GLuint buffer); + void (GL_APIENTRY * glBufferData) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); + void (GL_APIENTRY * glBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); + void (GL_APIENTRY * glDeleteBuffers) (GLsizei n, const GLuint *buffers); + GLboolean (GL_APIENTRY * glIsBuffer) (GLuint buffer); + void (GL_APIENTRY * glGetBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); + GLvoid* (GL_APIENTRY * glMapBuffer) (GLenum target, GLenum access); + GLvoid* (GL_APIENTRY * glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + GLboolean (GL_APIENTRY * glUnmapBuffer) (GLenum target); + void (GL_APIENTRY * glGetBufferParameteriv) (GLenum target, GLenum pname, GLint *params); + void (GL_APIENTRY * glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid* *params); + void (GL_APIENTRY * glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + void (GL_APIENTRY * glBindBufferBase) (GLenum target, GLuint index, GLuint buffer); + void (GL_APIENTRY * glTexBuffer) (GLenum target, GLenum internalFormat, GLuint buffer); + void (GL_APIENTRY * glMemoryBarrier)( GLbitfield barriers ); - GLvoid* (GL_APIENTRY * glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - void (GL_APIENTRY * glBindBufferBase)(GLenum target, GLuint index, GLuint buffer); }; } diff --git a/include/osg/TextureBuffer b/include/osg/TextureBuffer index ef067a202..845358771 100644 --- a/include/osg/TextureBuffer +++ b/include/osg/TextureBuffer @@ -121,7 +121,7 @@ class OSG_EXPORT TextureBuffer : public Texture _id(0), _usageHint(usageHint) { - _extensions = osg::GLBufferObject::getExtensions(contextID, true); + _extensions = osg::GL2Extensions::Get(contextID, true); } void bindBuffer(GLenum target); @@ -134,7 +134,7 @@ class OSG_EXPORT TextureBuffer : public Texture public: GLuint _id; GLenum _usageHint; - osg::GLBufferObject::Extensions* _extensions; + osg::GL2Extensions* _extensions; }; typedef osg::buffered_object > TextureBufferObjectList; diff --git a/src/osg/BufferIndexBinding.cpp b/src/osg/BufferIndexBinding.cpp index 9789f7e9e..4ec16e2ec 100644 --- a/src/osg/BufferIndexBinding.cpp +++ b/src/osg/BufferIndexBinding.cpp @@ -51,7 +51,7 @@ void BufferIndexBinding::apply(State& state) const { GLBufferObject* glObject = _bufferObject->getOrCreateGLBufferObject(state.getContextID()); - if (!glObject->_extensions->isUniformBufferObjectSupported()) + if (!glObject->_extensions->isUniformBufferObjectSupported) return; if (glObject->isDirty()) glObject->compileBuffer(); glObject->_extensions->glBindBufferRange(_target, _index, diff --git a/src/osg/BufferObject.cpp b/src/osg/BufferObject.cpp index ac276c17f..4fb220283 100644 --- a/src/osg/BufferObject.cpp +++ b/src/osg/BufferObject.cpp @@ -64,7 +64,7 @@ GLBufferObject::GLBufferObject(unsigned int contextID, BufferObject* bufferObjec { assign(bufferObject); - _extensions = GLBufferObject::getExtensions(contextID, true); + _extensions = GL2Extensions::Get(contextID, true); if (glObjectID==0) { @@ -264,6 +264,7 @@ void GLBufferObject::setBufferDataHasBeenRead(const osg::BufferData* bd) ++entry.numRead; } +#if 0 ////////////////////////////////////////////////////////////////////////////// // // Extension support @@ -448,6 +449,7 @@ void GLBufferObject::Extensions::glTexBuffer( GLenum target, GLenum internalForm if ( _glTexBuffer ) _glTexBuffer( target, internalFormat, buffer ); else OSG_WARN<<"Error: glTexBuffer not supported by OpenGL driver\n"; } +#endif ////////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -1679,7 +1681,7 @@ void PixelDataBufferObject::bindBufferInWriteMode(State& state) //-------------------------------------------------------------------------------- void PixelDataBufferObject::unbindBuffer(unsigned int contextID) const { - GLBufferObject::Extensions* extensions = GLBufferObject::getExtensions(contextID,true); + GL2Extensions* extensions = GL2Extensions::Get(contextID, true); switch(_mode[contextID]) { diff --git a/src/osg/GL2Extensions.cpp b/src/osg/GL2Extensions.cpp index 8259ce760..1b5f8df03 100644 --- a/src/osg/GL2Extensions.cpp +++ b/src/osg/GL2Extensions.cpp @@ -273,8 +273,27 @@ GL2Extensions::GL2Extensions(unsigned int contextID) setGLExtensionFuncPtr(glDispatchCompute, "glDispatchCompute" ); setGLExtensionFuncPtr(glMemoryBarrier, "glMemoryBarrier", "glMemoryBarrierEXT" ); + + setGLExtensionFuncPtr(glGenBuffers, "glGenBuffers","glGenBuffersARB"); + setGLExtensionFuncPtr(glBindBuffer, "glBindBuffer","glBindBufferARB"); + setGLExtensionFuncPtr(glBufferData, "glBufferData","glBufferDataARB"); + setGLExtensionFuncPtr(glBufferSubData, "glBufferSubData","glBufferSubDataARB"); + setGLExtensionFuncPtr(glDeleteBuffers, "glDeleteBuffers","glDeleteBuffersARB"); + setGLExtensionFuncPtr(glIsBuffer, "glIsBuffer","glIsBufferARB"); + setGLExtensionFuncPtr(glGetBufferSubData, "glGetBufferSubData","glGetBufferSubDataARB"); + setGLExtensionFuncPtr(glMapBuffer, "glMapBuffer","glMapBufferARB"); setGLExtensionFuncPtr(glMapBufferRange, "glMapBufferRange" ); + setGLExtensionFuncPtr(glUnmapBuffer, "glUnmapBuffer","glUnmapBufferARB"); + setGLExtensionFuncPtr(glGetBufferParameteriv, "glGetBufferParameteriv","glGetBufferParameterivARB"); + setGLExtensionFuncPtr(glGetBufferPointerv, "glGetBufferPointerv","glGetBufferPointervARB"); + setGLExtensionFuncPtr(glBindBufferRange, "glBindBufferRange"); setGLExtensionFuncPtr(glBindBufferBase, "glBindBufferBase", "glBindBufferBaseEXT", "glBindBufferBaseNV" ); + setGLExtensionFuncPtr(glTexBuffer, "glTexBuffer","glTexBufferARB" ); + + isPBOSupported = OSG_GL3_FEATURES || osg::isGLExtensionSupported(contextID,"GL_ARB_pixel_buffer_object"); + isUniformBufferObjectSupported = osg::isGLExtensionSupported(contextID, "GL_ARB_uniform_buffer_object"); + isTBOSupported = osg::isGLExtensionSupported(contextID,"GL_ARB_texture_buffer_object"); + } diff --git a/src/osg/Geometry.cpp b/src/osg/Geometry.cpp index 0253c36d4..b5f9af1ec 100644 --- a/src/osg/Geometry.cpp +++ b/src/osg/Geometry.cpp @@ -661,7 +661,7 @@ void Geometry::compileGLObjects(RenderInfo& renderInfo) const { State& state = *renderInfo.getState(); unsigned int contextID = state.getContextID(); - GLBufferObject::Extensions* extensions = GLBufferObject::getExtensions(contextID, true); + GL2Extensions* extensions = state.get(); if (!extensions) return; typedef std::set BufferObjects; diff --git a/src/osgViewer/ScreenCaptureHandler.cpp b/src/osgViewer/ScreenCaptureHandler.cpp index 95db7e394..299275692 100644 --- a/src/osgViewer/ScreenCaptureHandler.cpp +++ b/src/osgViewer/ScreenCaptureHandler.cpp @@ -72,8 +72,8 @@ class WindowCaptureCallback : public osg::Camera::DrawCallback void read(); void readPixels(); - void singlePBO(osg::GLBufferObject::Extensions* ext); - void multiPBO(osg::GLBufferObject::Extensions* ext); + void singlePBO(osg::GL2Extensions* ext); + void multiPBO(osg::GL2Extensions* ext); typedef std::vector< osg::ref_ptr > ImageBuffer; typedef std::vector< GLuint > PBOBuffer; @@ -218,9 +218,9 @@ void WindowCaptureCallback::ContextData::updateTimings(osg::Timer_t tick_start, void WindowCaptureCallback::ContextData::read() { - osg::GLBufferObject::Extensions* ext = osg::GLBufferObject::getExtensions(_gc->getState()->getContextID(),true); + osg::GL2Extensions* ext = osg::GL2Extensions::Get(_gc->getState()->getContextID(),true); - if (ext->isPBOSupported() && !_pboBuffer.empty()) + if (ext->isPBOSupported && !_pboBuffer.empty()) { if (_pboBuffer.size()==1) { @@ -275,7 +275,7 @@ void WindowCaptureCallback::ContextData::readPixels() _currentPboIndex = nextPboIndex; } -void WindowCaptureCallback::ContextData::singlePBO(osg::GLBufferObject::Extensions* ext) +void WindowCaptureCallback::ContextData::singlePBO(osg::GL2Extensions* ext) { unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); @@ -350,7 +350,7 @@ void WindowCaptureCallback::ContextData::singlePBO(osg::GLBufferObject::Extensio _currentImageIndex = nextImageIndex; } -void WindowCaptureCallback::ContextData::multiPBO(osg::GLBufferObject::Extensions* ext) +void WindowCaptureCallback::ContextData::multiPBO(osg::GL2Extensions* ext) { unsigned int nextImageIndex = (_currentImageIndex+1)%_imageBuffer.size(); unsigned int nextPboIndex = (_currentPboIndex+1)%_pboBuffer.size();