OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_ |
6 #define GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
11 | 11 |
12 namespace gpu { | 12 namespace gpu { |
13 namespace gles2 { | 13 namespace gles2 { |
14 | 14 |
15 // A MemoryTracker is used to propagate per-ContextGroup memory usage | 15 // A MemoryTracker is used to propagate per-ContextGroup memory usage |
16 // statistics to the global GpuMemoryManager. | 16 // statistics to the global GpuMemoryManager. |
17 class MemoryTracker : public base::RefCounted<MemoryTracker> { | 17 class MemoryTracker : public base::RefCounted<MemoryTracker> { |
18 public: | 18 public: |
19 virtual void TrackMemoryAllocatedChange(size_t old_size, size_t new_size) = 0; | 19 enum Pool { |
| 20 kUnmanaged, |
| 21 kManaged |
| 22 }; |
| 23 |
| 24 virtual void TrackMemoryAllocatedChange(size_t old_size, |
| 25 size_t new_size, |
| 26 Pool pool) = 0; |
20 | 27 |
21 protected: | 28 protected: |
22 friend class base::RefCounted<MemoryTracker>; | 29 friend class base::RefCounted<MemoryTracker>; |
23 MemoryTracker() {} | 30 MemoryTracker() {} |
24 virtual ~MemoryTracker() {}; | 31 virtual ~MemoryTracker() {}; |
25 | 32 |
26 private: | 33 private: |
27 DISALLOW_COPY_AND_ASSIGN(MemoryTracker); | 34 DISALLOW_COPY_AND_ASSIGN(MemoryTracker); |
28 }; | 35 }; |
29 | 36 |
30 // A MemoryTypeTracker tracks the use of a particular type of memory (buffer, | 37 // A MemoryTypeTracker tracks the use of a particular type of memory (buffer, |
31 // texture, or renderbuffer) and forward the result to a specified | 38 // texture, or renderbuffer) and forward the result to a specified |
32 // MemoryTracker. | 39 // MemoryTracker. |
33 class MemoryTypeTracker { | 40 class MemoryTypeTracker { |
34 public: | 41 public: |
35 MemoryTypeTracker(MemoryTracker* memory_tracker) | 42 MemoryTypeTracker(MemoryTracker* memory_tracker, MemoryTracker::Pool pool) |
36 : memory_tracker_(memory_tracker), | 43 : memory_tracker_(memory_tracker), |
37 has_updated_mem_represented_(false), | 44 pool_(pool), |
38 last_updated_mem_represented_(0) { | 45 has_done_update_(false), |
| 46 mem_represented_(0), |
| 47 mem_represented_at_last_update_(0) { |
39 } | 48 } |
40 | 49 |
41 void UpdateMemRepresented(size_t mem_represented) { | 50 void TrackMemAlloc(size_t bytes) { |
42 if (!has_updated_mem_represented_ && | 51 mem_represented_ += bytes; |
43 mem_represented == last_updated_mem_represented_) { | 52 } |
| 53 |
| 54 void TrackMemFree(size_t bytes) { |
| 55 DCHECK(bytes <= mem_represented_); |
| 56 mem_represented_ -= bytes; |
| 57 } |
| 58 |
| 59 void UpdateMemRepresented() { |
| 60 // Skip redundant updates only if we have already done an update. |
| 61 if (!has_done_update_ && |
| 62 mem_represented_ == mem_represented_at_last_update_) { |
44 return; | 63 return; |
45 } | 64 } |
46 if (memory_tracker_) { | 65 if (memory_tracker_) { |
47 memory_tracker_->TrackMemoryAllocatedChange( | 66 memory_tracker_->TrackMemoryAllocatedChange( |
48 last_updated_mem_represented_, | 67 mem_represented_at_last_update_, |
49 mem_represented); | 68 mem_represented_, |
| 69 pool_); |
50 } | 70 } |
51 has_updated_mem_represented_ = true; | 71 has_done_update_ = true; |
52 last_updated_mem_represented_ = mem_represented; | 72 mem_represented_at_last_update_ = mem_represented_; |
53 } | 73 } |
54 | 74 |
55 size_t GetMemRepresented() const { | 75 size_t GetMemRepresented() const { |
56 return last_updated_mem_represented_; | 76 return mem_represented_at_last_update_; |
57 } | 77 } |
58 | 78 |
59 private: | 79 private: |
60 MemoryTracker* memory_tracker_; | 80 MemoryTracker* memory_tracker_; |
61 bool has_updated_mem_represented_; | 81 MemoryTracker::Pool pool_; |
62 size_t last_updated_mem_represented_; | 82 bool has_done_update_; |
| 83 size_t mem_represented_; |
| 84 size_t mem_represented_at_last_update_; |
63 | 85 |
64 DISALLOW_COPY_AND_ASSIGN(MemoryTypeTracker); | 86 DISALLOW_COPY_AND_ASSIGN(MemoryTypeTracker); |
65 }; | 87 }; |
66 | 88 |
67 } // namespace gles2 | 89 } // namespace gles2 |
68 } // namespace gpu | 90 } // namespace gpu |
69 | 91 |
70 #endif // GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_ | 92 #endif // GPU_COMMAND_BUFFER_SERVICE_MEMORY_TRACKING_H_ |
OLD | NEW |