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

Side by Side Diff: content/browser/gpu/gpu_data_manager.cc

Issue 7967020: Implement --use-gl=any (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 3 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "content/browser/gpu/gpu_data_manager.h" 5 #include "content/browser/gpu/gpu_data_manager.h"
6 6
7 #if defined(OS_MACOSX) 7 #if defined(OS_MACOSX)
8 #include <CoreGraphics/CGDisplayConfiguration.h> 8 #include <CoreGraphics/CGDisplayConfiguration.h>
9 #endif 9 #endif
10 10
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 } 53 }
54 54
55 DictionaryValue* NewDescriptionValuePair(const std::string& desc, 55 DictionaryValue* NewDescriptionValuePair(const std::string& desc,
56 Value* value) { 56 Value* value) {
57 DictionaryValue* dict = new DictionaryValue(); 57 DictionaryValue* dict = new DictionaryValue();
58 dict->SetString("description", desc); 58 dict->SetString("description", desc);
59 dict->Set("value", value); 59 dict->Set("value", value);
60 return dict; 60 return dict;
61 } 61 }
62 62
63 Value* NewStatusValue(const char* name, const char* status) {
64 DictionaryValue* value = new DictionaryValue();
65 value->SetString("name", name);
66 value->SetString("status", status);
67 return value;
68 }
69
70 bool UseGLIsOSMesaOrAny() {
71 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
72 std::string gl = browser_command_line.GetSwitchValueASCII(switches::kUseGL);
73 return (gl == gfx::kGLImplementationAnyName ||
74 gl == gfx::kGLImplementationOSMesaName);
75 }
76
63 #if defined(OS_WIN) 77 #if defined(OS_WIN)
64 enum WinSubVersion { 78 enum WinSubVersion {
65 kWinOthers = 0, 79 kWinOthers = 0,
66 kWinXP, 80 kWinXP,
67 kWinVista, 81 kWinVista,
68 kWin7, 82 kWin7,
69 kNumWinSubVersions 83 kNumWinSubVersions
70 }; 84 };
71 85
72 // Output DxDiagNode tree as nested array of {description,value} pairs 86 // Output DxDiagNode tree as nested array of {description,value} pairs
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 188
175 UpdateGpuFeatureFlags(); 189 UpdateGpuFeatureFlags();
176 } 190 }
177 191
178 const GPUInfo& GpuDataManager::gpu_info() const { 192 const GPUInfo& GpuDataManager::gpu_info() const {
179 base::AutoLock auto_lock(gpu_info_lock_); 193 base::AutoLock auto_lock(gpu_info_lock_);
180 return gpu_info_; 194 return gpu_info_;
181 } 195 }
182 196
183 Value* GpuDataManager::GetFeatureStatus() { 197 Value* GpuDataManager::GetFeatureStatus() {
184 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 198 const CommandLine& browser_command_line =
185 if (gpu_blacklist_.get()) 199 *CommandLine::ForCurrentProcess();
186 return gpu_blacklist_->GetFeatureStatus(GpuAccessAllowed(), 200 bool gpu_access_allowed = GpuAccessAllowed();
187 browser_command_line.HasSwitch( 201 bool disable_accelerated_compositing = browser_command_line.HasSwitch(
188 switches::kDisableAcceleratedCompositing), 202 switches::kDisableAcceleratedCompositing);
189 browser_command_line.HasSwitch( 203 bool disable_accelerated_2D_canvas = browser_command_line.HasSwitch(
190 switches::kDisableAccelerated2dCanvas), 204 switches::kDisableAccelerated2dCanvas);
191 browser_command_line.HasSwitch(switches::kDisableExperimentalWebGL), 205 bool disable_experimental_webgl = browser_command_line.HasSwitch(
192 browser_command_line.HasSwitch(switches::kDisableGLMultisampling)); 206 switches::kDisableExperimentalWebGL);
193 return NULL; 207 bool disable_multisampling = browser_command_line.HasSwitch(
208 switches::kDisableGLMultisampling);
209
210 uint32 flags = GetGpuFeatureFlags().flags();
211 DictionaryValue* status = new DictionaryValue();
212
213 // Build the feature_status field.
214 {
215 ListValue* feature_status_list = new ListValue();
216
217 // 2d_canvas.
218 if (!gpu_access_allowed) {
219 if (disable_accelerated_2D_canvas)
220 feature_status_list->Append(NewStatusValue("2d_canvas",
221 "software"));
222 else
223 feature_status_list->Append(NewStatusValue("2d_canvas",
224 "unavailable_software"));
225 } else if (!disable_accelerated_2D_canvas) {
226 if ((flags & GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas) != 0)
227 feature_status_list->Append(NewStatusValue("2d_canvas",
228 "unavailable_software"));
229 else if (disable_accelerated_compositing)
230 feature_status_list->Append(NewStatusValue("2d_canvas",
231 "disabled_software"));
232 else
233 feature_status_list->Append(NewStatusValue("2d_canvas",
234 "enabled"));
235 } else {
236 feature_status_list->Append(NewStatusValue("2d_canvas",
237 "software"));
238 }
239
240 // 3d css and compositing.
241 if (!gpu_access_allowed) {
242 feature_status_list->Append(NewStatusValue("3d_css",
243 "unavailable_off"));
244 feature_status_list->Append(NewStatusValue("compositing",
245 "unavailable_software"));
246 } else if (disable_accelerated_compositing) {
247 feature_status_list->Append(NewStatusValue("3d_css",
248 "unavailable_off"));
249 feature_status_list->Append(NewStatusValue("compositing",
250 "disabled_software"));
251 } else if ((flags &
252 GpuFeatureFlags::kGpuFeatureAcceleratedCompositing) != 0) {
253 feature_status_list->Append(NewStatusValue("3d_css",
254 "unavailable_off"));
255 feature_status_list->Append(NewStatusValue("compositing",
256 "disabled_software"));
257 } else {
258 feature_status_list->Append(NewStatusValue("3d_css",
259 "enabled"));
260 feature_status_list->Append(NewStatusValue("compositing",
261 "enabled"));
262 }
263
264 // webgl
265 if (!gpu_access_allowed)
266 feature_status_list->Append(NewStatusValue("webgl",
267 "unavailable_off"));
268 else if (disable_experimental_webgl)
269 feature_status_list->Append(NewStatusValue("webgl",
270 "disabled_off"));
271 else if ((flags & GpuFeatureFlags::kGpuFeatureWebgl) != 0)
272 feature_status_list->Append(NewStatusValue("webgl",
273 "unavailable_off"));
274 else if (disable_accelerated_compositing)
275 feature_status_list->Append(NewStatusValue("webgl",
276 "enabled_readback"));
277 else
278 feature_status_list->Append(NewStatusValue("webgl",
279 "enabled"));
280
281 // multisampling
282 if (!gpu_access_allowed)
283 feature_status_list->Append(NewStatusValue("multisampling",
284 "unavailable_off"));
285 else if (disable_multisampling)
286 feature_status_list->Append(NewStatusValue("multisampling",
287 "disabled_off"));
288 else if ((flags & GpuFeatureFlags::kGpuFeatureMultisampling) != 0)
289 feature_status_list->Append(NewStatusValue("multisampling",
290 "disabled_off"));
291 else
292 feature_status_list->Append(NewStatusValue("multisampling",
293 "enabled"));
294
295 status->Set("featureStatus", feature_status_list);
296 }
297
298 // Build the problems list.
299 {
300 ListValue* problem_list = new ListValue();
301 if (!gpu_access_allowed) {
302 DictionaryValue* problem = new DictionaryValue();
303 problem->SetString("description",
304 "GPU process was unable to boot. Access to GPU disallowed.");
305 problem->Set("crBugs", new ListValue());
306 problem->Set("webkitBugs", new ListValue());
307 problem_list->Append(problem);
308 }
309 if (disable_accelerated_2D_canvas) {
310 DictionaryValue* problem = new DictionaryValue();
311 problem->SetString("description",
312 "Accelerated 2D canvas has been disabled at the command line");
313 problem->Set("crBugs", new ListValue());
314 problem->Set("webkitBugs", new ListValue());
315 problem_list->Append(problem);
316 }
317 if (disable_accelerated_compositing) {
318 DictionaryValue* problem = new DictionaryValue();
319 problem->SetString("description",
320 "Accelerated compositing has been disabled, either via about:flags "
321 "or command line. This adversely affects performance of all hardware "
322 " accelerated features.");
323 problem->Set("crBugs", new ListValue());
324 problem->Set("webkitBugs", new ListValue());
325 problem_list->Append(problem);
326 }
327 if (disable_experimental_webgl) {
328 DictionaryValue* problem = new DictionaryValue();
329 problem->SetString("description",
330 "WebGL has been disabled, either via about:flags "
331 "or command line");
332 problem->Set("crBugs", new ListValue());
333 problem->Set("webkitBugs", new ListValue());
334 problem_list->Append(problem);
335 }
336 if (disable_multisampling) {
337 DictionaryValue* problem = new DictionaryValue();
338 problem->SetString("description",
339 "Multisampling has been disabled, either via about:flags "
340 "or command line");
341 problem->Set("crBugs", new ListValue());
342 problem->Set("webkitBugs", new ListValue());
343 problem_list->Append(problem);
344 }
345 GpuBlacklist* blacklist = GetGpuBlacklist();
346 if (blacklist && (!UseGLIsOSMesaOrAny()))
347 blacklist->GetBlacklistReasons(problem_list);
348 status->Set("problems", problem_list);
349 }
350 return status;
194 } 351 }
195 352
196 std::string GpuDataManager::GetBlacklistVersion() const { 353 std::string GpuDataManager::GetBlacklistVersion() const {
197 if (gpu_blacklist_.get() != NULL) { 354 if (gpu_blacklist_.get() != NULL) {
198 uint16 version_major, version_minor; 355 uint16 version_major, version_minor;
199 if (gpu_blacklist_->GetVersion(&version_major, 356 if (gpu_blacklist_->GetVersion(&version_major,
200 &version_minor)) { 357 &version_minor)) {
201 std::string version_string = 358 std::string version_string =
202 base::UintToString(static_cast<unsigned>(version_major)) + 359 base::UintToString(static_cast<unsigned>(version_major)) +
203 "." + 360 "." +
204 base::UintToString(static_cast<unsigned>(version_minor)); 361 base::UintToString(static_cast<unsigned>(version_minor));
205 return version_string; 362 return version_string;
206 } 363 }
207 } 364 }
208 return ""; 365 return "";
209 } 366 }
210 367
211 void GpuDataManager::AddLogMessage(Value* msg) { 368 void GpuDataManager::AddLogMessage(Value* msg) {
212 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 369 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
213 log_messages_.Append(msg); 370 log_messages_.Append(msg);
214 } 371 }
215 372
216 const ListValue& GpuDataManager::log_messages() const { 373 const ListValue& GpuDataManager::log_messages() const {
217 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 374 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
218 return log_messages_; 375 return log_messages_;
219 } 376 }
220 377
221 GpuFeatureFlags GpuDataManager::GetGpuFeatureFlags() { 378 GpuFeatureFlags GpuDataManager::GetGpuFeatureFlags() {
379 if (UseGLIsOSMesaOrAny())
380 return GpuFeatureFlags();
222 return gpu_feature_flags_; 381 return gpu_feature_flags_;
223 } 382 }
224 383
225 bool GpuDataManager::GpuAccessAllowed() { 384 bool GpuDataManager::GpuAccessAllowed() {
385 if (UseGLIsOSMesaOrAny())
386 return true;
387
226 // We only need to block GPU process if more features are disallowed other 388 // We only need to block GPU process if more features are disallowed other
227 // than those in the preliminary gpu feature flags because the latter work 389 // than those in the preliminary gpu feature flags because the latter work
228 // through renderer commandline switches. 390 // through renderer commandline switches.
229 uint32 mask = (~(preliminary_gpu_feature_flags_.flags())); 391 uint32 mask = (~(preliminary_gpu_feature_flags_.flags()));
230 return (gpu_feature_flags_.flags() & mask) == 0; 392 return (gpu_feature_flags_.flags() & mask) == 0;
231 } 393 }
232 394
233 void GpuDataManager::AddGpuInfoUpdateCallback(Callback0::Type* callback) { 395 void GpuDataManager::AddGpuInfoUpdateCallback(Callback0::Type* callback) {
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 396 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
235 gpu_info_update_callbacks_.insert(callback); 397 gpu_info_update_callbacks_.insert(callback);
(...skipping 26 matching lines...) Expand all
262 !command_line->HasSwitch(switches::kDisableGLMultisampling)) 424 !command_line->HasSwitch(switches::kDisableGLMultisampling))
263 command_line->AppendSwitch(switches::kDisableGLMultisampling); 425 command_line->AppendSwitch(switches::kDisableGLMultisampling);
264 if ((flags & GpuFeatureFlags::kGpuFeatureAcceleratedCompositing) && 426 if ((flags & GpuFeatureFlags::kGpuFeatureAcceleratedCompositing) &&
265 !command_line->HasSwitch(switches::kDisableAcceleratedCompositing)) 427 !command_line->HasSwitch(switches::kDisableAcceleratedCompositing))
266 command_line->AppendSwitch(switches::kDisableAcceleratedCompositing); 428 command_line->AppendSwitch(switches::kDisableAcceleratedCompositing);
267 if ((flags & GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas) && 429 if ((flags & GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas) &&
268 !command_line->HasSwitch(switches::kDisableAccelerated2dCanvas)) 430 !command_line->HasSwitch(switches::kDisableAccelerated2dCanvas))
269 command_line->AppendSwitch(switches::kDisableAccelerated2dCanvas); 431 command_line->AppendSwitch(switches::kDisableAccelerated2dCanvas);
270 } 432 }
271 433
434 void GpuDataManager::AppendGpuCommandLine(
435 CommandLine* command_line) {
436 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
437 DCHECK(command_line);
438
439 uint32 flags = gpu_feature_flags_.flags();
440 if ((flags & GpuFeatureFlags::kGpuFeatureMultisampling) &&
441 !command_line->HasSwitch(switches::kDisableGLMultisampling))
442 command_line->AppendSwitch(switches::kDisableGLMultisampling);
443
444 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
445 if ((flags & (GpuFeatureFlags::kGpuFeatureWebgl |
446 GpuFeatureFlags::kGpuFeatureAcceleratedCompositing |
447 GpuFeatureFlags::kGpuFeatureAccelerated2dCanvas)) &&
448 (browser_command_line.GetSwitchValueASCII(
449 switches::kUseGL) == gfx::kGLImplementationAnyName)) {
450 command_line->AppendSwitchASCII(
451 switches::kUseGL, gfx::kGLImplementationOSMesaName);
452 } else if (browser_command_line.HasSwitch(switches::kUseGL)) {
453 command_line->AppendSwitchASCII(switches::kUseGL,
454 browser_command_line.GetSwitchValueASCII(switches::kUseGL));
455 }
456 }
457
272 void GpuDataManager::SetBuiltInGpuBlacklist(GpuBlacklist* built_in_list) { 458 void GpuDataManager::SetBuiltInGpuBlacklist(GpuBlacklist* built_in_list) {
273 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 459 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
274 DCHECK(built_in_list); 460 DCHECK(built_in_list);
275 uint16 version_major, version_minor; 461 uint16 version_major, version_minor;
276 bool succeed = built_in_list->GetVersion( 462 bool succeed = built_in_list->GetVersion(
277 &version_major, &version_minor); 463 &version_major, &version_minor);
278 DCHECK(succeed); 464 DCHECK(succeed);
279 gpu_blacklist_.reset(built_in_list); 465 gpu_blacklist_.reset(built_in_list);
280 UpdateGpuFeatureFlags(); 466 UpdateGpuFeatureFlags();
281 preliminary_gpu_feature_flags_ = gpu_feature_flags_; 467 preliminary_gpu_feature_flags_ = gpu_feature_flags_;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 histogram_pointer->Add( 642 histogram_pointer->Add(
457 GetGpuBlacklistHistogramValueWin( 643 GetGpuBlacklistHistogramValueWin(
458 (flags & kGpuFeatures[i]) ? true : false)); 644 (flags & kGpuFeatures[i]) ? true : false));
459 #endif 645 #endif
460 } 646 }
461 } 647 }
462 648
463 GpuBlacklist* GpuDataManager::GetGpuBlacklist() { 649 GpuBlacklist* GpuDataManager::GetGpuBlacklist() {
464 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 650 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
465 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 651 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
466 if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist) || 652 if (browser_command_line.HasSwitch(switches::kIgnoreGpuBlacklist))
467 browser_command_line.GetSwitchValueASCII(
468 switches::kUseGL) == gfx::kGLImplementationOSMesaName)
469 return NULL; 653 return NULL;
470 // No need to return an empty blacklist. 654 // No need to return an empty blacklist.
471 if (gpu_blacklist_.get() != NULL && gpu_blacklist_->max_entry_id() == 0) 655 if (gpu_blacklist_.get() != NULL && gpu_blacklist_->max_entry_id() == 0)
472 return NULL; 656 return NULL;
473 return gpu_blacklist_.get(); 657 return gpu_blacklist_.get();
474 } 658 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698