Further perfomrmance optimizations and clean up on new VBO/EBO/PBO API.

This commit is contained in:
Robert Osfield
2007-05-01 18:03:32 +00:00
parent fe85a439fb
commit 859bcf3c4b
16 changed files with 306 additions and 461 deletions

View File

@@ -358,8 +358,7 @@ Geometry::ArrayData::ArrayData(const ArrayData& data,const CopyOp& copyop):
array(copyop(data.array.get())),
indices(dynamic_cast<osg::IndexArray*>(copyop(data.indices.get()))),
binding(data.binding),
normalize(data.normalize),
offset(data.offset)
normalize(data.normalize)
{
}
@@ -367,8 +366,7 @@ Geometry::Vec3ArrayData::Vec3ArrayData(const Vec3ArrayData& data,const CopyOp& c
array(dynamic_cast<osg::Vec3Array*>(copyop(data.array.get()))),
indices(dynamic_cast<osg::IndexArray*>(copyop(data.indices.get()))),
binding(data.binding),
normalize(data.normalize),
offset(data.offset)
normalize(data.normalize)
{
}
@@ -981,7 +979,7 @@ unsigned int Geometry::getGLObjectSizeHint() const
return totalSize;
}
bool Geometry::getArrayList(ArrayList& arrayList)
bool Geometry::getArrayList(ArrayList& arrayList) const
{
unsigned int startSize = arrayList.size();
@@ -1006,11 +1004,11 @@ bool Geometry::getArrayList(ArrayList& arrayList)
return arrayList.size()!=startSize;
}
bool Geometry::getDrawElementsList(DrawElementsList& drawElementsList)
bool Geometry::getDrawElementsList(DrawElementsList& drawElementsList) const
{
unsigned int startSize = drawElementsList.size();
for(PrimitiveSetList::iterator itr = _primitives.begin();
for(PrimitiveSetList::const_iterator itr = _primitives.begin();
itr != _primitives.end();
++itr)
{
@@ -1088,7 +1086,7 @@ osg::ElementBufferObject* Geometry::getOrCreateElementBufferObject()
void Geometry::setUseVertexBufferObjects(bool flag)
{
flag = true;
// flag = true;
// osg::notify(osg::NOTICE)<<"Geometry::setUseVertexBufferObjects("<<flag<<")"<<std::endl;
@@ -1185,89 +1183,60 @@ void Geometry::dirtyDisplayList()
Drawable::dirtyDisplayList();
}
void Geometry::resizeGLObjectBuffers(unsigned int maxSize)
{
Drawable::resizeGLObjectBuffers(maxSize);
#define SETARRAYPOINTER(vertexData, setVertexPointer, disableVertexPointer) \
if( vertexData.array.valid() ) \
{ \
new_vbo = vertexData.array.valid() ? vertexData.array->getVertexBufferObject() : 0; \
if (new_vbo) \
{ \
if (new_vbo!=prev_vbo) new_vbo->bindBuffer(contextID); \
prev_vbo = new_vbo; \
setVertexPointer(vertexData.array->getDataSize(),vertexData.array->getDataType(),0,new_vbo->getOffset(vertexData.array->getVertexBufferObjectIndex())); \
} \
else \
{ \
extensions->glBindBuffer(GL_ARRAY_BUFFER_ARB,0); \
prev_vbo = 0; \
setVertexPointer(vertexData.array->getDataSize(),vertexData.array->getDataType(),0,vertexData.array->getDataPointer()); \
} \
} \
else \
disableVertexPointer();
ArrayList arrays;
if (getArrayList(arrays))
{
for(ArrayList::iterator itr = arrays.begin();
itr != arrays.end();
++itr)
{
(*itr)->resizeGLObjectBuffers(maxSize);
}
}
#define SETNORMALPOINTER_IFPERVERTEXBINDING(vertexData, setVertexPointer, disableVertexPointer) \
if( vertexData.array.valid() && vertexData.binding==BIND_PER_VERTEX) \
{ \
new_vbo = vertexData.array.valid() ? vertexData.array->getVertexBufferObject() : 0; \
if (new_vbo) \
{ \
if (new_vbo!=prev_vbo) new_vbo->bindBuffer(contextID); \
prev_vbo = new_vbo; \
setVertexPointer(vertexData.array->getDataType(),0,new_vbo->getOffset(vertexData.array->getVertexBufferObjectIndex())); \
} \
else \
{ \
extensions->glBindBuffer(GL_ARRAY_BUFFER_ARB,0); \
prev_vbo = 0; \
setVertexPointer(vertexData.array->getDataType(),0,vertexData.array->getDataPointer()); \
} \
} \
else \
disableVertexPointer();
DrawElementsList drawElements;
if (getDrawElementsList(drawElements))
{
for(DrawElementsList::iterator itr = drawElements.begin();
itr != drawElements.end();
++itr)
{
(*itr)->resizeGLObjectBuffers(maxSize);
}
}
}
void Geometry::releaseGLObjects(State* state) const
{
Drawable::releaseGLObjects(state);
#define SETARRAYPOINTER_IFPERVERTEXBINDING(vertexData, setVertexPointer, disableVertexPointer) \
if( vertexData.array.valid() && vertexData.binding==BIND_PER_VERTEX) \
{ \
new_vbo = vertexData.array.valid() ? vertexData.array->getVertexBufferObject() : 0; \
if (new_vbo) \
{ \
if (new_vbo!=prev_vbo) new_vbo->bindBuffer(contextID); \
prev_vbo = new_vbo; \
setVertexPointer(vertexData.array->getDataSize(),vertexData.array->getDataType(),0,new_vbo->getOffset(vertexData.array->getVertexBufferObjectIndex())); \
} \
else \
{ \
extensions->glBindBuffer(GL_ARRAY_BUFFER_ARB,0); \
prev_vbo = 0; \
setVertexPointer(vertexData.array->getDataSize(),vertexData.array->getDataType(),0,vertexData.array->getDataPointer()); \
} \
} \
else \
disableVertexPointer();
ArrayList arrays;
if (getArrayList(arrays))
{
for(ArrayList::iterator itr = arrays.begin();
itr != arrays.end();
++itr)
{
(*itr)->releaseGLObjects(state);
}
}
DrawElementsList drawElements;
if (getDrawElementsList(drawElements))
{
for(DrawElementsList::iterator itr = drawElements.begin();
itr != drawElements.end();
++itr)
{
(*itr)->releaseGLObjects(state);
}
}
#define SETARRAYUNITPOINTER_IFPERVERTEXBINDING(vertexData, unit, setVertexPointer, disableVertexPointer) \
if( vertexData.array.valid() && vertexData.binding==BIND_PER_VERTEX) \
{ \
new_vbo = vertexData.array.valid() ? vertexData.array->getVertexBufferObject() : 0; \
if (new_vbo) \
{ \
if (new_vbo!=prev_vbo) new_vbo->bindBuffer(contextID); \
prev_vbo = new_vbo; \
setVertexPointer(unit, vertexData.array->getDataSize(),vertexData.array->getDataType(),0,new_vbo->getOffset(vertexData.array->getVertexBufferObjectIndex())); \
} \
else \
{ \
extensions->glBindBuffer(GL_ARRAY_BUFFER_ARB,0); \
prev_vbo = 0; \
setVertexPointer(unit, vertexData.array->getDataSize(),vertexData.array->getDataType(),0,vertexData.array->getDataPointer()); \
} \
} \
else \
disableVertexPointer();
}
void Geometry::drawImplementation(RenderInfo& renderInfo) const
{