summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-01 23:08:05 +0000
committerjbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-01 23:08:05 +0000
commit5b6838b421fe7e4d4bcd027035f049164901591d (patch)
treeee9d82922707eab749cc742e35d5b15c24b1c9b9
parent5553d5bcd8c1f0d90d74a2a52a4c9af51d730d01 (diff)
downloadchromium_src-5b6838b421fe7e4d4bcd027035f049164901591d.zip
chromium_src-5b6838b421fe7e4d4bcd027035f049164901591d.tar.gz
chromium_src-5b6838b421fe7e4d4bcd027035f049164901591d.tar.bz2
Remove old GPU latency test.
This is mostly redundant with the new telemetry-based latency tests. BUG=249207 Review URL: https://chromiumcodereview.appspot.com/17847009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@209533 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/test/data/perf/latency_suite.html159
-rw-r--r--chrome/test/perf/rendering/latency_tests.cc766
-rw-r--r--content/browser/renderer_host/compositing_iosurface_mac.mm4
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc11
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc7
-rw-r--r--ui/gl/gl_surface_glx.cc3
-rw-r--r--ui/surface/accelerated_surface_win.cc8
8 files changed, 0 insertions, 959 deletions
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index b781541..3d07a1d 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -2132,7 +2132,6 @@
'test/base/chrome_test_launcher.cc',
'test/perf/browser_perf_test.cc',
'test/perf/browser_perf_test.h',
- 'test/perf/rendering/latency_tests.cc',
'test/perf/rendering/throughput_tests.cc',
],
'rules': [
diff --git a/chrome/test/data/perf/latency_suite.html b/chrome/test/data/perf/latency_suite.html
deleted file mode 100644
index 115047d..0000000
--- a/chrome/test/data/perf/latency_suite.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<html>
-<head>
-<script type="text/javascript">
-/**
- * @fileoverview This page executes various animation behaviors based on URL
- * arguments to test input latency. There are two main modes of
- * operation: webgl and software. Both modes use
- * requestAnimationFrame to drive the update rate. The basic task
- * of the page is to collect mouse input coordinates in the input
- * handler and render with the latest input coordinate in RAF. The
- * latency test will look at the rendering trace data to detect
- * the latest mouse coordinate that affected the frame. For
- * software runs, the pixel at 0,0 on the page must contain the
- * mouse coordinate encoded as a color.
- */
-
-var frameCountWarmup = 5;
-var frameCount = 0;
-var gl = null;
-var mouseX = 0;
-var testParams = {};
-var testIsRunning = true;
-
-function parseParams() {
- var query = window.location.search.substring(1);
- if (!query)
- return;
- var params = query.split('&');
- for (var i = 0, len = params.length; i < len; i++) {
- var pair = params[i].split('=');
- if (pair.length == 1)
- testParams[pair[0]] = true;
- else
- testParams[pair[0]] = pair[1];
- }
-}
-
-function setCoordinates(e) {
- // Prevent the page from dirtying when the test has already ended. Otherwise,
- // on OSX some tests never get the domAutomationController FINISHED message.
- if (!testIsRunning)
- return;
-
- // Ignore mouse events with wrong Y coordinate.
- if (e.clientY != parseInt(testParams.y))
- return;
-
- mouseX = e.clientX;
- if (testParams.inputDirty) {
- document.getElementById('text').firstChild.textContent =
- mouseX.toString();
- }
- if (testParams.inputHeavy) {
- sleep(parseInt(testParams.delayTimeMS));
- }
-}
-
-function init() {
- parseParams();
-
- if (testParams.mode.indexOf('webgl') != -1) {
- var canvas = document.getElementById('canvas');
- if (!canvas)
- return false;
- canvas.width = parseInt(testParams.canvasWidth);
- canvas.height = parseInt(testParams.canvasWidth);
- try {
- // Specify antialiasing to ensure that we get a BlitFramebufferEXT in
- // the trace when the compositor consumes a webgl frame.
- gl = canvas.getContext('webgl', { antialias: true });
- } catch (e) {}
- if (!gl) {
- try {
- gl = canvas.getContext('experimental-webgl');
- } catch (e) {
- return false;
- }
- }
- return true;
- } else if (testParams.mode == 'software') {
- var table = document.getElementById('table');
- table.style.backgroundColor = '#ff00ff';
- return true;
- }
-}
-
-function onLoad() {
- if (init())
- window.webkitRequestAnimationFrame(draw);
- else
- endTest();
-}
-
-function sleep(milliseconds) {
- var start = Date.now();
- while(Date.now() - start <= milliseconds);
-}
-
-function draw() {
- if (testParams.rafHeavy) {
- sleep(parseInt(testParams.delayTimeMS));
- }
-
- if (testParams.mode.indexOf('webgl') != -1) {
- gl.viewport(0, 0, testParams.canvasWidth, testParams.canvasWidth);
- if (testParams.paintHeavy) {
- gl.clearColor(0, 0, 0.0, 1.0);
- for (var i = 0; i < 1000; ++i)
- gl.clear(gl.COLOR_BUFFER_BIT);
- }
- gl.clearColor(mouseX, testParams.clearColorGreen, 0.0, 1.0);
- gl.clear(gl.COLOR_BUFFER_BIT);
- } else if (testParams.mode == 'software') {
- var table = document.getElementById('table');
- // Encode mouse x value into color channels (support up to 64k x values).
- var g = (mouseX & 0xff00) >> 8;
- var b = (mouseX & 0xff);
- table.style.backgroundColor = 'rgb(0, ' + g + ', ' + b + ')';
- // When no inputs are coming in, the first table won't change. Since we
- // still need to cause a paint, toggle the color of another element:
- var table2 = document.getElementById('table2');
- table2.style.backgroundColor = (frameCount & 1) ? 'gray' : 'silver';
- if (testParams.paintHeavy) {
- var body = document.getElementById('body');
- body.style.backgroundColor = (frameCount & 1) ? 'silver' : 'gray';
- }
- }
-
- frameCount++;
- if (frameCount == parseInt(testParams.numFrames)) {
- if (testParams.mode.indexOf('webgl') != -1)
- gl.finish();
- endTest();
- } else {
- window.webkitRequestAnimationFrame(draw);
- }
-}
-
-function endTest() {
- testIsRunning = false;
- domAutomationController.setAutomationId(1);
- domAutomationController.send('FINISHED');
-}
-</script>
-</head>
-<style>
-#table {
- height: 10px;
- width: 10px;
-}
-</style>
-<body id="body" style="margin:0px" onload="onLoad()"
- onmousemove="setCoordinates(event)">
-<table id="table"><tr/></table>
-<table id="table2"><tr/></table>
-<canvas id="canvas"></canvas>
-<p><b id="text">x</b></p>
-</body>
-</html>
diff --git a/chrome/test/perf/rendering/latency_tests.cc b/chrome/test/perf/rendering/latency_tests.cc
deleted file mode 100644
index 5309b94..0000000
--- a/chrome/test/perf/rendering/latency_tests.cc
+++ /dev/null
@@ -1,766 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "base/command_line.h"
-#include "base/file_util.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/path_service.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/test_switches.h"
-#include "base/test/trace_event_analyzer.h"
-#include "base/threading/platform_thread.h"
-#include "base/timer/timer.h"
-#include "base/version.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/test/base/tracing.h"
-#include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/perf/browser_perf_test.h"
-#include "chrome/test/perf/perf_test.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/test/browser_test_utils.h"
-#include "gpu/config/gpu_test_config.h"
-#include "net/base/net_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-#if defined(OS_MACOSX)
-#include "base/mac/mac_util.h"
-#endif
-
-// Run with --vmodule=latency_tests=1 to print verbose latency info.
-
-// How is latency measured?
-//
-// The test injects mouse moves many times per frame from the browser via
-// RenderWidgetHost. Each input has a unique x coordinate. When the javascript
-// handler receives the input, it stores the coordinate for later use in the
-// requestAnimationFrame callback. In RAF, the test paints using the x
-// coordinate as a color (in software, it sets the color of a table; in webgl,
-// it executes a glClearColor). Trace events emit the color when it is picked up
-// by either UpdateRect for software or gles2_cmd_decoder/glClear for webgl.
-//
-// Each UpdateRect (software) or SwapBuffers (webgl) is considered to be a frame
-// boundary that will be used to measure latency in number of frames. Starting
-// from a frame boundary Y, the test first determines what mouse x coordinate
-// was represented by the color at that frame boundary. Then, the test walks
-// backward through the trace events to find the input event matching that
-// x coordinate. Then, the test find the nearest frame boundary X to the input
-// event (may be before or after). The number of frame boundaries is then
-// counted between X and Y to determine the input latency.
-//
-// By injecting mouse moves many times per frame, we reduce flakiness in the
-// finding of the nearest frame boundary.
-//
-// This test only measures the latency introduced by chrome code -- it does not
-// measure latency introduced by mouse drivers or the GL driver or the OS window
-// manager. The actual latency seen by a user is more than what is reported by
-// this test.
-//
-// Current modes:
-// - Software RAF
-// - WebGL RAF
-// - WebGL RAF with Compositor Thread
-
-namespace {
-
-using trace_analyzer::CountMatches;
-using trace_analyzer::FindClosest;
-using trace_analyzer::FindLastOf;
-using trace_analyzer::RateStats;
-using trace_analyzer::Query;
-using trace_analyzer::TraceAnalyzer;
-using trace_analyzer::TraceEvent;
-using trace_analyzer::TraceEventVector;
-
-enum LatencyTestMode {
- kWebGL,
- kWebGLThread,
- kSoftware
-};
-
-enum LatencyTestFlags {
- kInputHeavy = 1 << 0,
- kInputDirty = 1 << 1,
- kRafHeavy = 1 << 2,
- kPaintHeavy = 1 << 3
-};
-
-const int kWebGLCanvasWidth = 10;
-const int kNumFrames = 80;
-const int kInputsPerFrame = 16;
-// Magic number to identify certain glClear events.
-const int kClearColorGreen = 137;
-const int kMouseY = 5;
-
-// Don't analyze start frames that may be inaccurate. Latencies can be as high
-// as 5 frames or so, so skip the first 6 frames to get more accurate results.
-const int kIgnoreStartFrames = 6;
-// Don't analyze end frames that may be inaccurate.
-const int kIgnoreEndFrames = 4;
-// Minimum frames to produce an answer.
-const int kMinimumFramesForAnalysis = 5;
-
-class LatencyTest
- : public BrowserPerfTest,
- public ::testing::WithParamInterface<int> {
- public:
- explicit LatencyTest(LatencyTestMode mode) :
- query_instant_(Query::EventPhaseIs(TRACE_EVENT_PHASE_INSTANT)),
- // These queries are initialized in RunTest.
- query_begin_swaps_(Query::Bool(false)),
- query_end_swaps_(Query::Bool(false)),
- query_inputs_(Query::Bool(false)),
- query_blits_(Query::Bool(false)),
- query_clears_(Query::Bool(false)),
- mouse_x_(0),
- tab_width_(0),
- mode_(mode),
- delay_time_us_(0),
- num_frames_(0),
- verbose_(false),
- test_flags_(0),
- use_gpu_(mode == kWebGL || mode == kWebGLThread) {}
-
- virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
-
- std::vector<int> GetAllBehaviors();
-
- // Run test with specified |behaviors|.
- // |behaviors| is a list of combinations of LatencyTestFlags.
- void RunTest(const std::vector<int>& behaviors);
-
- private:
- void RunTestInternal(const std::string& test_url,
- bool send_inputs,
- int input_delay_us);
-
- double CalculateLatency();
-
- std::string GetModeString() {
- switch (mode_) {
- case kWebGL:
- return "webgl";
- case kWebGLThread:
- return "webgl_thread";
- case kSoftware:
- return "software";
- default:
- NOTREACHED() << "invalid mode";
- return std::string();
- }
- }
-
- std::string GetTraceName(int flags);
-
- std::string GetUrlModeString(int flags);
-
- std::string GetUrl(int flags);
-
- void GetMeanFrameTimeMicros(int* frame_time) const;
-
- void SendInput();
-
- void PrintEvents(const TraceEventVector& events);
-
- // Path to html file.
- base::FilePath test_path_;
-
- // Query INSTANT events.
- Query query_instant_;
-
- // Query begin of "swaps" which is SwapBuffers for GL and UpdateRect for
- // software.
- Query query_begin_swaps_;
-
- // Query end of "swaps" which is SwapBuffers for GL and UpdateRect for
- // software.
- Query query_end_swaps_;
-
- // Query mouse input entry events in browser process (ForwardMouseEvent).
- Query query_inputs_;
-
- // Query GL blits for the WebGL canvas -- represents the compositor consuming
- // the WebGL contents for display.
- Query query_blits_;
-
- // Query glClear calls with mouse coordinate as clear color.
- Query query_clears_;
-
- // For searching trace data.
- scoped_ptr<TraceAnalyzer> analyzer_;
-
- // Current mouse x coordinate for injecting events.
- int mouse_x_;
-
- // Width of window containing our tab.
- int tab_width_;
-
- // Timer for injecting mouse events periodically.
- base::RepeatingTimer<LatencyTest> timer_;
-
- // Mode: webgl or software.
- LatencyTestMode mode_;
-
- // Delay time for javascript test code. Typically 2 x frame duration. Used
- // to spin-wait in the javascript input handler and requestAnimationFrame.
- int delay_time_us_;
-
- // Number of frames to render from the html test code.
- int num_frames_;
-
- // Map from test flags combination to the calculated mean latency.
- std::map<int, double> latencies_;
-
- // Whether to print more verbose output.
- bool verbose_;
-
- // Current test flags combination, determining the behavior of the test.
- int test_flags_;
-
- bool use_gpu_;
-};
-
-void LatencyTest::SetUpCommandLine(CommandLine* command_line) {
- BrowserPerfTest::SetUpCommandLine(command_line);
- if (mode_ == kWebGLThread) {
- ASSERT_TRUE(use_gpu_);
- command_line->AppendSwitch(switches::kEnableThreadedCompositing);
- } else {
- command_line->AppendSwitch(switches::kDisableThreadedCompositing);
- }
- if (!use_gpu_)
- command_line->AppendSwitch(switches::kDisableAcceleratedCompositing);
- command_line->AppendSwitch(switches::kDisableBackgroundNetworking);
-}
-
-std::vector<int> LatencyTest::GetAllBehaviors() {
- std::vector<int> behaviors;
- int max_behaviors = kInputHeavy | kInputDirty | kRafHeavy | kPaintHeavy;
- for (int i = 0; i <= max_behaviors; ++i)
- behaviors.push_back(i);
- return behaviors;
-}
-
-void LatencyTest::RunTest(const std::vector<int>& behaviors) {
- verbose_ = (logging::GetVlogLevel("latency_tests") > 0);
-
- // Linux Intel uses mesa driver, where multisampling is not supported.
- // Multisampling is also not supported on virtualized mac os.
- // The latency test uses the multisampling blit trace event to determine when
- // the compositor is consuming the webgl context, so it currently doesn't work
- // without multisampling. Since the Latency test does not depend much on the
- // GPU, let's just skip testing on Intel since the data is redundant with
- // other non-Intel bots.
- gpu::GPUTestBotConfig test_bot;
- test_bot.LoadCurrentConfig(NULL);
- const std::vector<uint32>& gpu_vendor = test_bot.gpu_vendor();
-#if defined(OS_LINUX)
- if (gpu_vendor.size() == 1 && gpu_vendor[0] == 0x8086)
- return;
-#endif // defined(OS_LINUX)
-#if defined(OS_MACOSX)
- if (gpu_vendor.size() == 1 && gpu_vendor[0] == 0x15AD)
- return;
-#endif // defined(OS_MACOSX)
-
-#if defined(OS_WIN)
- // Latency test doesn't work on WinXP. crbug.com/128066
- if (base::win::OSInfo::GetInstance()->version() == base::win::VERSION_XP)
- return;
-#endif
-#if defined(OS_MACOSX)
- // Latency tests are flaky on 10.8 OSX gpu bots. http://crbug.com/254542
- if (base::mac::IsOSMountainLion())
- return;
-#endif
-
- // Construct queries for searching trace events via TraceAnalyzer.
- if (use_gpu_) {
- query_begin_swaps_ = query_instant_ &&
- Query::EventNameIs("SwapBuffersLatency") &&
- Query::EventArg("width") != Query::Int(kWebGLCanvasWidth);
- query_end_swaps_ = query_instant_ &&
- Query::EventNameIs("CompositorSwapBuffersComplete");
- } else if (mode_ == kSoftware) {
- // Software updates need to have x=0 and y=0 to contain the input color.
- query_begin_swaps_ = query_instant_ &&
- Query::EventNameIs("UpdateRect") &&
- Query::EventArg("x+y") == Query::Int(0);
- query_end_swaps_ = query_instant_ &&
- Query::EventNameIs("UpdateRectComplete") &&
- Query::EventArg("x+y") == Query::Int(0);
- }
- query_inputs_ = query_instant_ &&
- Query::EventNameIs("MouseEventBegin");
- query_blits_ = query_instant_ &&
- Query::EventNameIs("DoBlit") &&
- Query::EventArg("width") == Query::Int(kWebGLCanvasWidth);
- query_clears_ = query_instant_ &&
- Query::EventNameIs("DoClear") &&
- Query::EventArg("green") == Query::Int(kClearColorGreen);
- Query query_width_swaps = Query::Bool(false);
- if (use_gpu_) {
- query_width_swaps = query_begin_swaps_;
- } else if (mode_ == kSoftware) {
- query_width_swaps = query_instant_ &&
- Query::EventNameIs("UpdateRectWidth") &&
- Query::EventArg("width") > Query::Int(kWebGLCanvasWidth);
- }
-
- // Set path to test html.
- ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_path_));
- test_path_ = test_path_.Append(FILE_PATH_LITERAL("perf"));
- test_path_ = test_path_.Append(FILE_PATH_LITERAL("latency_suite.html"));
- ASSERT_TRUE(file_util::PathExists(test_path_))
- << "Missing test file: " << test_path_.value();
-
- // Run once with defaults to measure the frame times.
- delay_time_us_ = 0;
- // kNumFrames may be very high, but we only need a few frames to measure
- // average frame times.
- num_frames_ = 30;
- int initial_flags = 0;
- if (mode_ == kSoftware) {
- // For the first run, run software with kPaintHeavy (which toggles the
- // background color every frame) to force an update each RAF. Otherwise it
- // won't trigger an UpdateRect each frame and we won't be able to measure
- // framerate, because there are no inputs during the first run.
- initial_flags = static_cast<int>(kPaintHeavy);
- }
- RunTestInternal(GetUrl(initial_flags), false, 0);
-
- // Get width of tab so that we know the limit of x coordinates for the
- // injected mouse inputs.
- const TraceEvent* swap_event = analyzer_->FindFirstOf(query_width_swaps);
- ASSERT_TRUE(swap_event);
- tab_width_ = swap_event->GetKnownArgAsInt("width");
- // Keep printf output clean by limiting input coords to three digits:
- tab_width_ = (tab_width_ < 1000) ? tab_width_ : 999;
- // Sanity check the tab_width -- it should be more than 100 pixels.
- EXPECT_GT(tab_width_, 100);
-
- int mean_frame_time_us = 0;
- GetMeanFrameTimeMicros(&mean_frame_time_us);
- if (verbose_)
- printf("Mean frame time micros = %d\n", mean_frame_time_us);
- // Delay time is 2x the average frame time.
- delay_time_us_ = 2 * mean_frame_time_us;
- // Calculate delay time between inputs based on the measured frame time.
- // This prevents flooding the browser with more events than we need if the
- // test is running very slow (such as on a VM).
- int delay_us = mean_frame_time_us / kInputsPerFrame;
-
- // Reset num_frames_ for actual test runs.
- num_frames_ = kNumFrames;
-
- // Run input latency test with each requested behavior.
- for (size_t i = 0; i < behaviors.size(); ++i) {
- test_flags_ = behaviors[i];
- std::string url = GetUrl(test_flags_);
- printf("=============================================================\n");
- if (verbose_)
- printf("Mode: %s\n", GetUrlModeString(i).c_str());
- printf("URL: %s\n", url.c_str());
-
- // Do the actual test with input events.
- RunTestInternal(url, true, delay_us);
- latencies_[test_flags_] = CalculateLatency();
-
- if (mode_ == kWebGLThread) {
- // Print vsync info when in threaded mode.
- Query query_vsync =
- Query::EventNameIs("OutputSurface::OnVSyncParametersChanged") &&
- Query::EventHasNumberArg("timebase") &&
- Query::EventHasNumberArg("interval");
-
- const TraceEvent* vsync_info = analyzer_->FindFirstOf(query_vsync);
- if (vsync_info) {
- double timebase = vsync_info->GetKnownArgAsDouble("timebase");
- double interval = vsync_info->GetKnownArgAsDouble("interval");
- printf("VSync scheduling: timebase = %f; interval = %f\n",
- timebase, interval);
- }
- }
- }
-
- // Print summary if more than 1 behavior was tested in this run. This is only
- // for manual test runs for human reabable results, not for perf bots.
- if (behaviors.size() > 1) {
- printf("#############################################################\n");
- printf("## %s\n", GetModeString().c_str());
- if (verbose_) {
- printf("Latency, behavior:\n");
- for (size_t i = 0; i < behaviors.size(); ++i) {
- printf("%.1f, %s%s%s%s\n", latencies_[behaviors[i]],
- (i & kInputHeavy) ? "InputHeavy " : "",
- (i & kInputDirty) ? "InputDirty " : "",
- (i & kRafHeavy) ? "RafHeavy " : "",
- (i & kPaintHeavy) ? "PaintHeavy " : "");
- }
- }
- printf("Latencies for tests: ");
- for (size_t i = 0; i < behaviors.size(); ++i) {
- printf("%.1f%s", latencies_[behaviors[i]],
- (i < behaviors.size() - 1) ? ", " : "");
- }
- printf("\n");
- printf("#############################################################\n");
- }
-}
-
-void LatencyTest::RunTestInternal(const std::string& test_url,
- bool send_inputs,
- int input_delay_us) {
- mouse_x_ = 0;
-
- ASSERT_TRUE(tracing::BeginTracing("cc,test_gpu,test_latency"));
-
- ui_test_utils::NavigateToURLWithDisposition(
- browser(), GURL(test_url), CURRENT_TAB,
- ui_test_utils::BROWSER_TEST_NONE);
-
- // Start sending mouse inputs.
- if (send_inputs) {
- // Round input_delay_us down to nearest milliseconds. The rounding in timer
- // code rounds up from us to ms, so we need to do our own rounding here.
- int input_delay_ms = input_delay_us / 1000;
- input_delay_ms = (input_delay_ms <= 0) ? 1 : input_delay_ms;
- timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(input_delay_ms),
- this, &LatencyTest::SendInput);
- }
-
- // Wait for message indicating the test has finished running.
- content::DOMMessageQueue message_queue;
- ASSERT_TRUE(message_queue.WaitForMessage(NULL));
-
- timer_.Stop();
-
- std::string json_events;
- ASSERT_TRUE(tracing::EndTracing(&json_events));
-
- analyzer_.reset(TraceAnalyzer::Create(json_events));
- analyzer_->AssociateBeginEndEvents();
- analyzer_->MergeAssociatedEventArgs();
-}
-
-double LatencyTest::CalculateLatency() {
- TraceEventVector events;
- if (use_gpu_) {
- // Search for three types of events in WebGL mode:
- // - onscreen swaps.
- // - DoClear calls that contain the mouse x coordinate.
- // - mouse events.
- analyzer_->FindEvents(query_begin_swaps_ || query_end_swaps_ ||
- query_inputs_ || query_blits_ || query_clears_,
- &events);
- } else if (mode_ == kSoftware) {
- analyzer_->FindEvents(query_begin_swaps_ || query_end_swaps_ ||
- query_inputs_, &events);
- } else {
- NOTREACHED() << "invalid mode";
- }
-
- if (verbose_)
- PrintEvents(events);
-
- int swap_count = 0;
- size_t previous_blit_pos = 0;
- swap_count = 0;
- std::vector<double> latencies;
- printf("Measured latency (in number of frames) for each frame:\n");
- for (size_t i = 0; i < events.size(); ++i) {
- if (query_end_swaps_.Evaluate(*events[i])) {
- size_t end_swap_pos = i;
-
- // Compositor context swap buffers.
- ++swap_count;
- // Don't analyze first few swaps, because they are filling the rendering
- // pipeline and may be unstable.
- if (swap_count > kIgnoreStartFrames) {
- // First, find the beginning of this swap.
- size_t begin_swap_pos = 0;
- EXPECT_TRUE(FindLastOf(events, query_begin_swaps_, end_swap_pos,
- &begin_swap_pos));
-
- int mouse_x = 0;
- if (use_gpu_) {
- // Trace backwards through the events to find the input event that
- // matches the glClear that was presented by this SwapBuffers.
-
- // Step 1: Find the last blit (which will be the WebGL blit).
- size_t blit_pos = 0;
- EXPECT_TRUE(FindLastOf(events, query_blits_, begin_swap_pos,
- &blit_pos));
- // Skip this SwapBuffers if the blit has already been consumed by a
- // previous SwapBuffers. This means the current frame did not receive
- // an update from WebGL.
- if (blit_pos == previous_blit_pos) {
- if (verbose_)
- printf(" %03d: MISS_BLIT\n", swap_count);
- else
- printf(" MISS_BLIT");
- continue;
- }
- previous_blit_pos = blit_pos;
-
- // Step 2: find the last clear from the WebGL blit. This will be the
- // value of the latest mouse input that has affected this swap.
- size_t clear_pos = 0;
- EXPECT_TRUE(FindLastOf(events, query_clears_, blit_pos, &clear_pos));
- mouse_x = events[clear_pos]->GetKnownArgAsInt("red");
- } else if (mode_ == kSoftware) {
- // The software path gets the mouse_x directly from the DIB colors.
- mouse_x = events[begin_swap_pos]->GetKnownArgAsInt("color");
- }
-
- // Find the corresponding mouse input.
- size_t input_pos = 0;
- Query query_mouse_event = query_inputs_ &&
- Query::EventArg("x") == Query::Int(mouse_x);
- EXPECT_TRUE(FindLastOf(events, query_mouse_event, begin_swap_pos,
- &input_pos));
-
- // Step 4: Find the nearest onscreen SwapBuffers to this input event.
- size_t end_swap_left = 0;
- size_t end_swap_right = 0;
- EXPECT_TRUE(FindLastOf(events, query_end_swaps_, input_pos,
- &end_swap_left));
- EXPECT_TRUE(FindFirstOf(events, query_end_swaps_, input_pos,
- &end_swap_right));
-
- EXPECT_LT(end_swap_left, input_pos);
- EXPECT_LT(end_swap_left, end_swap_right);
- EXPECT_LT(input_pos, end_swap_right);
-
- // Calculate the fraction of the first frame from the input event to the
- // next end_swap event: (right_swap - left_swap) / (right_swap - input).
- double frame_time = (events[end_swap_right]->timestamp -
- events[end_swap_left]->timestamp);
- double input_time = (events[end_swap_right]->timestamp -
- events[input_pos]->timestamp);
- double latency_frame_fraction = input_time / frame_time;
-
- EXPECT_LE(latency_frame_fraction, 1.0);
-
- // Calculate latency by counting the number of swaps between the input
- // event and the corresponding on-screen end-of-swap.
- int latency_int = CountMatches(events, query_end_swaps_,
- input_pos, end_swap_pos);
-
- double latency_frames = static_cast<double>(latency_int) +
- latency_frame_fraction;
- latencies.push_back(latency_frames);
- if (verbose_)
- printf(" %03d: %0.1f (int %d, frac %f)\n", swap_count, latency_frames,
- latency_int, latency_frame_fraction);
- else
- printf(" %0.1f", latency_frames);
- }
- }
- }
- printf("\n");
-
- size_t ignoreEndFrames = static_cast<size_t>(kIgnoreEndFrames);
- bool haveEnoughFrames = latencies.size() >
- ignoreEndFrames + static_cast<size_t>(kMinimumFramesForAnalysis);
- EXPECT_TRUE(haveEnoughFrames);
- if (!haveEnoughFrames)
- return 0.0;
-
- double mean_latency = 0.0;
- // Skip last few frames, because they may be unreliable.
- size_t num_consider = latencies.size() - ignoreEndFrames;
- for (size_t i = 0; i < num_consider; ++i)
- mean_latency += latencies[i];
- mean_latency /= static_cast<double>(num_consider);
- printf("Mean latency = %f\n", mean_latency);
-
- double mean_error = 0.0;
- for (size_t i = 0; i < num_consider; ++i) {
- double offset = fabs(mean_latency - latencies[i]);
- mean_error = (offset > mean_error) ? offset : mean_error;
- }
-
- std::string trace_name = GetTraceName(test_flags_);
- std::string mean_and_error = base::StringPrintf("%f,%f", mean_latency,
- mean_error);
- perf_test::PrintResultMeanAndError(GetModeString(),
- std::string(),
- trace_name,
- mean_and_error,
- "frames",
- true);
- return mean_latency;
-}
-
-std::string LatencyTest::GetTraceName(int flags) {
- if (flags == 0)
- return "simple";
- std::string name;
- if (flags & kInputHeavy)
- name += "ih";
- if (flags & kInputDirty)
- name += std::string(name.empty()? "" : "_") + "id";
- if (flags & kRafHeavy)
- name += std::string(name.empty()? "" : "_") + "rh";
- if (flags & kPaintHeavy)
- name += std::string(name.empty()? "" : "_") + "ph";
- return name;
-}
-
-std::string LatencyTest::GetUrlModeString(int flags) {
- std::string mode = "&mode=" + GetModeString();
- if (flags & kInputHeavy)
- mode += "&inputHeavy";
- if (flags & kInputDirty)
- mode += "&inputDirty";
- if (flags & kRafHeavy)
- mode += "&rafHeavy";
- if (flags & kPaintHeavy)
- mode += "&paintHeavy";
- return mode;
-}
-
-std::string LatencyTest::GetUrl(int flags) {
- std::string test_url =
- net::FilePathToFileURL(test_path_).possibly_invalid_spec();
- test_url += "?numFrames=" + base::IntToString(num_frames_);
- test_url += "&canvasWidth=" + base::IntToString(kWebGLCanvasWidth);
- test_url += "&clearColorGreen=" + base::IntToString(kClearColorGreen);
- test_url += "&delayTimeMS=" + base::IntToString(delay_time_us_ / 1000);
- test_url += "&y=" + base::IntToString(kMouseY);
- return test_url + GetUrlModeString(flags);
-}
-
-void LatencyTest::GetMeanFrameTimeMicros(int* frame_time) const {
- TraceEventVector events;
- // Search for compositor swaps (or UpdateRects in the software path).
- analyzer_->FindEvents(query_end_swaps_, &events);
- RateStats stats;
- trace_analyzer::RateStatsOptions options;
- options.trim_max = 3;
- options.trim_min = 3;
- ASSERT_TRUE(GetRateStats(events, &stats, &options));
-
- // Check that the number of swaps is close to kNumFrames.
- EXPECT_LT(num_frames_ - num_frames_ / 4, static_cast<int>(events.size()));
- *frame_time = static_cast<int>(stats.mean_us);
-}
-
-void LatencyTest::SendInput() {
- content::RenderViewHost* rvh =
- browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost();
- WebKit::WebMouseEvent mouse_event;
- mouse_event.movementX = 1;
- mouse_x_ += mouse_event.movementX;
- // Wrap mouse_x_ when it's near the edge of the tab.
- if (mouse_x_ > tab_width_ - 5)
- mouse_x_ = 1;
- mouse_event.x = mouse_event.windowX = mouse_x_;
- // Set y coordinate to be a few pixels down from the top of the window,
- // so that it is between the top and bottom of the canvas.
- mouse_event.y = mouse_event.windowY = 5;
- mouse_event.type = WebKit::WebInputEvent::MouseMove;
- TRACE_EVENT_INSTANT1("test_latency", "MouseEventBegin",
- TRACE_EVENT_SCOPE_THREAD, "x", mouse_x_);
- rvh->ForwardMouseEvent(mouse_event);
-}
-
-void LatencyTest::PrintEvents(const TraceEventVector& events) {
- bool is_software = (mode_ == kSoftware);
- int swap_count = 0;
- for (size_t i = 0; i < events.size(); ++i) {
- if (events[i]->name == "MouseEventBegin") {
- printf("%03d ", events[i]->GetKnownArgAsInt("x"));
- } else if (events[i]->name == "DoClear") {
- printf("Clr%03d ", events[i]->GetKnownArgAsInt("red"));
- } else if (events[i]->name == "DoBlit") {
- // WebGL context swap buffers.
- printf("BLT ");
- } else if (events[i]->name == "SwapBuffersLatency") {
- // Compositor context swap buffers.
- ++swap_count;
- printf("|\nframe %03d: ", swap_count + 1);
- } else if (is_software && events[i]->name == "UpdateRect") {
- ++swap_count;
- printf("(%d)|\nframe %03d: ",
- events[i]->GetKnownArgAsInt("color"), swap_count + 1);
- }
- }
- printf("\n");
-}
-
-// For running tests on GPU:
-class LatencyTestWebGL : public LatencyTest {
- public:
- LatencyTestWebGL() : LatencyTest(kWebGL) {}
-};
-
-// For running tests on GPU with the compositor thread:
-class LatencyTestWebGLThread : public LatencyTest {
- public:
- LatencyTestWebGLThread() : LatencyTest(kWebGLThread) {}
-};
-
-// For running tests on Software:
-class LatencyTestSW : public LatencyTest {
- public:
- LatencyTestSW() : LatencyTest(kSoftware) {}
-};
-
-////////////////////////////////////////////////////////////////////////////////
-/// Tests
-
-using ::testing::Values;
-
-// For manual testing only, run all input latency tests and print summary.
-IN_PROC_BROWSER_TEST_F(LatencyTestWebGL, DISABLED_LatencyWebGLAll) {
- RunTest(GetAllBehaviors());
-}
-
-// For manual testing only, run all input latency tests and print summary.
-IN_PROC_BROWSER_TEST_F(LatencyTestWebGLThread, DISABLED_LatencyWebGLThreadAll) {
- RunTest(GetAllBehaviors());
-}
-
-// For manual testing only, run all input latency tests and print summary.
-IN_PROC_BROWSER_TEST_F(LatencyTestSW, DISABLED_LatencySoftwareAll) {
- RunTest(GetAllBehaviors());
-}
-
-IN_PROC_BROWSER_TEST_P(LatencyTestWebGL, LatencyWebGL) {
- RunTest(std::vector<int>(1, GetParam()));
-}
-
-IN_PROC_BROWSER_TEST_P(LatencyTestWebGLThread, LatencyWebGLThread) {
- RunTest(std::vector<int>(1, GetParam()));
-}
-
-IN_PROC_BROWSER_TEST_P(LatencyTestSW, LatencySoftware) {
- RunTest(std::vector<int>(1, GetParam()));
-}
-
-#define LATENCY_SUITE_MODES() ::testing::Values( \
- 0, \
- kInputHeavy, \
- kInputHeavy | kInputDirty | kRafHeavy, \
- kInputHeavy | kInputDirty | kRafHeavy | kPaintHeavy, \
- kInputDirty | kPaintHeavy, \
- kInputDirty | kRafHeavy | kPaintHeavy)
-
-INSTANTIATE_TEST_CASE_P(, LatencyTestWebGL, LATENCY_SUITE_MODES());
-INSTANTIATE_TEST_CASE_P(, LatencyTestWebGLThread, LATENCY_SUITE_MODES());
-INSTANTIATE_TEST_CASE_P(, LatencyTestSW, LATENCY_SUITE_MODES());
-
-} // namespace
diff --git a/content/browser/renderer_host/compositing_iosurface_mac.mm b/content/browser/renderer_host/compositing_iosurface_mac.mm
index dbc1a0f..b64152e 100644
--- a/content/browser/renderer_host/compositing_iosurface_mac.mm
+++ b/content/browser/renderer_host/compositing_iosurface_mac.mm
@@ -570,10 +570,6 @@ bool CompositingIOSurfaceMac::DrawIOSurface(
RenderWidgetHostImpl::CompositorFrameDrawn(latency_info_);
latency_info_.Clear();
- // For latency_tests.cc:
- UNSHIPPED_TRACE_EVENT_INSTANT0("test_gpu", "CompositorSwapBuffersComplete",
- TRACE_EVENT_SCOPE_THREAD);
-
// Try to finish previous copy requests after flush to get better pipelining.
std::vector<base::Closure> copy_done_callbacks;
FinishAllCopiesWithinContext(&copy_done_callbacks);
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 8b30f4c..456f6df 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1850,14 +1850,6 @@ void RenderWidgetHostImpl::OnUpdateRect(
RecordAction(UserMetricsAction("BadMessageTerminate_RWH1"));
GetProcess()->ReceivedBadMessage();
} else {
- UNSHIPPED_TRACE_EVENT_INSTANT2("test_latency", "UpdateRect",
- TRACE_EVENT_SCOPE_THREAD,
- "x+y", params.bitmap_rect.x() + params.bitmap_rect.y(),
- "color", 0xffffff & *static_cast<uint32*>(dib->memory()));
- UNSHIPPED_TRACE_EVENT_INSTANT1("test_latency", "UpdateRectWidth",
- TRACE_EVENT_SCOPE_THREAD,
- "width", params.bitmap_rect.width());
-
// Scroll the backing store.
if (!params.scroll_rect.IsEmpty()) {
ScrollBackingStoreRect(params.scroll_delta,
@@ -1967,9 +1959,6 @@ void RenderWidgetHostImpl::DidUpdateBackingStore(
// On other platforms, this will be equivalent to MPArch.RWH_OnMsgUpdateRect.
delta = now - paint_start;
UMA_HISTOGRAM_TIMES("MPArch.RWH_TotalPaintTime", delta);
- UNSHIPPED_TRACE_EVENT_INSTANT1("test_latency", "UpdateRectComplete",
- TRACE_EVENT_SCOPE_THREAD,
- "x+y", params.bitmap_rect.x() + params.bitmap_rect.y());
}
void RenderWidgetHostImpl::OnInputEventAck(
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index ed54bce..852e297 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4695,11 +4695,6 @@ error::Error GLES2DecoderImpl::HandleRegisterSharedIdsCHROMIUM(
error::Error GLES2DecoderImpl::DoClear(GLbitfield mask) {
DCHECK(!ShouldDeferDraws());
if (CheckBoundFramebuffersValid("glClear")) {
- UNSHIPPED_TRACE_EVENT_INSTANT2(
- "test_gpu", "DoClear",
- TRACE_EVENT_SCOPE_THREAD,
- "red", state_.color_clear_red,
- "green", state_.color_clear_green);
ApplyDirtyState();
glClear(mask);
}
@@ -4954,8 +4949,6 @@ void GLES2DecoderImpl::DoBlitFramebufferEXT(
srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}
EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test);
- UNSHIPPED_TRACE_EVENT_INSTANT1("test_gpu", "DoBlit", TRACE_EVENT_SCOPE_THREAD,
- "width", srcX1 - srcX0);
}
void GLES2DecoderImpl::DoRenderbufferStorageMultisample(
diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc
index 91fc4e8..7d819fd 100644
--- a/ui/gl/gl_surface_glx.cc
+++ b/ui/gl/gl_surface_glx.cc
@@ -424,9 +424,6 @@ bool NativeViewGLSurfaceGLX::IsOffscreen() {
bool NativeViewGLSurfaceGLX::SwapBuffers() {
glXSwapBuffers(g_display, window_);
- // For latency_tests.cc:
- UNSHIPPED_TRACE_EVENT_INSTANT0("test_gpu", "CompositorSwapBuffersComplete",
- TRACE_EVENT_SCOPE_THREAD);
return true;
}
diff --git a/ui/surface/accelerated_surface_win.cc b/ui/surface/accelerated_surface_win.cc
index 01f582f..733f230 100644
--- a/ui/surface/accelerated_surface_win.cc
+++ b/ui/surface/accelerated_surface_win.cc
@@ -841,10 +841,6 @@ void AcceleratedPresenter::DoPresentAndAcknowledge(
hr = swap_chain_->Present(&rect, &rect, window_, NULL, 0);
- // For latency_tests.cc:
- UNSHIPPED_TRACE_EVENT_INSTANT0("test_gpu", "CompositorSwapBuffersComplete",
- TRACE_EVENT_SCOPE_THREAD);
-
if (FAILED(hr)) {
if (present_thread_->IsDeviceLost())
present_thread_->ResetDevice();
@@ -1023,10 +1019,6 @@ void AcceleratedPresenter::PresentWithGDI(HDC dc) {
}
system_surface->UnlockRect();
-
- // For latency_tests.cc:
- UNSHIPPED_TRACE_EVENT_INSTANT0("test_gpu", "CompositorSwapBuffersComplete",
- TRACE_EVENT_SCOPE_THREAD);
}
gfx::Size AcceleratedPresenter::GetWindowSize() {