Index: chrome/browser/task_manager/task_manager.cc |
diff --git a/chrome/browser/task_manager/task_manager.cc b/chrome/browser/task_manager/task_manager.cc |
index f089752cdcbc72e4bfa89ecc52713773ae4bc98e..eb7c87ee38f3dac21a40cc8a3c5d6cf649079a47 100644 |
--- a/chrome/browser/task_manager/task_manager.cc |
+++ b/chrome/browser/task_manager/task_manager.cc |
@@ -31,6 +31,8 @@ |
#include "chrome/common/view_type.h" |
#include "content/public/browser/browser_child_process_host.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/gpu_data_manager.h" |
+#include "content/public/browser/gpu_data_manager_observer.h" |
#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/resource_request_info.h" |
#include "content/public/browser/web_contents.h" |
@@ -83,7 +85,8 @@ string16 FormatStatsSize(const WebKit::WebCache::ResourceTypeStat& stat) { |
//////////////////////////////////////////////////////////////////////////////// |
TaskManagerModel::TaskManagerModel(TaskManager* task_manager) |
- : update_requests_(0), |
+ : pending_vidmem_usage_stats_update_(false), |
+ update_requests_(0), |
listen_requests_(0), |
update_state_(IDLE), |
goat_salt_(base::RandUint64()), |
@@ -255,6 +258,26 @@ string16 TaskManagerModel::GetResourceWebCoreCSSCacheSize( |
return FormatStatsSize(stats.cssStyleSheets); |
} |
+string16 TaskManagerModel::GetResourceVidmem( |
+ int index) const { |
brettw
2012/08/17 19:07:24
Doesn't this fit on the previous line?
ccameron
2012/08/17 20:52:55
Done.
|
+ CHECK_LT(index, ResourceCount()); |
+ |
+ bool result; |
+ size_t vidmem; |
+ bool has_duplicates; |
+ result = GetVidmem(index, &vidmem, &has_duplicates); |
+ |
+ if (!result || !vidmem) { |
+ return ASCIIToUTF16("N/A"); |
brettw
2012/08/17 19:07:24
It's not clear why you're using ASCII in this plac
ccameron
2012/08/17 20:52:55
The other instances of N/A use ASCII -- I changed
|
+ } else if (has_duplicates) { |
+ return UTF8ToUTF16("(") + |
+ GetMemCellText(vidmem) + |
+ UTF8ToUTF16(")"); |
+ } else { |
+ return GetMemCellText(vidmem); |
+ } |
+} |
+ |
string16 TaskManagerModel::GetResourceFPS( |
int index) const { |
CHECK_LT(index, ResourceCount()); |
@@ -448,6 +471,13 @@ int TaskManagerModel::CompareValues(int row1, int row2, int col_id) const { |
} else if (col_id == IDS_TASK_MANAGER_FPS_COLUMN) { |
return ValueCompare<float>(resources_[row1]->GetFPS(), |
resources_[row2]->GetFPS()); |
+ } else if (col_id == IDS_TASK_MANAGER_VIDMEM_COLUMN) { |
+ size_t value1; |
+ size_t value2; |
+ bool has_duplicates; |
+ if (!GetVidmem(row1, &value1, &has_duplicates)) value1 = 0; |
+ if (!GetVidmem(row2, &value2, &has_duplicates)) value2 = 0; |
+ return ValueCompare<size_t>(value1, value2); |
} else if (col_id == IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN) { |
return ValueCompare<int>(GetGoatsTeleported(row1), |
GetGoatsTeleported(row2)); |
@@ -567,6 +597,22 @@ bool TaskManagerModel::GetWebCoreCacheStats( |
return true; |
} |
+bool TaskManagerModel::GetVidmem( |
+ int index, size_t* vidmem, bool* has_duplicates) const { |
+ TaskManager::Resource* resource = resources_[index]; |
+ base::ProcessId pid = base::GetProcId(resource->GetProcess()); |
+ content::GPUVidmemUsageStats::ProcessMap::const_iterator i = |
+ vidmem_usage_stats_.process_map.find(pid); |
+ if (i == vidmem_usage_stats_.process_map.end()) { |
+ *vidmem = 0; |
+ *has_duplicates = false; |
+ return false; |
+ } |
+ *vidmem = (*i).second.vidmem; |
+ *has_duplicates = (*i).second.has_duplicates; |
+ return true; |
+} |
+ |
bool TaskManagerModel::GetFPS(int index, float* result) const { |
*result = 0; |
if (!resources_[index]->ReportsFPS()) |
@@ -885,6 +931,13 @@ void TaskManagerModel::NotifyFPS(base::ProcessId renderer_id, |
} |
} |
+void TaskManagerModel::NotifyVidmemUsageStats( |
+ const content::GPUVidmemUsageStats& vidmem_usage_stats) { |
+ DCHECK(pending_vidmem_usage_stats_update_); |
+ vidmem_usage_stats_ = vidmem_usage_stats; |
+ pending_vidmem_usage_stats_update_ = false; |
+} |
+ |
void TaskManagerModel::NotifyV8HeapStats(base::ProcessId renderer_id, |
size_t v8_memory_allocated, |
size_t v8_memory_used) { |
@@ -896,6 +949,48 @@ void TaskManagerModel::NotifyV8HeapStats(base::ProcessId renderer_id, |
} |
} |
+class TaskManagerModelGpuDataManagerObserver |
+ : public content::GpuDataManagerObserver { |
+ public: |
+ |
+ TaskManagerModelGpuDataManagerObserver() { |
+ content::GpuDataManager::GetInstance()->AddObserver(this); |
+ } |
+ |
+ virtual ~TaskManagerModelGpuDataManagerObserver() { |
+ content::GpuDataManager::GetInstance()->RemoveObserver(this); |
+ } |
+ |
+ static void NotifyVidmemUsageStats( |
+ content::GPUVidmemUsageStats vidmem_usage_stats) { |
+ TaskManager::GetInstance()->model()->NotifyVidmemUsageStats( |
+ vidmem_usage_stats); |
+ } |
+ |
+ virtual void OnGpuInfoUpdate() OVERRIDE {} |
+ |
+ virtual void OnVidmemUsageStatsUpdate( |
+ const content::GPUVidmemUsageStats& vidmem_usage_stats) OVERRIDE { |
+ if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ NotifyVidmemUsageStats(vidmem_usage_stats); |
+ } else { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, base::Bind( |
+ &TaskManagerModelGpuDataManagerObserver::NotifyVidmemUsageStats, |
+ vidmem_usage_stats)); |
+ } |
+ delete this; |
+ } |
+}; |
+ |
+void TaskManagerModel::RefreshVidmemUsageStats() |
+{ |
+ if (pending_vidmem_usage_stats_update_) return; |
+ pending_vidmem_usage_stats_update_ = true; |
+ new TaskManagerModelGpuDataManagerObserver; |
+ content::GpuDataManager::GetInstance()->RequestVidmemUsageStatsUpdate(); |
+} |
+ |
void TaskManagerModel::Refresh() { |
DCHECK_NE(IDLE, update_state_); |
@@ -928,6 +1023,9 @@ void TaskManagerModel::Refresh() { |
// Clear the memory values so they can be querried lazily. |
memory_usage_map_.clear(); |
+ // Send a request to refresh GPU memory consumption values |
+ RefreshVidmemUsageStats(); |
+ |
// Compute the new network usage values. |
displayed_network_usage_map_.clear(); |
base::TimeDelta update_time = |