Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/renderer/VertexBuffer.cpp
Show All 26 Lines | |||||
#include <algorithm> | #include <algorithm> | ||||
#include <iterator> | #include <iterator> | ||||
// Absolute maximum (bytewise) size of each GL vertex buffer object. | // Absolute maximum (bytewise) size of each GL vertex buffer object. | ||||
// Make it large enough for the maximum feasible mesh size (64K vertexes, | // Make it large enough for the maximum feasible mesh size (64K vertexes, | ||||
// 64 bytes per vertex in InstancingModelRenderer). | // 64 bytes per vertex in InstancingModelRenderer). | ||||
// TODO: measure what influence this has on performance | // TODO: measure what influence this has on performance | ||||
#define MAX_VB_SIZE_BYTES (4*1024*1024) | constexpr std::size_t MAX_VB_SIZE_BYTES = 4 * 1024 * 1024; | ||||
CVertexBuffer::CVertexBuffer(size_t vertexSize, GLenum usage, GLenum target) | CVertexBuffer::CVertexBuffer(size_t vertexSize, GLenum usage, GLenum target) | ||||
: CVertexBuffer(vertexSize, usage, target, MAX_VB_SIZE_BYTES) | |||||
{ | |||||
} | |||||
CVertexBuffer::CVertexBuffer(size_t vertexSize, GLenum usage, GLenum target, size_t maximumBufferSize) | |||||
: m_VertexSize(vertexSize), m_Handle(0), m_SysMem(0), m_Usage(usage), m_Target(target), m_HasNeededChunks(false) | : m_VertexSize(vertexSize), m_Handle(0), m_SysMem(0), m_Usage(usage), m_Target(target), m_HasNeededChunks(false) | ||||
{ | { | ||||
size_t size = MAX_VB_SIZE_BYTES; | size_t size = maximumBufferSize; | ||||
if (target == GL_ARRAY_BUFFER) // vertex data buffer | if (target == GL_ARRAY_BUFFER) // vertex data buffer | ||||
{ | { | ||||
// We want to store 16-bit indices to any vertex in a buffer, so the | // We want to store 16-bit indices to any vertex in a buffer, so the | ||||
// buffer must never be bigger than vertexSize*64K bytes since we can | // buffer must never be bigger than vertexSize*64K bytes since we can | ||||
// address at most 64K of them with 16-bit indices | // address at most 64K of them with 16-bit indices | ||||
size = std::min(size, vertexSize*65536); | size = std::min(size, vertexSize*65536); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 294 Lines • ▼ Show 20 Lines | size_t CVertexBuffer::GetBytesReserved() const | ||||
return MAX_VB_SIZE_BYTES; | return MAX_VB_SIZE_BYTES; | ||||
} | } | ||||
size_t CVertexBuffer::GetBytesAllocated() const | size_t CVertexBuffer::GetBytesAllocated() const | ||||
{ | { | ||||
return (m_MaxVertices - m_FreeVertices) * m_VertexSize; | return (m_MaxVertices - m_FreeVertices) * m_VertexSize; | ||||
} | } | ||||
void CVertexBuffer::DumpStatus() | void CVertexBuffer::DumpStatus() const | ||||
{ | { | ||||
debug_printf("freeverts = %d\n", static_cast<int>(m_FreeVertices)); | debug_printf("freeverts = %d\n", static_cast<int>(m_FreeVertices)); | ||||
size_t maxSize = 0; | size_t maxSize = 0; | ||||
for (VBChunk* const& chunk : m_FreeList) | for (VBChunk* const& chunk : m_FreeList) | ||||
{ | { | ||||
debug_printf("free chunk %p: size=%d\n", static_cast<void *>(chunk), static_cast<int>(chunk->m_Count)); | debug_printf("free chunk %p: size=%d\n", static_cast<void *>(chunk), static_cast<int>(chunk->m_Count)); | ||||
maxSize = std::max(chunk->m_Count, maxSize); | maxSize = std::max(chunk->m_Count, maxSize); | ||||
Show All 14 Lines |
Wildfire Games · Phabricator