/////////////////////////////////////////////////////////////////////////////// // Allocate: try to allocate a buffer of given number of vertices (each of // given size), with the given type, and using the given texture - return null // if no free chunks available CVertexBuffer::VBChunk* CVertexBufferManager::Allocate(size_t vertexSize, size_t numVertices, GLenum usage, GLenum target, void* backingStore) { CVertexBuffer::VBChunk* result=0; ENSURE(usage == GL_STREAM_DRAW || usage == GL_STATIC_DRAW || usage == GL_DYNAMIC_DRAW); ENSURE(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER); if (CVertexBuffer::UseStreaming(usage)) ENSURE(backingStore != NULL); // TODO, RC - run some sanity checks on allocation request typedef std::list<CVertexBuffer*>::iterator Iter; #if DUMP_VB_STATS debug_printf("\n============================\n# allocate vsize=%d nverts=%d\n\n", vertexSize, numVertices); for (Iter iter = m_Buffers.begin(); iter != m_Buffers.end(); ++iter) { CVertexBuffer* buffer = *iter; if (buffer->CompatibleVertexType(vertexSize, usage, target)) { debug_printf("%p\n", buffer); buffer->DumpStatus(); } } #endif // iterate through all existing buffers testing for one that'll // satisfy the allocation for (Iter iter = m_Buffers.begin(); iter != m_Buffers.end(); ++iter) { CVertexBuffer* buffer = *iter; result = buffer->Allocate(vertexSize, numVertices, usage, target, backingStore); if (result) return result; } // got this far; need to allocate a new buffer CVertexBuffer* buffer = new CVertexBuffer(vertexSize, usage, target); m_Buffers.push_front(buffer); result = buffer->Allocate(vertexSize, numVertices, usage, target, backingStore); if (!result) { LOGERROR("Failed to create VBOs (%lu*%lu)", (unsigned long)vertexSize, (unsigned long)numVertices); } return result; }