mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-09-21 20:06:40 +00:00
Support storing index data in VBOs.
Use index VBOs in model renderers, for performance. Be more explicit about static/dynamic VBOs. Add VBO usage to renderer stats. Clean up some obsolete unused code. This was SVN commit r9052.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2009 Wildfire Games.
|
||||
/* Copyright (C) 2011 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@@ -21,10 +21,12 @@
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
#include "lib/ogl.h"
|
||||
#include "VertexBufferManager.h"
|
||||
|
||||
#include "lib/ogl.h"
|
||||
#include "ps/CLogger.h"
|
||||
|
||||
CVertexBufferManager g_VBMan;
|
||||
|
||||
// janwas 2004-06-14: added dtor
|
||||
|
||||
@@ -39,10 +41,9 @@ CVertexBufferManager::~CVertexBufferManager()
|
||||
void CVertexBufferManager::Shutdown()
|
||||
{
|
||||
typedef std::list<CVertexBuffer*>::iterator Iter;
|
||||
for (Iter iter=m_Buffers.begin();iter!=m_Buffers.end();++iter)
|
||||
for (Iter iter = m_Buffers.begin(); iter != m_Buffers.end(); ++iter)
|
||||
delete *iter;
|
||||
|
||||
CVertexBuffer::Shutdown();
|
||||
m_Buffers.clear();
|
||||
}
|
||||
|
||||
|
||||
@@ -50,10 +51,14 @@ void CVertexBufferManager::Shutdown()
|
||||
// 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, bool dynamic)
|
||||
CVertexBuffer::VBChunk* CVertexBufferManager::Allocate(size_t vertexSize, size_t numVertices, GLenum usage, GLenum target)
|
||||
{
|
||||
CVertexBuffer::VBChunk* result=0;
|
||||
|
||||
debug_assert(usage == GL_STREAM_DRAW || usage == GL_STATIC_DRAW || usage == GL_DYNAMIC_DRAW);
|
||||
|
||||
debug_assert(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER);
|
||||
|
||||
// TODO, RC - run some sanity checks on allocation request
|
||||
|
||||
// iterate through all existing buffers testing for one that'll
|
||||
@@ -61,15 +66,15 @@ CVertexBuffer::VBChunk* CVertexBufferManager::Allocate(size_t vertexSize, size_t
|
||||
typedef std::list<CVertexBuffer*>::iterator Iter;
|
||||
for (Iter iter = m_Buffers.begin(); iter != m_Buffers.end(); ++iter) {
|
||||
CVertexBuffer* buffer = *iter;
|
||||
result = buffer->Allocate(vertexSize, numVertices, dynamic);
|
||||
result = buffer->Allocate(vertexSize, numVertices, usage, target);
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
|
||||
// got this far; need to allocate a new buffer
|
||||
CVertexBuffer* buffer = new CVertexBuffer(vertexSize, dynamic);
|
||||
CVertexBuffer* buffer = new CVertexBuffer(vertexSize, usage, target);
|
||||
m_Buffers.push_front(buffer);
|
||||
result = buffer->Allocate(vertexSize, numVertices, dynamic);
|
||||
result = buffer->Allocate(vertexSize, numVertices, usage, target);
|
||||
|
||||
if (!result)
|
||||
{
|
||||
@@ -87,13 +92,25 @@ void CVertexBufferManager::Release(CVertexBuffer::VBChunk* chunk)
|
||||
chunk->m_Owner->Release(chunk);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// ClearBatchIndices: empty out the batch lists of all vertex buffers
|
||||
void CVertexBufferManager::ClearBatchIndices()
|
||||
|
||||
size_t CVertexBufferManager::GetBytesReserved()
|
||||
{
|
||||
size_t total = 0;
|
||||
|
||||
typedef std::list<CVertexBuffer*>::iterator Iter;
|
||||
for (Iter iter=m_Buffers.begin();iter!=m_Buffers.end();++iter) {
|
||||
CVertexBuffer* buffer=*iter;
|
||||
buffer->ClearBatchIndices();
|
||||
}
|
||||
for (Iter iter = m_Buffers.begin(); iter != m_Buffers.end(); ++iter)
|
||||
total += (*iter)->GetBytesReserved();
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
size_t CVertexBufferManager::GetBytesAllocated()
|
||||
{
|
||||
size_t total = 0;
|
||||
|
||||
typedef std::list<CVertexBuffer*>::iterator Iter;
|
||||
for (Iter iter = m_Buffers.begin(); iter != m_Buffers.end(); ++iter)
|
||||
total += (*iter)->GetBytesAllocated();
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user