blob: 8c4c5970ac68893cfa7c6d015c2ab1de74f48f68 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/message_loop.h"
#include "base/run_loop.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
#include "content/public/browser/gpu_data_manager_observer.h"
#include "content/public/common/gpu_info.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class TestObserver : public content::GpuDataManagerObserver {
public:
TestObserver()
: gpu_info_updated_(false),
video_memory_usage_stats_updated_(false) {
}
virtual ~TestObserver() { }
bool gpu_info_updated() const { return gpu_info_updated_; }
bool video_memory_usage_stats_updated() const {
return video_memory_usage_stats_updated_;
}
virtual void OnGpuInfoUpdate() OVERRIDE {
gpu_info_updated_ = true;
}
virtual void OnVideoMemoryUsageStatsUpdate(
const content::GPUVideoMemoryUsageStats& stats) OVERRIDE {
video_memory_usage_stats_updated_ = true;
}
private:
bool gpu_info_updated_;
bool video_memory_usage_stats_updated_;
};
} // namespace anonymous
class GpuDataManagerImplTest : public testing::Test {
public:
GpuDataManagerImplTest() { }
virtual ~GpuDataManagerImplTest() { }
protected:
void SetUp() {
}
void TearDown() {
}
MessageLoop message_loop_;
};
// We use new method instead of GetInstance() method because we want
// each test to be independent of each other.
TEST_F(GpuDataManagerImplTest, GpuSideBlacklisting) {
// If a feature is allowed in preliminary step (browser side), but
// disabled when GPU process launches and collects full GPU info,
// it's too late to let renderer know, so we basically block all GPU
// access, to be on the safe side.
GpuDataManagerImpl* manager = new GpuDataManagerImpl();
ASSERT_TRUE(manager);
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
const std::string blacklist_json =
"{\n"
" \"name\": \"gpu blacklist\",\n"
" \"version\": \"0.1\",\n"
" \"entries\": [\n"
" {\n"
" \"id\": 1,\n"
" \"blacklist\": [\n"
" \"webgl\"\n"
" ]\n"
" },\n"
" {\n"
" \"id\": 2,\n"
" \"gl_renderer\": {\n"
" \"op\": \"contains\",\n"
" \"value\": \"GeForce\"\n"
" },\n"
" \"blacklist\": [\n"
" \"accelerated_2d_canvas\"\n"
" ]\n"
" }\n"
" ]\n"
"}";
content::GPUInfo gpu_info;
gpu_info.gpu.vendor_id = 0x10de;
gpu_info.gpu.device_id = 0x0640;
manager->InitializeForTesting(blacklist_json, gpu_info);
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_EQ(content::GPU_FEATURE_TYPE_WEBGL,
manager->GetBlacklistedFeatures());
gpu_info.gl_renderer = "NVIDIA GeForce GT 120";
manager->UpdateGpuInfo(gpu_info);
EXPECT_FALSE(manager->GpuAccessAllowed());
EXPECT_EQ(content::GPU_FEATURE_TYPE_WEBGL |
content::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS,
manager->GetBlacklistedFeatures());
delete manager;
}
TEST_F(GpuDataManagerImplTest, GpuSideExceptions) {
GpuDataManagerImpl* manager = new GpuDataManagerImpl();
ASSERT_TRUE(manager);
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
const std::string blacklist_json =
"{\n"
" \"name\": \"gpu blacklist\",\n"
" \"version\": \"0.1\",\n"
" \"entries\": [\n"
" {\n"
" \"id\": 1,\n"
" \"exceptions\": [\n"
" {\n"
" \"gl_renderer\": {\n"
" \"op\": \"contains\",\n"
" \"value\": \"GeForce\"\n"
" }\n"
" }\n"
" ],\n"
" \"blacklist\": [\n"
" \"webgl\"\n"
" ]\n"
" }\n"
" ]\n"
"}";
content::GPUInfo gpu_info;
gpu_info.gpu.vendor_id = 0x10de;
gpu_info.gpu.device_id = 0x0640;
manager->InitializeForTesting(blacklist_json, gpu_info);
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_EQ(content::GPU_FEATURE_TYPE_WEBGL,
manager->GetBlacklistedFeatures());
// Now assue gpu process launches and full GPU info is collected.
gpu_info.gl_renderer = "NVIDIA GeForce GT 120";
manager->UpdateGpuInfo(gpu_info);
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
delete manager;
}
TEST_F(GpuDataManagerImplTest, BlacklistCard) {
GpuDataManagerImpl* manager = new GpuDataManagerImpl();
ASSERT_TRUE(manager);
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
manager->BlacklistCard();
EXPECT_FALSE(manager->GpuAccessAllowed());
EXPECT_EQ(content::GPU_FEATURE_TYPE_ALL,
manager->GetBlacklistedFeatures());
delete manager;
}
TEST_F(GpuDataManagerImplTest, SoftwareRendering) {
// Blacklist, then register SwiftShader.
GpuDataManagerImpl* manager = new GpuDataManagerImpl();
ASSERT_TRUE(manager);
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_FALSE(manager->ShouldUseSoftwareRendering());
manager->BlacklistCard();
EXPECT_FALSE(manager->GpuAccessAllowed());
EXPECT_FALSE(manager->ShouldUseSoftwareRendering());
// If software rendering is enabled, even if we blacklist GPU,
// GPU process is still allowed.
const FilePath test_path(FILE_PATH_LITERAL("AnyPath"));
manager->RegisterSwiftShaderPath(test_path);
EXPECT_TRUE(manager->ShouldUseSoftwareRendering());
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_EQ(content::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS,
manager->GetBlacklistedFeatures());
delete manager;
}
TEST_F(GpuDataManagerImplTest, SoftwareRendering2) {
// Register SwiftShader, then blacklist.
GpuDataManagerImpl* manager = new GpuDataManagerImpl();
ASSERT_TRUE(manager);
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_FALSE(manager->ShouldUseSoftwareRendering());
const FilePath test_path(FILE_PATH_LITERAL("AnyPath"));
manager->RegisterSwiftShaderPath(test_path);
EXPECT_EQ(0, manager->GetBlacklistedFeatures());
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_FALSE(manager->ShouldUseSoftwareRendering());
manager->BlacklistCard();
EXPECT_TRUE(manager->GpuAccessAllowed());
EXPECT_TRUE(manager->ShouldUseSoftwareRendering());
EXPECT_EQ(content::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS,
manager->GetBlacklistedFeatures());
delete manager;
}
TEST_F(GpuDataManagerImplTest, GpuInfoUpdate) {
GpuDataManagerImpl* manager = new GpuDataManagerImpl();
ASSERT_TRUE(manager);
TestObserver observer;
manager->AddObserver(&observer);
EXPECT_FALSE(observer.gpu_info_updated());
content::GPUInfo gpu_info;
manager->UpdateGpuInfo(gpu_info);
base::RunLoop run_loop;
run_loop.RunUntilIdle();
EXPECT_TRUE(observer.gpu_info_updated());
delete manager;
}
TEST_F(GpuDataManagerImplTest, GPUVideoMemoryUsageStatsUpdate) {
GpuDataManagerImpl* manager = new GpuDataManagerImpl();
ASSERT_TRUE(manager);
TestObserver observer;
manager->AddObserver(&observer);
EXPECT_FALSE(observer.video_memory_usage_stats_updated());
content::GPUVideoMemoryUsageStats vram_stats;
manager->UpdateVideoMemoryUsageStats(vram_stats);
base::RunLoop run_loop;
run_loop.RunUntilIdle();
EXPECT_TRUE(observer.video_memory_usage_stats_updated());
delete manager;
}