Chromium Code Reviews| 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 #include <list> | 8 #include <list> |
| 9 #include <map> | 9 #include <map> |
| 10 | 10 |
| 11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 12 #include "base/cancelable_callback.h" | 12 #include "base/cancelable_callback.h" |
| 13 #include "base/containers/hash_tables.h" | 13 #include "base/containers/hash_tables.h" |
| 14 #include "base/gtest_prod_util.h" | 14 #include "base/gtest_prod_util.h" |
| 15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
| 16 #include "content/common/content_export.h" | 16 #include "content/common/content_export.h" |
| 17 #include "content/public/common/gpu_memory_stats.h" | 17 #include "content/public/common/gpu_memory_stats.h" |
| 18 #include "gpu/command_buffer/common/gpu_memory_allocation.h" | 18 #include "gpu/command_buffer/common/gpu_memory_allocation.h" |
| 19 #include "gpu/command_buffer/service/memory_tracking.h" | 19 #include "gpu/command_buffer/service/memory_tracking.h" |
| 20 | 20 |
| 21 namespace content { | 21 namespace content { |
| 22 | 22 |
| 23 class GpuChannelManager; | 23 class GpuChannelManager; |
| 24 class GpuMemoryManagerClient; | |
| 25 class GpuMemoryManagerClientState; | |
| 26 class GpuMemoryTrackingGroup; | 24 class GpuMemoryTrackingGroup; |
| 27 | 25 |
| 28 class CONTENT_EXPORT GpuMemoryManager : | 26 class CONTENT_EXPORT GpuMemoryManager : |
| 29 public base::SupportsWeakPtr<GpuMemoryManager> { | 27 public base::SupportsWeakPtr<GpuMemoryManager> { |
| 30 public: | 28 public: |
| 31 #if defined(OS_ANDROID) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) | 29 GpuMemoryManager(GpuChannelManager* channel_manager); |
|
piman
2015/11/10 23:34:49
nit: explicit
sohanjg
2015/11/13 07:30:44
Done.
| |
| 32 enum { kDefaultMaxSurfacesWithFrontbufferSoftLimit = 1 }; | |
| 33 #else | |
| 34 enum { kDefaultMaxSurfacesWithFrontbufferSoftLimit = 8 }; | |
| 35 #endif | |
| 36 enum ScheduleManageTime { | |
| 37 // Add a call to Manage to the thread's message loop immediately. | |
| 38 kScheduleManageNow, | |
| 39 // Add a Manage call to the thread's message loop for execution 1/60th of | |
| 40 // of a second from now. | |
| 41 kScheduleManageLater, | |
| 42 }; | |
| 43 | |
| 44 GpuMemoryManager(GpuChannelManager* channel_manager, | |
| 45 uint64 max_surfaces_with_frontbuffer_soft_limit); | |
| 46 ~GpuMemoryManager(); | 30 ~GpuMemoryManager(); |
| 47 | 31 |
| 48 // Schedule a Manage() call. If immediate is true, we PostTask without delay. | |
| 49 // Otherwise PostDelayedTask using a CancelableClosure and allow multiple | |
| 50 // delayed calls to "queue" up. This way, we do not spam clients in certain | |
| 51 // lower priority situations. An immediate schedule manage will cancel any | |
| 52 // queued delayed manage. | |
| 53 void ScheduleManage(ScheduleManageTime schedule_manage_time); | |
| 54 | |
| 55 // Retrieve GPU Resource consumption statistics for the task manager | 32 // Retrieve GPU Resource consumption statistics for the task manager |
| 56 void GetVideoMemoryUsageStats( | 33 void GetVideoMemoryUsageStats( |
| 57 content::GPUVideoMemoryUsageStats* video_memory_usage_stats) const; | 34 content::GPUVideoMemoryUsageStats* video_memory_usage_stats) const; |
| 58 | 35 |
| 59 GpuMemoryManagerClientState* CreateClientState( | |
| 60 GpuMemoryManagerClient* client, bool has_surface, bool visible); | |
| 61 | |
| 62 GpuMemoryTrackingGroup* CreateTrackingGroup( | 36 GpuMemoryTrackingGroup* CreateTrackingGroup( |
| 63 base::ProcessId pid, gpu::gles2::MemoryTracker* memory_tracker); | 37 base::ProcessId pid, gpu::gles2::MemoryTracker* memory_tracker); |
| 64 | 38 |
| 65 uint64 GetTrackerMemoryUsage(gpu::gles2::MemoryTracker* tracker) const; | 39 uint64 GetTrackerMemoryUsage(gpu::gles2::MemoryTracker* tracker) const; |
| 66 uint64 GetMaximumClientAllocation() const { | 40 uint64 GetMaximumClientAllocation() const { |
| 67 return client_hard_limit_bytes_; | 41 return client_hard_limit_bytes_; |
| 68 } | 42 } |
| 69 | 43 |
| 70 private: | 44 private: |
| 71 friend class GpuMemoryManagerTest; | 45 friend class GpuMemoryManagerTest; |
| 72 friend class GpuMemoryTrackingGroup; | 46 friend class GpuMemoryTrackingGroup; |
| 73 friend class GpuMemoryManagerClientState; | 47 friend class GpuMemoryManagerClientState; |
| 74 | 48 |
| 75 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 76 TestManageBasicFunctionality); | |
| 77 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 78 TestManageChangingVisibility); | |
| 79 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 80 TestManageManyVisibleStubs); | |
| 81 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 82 TestManageManyNotVisibleStubs); | |
| 83 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 84 TestManageChangingLastUsedTime); | |
| 85 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 86 TestManageChangingImportanceShareGroup); | |
| 87 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 88 TestForegroundStubsGetBonusAllocation); | |
| 89 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 90 TestUpdateAvailableGpuMemory); | |
| 91 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 92 GpuMemoryAllocationCompareTests); | |
| 93 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 94 StubMemoryStatsForLastManageTests); | |
| 95 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 96 TestManagedUsageTracking); | |
| 97 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 98 BackgroundMru); | |
| 99 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 100 AllowNonvisibleMemory); | |
| 101 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 102 BackgroundDiscardPersistent); | |
| 103 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 104 UnmanagedTracking); | |
| 105 FRIEND_TEST_ALL_PREFIXES(GpuMemoryManagerTest, | |
| 106 DefaultAllocation); | |
| 107 | |
| 108 typedef std::map<gpu::gles2::MemoryTracker*, GpuMemoryTrackingGroup*> | 49 typedef std::map<gpu::gles2::MemoryTracker*, GpuMemoryTrackingGroup*> |
| 109 TrackingGroupMap; | 50 TrackingGroupMap; |
| 110 | 51 |
| 111 typedef std::list<GpuMemoryManagerClientState*> ClientStateList; | |
| 112 | |
| 113 void Manage(); | |
| 114 void SetClientsHibernatedState() const; | |
| 115 | |
| 116 // Send memory usage stats to the browser process. | 52 // Send memory usage stats to the browser process. |
| 117 void SendUmaStatsToBrowser(); | 53 void SendUmaStatsToBrowser(); |
| 118 | 54 |
| 119 // Get the current number of bytes allocated. | 55 // Get the current number of bytes allocated. |
| 120 uint64 GetCurrentUsage() const { | 56 uint64 GetCurrentUsage() const { |
| 121 return bytes_allocated_current_; | 57 return bytes_allocated_current_; |
| 122 } | 58 } |
| 123 | 59 |
| 124 // GpuMemoryTrackingGroup interface | 60 // GpuMemoryTrackingGroup interface |
| 125 void TrackMemoryAllocatedChange( | 61 void TrackMemoryAllocatedChange( |
| 126 GpuMemoryTrackingGroup* tracking_group, | 62 GpuMemoryTrackingGroup* tracking_group, |
| 127 uint64 old_size, | 63 uint64 old_size, |
| 128 uint64 new_size); | 64 uint64 new_size); |
| 129 void OnDestroyTrackingGroup(GpuMemoryTrackingGroup* tracking_group); | 65 void OnDestroyTrackingGroup(GpuMemoryTrackingGroup* tracking_group); |
| 130 bool EnsureGPUMemoryAvailable(uint64 size_needed); | 66 bool EnsureGPUMemoryAvailable(uint64 size_needed); |
| 131 | 67 |
| 132 // GpuMemoryManagerClientState interface | |
| 133 void SetClientStateVisible( | |
| 134 GpuMemoryManagerClientState* client_state, bool visible); | |
| 135 void OnDestroyClientState(GpuMemoryManagerClientState* client); | |
| 136 | |
| 137 // Add or remove a client from its clients list (visible, nonvisible, or | |
| 138 // nonsurface). When adding the client, add it to the front of the list. | |
| 139 void AddClientToList(GpuMemoryManagerClientState* client_state); | |
| 140 void RemoveClientFromList(GpuMemoryManagerClientState* client_state); | |
| 141 ClientStateList* GetClientList(GpuMemoryManagerClientState* client_state); | |
| 142 | |
| 143 // Interfaces for testing | |
| 144 void TestingDisableScheduleManage() { disable_schedule_manage_ = true; } | |
| 145 | |
| 146 GpuChannelManager* channel_manager_; | 68 GpuChannelManager* channel_manager_; |
| 147 | 69 |
| 148 // A list of all visible and nonvisible clients, in most-recently-used | |
| 149 // order (most recently used is first). | |
| 150 ClientStateList clients_visible_mru_; | |
| 151 ClientStateList clients_nonvisible_mru_; | |
| 152 | |
| 153 // A list of all clients that don't have a surface. | |
| 154 ClientStateList clients_nonsurface_; | |
| 155 | |
| 156 // All context groups' tracking structures | 70 // All context groups' tracking structures |
| 157 TrackingGroupMap tracking_groups_; | 71 TrackingGroupMap tracking_groups_; |
| 158 | 72 |
| 159 base::CancelableClosure delayed_manage_callback_; | |
| 160 bool manage_immediate_scheduled_; | |
| 161 bool disable_schedule_manage_; | |
| 162 | |
| 163 uint64 max_surfaces_with_frontbuffer_soft_limit_; | |
| 164 | |
| 165 // The maximum amount of memory that may be allocated for a single client. | 73 // The maximum amount of memory that may be allocated for a single client. |
| 166 uint64 client_hard_limit_bytes_; | 74 uint64 client_hard_limit_bytes_; |
| 167 | 75 |
| 168 // The current total memory usage, and historical maximum memory usage | 76 // The current total memory usage, and historical maximum memory usage |
| 169 uint64 bytes_allocated_current_; | 77 uint64 bytes_allocated_current_; |
| 170 uint64 bytes_allocated_historical_max_; | 78 uint64 bytes_allocated_historical_max_; |
| 171 | 79 |
| 172 DISALLOW_COPY_AND_ASSIGN(GpuMemoryManager); | 80 DISALLOW_COPY_AND_ASSIGN(GpuMemoryManager); |
| 173 }; | 81 }; |
| 174 | 82 |
| 175 } // namespace content | 83 } // namespace content |
| 176 | 84 |
| 177 #endif // CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ | 85 #endif // CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_ |
| OLD | NEW |