2012-03-22 01:36:20 +08:00
|
|
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
2007-07-06 21:08:51 +08:00
|
|
|
*
|
2012-03-22 01:36:20 +08:00
|
|
|
* This library is open source and may be redistributed and/or modified under
|
|
|
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
2007-07-06 21:08:51 +08:00
|
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
|
|
* included with this distribution, and on the openscenegraph.org website.
|
2012-03-22 01:36:20 +08:00
|
|
|
*
|
2007-07-06 21:08:51 +08:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2012-03-22 01:36:20 +08:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2007-07-06 21:08:51 +08:00
|
|
|
* OpenSceneGraph Public License for more details.
|
|
|
|
*/
|
|
|
|
#include <osg/GLObjects>
|
|
|
|
|
|
|
|
#include <osg/VertexProgram>
|
|
|
|
#include <osg/FragmentProgram>
|
|
|
|
#include <osg/FrameBufferObject>
|
2015-09-23 17:47:34 +08:00
|
|
|
#include <osg/ContextData>
|
|
|
|
|
|
|
|
using namespace osg;
|
2007-07-06 21:08:51 +08:00
|
|
|
|
|
|
|
void osg::flushDeletedGLObjects(unsigned int contextID, double currentTime, double& availableTime)
|
|
|
|
{
|
2015-09-23 17:47:34 +08:00
|
|
|
osg::getContextData(contextID)->flushDeletedGLObjects(currentTime, availableTime);
|
|
|
|
}
|
2009-10-23 21:19:57 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
void osg::flushAllDeletedGLObjects(unsigned int contextID)
|
|
|
|
{
|
|
|
|
osg::getContextData(contextID)->flushAllDeletedGLObjects();
|
|
|
|
}
|
2009-10-23 21:19:57 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
void osg::deleteAllGLObjects(unsigned int contextID)
|
|
|
|
{
|
|
|
|
osg::getContextData(contextID)->deleteAllGLObjects();
|
2007-07-06 21:08:51 +08:00
|
|
|
}
|
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
void osg::discardAllGLObjects(unsigned int contextID)
|
2007-07-06 21:08:51 +08:00
|
|
|
{
|
2015-09-23 17:47:34 +08:00
|
|
|
osg::getContextData(contextID)->discardAllGLObjects();
|
|
|
|
}
|
2009-10-23 21:19:57 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// GraphicsObject
|
|
|
|
//
|
|
|
|
GraphicsObject::GraphicsObject()
|
|
|
|
{
|
|
|
|
// OSG_NOTICE<<"GraphicsObject::GraphicsObject() "<<this<<std::endl;
|
|
|
|
}
|
2009-10-23 21:19:57 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
GraphicsObject::~GraphicsObject()
|
|
|
|
{
|
|
|
|
// OSG_NOTICE<<"GraphicsObject::~GraphicsObject() "<<this<<std::endl;
|
|
|
|
}
|
2009-10-23 21:19:57 +08:00
|
|
|
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// GraphicsObjectManager
|
|
|
|
//
|
|
|
|
GraphicsObjectManager::GraphicsObjectManager(const std::string& name, unsigned int contextID):
|
|
|
|
_name(name),
|
|
|
|
_contextID(contextID)
|
|
|
|
{
|
|
|
|
OSG_INFO<<_name<<"::"<<_name<<"()"<<this<<std::endl;
|
2009-11-26 20:33:07 +08:00
|
|
|
}
|
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
GraphicsObjectManager::~GraphicsObjectManager()
|
|
|
|
{
|
|
|
|
OSG_INFO<<_name<<"::~"<<_name<<"()"<<this<<std::endl;
|
|
|
|
}
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// GLObjectManager
|
|
|
|
//
|
|
|
|
GLObjectManager::GLObjectManager(const std::string& name, unsigned int contextID):
|
|
|
|
GraphicsObjectManager(name, contextID)
|
2009-11-26 20:33:07 +08:00
|
|
|
{
|
2015-09-23 17:47:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
GLObjectManager::~GLObjectManager()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLObjectManager::flushDeletedGLObjects(double, double& availableTime)
|
|
|
|
{
|
|
|
|
// if no time available don't try to flush objects.
|
|
|
|
if (availableTime<=0.0) return;
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
const osg::Timer& timer = *osg::Timer::instance();
|
|
|
|
osg::Timer_t start_tick = timer.tick();
|
|
|
|
double elapsedTime = 0.0;
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
for(GLObjectHandleList::iterator itr = _deleteGLObjectHandles.begin();
|
|
|
|
itr != _deleteGLObjectHandles.end() && elapsedTime<availableTime;
|
|
|
|
)
|
|
|
|
{
|
|
|
|
deleteGLObject( *itr );
|
|
|
|
itr = _deleteGLObjectHandles.erase( itr );
|
|
|
|
elapsedTime = timer.delta_s(start_tick,timer.tick());
|
|
|
|
}
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
availableTime -= elapsedTime;
|
2007-07-06 21:08:51 +08:00
|
|
|
}
|
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
void GLObjectManager::flushAllDeletedGLObjects()
|
|
|
|
{
|
|
|
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
|
|
|
|
|
|
|
for(GLObjectHandleList::iterator itr = _deleteGLObjectHandles.begin();
|
|
|
|
itr != _deleteGLObjectHandles.end();
|
|
|
|
++itr)
|
|
|
|
{
|
|
|
|
deleteGLObject( *itr );
|
|
|
|
}
|
|
|
|
_deleteGLObjectHandles.clear();
|
|
|
|
}
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
void GLObjectManager::deleteAllGLObjects()
|
2008-01-08 21:24:29 +08:00
|
|
|
{
|
2018-04-21 00:18:22 +08:00
|
|
|
OSG_INFO<<"void "<<_name<<"::deleteAllGLObjects() : Not Implemented"<<std::endl;
|
2015-09-23 17:47:34 +08:00
|
|
|
}
|
2009-10-23 21:19:57 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
void GLObjectManager::discardAllGLObjects()
|
|
|
|
{
|
|
|
|
// OSG_NOTICE<<"void "<<_name<<"::discardAllGLObjects()"<<std::endl;
|
|
|
|
|
|
|
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
2009-10-23 21:19:57 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
_deleteGLObjectHandles.clear();
|
|
|
|
}
|
|
|
|
|
2016-01-19 22:49:56 +08:00
|
|
|
void GLObjectManager::scheduleGLObjectForDeletion(GLuint globj)
|
2015-09-23 17:47:34 +08:00
|
|
|
{
|
|
|
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
2009-11-26 20:33:07 +08:00
|
|
|
|
2015-09-23 17:47:34 +08:00
|
|
|
// add glProgram to the cache for the appropriate context.
|
|
|
|
_deleteGLObjectHandles.push_back(globj);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
GLuint GLObjectManager::createGLObject()
|
|
|
|
{
|
2018-04-21 00:18:22 +08:00
|
|
|
OSG_INFO<<"void "<<_name<<"::createGLObject() : Not Implemented"<<std::endl;
|
2015-09-23 17:47:34 +08:00
|
|
|
return 0;
|
2008-01-08 21:24:29 +08:00
|
|
|
}
|