Index: content/test/gpu/gpu_tests/gpu_process_integration_test.py |
diff --git a/content/test/gpu/gpu_tests/gpu_process_integration_test.py b/content/test/gpu/gpu_tests/gpu_process_integration_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..af7bedb903882847e34cc8a1b676126f1f8f1057 |
--- /dev/null |
+++ b/content/test/gpu/gpu_tests/gpu_process_integration_test.py |
@@ -0,0 +1,528 @@ |
+# Copyright 2017 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import logging |
+import os |
+import sys |
+ |
+from gpu_tests import gpu_integration_test |
+from gpu_tests import gpu_process_expectations |
+from gpu_tests import path_util |
+ |
+data_path = os.path.join( |
+ path_util.GetChromiumSrcDir(), 'content', 'test', 'data') |
+ |
+test_harness_script = r""" |
+ var domAutomationController = {}; |
+ domAutomationController._finished = false; |
+ domAutomationController.setAutomationId = function(id) {} |
+ domAutomationController.send = function(msg) { |
+ domAutomationController._finished = true; |
+ } |
+ |
+ window.domAutomationController = domAutomationController; |
+ |
+ function GetDriverBugWorkarounds() { |
+ var query_result = document.querySelector('.workarounds-list'); |
+ var browser_list = [] |
+ for (var i=0; i < query_result.childElementCount; i++) |
+ browser_list.push(query_result.children[i].textContent); |
+ return browser_list; |
+ }; |
+""" |
+ |
+class GpuProcessIntegrationTest(gpu_integration_test.GpuIntegrationTest): |
+ # We store a deep copy of the original browser finder options in |
+ # order to be able to restart the browser multiple times, with a |
+ # different set of command line arguments each time. |
+ _original_finder_options = None |
+ |
+ # We keep track of the set of command line arguments used to launch |
+ # the browser most recently in order to figure out whether we need |
+ # to relaunch it, if a new pixel test requires a different set of |
+ # arguments. |
+ _last_launched_browser_args = set() |
+ |
+ @classmethod |
+ def Name(cls): |
+ """The name by which this test is invoked on the command line.""" |
+ return 'gpu_process' |
+ |
+ @classmethod |
+ def setUpClass(cls): |
+ super(cls, GpuProcessIntegrationTest).setUpClass() |
+ cls._original_finder_options = cls._finder_options.Copy() |
+ cls.CustomizeBrowserArgs([]) |
+ cls.StartBrowser() |
+ cls.SetStaticServerDirs([data_path]) |
+ |
+ @classmethod |
+ def CustomizeBrowserArgs(cls, browser_args): |
+ if not browser_args: |
+ browser_args = [] |
+ cls._finder_options = cls._original_finder_options.Copy() |
+ browser_options = cls._finder_options.browser_options |
+ # All tests receive the following options. They aren't recorded in |
+ # the _last_launched_browser_args. |
+ browser_options.AppendExtraBrowserArgs([ |
+ '--enable-gpu-benchmarking', |
+ # TODO(kbr): figure out why the following option seems to be |
+ # needed on Android for robustness. |
+ # https://github.com/catapult-project/catapult/issues/3122 |
+ '--no-first-run']) |
+ # Append the new arguments. |
+ browser_options.AppendExtraBrowserArgs(browser_args) |
+ cls._last_launched_browser_args = set(browser_args) |
+ cls.SetBrowserOptions(cls._finder_options) |
+ |
+ @classmethod |
+ def RestartBrowserIfNecessaryWithArgs(cls, browser_args): |
+ if not browser_args: |
+ browser_args = [] |
+ if set(browser_args) != cls._last_launched_browser_args: |
+ logging.info('Restarting browser with arguments: ' + str(browser_args)) |
+ cls.StopBrowser() |
+ cls.CustomizeBrowserArgs(browser_args) |
+ cls.StartBrowser() |
+ cls.tab = cls.browser.tabs[0] |
+ |
+ @classmethod |
+ def _CreateExpectations(cls): |
+ return gpu_process_expectations.GpuProcessExpectations() |
+ |
+ @classmethod |
+ def GenerateGpuTests(cls, options): |
+ # The browser test runner synthesizes methods with the exact name |
+ # given in GenerateGpuTests, so in order to hand-write our tests but |
+ # also go through the _RunGpuTest trampoline, the test needs to be |
+ # slightly differently named. |
+ |
+ # Also note that since functional_video.html refers to files in |
+ # ../media/ , the serving dir must be the common parent directory. |
+ tests = (('GpuProcess_canvas2d', 'gpu/functional_canvas_demo.html'), |
+ ('GpuProcess_css3d', 'gpu/functional_3d_css.html'), |
+ ('GpuProcess_webgl', 'gpu/functional_webgl.html'), |
+ ('GpuProcess_video', 'gpu/functional_video.html'), |
+ ('GpuProcess_gpu_info_complete', 'gpu/functional_3d_css.html'), |
+ ('GpuProcess_no_gpu_process', 'about:blank'), |
+ ('GpuProcess_driver_bug_workarounds_in_gpu_process', 'chrome:gpu'), |
+ ('GpuProcess_readback_webgl_gpu_process', 'chrome:gpu'), |
+ ('GpuProcess_driver_bug_workarounds_upon_gl_renderer', |
+ 'chrome:gpu'), |
+ ('GpuProcess_only_one_workaround', 'chrome:gpu'), |
+ ('GpuProcess_skip_gpu_process', 'chrome:gpu'), |
+ ('GpuProcess_identify_active_gpu1', 'chrome:gpu'), |
+ ('GpuProcess_identify_active_gpu2', 'chrome:gpu'), |
+ ('GpuProcess_identify_active_gpu3', 'chrome:gpu'), |
+ ('GpuProcess_identify_active_gpu4', 'chrome:gpu'), |
+ ('GpuProcess_software_gpu_process', 'about:blank')) |
+ |
+ # The earlier has_transparent_visuals_gpu_process and |
+ # no_transparent_visuals_gpu_process tests became no-ops in |
+ # http://crrev.com/2347383002 and were deleted. |
+ |
+ for t in tests: |
+ yield (t[0], t[1], ('_' + t[0])) |
+ |
+ def RunActualGpuTest(self, test_path, *args): |
+ test_name = args[0] |
+ getattr(self, test_name)(test_path) |
+ |
+ ###################################### |
+ # Helper functions for the tests below |
+ |
+ def _Navigate(self, test_path): |
+ url = self.UrlOfStaticFilePath(test_path) |
+ # It's crucial to use the action_runner, rather than the tab's |
+ # Navigate method directly. It waits for the document ready state |
+ # to become interactive or better, avoiding critical race |
+ # conditions. |
+ self.tab.action_runner.Navigate( |
+ url, script_to_evaluate_on_commit=test_harness_script) |
+ |
+ def _NavigateAndWait(self, test_path): |
+ self._Navigate(test_path) |
+ self.tab.action_runner.WaitForJavaScriptCondition( |
+ 'window.domAutomationController._finished', timeout_in_seconds=10) |
+ |
+ def _VerifyGpuProcessPresent(self): |
+ tab = self.tab |
+ has_gpu_channel_js = 'chrome.gpuBenchmarking.hasGpuChannel()' |
+ has_gpu_channel = tab.EvaluateJavaScript(has_gpu_channel_js) |
+ if not has_gpu_channel: |
+ self.fail('No GPU channel detected') |
+ |
+ def _ValidateDriverBugWorkaroundsImpl(self, process_kind, is_expected, |
+ workaround_name): |
+ tab = self.tab |
+ if process_kind == "browser_process": |
+ gpu_driver_bug_workarounds = tab.EvaluateJavaScript( |
+ 'GetDriverBugWorkarounds()') |
+ elif process_kind == "gpu_process": |
+ gpu_driver_bug_workarounds = tab.EvaluateJavaScript( |
+ 'chrome.gpuBenchmarking.getGpuDriverBugWorkarounds()') |
+ |
+ is_present = workaround_name in gpu_driver_bug_workarounds |
+ failure = False |
+ if is_expected and not is_present: |
+ failure = True |
+ error_message = "is missing" |
+ elif not is_expected and is_present: |
+ failure = True |
+ error_message = "is not expected" |
+ |
+ if failure: |
+ print 'Test failed. Printing page contents:' |
+ print tab.EvaluateJavaScript('document.body.innerHTML') |
+ self.fail('%s %s in %s workarounds: %s' |
+ % (workaround_name, error_message, process_kind, |
+ gpu_driver_bug_workarounds)) |
+ |
+ def _ValidateDriverBugWorkarounds(self, expected_workaround, |
+ unexpected_workaround): |
+ if not expected_workaround and not unexpected_workaround: |
+ return |
+ if expected_workaround: |
+ self._ValidateDriverBugWorkaroundsImpl( |
+ "browser_process", True, expected_workaround) |
+ self._ValidateDriverBugWorkaroundsImpl( |
+ "gpu_process", True, expected_workaround) |
+ if unexpected_workaround: |
+ self._ValidateDriverBugWorkaroundsImpl( |
+ "browser_process", False, unexpected_workaround) |
+ self._ValidateDriverBugWorkaroundsImpl( |
+ "gpu_process", False, unexpected_workaround) |
+ |
+ # This can only be called from one of the tests, i.e., after the |
+ # browser's been brought up once. |
+ def _RunningOnAndroid(self): |
+ options = self.__class__._original_finder_options.browser_options |
+ return options.browser_type.startswith('android') |
+ |
+ def _CompareAndCaptureDriverBugWorkarounds(self): |
+ tab = self.tab |
+ has_gpu_process_js = 'chrome.gpuBenchmarking.hasGpuProcess()' |
+ if not tab.EvaluateJavaScript(has_gpu_process_js): |
+ self.fail('No GPU process detected') |
+ |
+ has_gpu_channel_js = 'chrome.gpuBenchmarking.hasGpuChannel()' |
+ if not tab.EvaluateJavaScript(has_gpu_channel_js): |
+ self.fail('No GPU channel detected') |
+ |
+ browser_list = tab.EvaluateJavaScript('GetDriverBugWorkarounds()') |
+ gpu_list = tab.EvaluateJavaScript( |
+ 'chrome.gpuBenchmarking.getGpuDriverBugWorkarounds()') |
+ |
+ diff = set(browser_list).symmetric_difference(set(gpu_list)) |
+ if len(diff) > 0: |
+ print 'Test failed. Printing page contents:' |
+ print tab.EvaluateJavaScript('document.body.innerHTML') |
+ self.fail('Browser and GPU process list of driver bug' |
+ 'workarounds are not equal: %s != %s, diff: %s' % |
+ (browser_list, gpu_list, list(diff))) |
+ |
+ basic_infos = tab.EvaluateJavaScript('browserBridge.gpuInfo.basic_info') |
+ disabled_gl_extensions = None |
+ for info in basic_infos: |
+ if info['description'].startswith('Disabled Extensions'): |
+ disabled_gl_extensions = info['value'] |
+ break |
+ |
+ return gpu_list, disabled_gl_extensions |
+ |
+ def _VerifyActiveAndInactiveGPUs( |
+ self, expected_active_gpu, expected_inactive_gpus): |
+ tab = self.tab |
+ basic_infos = tab.EvaluateJavaScript('browserBridge.gpuInfo.basic_info') |
+ active_gpu = [] |
+ inactive_gpus = [] |
+ index = 0 |
+ for info in basic_infos: |
+ description = info['description'] |
+ value = info['value'] |
+ if description.startswith('GPU%d' % index) and value.startswith('VENDOR'): |
+ if value.endswith('*ACTIVE*'): |
+ active_gpu.append(value) |
+ else: |
+ inactive_gpus.append(value) |
+ index += 1 |
+ if active_gpu != expected_active_gpu: |
+ self.fail('Active GPU field is wrong %s' % active_gpu) |
+ if inactive_gpus != expected_inactive_gpus: |
+ self.fail('Inactive GPU field is wrong %s' % inactive_gpus) |
+ |
+ ###################################### |
+ # The actual tests |
+ |
+ def _GpuProcess_canvas2d(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([]) |
+ self._NavigateAndWait(test_path) |
+ self._VerifyGpuProcessPresent() |
+ |
+ def _GpuProcess_css3d(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([]) |
+ self._NavigateAndWait(test_path) |
+ self._VerifyGpuProcessPresent() |
+ |
+ def _GpuProcess_webgl(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([]) |
+ self._NavigateAndWait(test_path) |
+ self._VerifyGpuProcessPresent() |
+ |
+ def _GpuProcess_video(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([]) |
+ self._NavigateAndWait(test_path) |
+ self._VerifyGpuProcessPresent() |
+ |
+ def _GpuProcess_gpu_info_complete(self, test_path): |
+ # Regression test for crbug.com/454906 |
+ self.RestartBrowserIfNecessaryWithArgs([]) |
+ self._NavigateAndWait(test_path) |
+ tab = self.tab |
+ if not tab.browser.supports_system_info: |
+ self.fail('Browser must support system info') |
+ system_info = tab.browser.GetSystemInfo() |
+ if not system_info.gpu: |
+ self.fail('Target machine must have a GPU') |
+ if not system_info.gpu.aux_attributes: |
+ self.fail('Browser must support GPU aux attributes') |
+ if not 'gl_renderer' in system_info.gpu.aux_attributes: |
+ self.fail('Browser must have gl_renderer in aux attribs') |
+ if len(system_info.gpu.aux_attributes['gl_renderer']) <= 0: |
+ self.fail('Must have a non-empty gl_renderer string') |
+ |
+ def _GpuProcess_no_gpu_process(self, test_path): |
+ options = self.__class__._original_finder_options.browser_options |
+ if options.browser_type.startswith('android'): |
+ # Android doesn't support starting up the browser without any |
+ # GPU process. This test is skipped on Android in |
+ # gpu_process_expectations.py, but we must at least be able to |
+ # bring up the browser in order to detect that the test |
+ # shouldn't run. Faking a vendor and device ID can get the |
+ # browser into a state where it won't launch. |
+ return |
+ elif sys.platform in ('cygwin', 'win32'): |
+ # Hit id 34 from kSoftwareRenderingListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x5333', |
+ '--gpu-testing-device-id=0x8811']) |
+ elif sys.platform.startswith('linux'): |
+ # Hit id 50 from kSoftwareRenderingListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-no-complete-info-collection', |
+ '--gpu-testing-vendor-id=0x10de', |
+ '--gpu-testing-device-id=0x0de1', |
+ '--gpu-testing-gl-vendor=VMware', |
+ '--gpu-testing-gl-renderer=softpipe', |
+ '--gpu-testing-gl-version="2.1 Mesa 10.1"']) |
+ elif sys.platform == 'darwin': |
+ # Hit id 112 from kSoftwareRenderingListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x8086', |
+ '--gpu-testing-device-id=0x0116']) |
+ self._Navigate(test_path) |
+ has_gpu_process_js = 'chrome.gpuBenchmarking.hasGpuProcess()' |
+ has_gpu_process = self.tab.EvaluateJavaScript(has_gpu_process_js) |
+ if has_gpu_process: |
+ self.fail('GPU process detected') |
+ |
+ def _GpuProcess_driver_bug_workarounds_in_gpu_process(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--use_gpu_driver_workaround_for_testing']) |
+ self._Navigate(test_path) |
+ self._ValidateDriverBugWorkarounds( |
+ 'use_gpu_driver_workaround_for_testing', None) |
+ |
+ def _GpuProcess_readback_webgl_gpu_process(self, test_path): |
+ # This test was designed to only run on desktop Linux. |
+ options = self.__class__._original_finder_options.browser_options |
+ is_platform_android = options.browser_type.startswith('android') |
+ if sys.platform.startswith('linux') and not is_platform_android: |
+ # Hit id 110 from kSoftwareRenderingListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x10de', |
+ '--gpu-testing-device-id=0x0de1', |
+ '--gpu-testing-gl-vendor=VMware', |
+ '--gpu-testing-gl-renderer=Gallium 0.4 ' \ |
+ 'on llvmpipe (LLVM 3.4, 256 bits)', |
+ '--gpu-testing-gl-version="3.0 Mesa 11.2"']) |
+ self._Navigate(test_path) |
+ feature_status_js = 'browserBridge.gpuInfo.featureStatus.featureStatus' |
+ feature_status_list = self.tab.EvaluateJavaScript(feature_status_js) |
+ result = True |
+ for name, status in feature_status_list.items(): |
+ if name == 'multiple_raster_threads': |
+ result = result and status == 'enabled_on' |
+ elif name == 'native_gpu_memory_buffers': |
+ result = result and status == 'disabled_software' |
+ elif name == 'webgl': |
+ result = result and status == 'enabled_readback' |
+ elif name == 'webgl2': |
+ result = result and status == 'unavailable_off' |
+ else: |
+ result = result and status == 'unavailable_software' |
+ if not result: |
+ self.fail('WebGL readback setup failed: %s' % feature_status_list) |
+ |
+ def _GpuProcess_driver_bug_workarounds_upon_gl_renderer(self, test_path): |
+ is_platform_android = self._RunningOnAndroid() |
+ if is_platform_android: |
+ # Hit id 108 from kGpuDriverBugListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-gl-vendor=NVIDIA Corporation', |
+ '--gpu-testing-gl-renderer=NVIDIA Tegra', |
+ '--gpu-testing-gl-version=OpenGL ES 3.1 NVIDIA 343.00']) |
+ elif sys.platform in ('cygwin', 'win32'): |
+ # Hit id 51 and 87 from kGpuDriverBugListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x1002', |
+ '--gpu-testing-device-id=0x6779', |
+ '--gpu-testing-driver-date=11-20-2014', |
+ '--gpu-testing-gl-vendor=Google Inc.', |
+ '--gpu-testing-gl-renderer=ANGLE ' \ |
+ '(AMD Radeon HD 6450 Direct3D11 vs_5_0 ps_5_0)', |
+ '--gpu-testing-gl-version=OpenGL ES 2.0 (ANGLE 2.1.0.0c0d8006a9dd)']) |
+ elif sys.platform.startswith('linux'): |
+ # Hit id 40 from kGpuDriverBugListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x0101', |
+ '--gpu-testing-device-id=0x0102', |
+ '--gpu-testing-gl-vendor=ARM', |
+ '--gpu-testing-gl-renderer=Mali-400 MP']) |
+ elif sys.platform == 'darwin': |
+ # Currently on osx no workaround relies on gl-renderer. |
+ return |
+ self._Navigate(test_path) |
+ if is_platform_android: |
+ self._ValidateDriverBugWorkarounds( |
+ 'unpack_overlapping_rows_separately_unpack_buffer', None) |
+ elif sys.platform in ('cygwin', 'win32'): |
+ self._ValidateDriverBugWorkarounds( |
+ 'texsubimage_faster_than_teximage', 'disable_d3d11') |
+ elif sys.platform.startswith('linux'): |
+ self._ValidateDriverBugWorkarounds('disable_discard_framebuffer', None) |
+ else: |
+ self.fail('Unexpected platform ' + sys.platform) |
+ |
+ def _GpuProcess_only_one_workaround(self, test_path): |
+ # Start this test by launching the browser with no command line |
+ # arguments. |
+ self.RestartBrowserIfNecessaryWithArgs([]) |
+ self._Navigate(test_path) |
+ self._VerifyGpuProcessPresent() |
+ recorded_workarounds, recorded_disabled_gl_extensions = ( |
+ self._CompareAndCaptureDriverBugWorkarounds()) |
+ # Add the testing workaround to the recorded workarounds. |
+ recorded_workarounds.append('use_gpu_driver_workaround_for_testing') |
+ # Relaunch the browser with OS-specific command line arguments. |
+ browser_args = ['--use_gpu_driver_workaround_for_testing', |
+ '--disable-gpu-driver-bug-workarounds'] |
+ # Inject some info to make sure the flags above are effective. |
+ if sys.platform == 'darwin': |
+ # Hit id 33 from kGpuDriverBugListJson. |
+ browser_args.extend(['--gpu-testing-gl-vendor=Imagination']) |
+ else: |
+ # Hit id 5 from kGpuDriverBugListJson. |
+ browser_args.extend(['--gpu-testing-vendor-id=0x10de', |
+ '--gpu-testing-device-id=0x0001']) |
+ # no multi gpu on Android. |
+ if not self._RunningOnAndroid(): |
+ browser_args.extend(['--gpu-testing-secondary-vendor-ids=', |
+ '--gpu-testing-secondary-device-ids=']) |
+ for workaround in recorded_workarounds: |
+ browser_args.append('--' + workaround) |
+ browser_args.append('--disable-gl-extensions=' + |
+ recorded_disabled_gl_extensions) |
+ self.RestartBrowserIfNecessaryWithArgs(browser_args) |
+ self._Navigate(test_path) |
+ self._VerifyGpuProcessPresent() |
+ new_workarounds, new_disabled_gl_extensions = ( |
+ self._CompareAndCaptureDriverBugWorkarounds()) |
+ diff = set(recorded_workarounds).symmetric_difference(new_workarounds) |
+ tab = self.tab |
+ if len(diff) > 0: |
+ print 'Test failed. Printing page contents:' |
+ print tab.EvaluateJavaScript('document.body.innerHTML') |
+ self.fail( |
+ 'GPU process and expected list of driver bug ' |
+ 'workarounds are not equal: %s != %s, diff: %s' % |
+ (recorded_workarounds, new_workarounds, list(diff))) |
+ if recorded_disabled_gl_extensions != new_disabled_gl_extensions: |
+ print 'Test failed. Printing page contents:' |
+ print tab.EvaluateJavaScript('document.body.innerHTML') |
+ self.fail( |
+ 'The expected disabled gl extensions are ' |
+ 'incorrect: %s != %s:' % |
+ (recorded_disabled_gl_extensions, new_disabled_gl_extensions)) |
+ |
+ def _GpuProcess_skip_gpu_process(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--disable-gpu', |
+ '--skip-gpu-data-loading']) |
+ self._Navigate(test_path) |
+ has_gpu_process_js = 'chrome.gpuBenchmarking.hasGpuProcess()' |
+ has_gpu_process = self.tab.EvaluateJavaScript(has_gpu_process_js) |
+ if has_gpu_process: |
+ self.fail('GPU process detected') |
+ |
+ def _GpuProcess_identify_active_gpu1(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x8086', |
+ '--gpu-testing-device-id=0x040a', |
+ '--gpu-testing-secondary-vendor-ids=0x10de', |
+ '--gpu-testing-secondary-device-ids=0x0de1', |
+ '--gpu-testing-gl-vendor=nouveau']) |
+ self._Navigate(test_path) |
+ self._VerifyActiveAndInactiveGPUs( |
+ ['VENDOR = 0x10de, DEVICE= 0x0de1 *ACTIVE*'], |
+ ['VENDOR = 0x8086, DEVICE= 0x040a']) |
+ |
+ def _GpuProcess_identify_active_gpu2(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x8086', |
+ '--gpu-testing-device-id=0x040a', |
+ '--gpu-testing-secondary-vendor-ids=0x10de', |
+ '--gpu-testing-secondary-device-ids=0x0de1', |
+ '--gpu-testing-gl-vendor=Intel']) |
+ self._Navigate(test_path) |
+ self._VerifyActiveAndInactiveGPUs( |
+ ['VENDOR = 0x8086, DEVICE= 0x040a *ACTIVE*'], |
+ ['VENDOR = 0x10de, DEVICE= 0x0de1']) |
+ |
+ def _GpuProcess_identify_active_gpu3(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x8086', |
+ '--gpu-testing-device-id=0x040a', |
+ '--gpu-testing-secondary-vendor-ids=0x10de;0x1002', |
+ '--gpu-testing-secondary-device-ids=0x0de1;0x6779', |
+ '--gpu-testing-gl-vendor=X.Org', |
+ '--gpu-testing-gl-renderer=AMD R600']) |
+ self._Navigate(test_path) |
+ self._VerifyActiveAndInactiveGPUs( |
+ ['VENDOR = 0x1002, DEVICE= 0x6779 *ACTIVE*'], |
+ ['VENDOR = 0x8086, DEVICE= 0x040a', |
+ 'VENDOR = 0x10de, DEVICE= 0x0de1']) |
+ |
+ def _GpuProcess_identify_active_gpu4(self, test_path): |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x10de', |
+ '--gpu-testing-device-id=0x0de1', |
+ '--gpu-testing-secondary-vendor-ids=', |
+ '--gpu-testing-secondary-device-ids=', |
+ '--gpu-testing-gl-vendor=nouveau']) |
+ self._Navigate(test_path) |
+ self._VerifyActiveAndInactiveGPUs( |
+ ['VENDOR = 0x10de, DEVICE= 0x0de1 *ACTIVE*'], |
+ []) |
+ |
+ def _GpuProcess_software_gpu_process(self, test_path): |
+ # Hit exception from id 50 from kSoftwareRenderingListJson. |
+ self.RestartBrowserIfNecessaryWithArgs([ |
+ '--gpu-testing-vendor-id=0x10de', |
+ '--gpu-testing-device-id=0x0de1', |
+ '--gpu-testing-gl-vendor=VMware', |
+ '--gpu-testing-gl-renderer=SVGA3D', |
+ '--gpu-testing-gl-version=2.1 Mesa 10.1']) |
+ self._Navigate(test_path) |
+ self._VerifyGpuProcessPresent() |