| OLD | NEW |
| 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 21 matching lines...) Expand all Loading... |
| 32 // These two #includes need to come after render_messages.h. | 32 // These two #includes need to come after render_messages.h. |
| 33 #include <gdk/gdkwindow.h> // NOLINT | 33 #include <gdk/gdkwindow.h> // NOLINT |
| 34 #include <gdk/gdkx.h> // NOLINT | 34 #include <gdk/gdkx.h> // NOLINT |
| 35 #include "gfx/gtk_native_view_id_manager.h" | 35 #include "gfx/gtk_native_view_id_manager.h" |
| 36 #include "gfx/size.h" | 36 #include "gfx/size.h" |
| 37 #include "ui/base/x/x11_util.h" | 37 #include "ui/base/x/x11_util.h" |
| 38 #endif // defined(OS_LINUX) | 38 #endif // defined(OS_LINUX) |
| 39 | 39 |
| 40 namespace { | 40 namespace { |
| 41 | 41 |
| 42 enum GPUBlacklistTestResult { | |
| 43 BLOCKED, | |
| 44 ALLOWED, | |
| 45 BLACKLIST_TEST_RESULT_MAX | |
| 46 }; | |
| 47 | |
| 48 enum GPUProcessLifetimeEvent { | 42 enum GPUProcessLifetimeEvent { |
| 49 LAUNCED, | 43 LAUNCED, |
| 50 CRASHED, | 44 CRASHED, |
| 51 GPU_PROCESS_LIFETIME_EVENT_MAX | 45 GPU_PROCESS_LIFETIME_EVENT_MAX |
| 52 }; | 46 }; |
| 53 | 47 |
| 54 // Tasks used by this file | 48 // Tasks used by this file |
| 55 class RouteOnUIThreadTask : public Task { | 49 class RouteOnUIThreadTask : public Task { |
| 56 public: | 50 public: |
| 57 explicit RouteOnUIThreadTask(const IPC::Message& msg) : msg_(msg) { | 51 explicit RouteOnUIThreadTask(const IPC::Message& msg) : msg_(msg) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 private: | 104 private: |
| 111 scoped_ptr<GpuThread> gpu_thread_; | 105 scoped_ptr<GpuThread> gpu_thread_; |
| 112 std::string channel_id_; | 106 std::string channel_id_; |
| 113 DISALLOW_COPY_AND_ASSIGN(GpuMainThread); | 107 DISALLOW_COPY_AND_ASSIGN(GpuMainThread); |
| 114 }; | 108 }; |
| 115 | 109 |
| 116 GpuProcessHost::GpuProcessHost() | 110 GpuProcessHost::GpuProcessHost() |
| 117 : BrowserChildProcessHost(GPU_PROCESS, NULL), | 111 : BrowserChildProcessHost(GPU_PROCESS, NULL), |
| 118 initialized_(false), | 112 initialized_(false), |
| 119 initialized_successfully_(false), | 113 initialized_successfully_(false), |
| 120 blacklist_result_recorded_(false) { | 114 gpu_feature_flags_set_(false) { |
| 121 DCHECK_EQ(sole_instance_, static_cast<GpuProcessHost*>(NULL)); | 115 DCHECK_EQ(sole_instance_, static_cast<GpuProcessHost*>(NULL)); |
| 122 } | 116 } |
| 123 | 117 |
| 124 GpuProcessHost::~GpuProcessHost() { | 118 GpuProcessHost::~GpuProcessHost() { |
| 125 while (!queued_synchronization_replies_.empty()) { | 119 while (!queued_synchronization_replies_.empty()) { |
| 126 delete queued_synchronization_replies_.front().reply; | 120 delete queued_synchronization_replies_.front().reply; |
| 127 queued_synchronization_replies_.pop(); | 121 queued_synchronization_replies_.pop(); |
| 128 } | 122 } |
| 129 DCHECK_EQ(sole_instance_, this); | 123 DCHECK_EQ(sole_instance_, this); |
| 130 sole_instance_ = NULL; | 124 sole_instance_ = NULL; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 // handle it. | 237 // handle it. |
| 244 IPC_MESSAGE_UNHANDLED(RouteOnUIThread(message)) | 238 IPC_MESSAGE_UNHANDLED(RouteOnUIThread(message)) |
| 245 IPC_END_MESSAGE_MAP() | 239 IPC_END_MESSAGE_MAP() |
| 246 | 240 |
| 247 return true; | 241 return true; |
| 248 } | 242 } |
| 249 | 243 |
| 250 void GpuProcessHost::OnChannelEstablished( | 244 void GpuProcessHost::OnChannelEstablished( |
| 251 const IPC::ChannelHandle& channel_handle, | 245 const IPC::ChannelHandle& channel_handle, |
| 252 const GPUInfo& gpu_info) { | 246 const GPUInfo& gpu_info) { |
| 253 GpuFeatureFlags gpu_feature_flags; | 247 if (channel_handle.name.size() != 0 && !gpu_feature_flags_set_) { |
| 254 if (channel_handle.name.size() != 0) { | 248 gpu_feature_flags_ = gpu_blacklist_->DetermineGpuFeatureFlags( |
| 255 gpu_feature_flags = gpu_blacklist_->DetermineGpuFeatureFlags( | |
| 256 GpuBlacklist::kOsAny, NULL, gpu_info); | 249 GpuBlacklist::kOsAny, NULL, gpu_info); |
| 250 gpu_feature_flags_set_ = true; |
| 251 uint32 max_entry_id = gpu_blacklist_->max_entry_id(); |
| 252 if (gpu_feature_flags_.flags() != 0) { |
| 253 std::vector<uint32> flag_entries; |
| 254 gpu_blacklist_->GetGpuFeatureFlagEntries(GpuFeatureFlags::kGpuFeatureAll, |
| 255 flag_entries); |
| 256 DCHECK(flag_entries.size() > 0); |
| 257 for (size_t i = 0; i < flag_entries.size(); ++i) { |
| 258 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResults", |
| 259 flag_entries[i], max_entry_id + 1); |
| 260 } |
| 261 } else { |
| 262 // id 0 is never used by any entry, so we use it here to indicate that |
| 263 // gpu is allowed. |
| 264 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResults", |
| 265 0, max_entry_id + 1); |
| 266 } |
| 257 } | 267 } |
| 258 const ChannelRequest& request = sent_requests_.front(); | 268 const ChannelRequest& request = sent_requests_.front(); |
| 259 // Currently if any of the GPU features are blacklised, we don't establish a | 269 // Currently if any of the GPU features are blacklised, we don't establish a |
| 260 // GPU channel. | 270 // GPU channel. |
| 261 GPUBlacklistTestResult test_result; | 271 if (gpu_feature_flags_.flags() != 0) { |
| 262 if (gpu_feature_flags.flags() != 0) { | |
| 263 Send(new GpuMsg_CloseChannel(channel_handle)); | 272 Send(new GpuMsg_CloseChannel(channel_handle)); |
| 264 SendEstablishChannelReply(IPC::ChannelHandle(), gpu_info, request.filter); | 273 SendEstablishChannelReply(IPC::ChannelHandle(), gpu_info, request.filter); |
| 265 test_result = BLOCKED; | |
| 266 } else { | 274 } else { |
| 267 SendEstablishChannelReply(channel_handle, gpu_info, request.filter); | 275 SendEstablishChannelReply(channel_handle, gpu_info, request.filter); |
| 268 test_result = ALLOWED; | |
| 269 } | |
| 270 if (!blacklist_result_recorded_) { | |
| 271 UMA_HISTOGRAM_ENUMERATION("GPU.BlacklistTestResults", | |
| 272 test_result, BLACKLIST_TEST_RESULT_MAX); | |
| 273 blacklist_result_recorded_ = true; | |
| 274 } | 276 } |
| 275 sent_requests_.pop(); | 277 sent_requests_.pop(); |
| 276 } | 278 } |
| 277 | 279 |
| 278 void GpuProcessHost::OnSynchronizeReply() { | 280 void GpuProcessHost::OnSynchronizeReply() { |
| 279 // Guard against race conditions in abrupt GPU process termination. | 281 // Guard against race conditions in abrupt GPU process termination. |
| 280 if (queued_synchronization_replies_.size() > 0) { | 282 if (queued_synchronization_replies_.size() > 0) { |
| 281 const SynchronizationRequest& request = | 283 const SynchronizationRequest& request = |
| 282 queued_synchronization_replies_.front(); | 284 queued_synchronization_replies_.front(); |
| 283 SendSynchronizationReply(request.reply, request.filter); | 285 SendSynchronizationReply(request.reply, request.filter); |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); | 652 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); |
| 651 if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) || | 653 if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) || |
| 652 blacklist->LoadGpuBlacklist(gpu_blacklist_json.as_string(), true)) { | 654 blacklist->LoadGpuBlacklist(gpu_blacklist_json.as_string(), true)) { |
| 653 gpu_blacklist_.reset(blacklist); | 655 gpu_blacklist_.reset(blacklist); |
| 654 return true; | 656 return true; |
| 655 } | 657 } |
| 656 delete blacklist; | 658 delete blacklist; |
| 657 return false; | 659 return false; |
| 658 } | 660 } |
| 659 | 661 |
| OLD | NEW |