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_