Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(349)

Side by Side Diff: chrome/browser/gpu_process_host.cc

Issue 6352011: Improve blacklist logic: use more fields (driver_vendor, gl_renderer, ect) fo... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/gpu_process_host.h ('k') | chrome/browser/resources/gpu_blacklist.json » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #include "chrome/browser/gpu_process_host.h" 5 #include "chrome/browser/gpu_process_host.h"
6 6
7 #include "app/app_switches.h" 7 #include "app/app_switches.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/string_piece.h" 10 #include "base/string_piece.h"
(...skipping 10 matching lines...) Expand all
21 #include "chrome/common/render_messages.h" 21 #include "chrome/common/render_messages.h"
22 #include "chrome/gpu/gpu_thread.h" 22 #include "chrome/gpu/gpu_thread.h"
23 #include "grit/browser_resources.h" 23 #include "grit/browser_resources.h"
24 #include "ipc/ipc_channel_handle.h" 24 #include "ipc/ipc_channel_handle.h"
25 #include "ipc/ipc_switches.h" 25 #include "ipc/ipc_switches.h"
26 #include "media/base/media_switches.h" 26 #include "media/base/media_switches.h"
27 #include "ui/base/resource/resource_bundle.h" 27 #include "ui/base/resource/resource_bundle.h"
28 28
29 namespace { 29 namespace {
30 30
31 enum GPUBlacklistTestResult {
32 BLOCKED,
33 ALLOWED,
34 BLACKLIST_TEST_RESULT_MAX
35 };
36
37 enum GPUProcessLifetimeEvent { 31 enum GPUProcessLifetimeEvent {
38 LAUNCED, 32 LAUNCED,
39 CRASHED, 33 CRASHED,
40 GPU_PROCESS_LIFETIME_EVENT_MAX 34 GPU_PROCESS_LIFETIME_EVENT_MAX
41 }; 35 };
42 36
43 // Tasks used by this file 37 // Tasks used by this file
44 class RouteOnUIThreadTask : public Task { 38 class RouteOnUIThreadTask : public Task {
45 public: 39 public:
46 explicit RouteOnUIThreadTask(const IPC::Message& msg) : msg_(msg) { 40 explicit RouteOnUIThreadTask(const IPC::Message& msg) : msg_(msg) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 private: 93 private:
100 scoped_ptr<GpuThread> gpu_thread_; 94 scoped_ptr<GpuThread> gpu_thread_;
101 std::string channel_id_; 95 std::string channel_id_;
102 DISALLOW_COPY_AND_ASSIGN(GpuMainThread); 96 DISALLOW_COPY_AND_ASSIGN(GpuMainThread);
103 }; 97 };
104 98
105 GpuProcessHost::GpuProcessHost() 99 GpuProcessHost::GpuProcessHost()
106 : BrowserChildProcessHost(GPU_PROCESS, NULL), 100 : BrowserChildProcessHost(GPU_PROCESS, NULL),
107 initialized_(false), 101 initialized_(false),
108 initialized_successfully_(false), 102 initialized_successfully_(false),
109 blacklist_result_recorded_(false) { 103 gpu_feature_flags_set_(false) {
110 DCHECK_EQ(sole_instance_, static_cast<GpuProcessHost*>(NULL)); 104 DCHECK_EQ(sole_instance_, static_cast<GpuProcessHost*>(NULL));
111 } 105 }
112 106
113 GpuProcessHost::~GpuProcessHost() { 107 GpuProcessHost::~GpuProcessHost() {
114 while (!queued_synchronization_replies_.empty()) { 108 while (!queued_synchronization_replies_.empty()) {
115 delete queued_synchronization_replies_.front().reply; 109 delete queued_synchronization_replies_.front().reply;
116 queued_synchronization_replies_.pop(); 110 queued_synchronization_replies_.pop();
117 } 111 }
118 DCHECK_EQ(sole_instance_, this); 112 DCHECK_EQ(sole_instance_, this);
119 sole_instance_ = NULL; 113 sole_instance_ = NULL;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 // handle it. 213 // handle it.
220 IPC_MESSAGE_UNHANDLED(RouteOnUIThread(message)) 214 IPC_MESSAGE_UNHANDLED(RouteOnUIThread(message))
221 IPC_END_MESSAGE_MAP() 215 IPC_END_MESSAGE_MAP()
222 216
223 return true; 217 return true;
224 } 218 }
225 219
226 void GpuProcessHost::OnChannelEstablished( 220 void GpuProcessHost::OnChannelEstablished(
227 const IPC::ChannelHandle& channel_handle, 221 const IPC::ChannelHandle& channel_handle,
228 const GPUInfo& gpu_info) { 222 const GPUInfo& gpu_info) {
229 GpuFeatureFlags gpu_feature_flags; 223 if (channel_handle.name.size() != 0 && !gpu_feature_flags_set_) {
230 if (channel_handle.name.size() != 0) { 224 gpu_feature_flags_ = gpu_blacklist_->DetermineGpuFeatureFlags(
231 gpu_feature_flags = gpu_blacklist_->DetermineGpuFeatureFlags(
232 GpuBlacklist::kOsAny, NULL, gpu_info); 225 GpuBlacklist::kOsAny, NULL, gpu_info);
226 gpu_feature_flags_set_ = true;
227 uint32 max_entry_id = gpu_blacklist_->max_entry_id();
228 if (gpu_feature_flags_.flags() != 0) {
229 std::vector<uint32> flag_entries;
230 gpu_blacklist_->GetGpuFeatureFlagEntries(GpuFeatureFlags::kGpuFeatureAll,
231 flag_entries);
232 DCHECK_GT(flag_entries.size(), 0u);
233 for (size_t i = 0; i < flag_entries.size(); ++i) {
234 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResultsPerEntry",
235 flag_entries[i], max_entry_id + 1);
236 }
237 } else {
238 // id 0 is never used by any entry, so we use it here to indicate that
239 // gpu is allowed.
240 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResultsPerEntry",
241 0, max_entry_id + 1);
242 }
233 } 243 }
234 const ChannelRequest& request = sent_requests_.front(); 244 const ChannelRequest& request = sent_requests_.front();
235 // Currently if any of the GPU features are blacklised, we don't establish a 245 // Currently if any of the GPU features are blacklised, we don't establish a
236 // GPU channel. 246 // GPU channel.
237 GPUBlacklistTestResult test_result; 247 if (gpu_feature_flags_.flags() != 0) {
238 if (gpu_feature_flags.flags() != 0) {
239 Send(new GpuMsg_CloseChannel(channel_handle)); 248 Send(new GpuMsg_CloseChannel(channel_handle));
240 SendEstablishChannelReply(IPC::ChannelHandle(), gpu_info, request.filter); 249 SendEstablishChannelReply(IPC::ChannelHandle(), gpu_info, request.filter);
241 test_result = BLOCKED;
242 } else { 250 } else {
243 SendEstablishChannelReply(channel_handle, gpu_info, request.filter); 251 SendEstablishChannelReply(channel_handle, gpu_info, request.filter);
244 test_result = ALLOWED;
245 }
246 if (!blacklist_result_recorded_) {
247 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResults",
248 test_result, BLACKLIST_TEST_RESULT_MAX);
249 blacklist_result_recorded_ = true;
250 } 252 }
251 sent_requests_.pop(); 253 sent_requests_.pop();
252 } 254 }
253 255
254 void GpuProcessHost::OnSynchronizeReply() { 256 void GpuProcessHost::OnSynchronizeReply() {
255 // Guard against race conditions in abrupt GPU process termination. 257 // Guard against race conditions in abrupt GPU process termination.
256 if (queued_synchronization_replies_.size() > 0) { 258 if (queued_synchronization_replies_.size() > 0) {
257 const SynchronizationRequest& request = 259 const SynchronizationRequest& request =
258 queued_synchronization_replies_.front(); 260 queued_synchronization_replies_.front();
259 SendSynchronizationReply(request.reply, request.filter); 261 SendSynchronizationReply(request.reply, request.filter);
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 402 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
401 if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) || 403 if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) ||
402 blacklist->LoadGpuBlacklist(gpu_blacklist_json.as_string(), true)) { 404 blacklist->LoadGpuBlacklist(gpu_blacklist_json.as_string(), true)) {
403 gpu_blacklist_.reset(blacklist); 405 gpu_blacklist_.reset(blacklist);
404 return true; 406 return true;
405 } 407 }
406 delete blacklist; 408 delete blacklist;
407 return false; 409 return false;
408 } 410 }
409 411
OLDNEW
« no previous file with comments | « chrome/browser/gpu_process_host.h ('k') | chrome/browser/resources/gpu_blacklist.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698