1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_
9 #include "base/basictypes.h"
10 #include "base/debug/trace_event.h"
11 #include "base/logging.h"
12 #include "base/memory/ref_counted.h"
17 // A MemoryTracker is used to propagate per-ContextGroup memory usage
18 // statistics to the global GpuMemoryManager.
19 class MemoryTracker : public base::RefCounted<MemoryTracker> {
26 virtual void TrackMemoryAllocatedChange(size_t old_size,
30 // Ensure a certain amount of GPU memory is free. Returns true on success.
31 virtual bool EnsureGPUMemoryAvailable(size_t size_needed) = 0;
34 friend class base::RefCounted<MemoryTracker>;
36 virtual ~MemoryTracker() {};
39 DISALLOW_COPY_AND_ASSIGN(MemoryTracker);
42 // A MemoryTypeTracker tracks the use of a particular type of memory (buffer,
43 // texture, or renderbuffer) and forward the result to a specified
45 class MemoryTypeTracker {
47 MemoryTypeTracker(MemoryTracker* memory_tracker, MemoryTracker::Pool pool)
48 : memory_tracker_(memory_tracker),
50 has_done_update_(false),
52 mem_represented_at_last_update_(0) {
53 UpdateMemRepresented();
56 ~MemoryTypeTracker() {
57 UpdateMemRepresented();
60 void TrackMemAlloc(size_t bytes) {
61 mem_represented_ += bytes;
62 UpdateMemRepresented();
65 void TrackMemFree(size_t bytes) {
66 DCHECK(bytes <= mem_represented_);
67 mem_represented_ -= bytes;
68 UpdateMemRepresented();
71 size_t GetMemRepresented() const {
72 return mem_represented_at_last_update_;
75 // Ensure a certain amount of GPU memory is free. Returns true on success.
76 bool EnsureGPUMemoryAvailable(size_t size_needed) {
77 if (memory_tracker_) {
78 return memory_tracker_->EnsureGPUMemoryAvailable(size_needed);
84 void UpdateMemRepresented() {
85 // Skip redundant updates only if we have already done an update.
86 if (!has_done_update_ &&
87 mem_represented_ == mem_represented_at_last_update_) {
90 if (memory_tracker_) {
91 memory_tracker_->TrackMemoryAllocatedChange(
92 mem_represented_at_last_update_,
96 has_done_update_ = true;
97 mem_represented_at_last_update_ = mem_represented_;
100 MemoryTracker* memory_tracker_;
101 MemoryTracker::Pool pool_;
102 bool has_done_update_;
103 size_t mem_represented_;
104 size_t mem_represented_at_last_update_;
106 DISALLOW_COPY_AND_ASSIGN(MemoryTypeTracker);
112 #endif // GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_