15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl_private.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GpuDataManager* GpuDataManager::GetInstance() {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GpuDataManagerImpl::GetInstance();
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GpuDataManagerImpl* GpuDataManagerImpl::GetInstance() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<GpuDataManagerImpl>::get();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::InitializeForTesting(
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& gpu_blacklist_json, const gpu::GPUInfo& gpu_info) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private_->InitializeForTesting(gpu_blacklist_json, gpu_info);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuDataManagerImpl::IsFeatureBlacklisted(int feature) const {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->IsFeatureBlacklisted(feature);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuDataManagerImpl::IsDriverBugWorkaroundActive(int feature) const {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->IsDriverBugWorkaroundActive(feature);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::GPUInfo GpuDataManagerImpl::GetGPUInfo() const {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->GetGPUInfo();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::GetGpuProcessHandles(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetGpuProcessHandlesCallback& callback) const {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private_->GetGpuProcessHandles(callback);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuDataManagerImpl::GpuAccessAllowed(std::string* reason) const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->GpuAccessAllowed(reason);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::RequestCompleteGpuInfoIfNeeded() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private_->RequestCompleteGpuInfoIfNeeded();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuDataManagerImpl::IsEssentialGpuInfoAvailable() const {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->IsEssentialGpuInfoAvailable();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuDataManagerImpl::IsCompleteGpuInfoAvailable() const {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->IsCompleteGpuInfoAvailable();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::RequestVideoMemoryUsageStatsUpdate() const {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private_->RequestVideoMemoryUsageStatsUpdate();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuDataManagerImpl::ShouldUseSwiftShader() const {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->ShouldUseSwiftShader();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::RegisterSwiftShaderPath(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& path) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private_->RegisterSwiftShaderPath(path);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuDataManagerImpl::ShouldUseWarp() const {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return private_->ShouldUseWarp();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::AddObserver(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuDataManagerObserver* observer) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private_->AddObserver(observer);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::RemoveObserver(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuDataManagerObserver* observer) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private_->RemoveObserver(observer);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuDataManagerImpl::UnblockDomainFrom3DAPIs(const GURL& url) {
102  base::AutoLock auto_lock(lock_);
103  private_->UnblockDomainFrom3DAPIs(url);
104}
105
106void GpuDataManagerImpl::DisableGpuWatchdog() {
107  base::AutoLock auto_lock(lock_);
108  private_->DisableGpuWatchdog();
109}
110
111void GpuDataManagerImpl::SetGLStrings(const std::string& gl_vendor,
112                                      const std::string& gl_renderer,
113                                      const std::string& gl_version) {
114  base::AutoLock auto_lock(lock_);
115  private_->SetGLStrings(gl_vendor, gl_renderer, gl_version);
116}
117
118void GpuDataManagerImpl::GetGLStrings(std::string* gl_vendor,
119                                      std::string* gl_renderer,
120                                      std::string* gl_version) {
121  base::AutoLock auto_lock(lock_);
122  private_->GetGLStrings(gl_vendor, gl_renderer, gl_version);
123}
124
125void GpuDataManagerImpl::DisableHardwareAcceleration() {
126  base::AutoLock auto_lock(lock_);
127  private_->DisableHardwareAcceleration();
128}
129
130bool GpuDataManagerImpl::CanUseGpuBrowserCompositor() const {
131  base::AutoLock auto_lock(lock_);
132  return private_->CanUseGpuBrowserCompositor();
133}
134
135void GpuDataManagerImpl::Initialize() {
136  base::AutoLock auto_lock(lock_);
137  private_->Initialize();
138}
139
140void GpuDataManagerImpl::UpdateGpuInfo(const gpu::GPUInfo& gpu_info) {
141  base::AutoLock auto_lock(lock_);
142  private_->UpdateGpuInfo(gpu_info);
143}
144
145void GpuDataManagerImpl::UpdateVideoMemoryUsageStats(
146    const GPUVideoMemoryUsageStats& video_memory_usage_stats) {
147  base::AutoLock auto_lock(lock_);
148  private_->UpdateVideoMemoryUsageStats(video_memory_usage_stats);
149}
150
151void GpuDataManagerImpl::AppendRendererCommandLine(
152    base::CommandLine* command_line) const {
153  base::AutoLock auto_lock(lock_);
154  private_->AppendRendererCommandLine(command_line);
155}
156
157void GpuDataManagerImpl::AppendGpuCommandLine(
158    base::CommandLine* command_line) const {
159  base::AutoLock auto_lock(lock_);
160  private_->AppendGpuCommandLine(command_line);
161}
162
163void GpuDataManagerImpl::AppendPluginCommandLine(
164    base::CommandLine* command_line) const {
165  base::AutoLock auto_lock(lock_);
166  private_->AppendPluginCommandLine(command_line);
167}
168
169void GpuDataManagerImpl::UpdateRendererWebPrefs(
170    WebPreferences* prefs) const {
171  base::AutoLock auto_lock(lock_);
172  private_->UpdateRendererWebPrefs(prefs);
173}
174
175std::string GpuDataManagerImpl::GetBlacklistVersion() const {
176  base::AutoLock auto_lock(lock_);
177  return private_->GetBlacklistVersion();
178}
179
180std::string GpuDataManagerImpl::GetDriverBugListVersion() const {
181  base::AutoLock auto_lock(lock_);
182  return private_->GetDriverBugListVersion();
183}
184
185void GpuDataManagerImpl::GetBlacklistReasons(base::ListValue* reasons) const {
186  base::AutoLock auto_lock(lock_);
187  private_->GetBlacklistReasons(reasons);
188}
189
190void GpuDataManagerImpl::GetDriverBugWorkarounds(
191    base::ListValue* workarounds) const {
192  base::AutoLock auto_lock(lock_);
193  private_->GetDriverBugWorkarounds(workarounds);
194}
195
196void GpuDataManagerImpl::AddLogMessage(int level,
197                                       const std::string& header,
198                                       const std::string& message) {
199  base::AutoLock auto_lock(lock_);
200  private_->AddLogMessage(level, header, message);
201}
202
203void GpuDataManagerImpl::ProcessCrashed(
204    base::TerminationStatus exit_code) {
205  base::AutoLock auto_lock(lock_);
206  private_->ProcessCrashed(exit_code);
207}
208
209base::ListValue* GpuDataManagerImpl::GetLogMessages() const {
210  base::AutoLock auto_lock(lock_);
211  return private_->GetLogMessages();
212}
213
214void GpuDataManagerImpl::HandleGpuSwitch() {
215  base::AutoLock auto_lock(lock_);
216  private_->HandleGpuSwitch();
217}
218
219void GpuDataManagerImpl::BlockDomainFrom3DAPIs(
220    const GURL& url, DomainGuilt guilt) {
221  base::AutoLock auto_lock(lock_);
222  private_->BlockDomainFrom3DAPIs(url, guilt);
223}
224
225bool GpuDataManagerImpl::Are3DAPIsBlocked(const GURL& url,
226                                          int render_process_id,
227                                          int render_view_id,
228                                          ThreeDAPIType requester) {
229  base::AutoLock auto_lock(lock_);
230  return private_->Are3DAPIsBlocked(
231      url, render_process_id, render_view_id, requester);
232}
233
234void GpuDataManagerImpl::DisableDomainBlockingFor3DAPIsForTesting() {
235  base::AutoLock auto_lock(lock_);
236  private_->DisableDomainBlockingFor3DAPIsForTesting();
237}
238
239size_t GpuDataManagerImpl::GetBlacklistedFeatureCount() const {
240  base::AutoLock auto_lock(lock_);
241  return private_->GetBlacklistedFeatureCount();
242}
243
244void GpuDataManagerImpl::SetDisplayCount(unsigned int display_count) {
245  base::AutoLock auto_lock(lock_);
246  private_->SetDisplayCount(display_count);
247}
248
249unsigned int GpuDataManagerImpl::GetDisplayCount() const {
250  base::AutoLock auto_lock(lock_);
251  return private_->GetDisplayCount();
252}
253
254bool GpuDataManagerImpl::UpdateActiveGpu(uint32 vendor_id, uint32 device_id) {
255  base::AutoLock auto_lock(lock_);
256  return private_->UpdateActiveGpu(vendor_id, device_id);
257}
258
259void GpuDataManagerImpl::Notify3DAPIBlocked(const GURL& url,
260                                            int render_process_id,
261                                            int render_view_id,
262                                            ThreeDAPIType requester) {
263  base::AutoLock auto_lock(lock_);
264  private_->Notify3DAPIBlocked(
265      url, render_process_id, render_view_id, requester);
266}
267
268void GpuDataManagerImpl::OnGpuProcessInitFailure() {
269  base::AutoLock auto_lock(lock_);
270  private_->OnGpuProcessInitFailure();
271}
272
273GpuDataManagerImpl::GpuDataManagerImpl()
274    : private_(GpuDataManagerImplPrivate::Create(this)) {
275}
276
277GpuDataManagerImpl::~GpuDataManagerImpl() {
278}
279
280}  // namespace content
281