| # Copyright 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """ |
| This is a client side WebGL clear test that measures how many frames-per-second |
| (FPS) can be achieved (possibly limited by vsync) with glClear only. It can be |
| useful to gauge that most WebGL applications won't likely achieve anything |
| higher than the FPS output of this test, assuming all else equal. It may also |
| be useful to various types of graphics developers as a sanity check. However, |
| your mileage may vary and we make no claims with respect to any particular |
| platform or application. |
| |
| This test is expected to run 30 seconds by default. Any run that reports a FPS |
| value and finishes is a PASS. An acceptable FPS value is subjective and |
| platform, driver and/or project dependent... interpretation of the FPS results |
| are left up to the interested parties. |
| """ |
| |
| import logging |
| import os |
| import time |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib.cros import chrome |
| from autotest_lib.client.cros.graphics import graphics_utils |
| |
| |
| class graphics_WebGLClear(graphics_utils.GraphicsTest): |
| """WebGL clear graphics test.""" |
| version = 1 |
| perf_keyval = {} |
| test_duration_secs = 30 |
| |
| def setup(self): |
| self.job.setup_dep(['webgl_clear']) |
| |
| def initialize(self): |
| super(graphics_WebGLClear, self).initialize() |
| self.perf_keyval = {} |
| |
| def cleanup(self): |
| super(graphics_WebGLClear, self).cleanup() |
| |
| def run_clear_test(self, browser, test_url): |
| """Runs the clear test from the given url. |
| |
| @param browser: The Browser object to run the test with. |
| @param test_url: The URL to the clear test suite. |
| """ |
| tab = browser.tabs.New() |
| tab.Navigate(test_url) |
| tab.Activate() |
| tab.WaitForDocumentReadyStateToBeComplete() |
| time.sleep(self.test_duration_secs) |
| avg_fps = tab.EvaluateJavaScript('g_fpsTimer.averageFPS;') |
| self.perf_keyval['avg_fps'] = avg_fps |
| self.output_perf_value( |
| description='avg_fps', |
| value=avg_fps, |
| units='fps', |
| higher_is_better=True) |
| logging.info('Average FPS = %f', avg_fps) |
| |
| tab.Close() |
| |
| @graphics_utils.GraphicsTest.failure_report_decorator('graphics_WebGLClear') |
| def run_once(self, test_duration_secs=30): |
| """Finds a brower with telemetry, and run the test. |
| |
| @param test_duration_secs: The test duration in seconds to run the test |
| for. |
| """ |
| self.test_duration_secs = test_duration_secs |
| |
| # For this to have any noticable effect, SwapbuffersWait needs to be false |
| # in xorg.conf. |
| browser_args = '--disable-gpu-vsync' |
| |
| with chrome.Chrome(logged_in=False, |
| extra_browser_args=browser_args, |
| init_network_controller=True) as cr: |
| clearsrc = os.path.join(self.autodir, 'deps', 'webgl_clear', 'src') |
| if not cr.browser.platform.SetHTTPServerDirectories(clearsrc): |
| raise error.TestFail('Failed: Unable to start HTTP server') |
| test_url = cr.browser.platform.http_server.UrlOf( |
| os.path.join(clearsrc, 'WebGLClear.html')) |
| self.run_clear_test(cr.browser, test_url) |
| |
| self.write_perf_keyval(self.perf_keyval) |