blob: e98f76ed23a7af9ed7585c26c9737c31956dc9bd [file] [log] [blame]
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/config/gpu_util.h"
#include "base/command_line.h"
#include "base/test/scoped_feature_list.h"
#include "gpu/config/gpu_blocklist.h"
#include "gpu/config/gpu_driver_bug_workaround_type.h"
#include "gpu/config/gpu_finch_features.h"
#include "gpu/config/gpu_info.h"
#include "gpu/config/gpu_preferences.h"
#include "gpu/config/gpu_switches.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace gpu {
namespace {
std::vector<uint32_t> GetActiveBlocklistEntryIDs() {
GPUInfo gpu_info;
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
GpuFeatureInfo gpu_feature_info =
ComputeGpuFeatureInfo(gpu_info, GpuPreferences(), &command_line, nullptr);
std::unique_ptr<gpu::GpuBlocklist> blocklist(gpu::GpuBlocklist::Create());
CHECK(blocklist.get());
CHECK_GT(blocklist->max_entry_id(), 0u);
std::vector<uint32_t> active_blocklist_entry_ids =
blocklist->GetEntryIDsFromIndices(
gpu_feature_info.applied_gpu_blocklist_entries);
EXPECT_EQ(gpu_feature_info.applied_gpu_blocklist_entries.size(),
active_blocklist_entry_ids.size());
return active_blocklist_entry_ids;
}
} // namespace
TEST(GpuUtilTest, GetGpuFeatureInfo_WorkaroundFromCommandLine) {
{
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
GPUInfo gpu_info;
GpuFeatureInfo gpu_feature_info = ComputeGpuFeatureInfo(
gpu_info, GpuPreferences(), &command_line, nullptr);
EXPECT_FALSE(gpu_feature_info.IsWorkaroundEnabled(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING));
}
{
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
command_line.AppendSwitchASCII(GpuDriverBugWorkaroundTypeToString(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING),
"1");
GPUInfo gpu_info;
GpuFeatureInfo gpu_feature_info = ComputeGpuFeatureInfo(
gpu_info, GpuPreferences(), &command_line, nullptr);
EXPECT_TRUE(gpu_feature_info.IsWorkaroundEnabled(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING));
}
{
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
command_line.AppendSwitchASCII(switches::kGpuDriverBugListTestGroup, "1");
// See gpu/config/gpu_driver_bug_list.json, test_group 1, entry 215.
GPUInfo gpu_info;
GpuFeatureInfo gpu_feature_info = ComputeGpuFeatureInfo(
gpu_info, GpuPreferences(), &command_line, nullptr);
EXPECT_TRUE(gpu_feature_info.IsWorkaroundEnabled(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING));
}
{
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
command_line.AppendSwitchASCII(switches::kGpuDriverBugListTestGroup, "1");
command_line.AppendSwitchASCII(GpuDriverBugWorkaroundTypeToString(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING),
"0");
// See gpu/config/gpu_driver_bug_list.json, test_group 1, entry 215.
GPUInfo gpu_info;
GpuFeatureInfo gpu_feature_info = ComputeGpuFeatureInfo(
gpu_info, GpuPreferences(), &command_line, nullptr);
EXPECT_FALSE(gpu_feature_info.IsWorkaroundEnabled(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING));
}
}
TEST(GpuUtilTest, GetGpuFeatureInfo_WorkaroundFromFeatureFlag) {
{
GPUInfo gpu_info;
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
GpuFeatureInfo gpu_feature_info = ComputeGpuFeatureInfo(
gpu_info, GpuPreferences(), &command_line, nullptr);
EXPECT_FALSE(gpu_feature_info.IsWorkaroundEnabled(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING));
}
{
base::test::ScopedFeatureList enable_feature;
enable_feature.InitAndEnableFeatureWithParameters(
features::kGPUDriverBugListTestGroup, {{"test_group", "1"}});
// See gpu/config/gpu_driver_bug_list.json, test_group 1, entry 215.
GPUInfo gpu_info;
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
GpuFeatureInfo gpu_feature_info = ComputeGpuFeatureInfo(
gpu_info, GpuPreferences(), &command_line, nullptr);
EXPECT_TRUE(gpu_feature_info.IsWorkaroundEnabled(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING));
}
{
base::test::ScopedFeatureList enable_feature;
enable_feature.InitAndEnableFeature(features::kGPUDriverBugListTestGroup);
// See gpu/config/gpu_driver_bug_list.json, test_group 1, entry 215.
GPUInfo gpu_info;
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
GpuFeatureInfo gpu_feature_info = ComputeGpuFeatureInfo(
gpu_info, GpuPreferences(), &command_line, nullptr);
EXPECT_FALSE(gpu_feature_info.IsWorkaroundEnabled(
USE_GPU_DRIVER_WORKAROUND_FOR_TESTING));
}
} // namespace
TEST(GpuUtilTest, GetGpuFeatureInfo_SoftwareRenderingFromFeatureFlag) {
{
std::vector<uint32_t> active_blocklist_entry_ids =
GetActiveBlocklistEntryIDs();
// See software_rendering_list.json, test_group 1, entry 152.
EXPECT_EQ(std::count(active_blocklist_entry_ids.begin(),
active_blocklist_entry_ids.end(), 152),
0);
EXPECT_EQ(std::count(active_blocklist_entry_ids.begin(),
active_blocklist_entry_ids.end(), 153),
0);
}
{
base::test::ScopedFeatureList enable_feature;
enable_feature.InitAndEnableFeatureWithParameters(
features::kGPUBlockListTestGroup, {{"test_group", "1"}});
std::vector<uint32_t> active_blocklist_entry_ids =
GetActiveBlocklistEntryIDs();
// See software_rendering_list.json, test_group 1, entry 152.
EXPECT_EQ(std::count(active_blocklist_entry_ids.begin(),
active_blocklist_entry_ids.end(), 152),
1);
// See software_rendering_list.json, test_group 2, entry 153
EXPECT_EQ(std::count(active_blocklist_entry_ids.begin(),
active_blocklist_entry_ids.end(), 153),
0);
}
}
} // namespace gpu