Chromium Code Reviews| Index: core/cross/buffer.cc |
| =================================================================== |
| --- core/cross/buffer.cc (revision 20119) |
| +++ core/cross/buffer.cc (working copy) |
| @@ -34,6 +34,7 @@ |
| #include "core/cross/precompile.h" |
| #include "core/cross/buffer.h" |
| +#include "core/cross/client_info.h" |
| #include "core/cross/renderer.h" |
| #include "core/cross/features.h" |
| #include "core/cross/error.h" |
| @@ -108,6 +109,7 @@ |
| } |
| Buffer::~Buffer() { |
| + AdjustBufferMemoryInfo(false); |
| for (unsigned ii = 0; ii < fields_.size(); ++ii) { |
| if (!fields_[ii].IsNull()) { |
| fields_[ii]->ClearBuffer(); |
| @@ -115,6 +117,17 @@ |
| } |
| } |
| +void Buffer::AdjustBufferMemoryInfo(bool add) { |
| + // Only count VRAM/hardware buffers. |
| + if (IsA(VertexBuffer::GetApparentClass()) || |
| + IsA(IndexBuffer::GetApparentClass())) { |
| + size_t size_in_bytes = num_elements_ * stride_; |
| + ServiceDependency<ClientInfoManager> client_info_manager(service_locator()); |
|
apatrick
2009/07/09 18:22:00
You don't need to use a ServiceDependency here. Ge
|
| + client_info_manager->AdjustBufferMemoryUsed( |
| + static_cast<int>(size_in_bytes) * (add ? 1 : -1)); |
| + } |
| +} |
| + |
| bool Buffer::AllocateElements(unsigned num_elements) { |
| if (access_mode_ != NONE) { |
| O3D_ERROR(service_locator()) << "Attempt to allocate locked Buffer '" |
| @@ -152,25 +165,33 @@ |
| return false; |
| } |
| + bool success = true; |
| if (!ConcreteAllocate(size_in_bytes)) { |
| - num_elements_ = 0; |
| - return false; |
| + num_elements = 0; |
| + size_in_bytes = 0; |
| + success = false; |
| } |
| num_elements_ = num_elements; |
| - return true; |
| + |
| + AdjustBufferMemoryInfo(true); |
| + |
| + return success; |
| } |
| void Buffer::Free() { |
| if (num_elements_ > 0) { |
| ConcreteFree(); |
| + AdjustBufferMemoryInfo(false); |
| num_elements_ = 0; |
| } |
| } |
| bool Buffer::ReshuffleBuffer(unsigned int new_stride, Field* field_to_remove) { |
| if (new_stride == 0) { |
| + AdjustBufferMemoryInfo(false); |
| ConcreteFree(); |
| + stride_ = 0; |
| return true; |
| } |
| if (num_elements_) { |
| @@ -202,6 +223,7 @@ |
| // Copy the reorganized data into a new buffer. |
| { |
| ConcreteFree(); |
| + AdjustBufferMemoryInfo(false); |
| if (!ConcreteAllocate(size_in_bytes)) { |
| num_elements_ = 0; |
| O3D_ERROR(service_locator()) |
| @@ -214,6 +236,7 @@ |
| // is completed (see CreateField, RemoveField) for when we create a new |
| // buffer with no fields yet. |
| stride_ = new_stride; |
| + AdjustBufferMemoryInfo(true); |
| BufferLockHelper helper(this); |
| void* destination = helper.GetData(Buffer::WRITE_ONLY); |
| if (!destination) { |