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