Handle account removal correctly on all platforms.
[chromium-blink-merge.git] / gpu / command_buffer / service / memory_tracking.h
blob151432523ff9bbadcba93de0a43267ac4423888f
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_
8 #include <string>
9 #include "base/basictypes.h"
10 #include "base/debug/trace_event.h"
11 #include "base/logging.h"
12 #include "base/memory/ref_counted.h"
14 namespace gpu {
15 namespace gles2 {
17 // A MemoryTracker is used to propagate per-ContextGroup memory usage
18 // statistics to the global GpuMemoryManager.
19 class MemoryTracker : public base::RefCounted<MemoryTracker> {
20 public:
21 enum Pool {
22 kUnmanaged,
23 kManaged
26 virtual void TrackMemoryAllocatedChange(size_t old_size,
27 size_t new_size,
28 Pool pool) = 0;
30 // Ensure a certain amount of GPU memory is free. Returns true on success.
31 virtual bool EnsureGPUMemoryAvailable(size_t size_needed) = 0;
33 protected:
34 friend class base::RefCounted<MemoryTracker>;
35 MemoryTracker() {}
36 virtual ~MemoryTracker() {};
38 private:
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
44 // MemoryTracker.
45 class MemoryTypeTracker {
46 public:
47 MemoryTypeTracker(MemoryTracker* memory_tracker, MemoryTracker::Pool pool)
48 : memory_tracker_(memory_tracker),
49 pool_(pool),
50 has_done_update_(false),
51 mem_represented_(0),
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);
80 return true;
83 private:
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_) {
88 return;
90 if (memory_tracker_) {
91 memory_tracker_->TrackMemoryAllocatedChange(
92 mem_represented_at_last_update_,
93 mem_represented_,
94 pool_);
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);
109 } // namespace gles2
110 } // namespace gpu
112 #endif // GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_