| Index: chrome/test/gpu/gpu_feature_browsertest.cc
|
| diff --git a/chrome/test/gpu/gpu_feature_browsertest.cc b/chrome/test/gpu/gpu_feature_browsertest.cc
|
| deleted file mode 100644
|
| index ec27223f621aca888a49034e4a231ec58eb9f12a..0000000000000000000000000000000000000000
|
| --- a/chrome/test/gpu/gpu_feature_browsertest.cc
|
| +++ /dev/null
|
| @@ -1,500 +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/stringprintf.h"
|
| -#include "base/test/trace_event_analyzer.h"
|
| -#include "base/version.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_window.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/test/base/in_process_browser_test.h"
|
| -#include "chrome/test/base/tracing.h"
|
| -#include "chrome/test/base/ui_test_utils.h"
|
| -#include "content/public/browser/gpu_data_manager.h"
|
| -#include "content/public/common/content_client.h"
|
| -#include "content/public/common/content_switches.h"
|
| -#include "content/public/test/browser_test_utils.h"
|
| -#include "gpu/config/gpu_feature_type.h"
|
| -#include "gpu/config/gpu_info.h"
|
| -#include "gpu/config/gpu_test_config.h"
|
| -#include "net/base/filename_util.h"
|
| -#include "ui/gl/gl_implementation.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include "base/win/windows_version.h"
|
| -#endif
|
| -
|
| -using content::GpuDataManager;
|
| -using gpu::GpuFeatureType;
|
| -using trace_analyzer::Query;
|
| -using trace_analyzer::TraceAnalyzer;
|
| -using trace_analyzer::TraceEventVector;
|
| -
|
| -namespace {
|
| -
|
| -const char kAcceleratedCanvasCreationEvent[] = "Canvas2DLayerBridgeCreation";
|
| -const char kWebGLCreationEvent[] = "DrawingBufferCreation";
|
| -
|
| -class FakeContentClient : public content::ContentClient {
|
| -};
|
| -
|
| -class GpuFeatureTest : public InProcessBrowserTest {
|
| - public:
|
| - GpuFeatureTest() : category_patterns_("test_gpu") {}
|
| -
|
| - virtual void SetUp() OVERRIDE {
|
| - content::SetContentClient(&content_client_);
|
| - }
|
| -
|
| - virtual void TearDown() OVERRIDE {
|
| - content::SetContentClient(NULL);
|
| - }
|
| -
|
| - virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
|
| - base::FilePath test_dir;
|
| - ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir));
|
| - gpu_test_dir_ = test_dir.AppendASCII("gpu");
|
| - }
|
| -
|
| - virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| - command_line->AppendSwitch(switches::kDisablePopupBlocking);
|
| - command_line->AppendSwitchASCII(switches::kWindowSize, "400,300");
|
| - }
|
| -
|
| - void SetupBlacklist(const std::string& json_blacklist) {
|
| - gpu::GPUInfo gpu_info;
|
| - GpuDataManager::GetInstance()->InitializeForTesting(
|
| - json_blacklist, gpu_info);
|
| - }
|
| -
|
| - // If expected_reply is NULL, we don't check the reply content.
|
| - void RunTest(const base::FilePath& url,
|
| - const char* expected_reply,
|
| - bool new_tab) {
|
| -#if defined(OS_LINUX) && !defined(NDEBUG)
|
| - // Bypass tests on GPU Linux Debug bots.
|
| - if (gfx::GetGLImplementation() != gfx::kGLImplementationOSMesaGL)
|
| - return;
|
| -#endif
|
| -
|
| - base::FilePath test_path;
|
| - test_path = gpu_test_dir_.Append(url);
|
| - ASSERT_TRUE(base::PathExists(test_path))
|
| - << "Missing test file: " << test_path.value();
|
| -
|
| - content::DOMMessageQueue message_queue;
|
| - if (new_tab) {
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - browser(), net::FilePathToFileURL(test_path),
|
| - NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_NONE);
|
| - } else {
|
| - ui_test_utils::NavigateToURL(
|
| - browser(), net::FilePathToFileURL(test_path));
|
| - }
|
| -
|
| - std::string result;
|
| - // Wait for message indicating the test has finished running.
|
| - ASSERT_TRUE(message_queue.WaitForMessage(&result));
|
| - if (expected_reply)
|
| - EXPECT_STREQ(expected_reply, result.c_str());
|
| - }
|
| -
|
| - // Open the URL and check the trace stream for the given event.
|
| - void RunEventTest(const base::FilePath& url,
|
| - const char* event_name = NULL,
|
| - bool event_expected = false) {
|
| -#if defined(OS_LINUX) && !defined(NDEBUG)
|
| - // Bypass tests on GPU Linux Debug bots.
|
| - if (gfx::GetGLImplementation() != gfx::kGLImplementationOSMesaGL)
|
| - return;
|
| -#endif
|
| -
|
| - ASSERT_TRUE(tracing::BeginTracing(category_patterns_));
|
| -
|
| - // Have to use a new tab for the blacklist to work.
|
| - RunTest(url, NULL, true);
|
| -
|
| - ASSERT_TRUE(tracing::EndTracing(&trace_events_json_));
|
| -
|
| - analyzer_.reset(TraceAnalyzer::Create(trace_events_json_));
|
| - analyzer_->AssociateBeginEndEvents();
|
| - TraceEventVector events;
|
| -
|
| - if (!event_name)
|
| - return;
|
| -
|
| - size_t event_count =
|
| - analyzer_->FindEvents(Query::EventNameIs(event_name), &events);
|
| -
|
| - if (event_expected)
|
| - EXPECT_GT(event_count, 0U);
|
| - else
|
| - EXPECT_EQ(event_count, 0U);
|
| - }
|
| -
|
| - // Trigger a resize of the chrome window, and use tracing to wait for the
|
| - // given |wait_event|.
|
| - bool ResizeAndWait(const gfx::Rect& new_bounds,
|
| - const char* category_patterns,
|
| - const char* wait_category,
|
| - const char* wait_event) {
|
| - if (!tracing::BeginTracingWithWatch(category_patterns, wait_category,
|
| - wait_event, 1))
|
| - return false;
|
| - browser()->window()->SetBounds(new_bounds);
|
| - if (!tracing::WaitForWatchEvent(base::TimeDelta()))
|
| - return false;
|
| - if (!tracing::EndTracing(&trace_events_json_))
|
| - return false;
|
| - analyzer_.reset(TraceAnalyzer::Create(trace_events_json_));
|
| - analyzer_->AssociateBeginEndEvents();
|
| - return true;
|
| - }
|
| -
|
| - protected:
|
| - base::FilePath gpu_test_dir_;
|
| - scoped_ptr<TraceAnalyzer> analyzer_;
|
| - std::string category_patterns_;
|
| - std::string trace_events_json_;
|
| - FakeContentClient content_client_;
|
| -};
|
| -
|
| -class GpuFeaturePixelTest : public GpuFeatureTest {
|
| - protected:
|
| - virtual void SetUp() OVERRIDE {
|
| - EnablePixelOutput();
|
| - GpuFeatureTest::SetUp();
|
| - }
|
| -};
|
| -
|
| -class GpuCompositingBlockedTest : public GpuFeatureTest {
|
| - public:
|
| - virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
|
| - GpuFeatureTest::SetUpInProcessBrowserTestFixture();
|
| - const std::string json_blacklist =
|
| - "{\n"
|
| - " \"name\": \"gpu blacklist\",\n"
|
| - " \"version\": \"1.0\",\n"
|
| - " \"entries\": [\n"
|
| - " {\n"
|
| - " \"id\": 1,\n"
|
| - " \"features\": [\n"
|
| - " \"gpu_compositing\"\n"
|
| - " ]\n"
|
| - " }\n"
|
| - " ]\n"
|
| - "}";
|
| - SetupBlacklist(json_blacklist);
|
| - }
|
| -};
|
| -
|
| -IN_PROC_BROWSER_TEST_F(GpuCompositingBlockedTest, GpuCompositingBlocked) {
|
| - EXPECT_TRUE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
|
| - gpu::GPU_FEATURE_TYPE_GPU_COMPOSITING));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest, WebGLAllowed) {
|
| - EXPECT_FALSE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
|
| - gpu::GPU_FEATURE_TYPE_WEBGL));
|
| -
|
| - // The below times out: http://crbug.com/166060
|
| -#if 0
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_webgl.html"));
|
| - RunEventTest(url, kWebGLCreationEvent, true);
|
| -#endif
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest, WebGLBlocked) {
|
| - const std::string json_blacklist =
|
| - "{\n"
|
| - " \"name\": \"gpu blacklist\",\n"
|
| - " \"version\": \"1.0\",\n"
|
| - " \"entries\": [\n"
|
| - " {\n"
|
| - " \"id\": 1,\n"
|
| - " \"features\": [\n"
|
| - " \"webgl\"\n"
|
| - " ]\n"
|
| - " }\n"
|
| - " ]\n"
|
| - "}";
|
| - SetupBlacklist(json_blacklist);
|
| - EXPECT_TRUE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
|
| - gpu::GPU_FEATURE_TYPE_WEBGL));
|
| -
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_webgl.html"));
|
| - RunEventTest(url, kWebGLCreationEvent, false);
|
| -}
|
| -
|
| -class WebGLTest : public GpuFeatureTest {
|
| - public:
|
| - virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| - GpuFeatureTest::SetUpCommandLine(command_line);
|
| -#if !defined(OS_ANDROID)
|
| - // On Android, WebGL is disabled by default
|
| - command_line->AppendSwitch(switches::kDisableExperimentalWebGL);
|
| -#endif
|
| - }
|
| -};
|
| -
|
| -IN_PROC_BROWSER_TEST_F(WebGLTest, WebGLDisabled) {
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_webgl.html"));
|
| - RunEventTest(url, kWebGLCreationEvent, false);
|
| -}
|
| -
|
| -// This test is oblivious to the fact that multisample could be blacklisted on
|
| -// some configurations. Previously disabled on GOOGLE_CHROME_BUILD and
|
| -// on OS_MACOSX: http://crbug.com/314745
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest, DISABLED_MultisamplingAllowed) {
|
| - if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
|
| - return;
|
| - // Multisampling is not supported if running on top of osmesa.
|
| - if (gfx::GetGLImplementation() == gfx::kGLImplementationOSMesaGL)
|
| - return;
|
| - // Linux Intel uses mesa driver, where multisampling is not supported.
|
| - // Multisampling is also not supported on virtualized mac os.
|
| - std::vector<std::string> configs;
|
| - configs.push_back("LINUX INTEL");
|
| - configs.push_back("MAC VMWARE");
|
| - if (gpu::GPUTestBotConfig::CurrentConfigMatches(configs))
|
| - return;
|
| -
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_multisampling.html"));
|
| - RunTest(url, "\"TRUE\"", true);
|
| -}
|
| -
|
| -class WebGLMultisamplingTest : public GpuFeatureTest {
|
| - public:
|
| - virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| - GpuFeatureTest::SetUpCommandLine(command_line);
|
| - command_line->AppendSwitch("disable_multisampling");
|
| - }
|
| -};
|
| -
|
| -IN_PROC_BROWSER_TEST_F(WebGLMultisamplingTest, MultisamplingDisabled) {
|
| - // Multisampling fails on virtualized mac os.
|
| - if (gpu::GPUTestBotConfig::CurrentConfigMatches("MAC VMWARE"))
|
| - return;
|
| -
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_multisampling.html"));
|
| - RunTest(url, "\"FALSE\"", true);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest, Canvas2DAllowed) {
|
| - // Accelerated canvas 2D is not supported on XP.
|
| - if (gpu::GPUTestBotConfig::CurrentConfigMatches("XP"))
|
| - return;
|
| -
|
| - enum Canvas2DState {
|
| - ENABLED,
|
| - BLACKLISTED, // Disabled via the blacklist.
|
| - DISABLED, // Not disabled via the blacklist, but expected to be disabled
|
| - // by configuration.
|
| - } expected_state = ENABLED;
|
| -#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
|
| - // Blacklist rule #24 disables accelerated_2d_canvas on Linux.
|
| - expected_state = BLACKLISTED;
|
| -#elif defined(OS_WIN)
|
| - // Blacklist rule #67 disables accelerated_2d_canvas on XP.
|
| - if (base::win::GetVersion() < base::win::VERSION_VISTA)
|
| - expected_state = BLACKLISTED;
|
| -#endif
|
| -
|
| - if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
|
| - expected_state = BLACKLISTED;
|
| -
|
| -#if defined(USE_AURA)
|
| - // Canvas 2D is always disabled in software compositing mode, make sure it is
|
| - // marked as such if it wasn't blacklisted already.
|
| - if (expected_state == ENABLED &&
|
| - !content::GpuDataManager::GetInstance()->CanUseGpuBrowserCompositor()) {
|
| - expected_state = DISABLED;
|
| - }
|
| -#endif
|
| -
|
| - EXPECT_EQ(expected_state == BLACKLISTED,
|
| - GpuDataManager::GetInstance()->IsFeatureBlacklisted(
|
| - gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS));
|
| -
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_canvas2d.html"));
|
| - RunEventTest(url, kAcceleratedCanvasCreationEvent, expected_state == ENABLED);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest, Canvas2DBlocked) {
|
| - const std::string json_blacklist =
|
| - "{\n"
|
| - " \"name\": \"gpu blacklist\",\n"
|
| - " \"version\": \"1.0\",\n"
|
| - " \"entries\": [\n"
|
| - " {\n"
|
| - " \"id\": 1,\n"
|
| - " \"features\": [\n"
|
| - " \"accelerated_2d_canvas\"\n"
|
| - " ]\n"
|
| - " }\n"
|
| - " ]\n"
|
| - "}";
|
| - SetupBlacklist(json_blacklist);
|
| - EXPECT_TRUE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
|
| - gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS));
|
| -
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_canvas2d.html"));
|
| - RunEventTest(url, kAcceleratedCanvasCreationEvent, false);
|
| -}
|
| -
|
| -class Canvas2DDisabledTest : public GpuFeatureTest {
|
| - public:
|
| - virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| - GpuFeatureTest::SetUpCommandLine(command_line);
|
| - command_line->AppendSwitch(switches::kDisableAccelerated2dCanvas);
|
| - }
|
| -};
|
| -
|
| -IN_PROC_BROWSER_TEST_F(Canvas2DDisabledTest, Canvas2DDisabled) {
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_canvas2d.html"));
|
| - RunEventTest(url, kAcceleratedCanvasCreationEvent, false);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(GpuFeaturePixelTest,
|
| - CanOpenPopupAndRenderWithWebGLCanvas) {
|
| - if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
|
| - return;
|
| -
|
| - const base::FilePath url(FILE_PATH_LITERAL("webgl_popup.html"));
|
| - RunTest(url, "\"SUCCESS\"", false);
|
| -}
|
| -
|
| -// crbug.com/176466
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest,
|
| - DISABLED_CanOpenPopupAndRenderWith2DCanvas) {
|
| - const base::FilePath url(FILE_PATH_LITERAL("canvas_popup.html"));
|
| - RunTest(url, "\"SUCCESS\"", false);
|
| -}
|
| -
|
| -#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_MACOSX)
|
| -// http://crbug.com/162343: flaky on Windows and Mac, failing on ChromiumOS.
|
| -#define MAYBE_RafNoDamage DISABLED_RafNoDamage
|
| -#else
|
| -#define MAYBE_RafNoDamage RafNoDamage
|
| -#endif
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest, MAYBE_RafNoDamage) {
|
| - category_patterns_ = "-test_*";
|
| - const base::FilePath url(FILE_PATH_LITERAL("feature_raf_no_damage.html"));
|
| - RunEventTest(url);
|
| -
|
| - if (!analyzer_.get())
|
| - return;
|
| -
|
| - // Search for matching name on begin event or async_begin event (any begin).
|
| - Query query_raf =
|
| - (Query::EventPhaseIs(TRACE_EVENT_PHASE_BEGIN) ||
|
| - Query::EventPhaseIs(TRACE_EVENT_PHASE_ASYNC_BEGIN)) &&
|
| - Query::EventNameIs("___RafWithNoDamage___");
|
| - TraceEventVector events;
|
| - size_t num_events = analyzer_->FindEvents(query_raf, &events);
|
| -
|
| - trace_analyzer::RateStats stats;
|
| - trace_analyzer::RateStatsOptions stats_options;
|
| - stats_options.trim_min = stats_options.trim_max = num_events / 10;
|
| - EXPECT_TRUE(trace_analyzer::GetRateStats(events, &stats, &stats_options));
|
| -
|
| - LOG(INFO) << "Number of RAFs: " << num_events <<
|
| - " Mean: " << stats.mean_us <<
|
| - " Min: " << stats.min_us <<
|
| - " Max: " << stats.max_us <<
|
| - " StdDev: " << stats.standard_deviation_us;
|
| -
|
| - // Expect that the average time between RAFs is more than 15ms. That will
|
| - // indicate that the renderer is not simply spinning on RAF.
|
| - EXPECT_GT(stats.mean_us, 15000.0);
|
| -
|
| - // Print out the trace events upon error to debug failures.
|
| - if (stats.mean_us <= 15000.0) {
|
| - fprintf(stderr, "\n\nTRACE JSON:\n\n%s\n\n", trace_events_json_.c_str());
|
| - }
|
| -}
|
| -
|
| -#if defined(OS_MACOSX)
|
| -IN_PROC_BROWSER_TEST_F(GpuFeatureTest, IOSurfaceReuse) {
|
| - if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
|
| - return;
|
| -
|
| - const base::FilePath url(
|
| - FILE_PATH_LITERAL("feature_compositing_static.html"));
|
| - base::FilePath test_path = gpu_test_dir_.Append(url);
|
| - ASSERT_TRUE(base::PathExists(test_path))
|
| - << "Missing test file: " << test_path.value();
|
| -
|
| - ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL(test_path));
|
| -
|
| - LOG(INFO) << "did navigate";
|
| - gfx::Rect bounds = browser()->window()->GetBounds();
|
| - gfx::Rect new_bounds = bounds;
|
| -
|
| - const char* create_event = "IOSurfaceImageTransportSurface::CreateIOSurface";
|
| - const char* resize_event = "IOSurfaceImageTransportSurface::OnResize";
|
| - const char* draw_event = "CompositingIOSurfaceMac::DrawIOSurface";
|
| - Query find_creates = Query::MatchBeginName(create_event);
|
| - Query find_resizes = Query::MatchBeginName(resize_event) &&
|
| - Query::EventHasNumberArg("old_width") &&
|
| - Query::EventHasNumberArg("new_width");
|
| - Query find_draws = Query::MatchBeginName(draw_event) &&
|
| - Query::EventHasNumberArg("scale");
|
| -
|
| - const int roundup = 64;
|
| - // A few resize values assuming a roundup of 64 pixels. The test will resize
|
| - // by these values one at a time and verify that CreateIOSurface only happens
|
| - // when the rounded width changes.
|
| - int offsets[] = { 1, roundup - 1, roundup, roundup + 1, 2*roundup};
|
| - int num_offsets = static_cast<int>(arraysize(offsets));
|
| - int w_start = bounds.width();
|
| -
|
| - for (int offset_i = 0; offset_i < num_offsets; ++offset_i) {
|
| - new_bounds.set_width(w_start + offsets[offset_i]);
|
| - LOG(INFO) << "before wait";
|
| - ASSERT_TRUE(ResizeAndWait(new_bounds, "gpu", "gpu", resize_event));
|
| - LOG(INFO) << "after wait";
|
| -
|
| - TraceEventVector resize_events;
|
| - analyzer_->FindEvents(find_resizes, &resize_events);
|
| - LOG(INFO) << "num rezize events = " << resize_events.size();
|
| - for (size_t resize_i = 0; resize_i < resize_events.size(); ++resize_i) {
|
| - const trace_analyzer::TraceEvent* resize = resize_events[resize_i];
|
| - // Was a create allowed:
|
| - int old_width = resize->GetKnownArgAsInt("old_width");
|
| - int new_width = resize->GetKnownArgAsInt("new_width");
|
| - bool expect_create = (old_width/roundup != new_width/roundup ||
|
| - old_width == 0);
|
| - int expected_creates = expect_create ? 1 : 0;
|
| -
|
| - // Find the create event inside this resize event (if any). This will
|
| - // determine if the resize triggered a reallocation of the IOSurface.
|
| - double begin_time = resize->timestamp;
|
| - double end_time = begin_time + resize->GetAbsTimeToOtherEvent();
|
| - Query find_this_create = find_creates &&
|
| - Query::EventTime() >= Query::Double(begin_time) &&
|
| - Query::EventTime() <= Query::Double(end_time);
|
| - TraceEventVector create_events;
|
| - int num_creates = static_cast<int>(analyzer_->FindEvents(find_this_create,
|
| - &create_events));
|
| - EXPECT_EQ(expected_creates, num_creates);
|
| -
|
| - // For debugging failures, print out the width and height of each resize:
|
| - LOG(INFO) <<
|
| - base::StringPrintf(
|
| - "%d (resize offset %d): IOSurface width %d -> %d; Creates %d "
|
| - "Expected %d", offset_i, offsets[offset_i],
|
| - old_width, new_width, num_creates, expected_creates);
|
| - }
|
| - }
|
| - LOG(INFO) << "finished test";
|
| -}
|
| -#endif
|
| -
|
| -} // namespace
|
|
|