diff options
author | chai <chaifix@163.com> | 2021-10-27 19:30:06 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-27 19:30:06 +0800 |
commit | 51ced5a191078ce4ef08d57e343e91db007f556f (patch) | |
tree | 72dce341b2019e5b14c789a9edfb47d5b31900a6 /Runtime/Graphics/GpuDataBuffer.cpp | |
parent | e6a15decac22912900d2cbd2e5525229b92bb55a (diff) |
*misc
Diffstat (limited to 'Runtime/Graphics/GpuDataBuffer.cpp')
-rw-r--r-- | Runtime/Graphics/GpuDataBuffer.cpp | 206 |
1 files changed, 0 insertions, 206 deletions
diff --git a/Runtime/Graphics/GpuDataBuffer.cpp b/Runtime/Graphics/GpuDataBuffer.cpp deleted file mode 100644 index d20be65..0000000 --- a/Runtime/Graphics/GpuDataBuffer.cpp +++ /dev/null @@ -1,206 +0,0 @@ -#include <math.h> - -#include "GpuDataBuffer.h" - -namespace GPU -{ - - // 修改buffer数据要绑定到这个目标上,其他情况下用GetHandle()绑定到其他目标 - // GL_COPY_READ_BUFFER - static const GLenum kBufferTarget = GL_COPY_WRITE_BUFFER; - - DataBuffer::DataBuffer() - { - glGenBuffers(1, &m_Handle); - } - - DataBuffer::~DataBuffer() - { - glDeleteBuffers(1, &m_Handle); - } - - void DataBuffer::Restore(int size, GLenum usage) - { - RestoreWithData(size, usage, 0); - } - - void DataBuffer::RestoreWithData(int size, GLenum usage, const void* data) - { - glBindBuffer(kBufferTarget, m_Handle); - glBufferData(kBufferTarget, size, data, usage); - glBindBuffer(kBufferTarget, 0); - m_Size = size; - m_Usage = usage; - } - - // glBufferSubData - // glMapBuffer - // glMapBufferRange (best one) - - void DataBuffer::Upload(int offset, int size, const void* data) - { - glBindBuffer(kBufferTarget, m_Handle); - glBufferSubData(kBufferTarget, offset, size, data); - glBindBuffer(kBufferTarget, 0); - } - - void* DataBuffer::Map(uint32 access) - { - glBindBuffer(kBufferTarget, m_Handle); - void* ptr = glMapBuffer(kBufferTarget, access); - glBindBuffer(kBufferTarget, 0); - return ptr; - } - - void* DataBuffer::MapRange(int offset, int size, uint32 access) - { - glBindBuffer(kBufferTarget, m_Handle); - void* ptr = glMapBufferRange(kBufferTarget, offset, size, access); - glBindBuffer(kBufferTarget, 0); - return ptr; - } - - void DataBuffer::FlushMapedRange(int offset, int size) - { - glBindBuffer(kBufferTarget, m_Handle); - glFlushMappedBufferRange(kBufferTarget, offset, size); - glBindBuffer(kBufferTarget, 0); - } - - void DataBuffer::UnMap() - { - glBindBuffer(kBufferTarget, m_Handle); - glUnmapBuffer(kBufferTarget); - glBindBuffer(kBufferTarget, 0); - } - - void DataBuffer::Orphan() - { - glBindBuffer(kBufferTarget, m_Handle); - glBufferData(kBufferTarget, 0, 0, GL_STREAM_DRAW); - glBindBuffer(kBufferTarget, 0); - } - - static bool IsBufferPoolCreated = false; - - BufferPool::BufferPool() - :m_LiveBuffers() - { - Assert(!IsBufferPoolCreated); - IsBufferPoolCreated = true; - } - - BufferPool::~BufferPool() - { - - } - - void BufferPool::Initialize() - { - for(int i = 0; i < kSizeClassCount; ++i) - m_LiveBuffers[i].clear(); - } - - static const float kBufferAllocateWeight = 10.0f; //! Default weight for buffer allocation from scratch. - static const float kBufferSizeWeightFactor = 1.f / 8096.f; //!< Weight factor for size difference. - static const float kBufferUsageDiffWeight = 8.f; //!< Weight factor for usage difference. - - static int ComputeBufferWeight(DataBuffer* buffer, int desiredSize, GLenum desiredUsage) - { - const int bufferSize = buffer->GetSize(); - const GLenum bufferUsage = buffer->GetUsage(); - - if(bufferSize == 0) - return kBufferAllocateWeight; - - const int sizeDiff = std::abs(bufferSize - desiredSize); - - return float(sizeDiff)*kBufferSizeWeightFactor + ((bufferUsage != desiredUsage) ? kBufferUsageDiffWeight : 0.f); - } - - DataBuffer* BufferPool::ClaimBuffer(int size, GLenum usage) - { - const float maxWeight = kBufferAllocateWeight; - const int maxCandidates = 5; // Number of potential candidates to consider actually. - - const int sizeClass = GetSizeClass(size); - int numCandidates = 0; // Number of potential candidates considered - int bestBufferNdx = -1; - float bestWeight = std::numeric_limits<float>::infinity(); - - for (int idx = 0; idx < m_LiveBuffers[sizeClass].size(); ++idx) - { - DataBuffer* buffer = m_LiveBuffers[sizeClass][idx]; - const float weight = ComputeBufferWeight(buffer, size, usage); - - if (weight < maxWeight && weight < bestWeight) - { - bestWeight = weight; - bestBufferNdx = idx; - ++numCandidates; - } - - if(numCandidates >= maxCandidates) - break; // Do not try other buffers, sorry. - } - - if (bestBufferNdx >= 0) - { - DataBuffer* selectedBuffer = m_LiveBuffers[sizeClass][bestBufferNdx]; - - if (bestBufferNdx + 1 != m_LiveBuffers[sizeClass].size()) - std::swap(m_LiveBuffers[sizeClass][bestBufferNdx], m_LiveBuffers[sizeClass].back()); - m_LiveBuffers[sizeClass].pop_back(); - - return selectedBuffer; - } - else - return new DataBuffer(); - - } - - void BufferPool::ReleaseBuffer(DataBuffer* buffer) - { - InsertToLive(buffer); - } - - void BufferPool::OnEndFrame() - { - UpdatePendingBuffersArray(); - } - - void BufferPool::UpdatePendingBuffersArray() - { - - } - - void BufferPool::InsertToLive(DataBuffer* buffer) - { - const int bufferSize = buffer->GetSize(); - const int sizeClass = GetSizeClass(bufferSize); - - m_LiveBuffers[sizeClass].push_back(buffer); - } - - uint BufferPool::GetSizeClass(uint bufferSize) - { - for (int idx = 0; idx < kSizeClassCount; ++idx) - { - if(bufferSize < GetSizeClassLimit(idx)) - return idx; - } - Assert(false); // never reach here - return 0; - } - - DataBuffer* ClaimBuffer(int size, GLenum usage ) - { - return BufferPool::Instance()->ClaimBuffer(size, usage); - } - - void ReleaseBuffer(DataBuffer* buffer) - { - BufferPool::Instance()->ReleaseBuffer(buffer); - } - -} |