OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 import sys | 4 import sys |
5 from telemetry.story import story_set as story_set_module | 5 from telemetry.story import story_set as story_set_module |
6 from telemetry.page import page_test | 6 from telemetry.page import page_test |
7 | 7 |
8 from gpu_tests import gpu_test_base | 8 from gpu_tests import gpu_test_base |
9 | 9 |
10 class GpuProcessSharedPageState(gpu_test_base.GpuSharedPageState): | 10 class GpuProcessSharedPageState(gpu_test_base.GpuSharedPageState): |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 return | 113 return |
114 | 114 |
115 if self.expected_workaround: | 115 if self.expected_workaround: |
116 self._Validate(tab, "browser_process", True, self.expected_workaround) | 116 self._Validate(tab, "browser_process", True, self.expected_workaround) |
117 self._Validate(tab, "gpu_process", True, self.expected_workaround) | 117 self._Validate(tab, "gpu_process", True, self.expected_workaround) |
118 | 118 |
119 if self.unexpected_workaround: | 119 if self.unexpected_workaround: |
120 self._Validate(tab, "browser_process", False, self.unexpected_workaround) | 120 self._Validate(tab, "browser_process", False, self.unexpected_workaround) |
121 self._Validate(tab, "gpu_process", False, self.unexpected_workaround) | 121 self._Validate(tab, "gpu_process", False, self.unexpected_workaround) |
122 | 122 |
| 123 |
| 124 class EqualBugWorkaroundsBasePage(gpu_test_base.PageBase): |
| 125 def __init__(self, name=None, page_set=None, shared_page_state_class=None, |
| 126 expectations=None): |
| 127 super(EqualBugWorkaroundsBasePage, self).__init__( |
| 128 url='chrome:gpu', |
| 129 name=name, |
| 130 page_set=page_set, |
| 131 shared_page_state_class=shared_page_state_class, |
| 132 expectations=expectations) |
| 133 |
| 134 def Validate(self, tab, results): |
| 135 has_gpu_process_js = 'chrome.gpuBenchmarking.hasGpuProcess()' |
| 136 if not tab.EvaluateJavaScript(has_gpu_process_js): |
| 137 raise page_test.Failure('No GPU process detected') |
| 138 |
| 139 has_gpu_channel_js = 'chrome.gpuBenchmarking.hasGpuChannel()' |
| 140 if not tab.EvaluateJavaScript(has_gpu_channel_js): |
| 141 raise page_test.Failure('No GPU channel detected') |
| 142 |
| 143 browser_list = tab.EvaluateJavaScript('GetDriverBugWorkarounds()') |
| 144 gpu_list = tab.EvaluateJavaScript( \ |
| 145 'chrome.gpuBenchmarking.getGpuDriverBugWorkarounds()') |
| 146 |
| 147 diff = set(browser_list).symmetric_difference(set(gpu_list)) |
| 148 if len(diff) > 0: |
| 149 print 'Test failed. Printing page contents:' |
| 150 print tab.EvaluateJavaScript('document.body.innerHTML') |
| 151 raise page_test.Failure('Browser and GPU process list of driver bug' \ |
| 152 'workarounds are not equal: %s != %s, diff: %s' % \ |
| 153 (browser_list, gpu_list, list(diff))) |
| 154 |
| 155 basic_infos = tab.EvaluateJavaScript('browserBridge.gpuInfo.basic_info') |
| 156 disabled_gl_extensions = None |
| 157 for info in basic_infos: |
| 158 if info['description'].startswith('Disabled Extensions'): |
| 159 disabled_gl_extensions = info['value'] |
| 160 break |
| 161 |
| 162 return gpu_list, disabled_gl_extensions |
| 163 |
| 164 |
123 class GpuProcessTestsPage(gpu_test_base.PageBase): | 165 class GpuProcessTestsPage(gpu_test_base.PageBase): |
124 def __init__(self, url, name, story_set, expectations): | 166 def __init__(self, url, name, story_set, expectations): |
125 super(GpuProcessTestsPage, self).__init__(url=url, | 167 super(GpuProcessTestsPage, self).__init__(url=url, |
126 shared_page_state_class=gpu_test_base.GpuSharedPageState, | 168 shared_page_state_class=gpu_test_base.GpuSharedPageState, |
127 page_set=story_set, | 169 page_set=story_set, |
128 name=name, | 170 name=name, |
129 expectations=expectations) | 171 expectations=expectations) |
130 | 172 |
131 | 173 |
132 class FunctionalVideoPage(GpuProcessTestsPage): | 174 class FunctionalVideoPage(GpuProcessTestsPage): |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 result = result and status == 'disabled_software' | 551 result = result and status == 'disabled_software' |
510 elif name == 'webgl': | 552 elif name == 'webgl': |
511 result = result and status == 'enabled_readback' | 553 result = result and status == 'enabled_readback' |
512 else: | 554 else: |
513 result = result and status == 'unavailable_software' | 555 result = result and status == 'unavailable_software' |
514 if not result: | 556 if not result: |
515 raise page_test.Failure('WebGL readback setup failed: %s' \ | 557 raise page_test.Failure('WebGL readback setup failed: %s' \ |
516 % feature_status_list) | 558 % feature_status_list) |
517 | 559 |
518 | 560 |
519 class EqualBugWorkaroundsInBrowserAndGpuProcessPage(gpu_test_base.PageBase): | |
520 def __init__(self, story_set, expectations): | |
521 super(EqualBugWorkaroundsInBrowserAndGpuProcessPage, self).__init__( | |
522 url='chrome:gpu', | |
523 name='GpuProcess.equal_bug_workarounds_in_browser_and_gpu_process', | |
524 page_set=story_set, | |
525 shared_page_state_class=GpuProcessSharedPageState, | |
526 expectations=expectations) | |
527 | |
528 def Validate(self, tab, results): | |
529 browser_list = tab.EvaluateJavaScript('GetDriverBugWorkarounds()') | |
530 gpu_list = tab.EvaluateJavaScript( \ | |
531 'chrome.gpuBenchmarking.getGpuDriverBugWorkarounds()') | |
532 | |
533 diff = set(browser_list).symmetric_difference(set(gpu_list)) | |
534 if len(diff) > 0: | |
535 print 'Test failed. Printing page contents:' | |
536 print tab.EvaluateJavaScript('document.body.innerHTML') | |
537 raise page_test.Failure('Browser and GPU process list of driver bug' \ | |
538 'workarounds are not equal: %s != %s, diff: %s' % \ | |
539 (browser_list, gpu_list, list(diff))) | |
540 | |
541 | |
542 class HasTransparentVisualsShared(GpuProcessSharedPageState): | 561 class HasTransparentVisualsShared(GpuProcessSharedPageState): |
543 def __init__(self, test, finder_options, story_set): | 562 def __init__(self, test, finder_options, story_set): |
544 super(HasTransparentVisualsShared, self).__init__( | 563 super(HasTransparentVisualsShared, self).__init__( |
545 test, finder_options, story_set) | 564 test, finder_options, story_set) |
546 options = finder_options.browser_options | 565 options = finder_options.browser_options |
547 if sys.platform.startswith('linux'): | 566 if sys.platform.startswith('linux'): |
548 # Hit id 173 from kGpuDriverBugListJson. | 567 # Hit id 173 from kGpuDriverBugListJson. |
549 options.AppendExtraBrowserArgs('--gpu-testing-gl-version=3.0 Mesa ' \ | 568 options.AppendExtraBrowserArgs('--gpu-testing-gl-version=3.0 Mesa ' \ |
550 '12.1') | 569 '12.1') |
551 | 570 |
(...skipping 28 matching lines...) Expand all Loading... |
580 shared_page_state_class=NoTransparentVisualsShared, | 599 shared_page_state_class=NoTransparentVisualsShared, |
581 expectations=expectations, | 600 expectations=expectations, |
582 expected_workaround='disable_transparent_visuals', | 601 expected_workaround='disable_transparent_visuals', |
583 unexpected_workaround=None) | 602 unexpected_workaround=None) |
584 | 603 |
585 def Validate(self, tab, results): | 604 def Validate(self, tab, results): |
586 if sys.platform.startswith('linux'): | 605 if sys.platform.startswith('linux'): |
587 super(NoTransparentVisualsGpuProcessPage, self).Validate(tab, results) | 606 super(NoTransparentVisualsGpuProcessPage, self).Validate(tab, results) |
588 | 607 |
589 | 608 |
| 609 class TransferWorkaroundSharedPageState(GpuProcessSharedPageState): |
| 610 def __init__(self, test, finder_options, story_set): |
| 611 super(TransferWorkaroundSharedPageState, self).__init__( |
| 612 test, finder_options, story_set) |
| 613 |
| 614 # Extra browser args need to be added here. Adding them in RunStory would be |
| 615 # too late. |
| 616 def WillRunStory(self, results): |
| 617 if self.WarmUpDone(): |
| 618 options = self._finder_options.browser_options |
| 619 options.AppendExtraBrowserArgs('--use_gpu_driver_workaround_for_testing') |
| 620 options.AppendExtraBrowserArgs('--disable-gpu-driver-bug-workarounds') |
| 621 |
| 622 # Inject some info to make sure the flag above is effective. |
| 623 if sys.platform == 'darwin': |
| 624 # Hit id 33 from kGpuDriverBugListJson. |
| 625 options.AppendExtraBrowserArgs('--gpu-testing-gl-vendor=Imagination') |
| 626 else: |
| 627 # Hit id 5 from kGpuDriverBugListJson. |
| 628 options.AppendExtraBrowserArgs('--gpu-testing-vendor-id=0x10de') |
| 629 options.AppendExtraBrowserArgs('--gpu-testing-device-id=0x0001') |
| 630 # no multi gpu on Android. |
| 631 if not options.browser_type.startswith('android'): |
| 632 options.AppendExtraBrowserArgs('--gpu-testing-secondary-vendor-ids=') |
| 633 options.AppendExtraBrowserArgs('--gpu-testing-secondary-device-ids=') |
| 634 |
| 635 for workaround in self.RecordedWorkarounds(): |
| 636 options.AppendExtraBrowserArgs('--' + workaround) |
| 637 options.AppendExtraBrowserArgs('--disable-gl-extensions=' + \ |
| 638 self.DisabledGLExts()) |
| 639 super(TransferWorkaroundSharedPageState, self).WillRunStory(results) |
| 640 |
| 641 # self._current_page is None in WillRunStory so do the transfer here. |
| 642 def RunStory(self, results): |
| 643 if self.WarmUpDone(): |
| 644 self._current_page.expected_workarounds = self.RecordedWorkarounds() |
| 645 self._current_page.expected_disabled_exts = self.DisabledGLExts() |
| 646 self.AddTestingWorkaround(self._current_page.expected_workarounds) |
| 647 super(TransferWorkaroundSharedPageState, self).RunStory(results) |
| 648 |
| 649 def WarmUpDone(self): |
| 650 return self._previous_page is not None and \ |
| 651 self.RecordedWorkarounds() is not None |
| 652 |
| 653 def RecordedWorkarounds(self): |
| 654 return self._previous_page.recorded_workarounds |
| 655 |
| 656 def DisabledGLExts(self): |
| 657 return self._previous_page.recorded_disabled_exts |
| 658 |
| 659 def AddTestingWorkaround(self, workarounds): |
| 660 if workarounds is not None: |
| 661 workarounds.append('use_gpu_driver_workaround_for_testing') |
| 662 |
| 663 |
| 664 class EqualBugWorkaroundsPage(EqualBugWorkaroundsBasePage): |
| 665 def __init__(self, story_set, expectations): |
| 666 super(EqualBugWorkaroundsPage, self).__init__( |
| 667 name='GpuProcess.equal_bug_workarounds_in_browser_and_gpu_process', |
| 668 page_set=story_set, |
| 669 shared_page_state_class=TransferWorkaroundSharedPageState, |
| 670 expectations=expectations) |
| 671 self.recorded_workarounds = None |
| 672 self.recorded_disabled_exts = None |
| 673 |
| 674 def Validate(self, tab, results): |
| 675 recorded_info = super(EqualBugWorkaroundsPage, self).Validate(tab, results) |
| 676 gpu_list, disabled_gl_extensions = recorded_info |
| 677 |
| 678 self.recorded_workarounds = gpu_list |
| 679 self.recorded_disabled_exts = disabled_gl_extensions |
| 680 |
| 681 |
| 682 class OnlyOneWorkaroundPage(EqualBugWorkaroundsBasePage): |
| 683 def __init__(self, story_set, expectations): |
| 684 super(OnlyOneWorkaroundPage, self).__init__( |
| 685 name='GpuProcess.only_one_workaround', |
| 686 page_set=story_set, |
| 687 shared_page_state_class=TransferWorkaroundSharedPageState, |
| 688 expectations=expectations) |
| 689 self.expected_workarounds = None |
| 690 self.expected_disabled_exts = None |
| 691 |
| 692 def Validate(self, tab, results): |
| 693 # Requires EqualBugWorkaroundsPage to succeed. If it has failed then just |
| 694 # pass to not overload the logs. |
| 695 if self.expected_workarounds is None: |
| 696 return |
| 697 |
| 698 recorded_info = super(OnlyOneWorkaroundPage, self).Validate(tab, results) |
| 699 gpu_list, disabled_gl_extensions = recorded_info |
| 700 |
| 701 diff = set(self.expected_workarounds).symmetric_difference(set(gpu_list)) |
| 702 if len(diff) > 0: |
| 703 print 'Test failed. Printing page contents:' |
| 704 print tab.EvaluateJavaScript('document.body.innerHTML') |
| 705 raise page_test.Failure('GPU process and expected list of driver bug' \ |
| 706 'workarounds are not equal: %s != %s, diff: %s' % \ |
| 707 (self.expected_workarounds, gpu_list, list(diff))) |
| 708 |
| 709 if self.expected_disabled_exts != disabled_gl_extensions: |
| 710 print 'Test failed. Printing page contents:' |
| 711 print tab.EvaluateJavaScript('document.body.innerHTML') |
| 712 raise page_test.Failure('The expected disabled gl extensions are ' \ |
| 713 'incorrect: %s != %s:' % \ |
| 714 (self.expected_disabled_exts, disabled_gl_extensions)) |
| 715 |
| 716 |
590 class GpuProcessTestsStorySet(story_set_module.StorySet): | 717 class GpuProcessTestsStorySet(story_set_module.StorySet): |
591 | 718 |
592 """ Tests that accelerated content triggers the creation of a GPU process """ | 719 """ Tests that accelerated content triggers the creation of a GPU process """ |
593 | 720 |
594 def __init__(self, expectations, is_platform_android): | 721 def __init__(self, expectations, is_platform_android): |
595 super(GpuProcessTestsStorySet, self).__init__( | 722 super(GpuProcessTestsStorySet, self).__init__( |
596 serving_dirs=set(['../../../../content/test/data'])) | 723 serving_dirs=set(['../../../../content/test/data'])) |
597 | 724 |
598 urls_and_names_list = [ | 725 urls_and_names_list = [ |
599 ('file://../../data/gpu/functional_canvas_demo.html', | 726 ('file://../../data/gpu/functional_canvas_demo.html', |
600 'GpuProcess.canvas2d'), | 727 'GpuProcess.canvas2d'), |
601 ('file://../../data/gpu/functional_3d_css.html', | 728 ('file://../../data/gpu/functional_3d_css.html', |
602 'GpuProcess.css3d'), | 729 'GpuProcess.css3d'), |
603 ('file://../../data/gpu/functional_webgl.html', | 730 ('file://../../data/gpu/functional_webgl.html', |
604 'GpuProcess.webgl') | 731 'GpuProcess.webgl') |
605 ] | 732 ] |
606 | 733 |
607 for url, name in urls_and_names_list: | 734 for url, name in urls_and_names_list: |
608 self.AddStory(GpuProcessTestsPage(url, name, self, expectations)) | 735 self.AddStory(GpuProcessTestsPage(url, name, self, expectations)) |
609 | 736 |
610 self.AddStory(FunctionalVideoPage(self, expectations)) | 737 self.AddStory(FunctionalVideoPage(self, expectations)) |
611 self.AddStory(GpuInfoCompletePage(self, expectations)) | 738 self.AddStory(GpuInfoCompletePage(self, expectations)) |
612 self.AddStory(NoGpuProcessPage(self, expectations)) | 739 self.AddStory(NoGpuProcessPage(self, expectations)) |
613 self.AddStory(DriverBugWorkaroundsInGpuProcessPage(self, expectations)) | 740 self.AddStory(DriverBugWorkaroundsInGpuProcessPage(self, expectations)) |
614 self.AddStory(ReadbackWebGLGpuProcessPage(self, expectations, | 741 self.AddStory(ReadbackWebGLGpuProcessPage(self, expectations, |
615 is_platform_android)) | 742 is_platform_android)) |
616 self.AddStory(DriverBugWorkaroundsUponGLRendererPage(self, expectations, | 743 self.AddStory(DriverBugWorkaroundsUponGLRendererPage(self, expectations, |
617 is_platform_android)) | 744 is_platform_android)) |
618 self.AddStory(EqualBugWorkaroundsInBrowserAndGpuProcessPage(self, | 745 self.AddStory(EqualBugWorkaroundsPage(self, expectations)) |
619 expectations)) | 746 self.AddStory(OnlyOneWorkaroundPage(self, expectations)) |
| 747 |
620 if not is_platform_android: | 748 if not is_platform_android: |
621 self.AddStory(SkipGpuProcessPage(self, expectations)) | 749 self.AddStory(SkipGpuProcessPage(self, expectations)) |
622 self.AddStory(HasTransparentVisualsGpuProcessPage(self, expectations)) | 750 self.AddStory(HasTransparentVisualsGpuProcessPage(self, expectations)) |
623 self.AddStory(NoTransparentVisualsGpuProcessPage(self, expectations)) | 751 self.AddStory(NoTransparentVisualsGpuProcessPage(self, expectations)) |
624 | 752 |
625 # There is no Android multi-gpu configuration and the helper | 753 # There is no Android multi-gpu configuration and the helper |
626 # gpu_info_collector.cc::IdentifyActiveGPU is not even called. | 754 # gpu_info_collector.cc::IdentifyActiveGPU is not even called. |
627 self.AddStory(IdentifyActiveGpuPage1(self, expectations)) | 755 self.AddStory(IdentifyActiveGpuPage1(self, expectations)) |
628 self.AddStory(IdentifyActiveGpuPage2(self, expectations)) | 756 self.AddStory(IdentifyActiveGpuPage2(self, expectations)) |
629 self.AddStory(IdentifyActiveGpuPage3(self, expectations)) | 757 self.AddStory(IdentifyActiveGpuPage3(self, expectations)) |
630 self.AddStory(IdentifyActiveGpuPage4(self, expectations)) | 758 self.AddStory(IdentifyActiveGpuPage4(self, expectations)) |
631 | 759 |
632 # There is currently no entry in kSoftwareRenderingListJson that enables | 760 # There is currently no entry in kSoftwareRenderingListJson that enables |
633 # a software GL driver on Android. | 761 # a software GL driver on Android. |
634 self.AddStory(SoftwareGpuProcessPage(self, expectations)) | 762 self.AddStory(SoftwareGpuProcessPage(self, expectations)) |
635 | 763 |
636 @property | 764 @property |
637 def allow_mixed_story_states(self): | 765 def allow_mixed_story_states(self): |
638 # Return True here in order to be able to run pages with different browser | 766 # Return True here in order to be able to run pages with different browser |
639 # command line arguments. | 767 # command line arguments. |
640 return True | 768 return True |
OLD | NEW |