15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/trace_event_analyzer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/tracing.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h"
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/common/content_client.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_feature_type.h"
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h"
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_test_config.h"
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h"
27c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "ui/gl/gl_implementation.h"
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::GpuDataManager;
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using gpu::GpuFeatureType;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using trace_analyzer::Query;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using trace_analyzer::TraceAnalyzer;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using trace_analyzer::TraceEventVector;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAcceleratedCanvasCreationEvent[] = "Canvas2DLayerBridgeCreation";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWebGLCreationEvent[] = "DrawingBufferCreation";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass FakeContentClient : public content::ContentClient {
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuFeatureTest : public InProcessBrowserTest {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
49c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  GpuFeatureTest() : category_patterns_("test_gpu") {}
50c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void SetUp() OVERRIDE {
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    content::SetContentClient(&content_client_);
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void TearDown() OVERRIDE {
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    content::SetContentClient(NULL);
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath test_dir;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_test_dir_ = test_dir.AppendASCII("gpu");
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisablePopupBlocking);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kWindowSize, "400,300");
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetupBlacklist(const std::string& json_blacklist) {
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    gpu::GPUInfo gpu_info;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuDataManager::GetInstance()->InitializeForTesting(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        json_blacklist, gpu_info);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If expected_reply is NULL, we don't check the reply content.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunTest(const base::FilePath& url,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const char* expected_reply,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool new_tab) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) && !defined(NDEBUG)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Bypass tests on GPU Linux Debug bots.
82c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    if (gfx::GetGLImplementation() != gfx::kGLImplementationOSMesaGL)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath test_path;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_path = gpu_test_dir_.Append(url);
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ASSERT_TRUE(base::PathExists(test_path))
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Missing test file: " << test_path.value();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::DOMMessageQueue message_queue;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (new_tab) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::NavigateToURLWithDisposition(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browser(), net::FilePathToFileURL(test_path),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_NONE);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::NavigateToURL(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browser(), net::FilePathToFileURL(test_path));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait for message indicating the test has finished running.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(message_queue.WaitForMessage(&result));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_reply)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_STREQ(expected_reply, result.c_str());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open the URL and check the trace stream for the given event.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunEventTest(const base::FilePath& url,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char* event_name = NULL,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool event_expected = false) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) && !defined(NDEBUG)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Bypass tests on GPU Linux Debug bots.
114c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    if (gfx::GetGLImplementation() != gfx::kGLImplementationOSMesaGL)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(tracing::BeginTracing(category_patterns_));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Have to use a new tab for the blacklist to work.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTest(url, NULL, true);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(tracing::EndTracing(&trace_events_json_));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    analyzer_.reset(TraceAnalyzer::Create(trace_events_json_));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    analyzer_->AssociateBeginEndEvents();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TraceEventVector events;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!event_name)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t event_count =
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        analyzer_->FindEvents(Query::EventNameIs(event_name), &events);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (event_expected)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_GT(event_count, 0U);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(event_count, 0U);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trigger a resize of the chrome window, and use tracing to wait for the
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // given |wait_event|.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ResizeAndWait(const gfx::Rect& new_bounds,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     const char* category_patterns,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const char* wait_category,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const char* wait_event) {
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!tracing::BeginTracingWithWatch(category_patterns, wait_category,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        wait_event, 1))
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser()->window()->SetBounds(new_bounds);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!tracing::WaitForWatchEvent(base::TimeDelta()))
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!tracing::EndTracing(&trace_events_json_))
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    analyzer_.reset(TraceAnalyzer::Create(trace_events_json_));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    analyzer_->AssociateBeginEndEvents();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath gpu_test_dir_;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TraceAnalyzer> analyzer_;
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string category_patterns_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string trace_events_json_;
1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  FakeContentClient content_client_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GpuFeaturePixelTest : public GpuFeatureTest {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EnablePixelOutput();
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GpuFeatureTest::SetUp();
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass GpuCompositingBlockedTest : public GpuFeatureTest {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuFeatureTest::SetUpInProcessBrowserTestFixture();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string json_blacklist =
1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "{\n"
1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "  \"name\": \"gpu blacklist\",\n"
1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "  \"version\": \"1.0\",\n"
1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "  \"entries\": [\n"
1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "    {\n"
1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "      \"id\": 1,\n"
1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "      \"features\": [\n"
1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "        \"gpu_compositing\"\n"
1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "      ]\n"
1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "    }\n"
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "  ]\n"
1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "}";
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupBlacklist(json_blacklist);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1970529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(GpuCompositingBlockedTest, GpuCompositingBlocked) {
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      gpu::GPU_FEATURE_TYPE_GPU_COMPOSITING));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2020529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(GpuFeatureTest, WebGLAllowed) {
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gpu::GPU_FEATURE_TYPE_WEBGL));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The below times out: http://crbug.com/166060
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if 0
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_webgl.html"));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunEventTest(url, kWebGLCreationEvent, true);
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeatureTest, WebGLBlocked) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string json_blacklist =
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{\n"
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"name\": \"gpu blacklist\",\n"
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"version\": \"1.0\",\n"
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"entries\": [\n"
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    {\n"
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      \"id\": 1,\n"
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "      \"features\": [\n"
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "        \"webgl\"\n"
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      ]\n"
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    }\n"
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  ]\n"
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupBlacklist(json_blacklist);
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gpu::GPU_FEATURE_TYPE_WEBGL));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_webgl.html"));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunEventTest(url, kWebGLCreationEvent, false);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebGLTest : public GpuFeatureTest {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuFeatureTest::SetUpCommandLine(command_line);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On Android, WebGL is disabled by default
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisableExperimentalWebGL);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebGLTest, WebGLDisabled) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_webgl.html"));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunEventTest(url, kWebGLCreationEvent, false);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This test is oblivious to the fact that multisample could be blacklisted on
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// some configurations. Previously disabled on GOOGLE_CHROME_BUILD and
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// on OS_MACOSX: http://crbug.com/314745
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeatureTest, DISABLED_MultisamplingAllowed) {
255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Multisampling is not supported if running on top of osmesa.
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (gfx::GetGLImplementation() == gfx::kGLImplementationOSMesaGL)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Linux Intel uses mesa driver, where multisampling is not supported.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Multisampling is also not supported on virtualized mac os.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> configs;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  configs.push_back("LINUX INTEL");
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  configs.push_back("MAC VMWARE");
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (gpu::GPUTestBotConfig::CurrentConfigMatches(configs))
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_multisampling.html"));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(url, "\"TRUE\"", true);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebGLMultisamplingTest : public GpuFeatureTest {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuFeatureTest::SetUpCommandLine(command_line);
276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    command_line->AppendSwitch("disable_multisampling");
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebGLMultisamplingTest, MultisamplingDisabled) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Multisampling fails on virtualized mac os.
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (gpu::GPUTestBotConfig::CurrentConfigMatches("MAC VMWARE"))
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_multisampling.html"));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(url, "\"FALSE\"", true);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeatureTest, Canvas2DAllowed) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accelerated canvas 2D is not supported on XP.
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (gpu::GPUTestBotConfig::CurrentConfigMatches("XP"))
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  enum Canvas2DState {
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ENABLED,
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BLACKLISTED,  // Disabled via the blacklist.
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DISABLED,     // Not disabled via the blacklist, but expected to be disabled
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  // by configuration.
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } expected_state = ENABLED;
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Blacklist rule #24 disables accelerated_2d_canvas on Linux.
3028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  expected_state = BLACKLISTED;
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif defined(OS_WIN)
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Blacklist rule #67 disables accelerated_2d_canvas on XP.
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA)
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    expected_state = BLACKLISTED;
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    expected_state = BLACKLISTED;
311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(USE_AURA)
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Canvas 2D is always disabled in software compositing mode, make sure it is
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // marked as such if it wasn't blacklisted already.
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (expected_state == ENABLED &&
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      !content::GpuDataManager::GetInstance()->CanUseGpuBrowserCompositor()) {
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    expected_state = DISABLED;
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(expected_state == BLACKLISTED,
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            GpuDataManager::GetInstance()->IsFeatureBlacklisted(
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_canvas2d.html"));
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RunEventTest(url, kAcceleratedCanvasCreationEvent, expected_state == ENABLED);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeatureTest, Canvas2DBlocked) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string json_blacklist =
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{\n"
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"name\": \"gpu blacklist\",\n"
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"version\": \"1.0\",\n"
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"entries\": [\n"
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    {\n"
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      \"id\": 1,\n"
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "      \"features\": [\n"
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "        \"accelerated_2d_canvas\"\n"
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      ]\n"
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    }\n"
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  ]\n"
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetupBlacklist(json_blacklist);
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(GpuDataManager::GetInstance()->IsFeatureBlacklisted(
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_canvas2d.html"));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunEventTest(url, kAcceleratedCanvasCreationEvent, false);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Canvas2DDisabledTest : public GpuFeatureTest {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GpuFeatureTest::SetUpCommandLine(command_line);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisableAccelerated2dCanvas);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(Canvas2DDisabledTest, Canvas2DDisabled) {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_canvas2d.html"));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunEventTest(url, kAcceleratedCanvasCreationEvent, false);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeaturePixelTest,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       CanOpenPopupAndRenderWithWebGLCanvas) {
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("webgl_popup.html"));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(url, "\"SUCCESS\"", false);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// crbug.com/176466
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeatureTest,
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DISABLED_CanOpenPopupAndRenderWith2DCanvas) {
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("canvas_popup.html"));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(url, "\"SUCCESS\"", false);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_MACOSX)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/162343: flaky on Windows and Mac, failing on ChromiumOS.
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RafNoDamage DISABLED_RafNoDamage
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_RafNoDamage RafNoDamage
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeatureTest, MAYBE_RafNoDamage) {
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  category_patterns_ = "-test_*";
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(FILE_PATH_LITERAL("feature_raf_no_damage.html"));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunEventTest(url);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!analyzer_.get())
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Search for matching name on begin event or async_begin event (any begin).
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query query_raf =
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (Query::EventPhaseIs(TRACE_EVENT_PHASE_BEGIN) ||
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       Query::EventPhaseIs(TRACE_EVENT_PHASE_ASYNC_BEGIN)) &&
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Query::EventNameIs("___RafWithNoDamage___");
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventVector events;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_events = analyzer_->FindEvents(query_raf, &events);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trace_analyzer::RateStats stats;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trace_analyzer::RateStatsOptions stats_options;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stats_options.trim_min = stats_options.trim_max = num_events / 10;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(trace_analyzer::GetRateStats(events, &stats, &stats_options));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "Number of RAFs: " << num_events <<
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " Mean: " << stats.mean_us <<
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " Min: " << stats.min_us <<
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " Max: " << stats.max_us <<
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " StdDev: " << stats.standard_deviation_us;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expect that the average time between RAFs is more than 15ms. That will
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // indicate that the renderer is not simply spinning on RAF.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(stats.mean_us, 15000.0);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print out the trace events upon error to debug failures.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stats.mean_us <= 15000.0) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "\n\nTRACE JSON:\n\n%s\n\n", trace_events_json_.c_str());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(GpuFeatureTest, IOSurfaceReuse) {
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (gpu::GPUTestBotConfig::GpuBlacklistedOnBot())
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath url(
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FILE_PATH_LITERAL("feature_compositing_static.html"));
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_path = gpu_test_dir_.Append(url);
4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::PathExists(test_path))
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Missing test file: " << test_path.value();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), net::FilePathToFileURL(test_path));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LOG(INFO) << "did navigate";
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = browser()->window()->GetBounds();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect new_bounds = bounds;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* create_event = "IOSurfaceImageTransportSurface::CreateIOSurface";
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* resize_event = "IOSurfaceImageTransportSurface::OnResize";
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* draw_event = "CompositingIOSurfaceMac::DrawIOSurface";
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query find_creates = Query::MatchBeginName(create_event);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query find_resizes = Query::MatchBeginName(resize_event) &&
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::EventHasNumberArg("old_width") &&
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Query::EventHasNumberArg("new_width");
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query find_draws = Query::MatchBeginName(draw_event) &&
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     Query::EventHasNumberArg("scale");
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int roundup = 64;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A few resize values assuming a roundup of 64 pixels. The test will resize
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by these values one at a time and verify that CreateIOSurface only happens
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the rounded width changes.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int offsets[] = { 1, roundup - 1, roundup, roundup + 1, 2*roundup};
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_offsets = static_cast<int>(arraysize(offsets));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int w_start = bounds.width();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int offset_i = 0; offset_i < num_offsets; ++offset_i) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_bounds.set_width(w_start + offsets[offset_i]);
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LOG(INFO) << "before wait";
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(ResizeAndWait(new_bounds, "gpu", "gpu", resize_event));
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LOG(INFO) << "after wait";
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TraceEventVector resize_events;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    analyzer_->FindEvents(find_resizes, &resize_events);
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LOG(INFO) << "num rezize events = " << resize_events.size();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t resize_i = 0; resize_i < resize_events.size(); ++resize_i) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const trace_analyzer::TraceEvent* resize = resize_events[resize_i];
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Was a create allowed:
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int old_width = resize->GetKnownArgAsInt("old_width");
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int new_width = resize->GetKnownArgAsInt("new_width");
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool expect_create = (old_width/roundup != new_width/roundup ||
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            old_width == 0);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_creates = expect_create ? 1 : 0;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Find the create event inside this resize event (if any). This will
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // determine if the resize triggered a reallocation of the IOSurface.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double begin_time = resize->timestamp;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double end_time = begin_time + resize->GetAbsTimeToOtherEvent();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Query find_this_create = find_creates &&
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Query::EventTime() >= Query::Double(begin_time) &&
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Query::EventTime() <= Query::Double(end_time);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TraceEventVector create_events;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int num_creates = static_cast<int>(analyzer_->FindEvents(find_this_create,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                               &create_events));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(expected_creates, num_creates);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For debugging failures, print out the width and height of each resize:
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(INFO) <<
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::StringPrintf(
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "%d (resize offset %d): IOSurface width %d -> %d; Creates %d "
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "Expected %d", offset_i, offsets[offset_i],
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              old_width, new_width, num_creates, expected_creates);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LOG(INFO) << "finished test";
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
500c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}  // namespace
501