summaryrefslogtreecommitdiffstats
path: root/o3d/core/cross/buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/core/cross/buffer.cc')
-rw-r--r--o3d/core/cross/buffer.cc30
1 files changed, 27 insertions, 3 deletions
diff --git a/o3d/core/cross/buffer.cc b/o3d/core/cross/buffer.cc
index cd1f8d6..7d4ced1 100644
--- a/o3d/core/cross/buffer.cc
+++ b/o3d/core/cross/buffer.cc
@@ -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(ServiceLocator* service_locator)
}
Buffer::~Buffer() {
+ AdjustBufferMemoryInfo(false);
for (unsigned ii = 0; ii < fields_.size(); ++ii) {
if (!fields_[ii].IsNull()) {
fields_[ii]->ClearBuffer();
@@ -115,6 +117,18 @@ Buffer::~Buffer() {
}
}
+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_;
+ ClientInfoManager* client_info_manager =
+ service_locator()->GetService<ClientInfoManager>();
+ 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 +166,33 @@ bool Buffer::AllocateElements(unsigned num_elements) {
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 +224,7 @@ bool Buffer::ReshuffleBuffer(unsigned int new_stride, Field* field_to_remove) {
// 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 +237,7 @@ bool Buffer::ReshuffleBuffer(unsigned int new_stride, Field* field_to_remove) {
// 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) {