Improved handling of the BufferObject::Profile::_size, utilizing it's intial value when it is non zero and larger than the arrays assigned to it.

This commit is contained in:
Robert Osfield
2016-09-01 14:41:17 +01:00
parent 8febae1546
commit d4d32cbde7

View File

@@ -208,6 +208,7 @@ void GLBufferObject::compileBuffer()
if (_allocatedSize != _profile._size)
{
_allocatedSize = _profile._size;
OSG_INFO<<" Allocating new glBufferData(), _allocatedSize="<<_allocatedSize<<std::endl;
_extensions->glBufferData(_profile._target, _profile._size, NULL, _profile._usage);
compileAll = true;
}
@@ -229,7 +230,6 @@ void GLBufferObject::compileBuffer()
unsigned int offset = entry.offset;
for(osg::Image::DataIterator img_itr(image); img_itr.valid(); ++img_itr)
{
//OSG_NOTICE<<"Copying to buffer object using DataIterator, offset="<<offset<<", size="<<img_itr.size()<<", data="<<(void*)img_itr.data()<<std::endl;
_extensions->glBufferSubData(_profile._target, (GLintptr)offset, (GLsizeiptr)img_itr.size(), img_itr.data());
offset += img_itr.size();
}
@@ -661,7 +661,7 @@ osg::ref_ptr<GLBufferObject> GLBufferObjectSet::takeOrGenerate(BufferObject* buf
moveToBack(glbo.get());
// assign to new texture
// assign
glbo->setBufferObject(bufferObject);
glbo->setProfile(_profile);
@@ -902,9 +902,11 @@ osg::ref_ptr<GLBufferObject> GLBufferObjectManager::generateGLBufferObject(const
ElapsedTime elapsedTime(&(getGenerateTime()));
++getNumberGenerated();
BufferObjectProfile profile(bufferObject->getTarget(), bufferObject->getUsage(), bufferObject->computeRequiredBufferSize());
unsigned int requiredBufferSize = osg::maximum(bufferObject->computeRequiredBufferSize(), bufferObject->getProfile()._size);
// OSG_NOTICE<<"GLBufferObjectManager::generateGLBufferObject size="<<bufferObject->computeRequiredBufferSize()<<std::endl;
BufferObjectProfile profile(bufferObject->getTarget(), bufferObject->getUsage(), requiredBufferSize);
// OSG_NOTICE<<"GLBufferObjectManager::generateGLBufferObject size="<<requiredBufferSize<<std::endl;
GLBufferObjectSet* glbos = getGLBufferObjectSet(profile);
return glbos->takeOrGenerate(const_cast<BufferObject*>(bufferObject));
@@ -1070,6 +1072,9 @@ BufferObject::~BufferObject()
GLBufferObject* BufferObject::getOrCreateGLBufferObject(unsigned int contextID) const
{
if (!_glBufferObjects[contextID]) _glBufferObjects[contextID] = osg::get<GLBufferObjectManager>(contextID)->generateGLBufferObject(this);
// OSG_NOTICE<<"BufferObject::getOrCreateGLBufferObject() _glBufferObjects[contextID]->getProfile()._size() = "<<_glBufferObjects[contextID]->getProfile()._size<<std::endl;
return _glBufferObjects[contextID].get();
}
@@ -1083,7 +1088,10 @@ void BufferObject::dirty()
{
for(unsigned int i=0; i<_glBufferObjects.size(); ++i)
{
if (_glBufferObjects[i].valid()) _glBufferObjects[i]->dirty();
if (_glBufferObjects[i].valid())
{
_glBufferObjects[i]->dirty();
}
}
}