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 CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ | 5 #ifndef CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ |
6 #define CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ | 6 #define CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ |
7 | 7 |
8 #if defined(ENABLE_GPU) | 8 #if defined(ENABLE_GPU) |
9 | 9 |
10 #include <list> | 10 #include <list> |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | 80 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, |
81 GpuMemoryAllocationCompareTests); | 81 GpuMemoryAllocationCompareTests); |
82 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | 82 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, |
83 StubMemoryStatsForLastManageTests); | 83 StubMemoryStatsForLastManageTests); |
84 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | 84 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, |
85 TestManagedUsageTracking); | 85 TestManagedUsageTracking); |
86 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | 86 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, |
87 TestBackgroundCutoff); | 87 TestBackgroundCutoff); |
88 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | 88 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, |
89 TestBackgroundMru); | 89 TestBackgroundMru); |
| 90 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, |
| 91 TestUnmanagedTracking); |
90 | 92 |
91 typedef std::map<gpu::gles2::MemoryTracker*, GpuMemoryTrackingGroup*> | 93 typedef std::map<gpu::gles2::MemoryTracker*, GpuMemoryTrackingGroup*> |
92 TrackingGroupMap; | 94 TrackingGroupMap; |
93 | 95 |
94 typedef std::list<GpuMemoryManagerClientState*> ClientStateList; | 96 typedef std::list<GpuMemoryManagerClientState*> ClientStateList; |
95 | 97 |
96 void Manage(); | 98 void Manage(); |
97 void SetClientsHibernatedState() const; | 99 void SetClientsHibernatedState() const; |
98 size_t GetVisibleClientAllocation() const; | 100 size_t GetVisibleClientAllocation() const; |
99 size_t GetCurrentBackgroundedAvailableGpuMemory() const; | 101 size_t GetCurrentBackgroundedAvailableGpuMemory() const; |
100 | 102 |
101 // Update the amount of GPU memory we think we have in the system, based | 103 // Update the amount of GPU memory we think we have in the system, based |
102 // on what the stubs' contexts report. | 104 // on what the stubs' contexts report. |
103 void UpdateAvailableGpuMemory(); | 105 void UpdateAvailableGpuMemory(); |
| 106 void UpdateUnmanagedMemoryLimits(); |
104 void UpdateBackgroundedAvailableGpuMemory(); | 107 void UpdateBackgroundedAvailableGpuMemory(); |
105 | 108 |
106 // The amount of video memory which is available for allocation. | 109 // The amount of video memory which is available for allocation. |
107 size_t GetAvailableGpuMemory() const; | 110 size_t GetAvailableGpuMemory() const; |
108 | 111 |
109 // Minimum value of available GPU memory, no matter how little the GPU | 112 // Minimum value of available GPU memory, no matter how little the GPU |
110 // reports. This is the default value. | 113 // reports. This is the default value. |
111 size_t GetDefaultAvailableGpuMemory() const; | 114 size_t GetDefaultAvailableGpuMemory() const; |
112 | 115 |
113 // Maximum cap on total GPU memory, no matter how much the GPU reports. | 116 // Maximum cap on total GPU memory, no matter how much the GPU reports. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 void RemoveClientFromList(GpuMemoryManagerClientState* client_state); | 155 void RemoveClientFromList(GpuMemoryManagerClientState* client_state); |
153 ClientStateList* GetClientList(GpuMemoryManagerClientState* client_state); | 156 ClientStateList* GetClientList(GpuMemoryManagerClientState* client_state); |
154 | 157 |
155 // Interfaces for testing | 158 // Interfaces for testing |
156 void TestingDisableScheduleManage() { disable_schedule_manage_ = true; } | 159 void TestingDisableScheduleManage() { disable_schedule_manage_ = true; } |
157 void TestingSetAvailableGpuMemory(size_t bytes) { | 160 void TestingSetAvailableGpuMemory(size_t bytes) { |
158 bytes_available_gpu_memory_ = bytes; | 161 bytes_available_gpu_memory_ = bytes; |
159 bytes_available_gpu_memory_overridden_ = true; | 162 bytes_available_gpu_memory_overridden_ = true; |
160 } | 163 } |
161 | 164 |
| 165 void TestingSetMinimumClientAllocation(size_t bytes) { |
| 166 bytes_minimum_per_client_ = bytes; |
| 167 bytes_minimum_per_client_overridden_ = true; |
| 168 } |
| 169 |
| 170 void TestingSetUnmanagedLimitStep(size_t bytes) { |
| 171 bytes_unmanaged_limit_step_ = bytes; |
| 172 } |
| 173 |
162 void TestingSetBackgroundedAvailableGpuMemory(size_t bytes) { | 174 void TestingSetBackgroundedAvailableGpuMemory(size_t bytes) { |
163 bytes_backgrounded_available_gpu_memory_ = bytes; | 175 bytes_backgrounded_available_gpu_memory_ = bytes; |
164 } | 176 } |
165 | 177 |
166 GpuChannelManager* channel_manager_; | 178 GpuChannelManager* channel_manager_; |
167 | 179 |
168 // A list of all visible and nonvisible clients, in most-recently-used | 180 // A list of all visible and nonvisible clients, in most-recently-used |
169 // order (most recently used is first). | 181 // order (most recently used is first). |
170 ClientStateList clients_visible_mru_; | 182 ClientStateList clients_visible_mru_; |
171 ClientStateList clients_nonvisible_mru_; | 183 ClientStateList clients_nonvisible_mru_; |
172 | 184 |
173 // A list of all clients that don't have a surface. | 185 // A list of all clients that don't have a surface. |
174 ClientStateList clients_nonsurface_; | 186 ClientStateList clients_nonsurface_; |
175 | 187 |
176 // All context groups' tracking structures | 188 // All context groups' tracking structures |
177 TrackingGroupMap tracking_groups_; | 189 TrackingGroupMap tracking_groups_; |
178 | 190 |
179 base::CancelableClosure delayed_manage_callback_; | 191 base::CancelableClosure delayed_manage_callback_; |
180 bool manage_immediate_scheduled_; | 192 bool manage_immediate_scheduled_; |
181 | 193 |
182 size_t max_surfaces_with_frontbuffer_soft_limit_; | 194 size_t max_surfaces_with_frontbuffer_soft_limit_; |
183 | 195 |
184 // The maximum amount of memory that may be allocated for GPU resources | 196 // The maximum amount of memory that may be allocated for GPU resources |
185 size_t bytes_available_gpu_memory_; | 197 size_t bytes_available_gpu_memory_; |
186 bool bytes_available_gpu_memory_overridden_; | 198 bool bytes_available_gpu_memory_overridden_; |
187 | 199 |
| 200 // The minimum allocation that may be given to a single renderer. |
| 201 size_t bytes_minimum_per_client_; |
| 202 bool bytes_minimum_per_client_overridden_; |
| 203 |
188 // The maximum amount of memory that can be allocated for GPU resources | 204 // The maximum amount of memory that can be allocated for GPU resources |
189 // in backgrounded renderers. | 205 // in backgrounded renderers. |
190 size_t bytes_backgrounded_available_gpu_memory_; | 206 size_t bytes_backgrounded_available_gpu_memory_; |
191 | 207 |
192 // The current total memory usage, and historical maximum memory usage | 208 // The current total memory usage, and historical maximum memory usage |
193 size_t bytes_allocated_managed_current_; | 209 size_t bytes_allocated_managed_current_; |
194 size_t bytes_allocated_managed_visible_; | 210 size_t bytes_allocated_managed_visible_; |
195 size_t bytes_allocated_managed_backgrounded_; | 211 size_t bytes_allocated_managed_backgrounded_; |
196 size_t bytes_allocated_unmanaged_current_; | 212 size_t bytes_allocated_unmanaged_current_; |
197 size_t bytes_allocated_historical_max_; | 213 size_t bytes_allocated_historical_max_; |
198 | 214 |
| 215 // If bytes_allocated_unmanaged_current_ leaves the interval [low_, high_), |
| 216 // then ScheduleManage to take the change into account. |
| 217 size_t bytes_allocated_unmanaged_high_; |
| 218 size_t bytes_allocated_unmanaged_low_; |
| 219 |
| 220 // Update bytes_allocated_unmanaged_low/high_ in intervals of step_. |
| 221 size_t bytes_unmanaged_limit_step_; |
| 222 |
199 // The number of browser windows that exist. If we ever receive a | 223 // The number of browser windows that exist. If we ever receive a |
200 // GpuMsg_SetVideoMemoryWindowCount, then we use this to compute memory | 224 // GpuMsg_SetVideoMemoryWindowCount, then we use this to compute memory |
201 // budgets, instead of doing more complicated stub-based calculations. | 225 // budgets, instead of doing more complicated stub-based calculations. |
202 bool window_count_has_been_received_; | 226 bool window_count_has_been_received_; |
203 uint32 window_count_; | 227 uint32 window_count_; |
204 | 228 |
205 // Used to disable automatic changes to Manage() in testing. | 229 // Used to disable automatic changes to Manage() in testing. |
206 bool disable_schedule_manage_; | 230 bool disable_schedule_manage_; |
207 | 231 |
208 DISALLOW_COPY_AND_ASSIGN(GpuMemoryManager); | 232 DISALLOW_COPY_AND_ASSIGN(GpuMemoryManager); |
209 }; | 233 }; |
210 | 234 |
211 } // namespace content | 235 } // namespace content |
212 | 236 |
213 #endif | 237 #endif |
214 | 238 |
215 #endif // CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ | 239 #endif // CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ |
OLD | NEW |