blob: 7d16a44f452e88a2a830bd951cc3723f68d7d715 [file] [log] [blame]
// Copyright 2015 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/stl_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gl/gl_surface_egl.h"
namespace {
TEST(EGLInitializationDisplaysTest, DisableD3D11) {
std::unique_ptr<base::CommandLine> command_line(
new base::CommandLine(base::CommandLine::NO_PROGRAM));
std::vector<gl::DisplayType> displays;
// using --disable-d3d11 with the default --use-angle should never return
// D3D11.
command_line->AppendSwitch(switches::kDisableD3D11);
GetEGLInitDisplays(true, true, true, command_line.get(), &displays);
EXPECT_FALSE(base::ContainsValue(displays, gl::ANGLE_D3D11));
// Specifically requesting D3D11 should always return it if the extension is
// available
command_line->AppendSwitchASCII(switches::kUseANGLE,
gl::kANGLEImplementationD3D11Name);
displays.clear();
GetEGLInitDisplays(true, true, true, command_line.get(), &displays);
EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_D3D11));
EXPECT_EQ(displays.size(), 1u);
// Specifically requesting D3D11 should not return D3D11 if the extension is
// not available
displays.clear();
GetEGLInitDisplays(false, true, true, command_line.get(), &displays);
EXPECT_FALSE(base::ContainsValue(displays, gl::ANGLE_D3D11));
}
TEST(EGLInitializationDisplaysTest, SwiftShader) {
std::unique_ptr<base::CommandLine> command_line(
new base::CommandLine(base::CommandLine::NO_PROGRAM));
std::vector<gl::DisplayType> displays;
// If swiftshader is requested, only SWIFT_SHADER should be returned
command_line->AppendSwitchASCII(switches::kUseGL,
gl::kGLImplementationSwiftShaderForWebGLName);
displays.clear();
GetEGLInitDisplays(true, true, true, command_line.get(), &displays);
EXPECT_TRUE(base::ContainsValue(displays, gl::SWIFT_SHADER));
EXPECT_EQ(displays.size(), 1u);
// Even if there are other flags, swiftshader should take prescedence
command_line->AppendSwitchASCII(switches::kUseANGLE,
gl::kANGLEImplementationD3D11Name);
displays.clear();
GetEGLInitDisplays(true, true, true, command_line.get(), &displays);
EXPECT_TRUE(base::ContainsValue(displays, gl::SWIFT_SHADER));
EXPECT_EQ(displays.size(), 1u);
}
TEST(EGLInitializationDisplaysTest, DefaultRenderers) {
std::unique_ptr<base::CommandLine> command_line(
new base::CommandLine(base::CommandLine::NO_PROGRAM));
// Default without --use-angle flag
std::vector<gl::DisplayType> default_no_flag_displays;
GetEGLInitDisplays(true, true, true, command_line.get(),
&default_no_flag_displays);
EXPECT_FALSE(default_no_flag_displays.empty());
// Default with --use-angle flag
command_line->AppendSwitchASCII(switches::kUseANGLE,
gl::kANGLEImplementationDefaultName);
std::vector<gl::DisplayType> default_with_flag_displays;
GetEGLInitDisplays(true, true, true, command_line.get(),
&default_with_flag_displays);
EXPECT_FALSE(default_with_flag_displays.empty());
// Make sure the same results are returned
EXPECT_EQ(default_no_flag_displays, default_with_flag_displays);
}
TEST(EGLInitializationDisplaysTest, NonDefaultRenderers) {
std::unique_ptr<base::CommandLine> command_line(
new base::CommandLine(base::CommandLine::NO_PROGRAM));
std::vector<gl::DisplayType> displays;
// OpenGL
command_line->AppendSwitchASCII(switches::kUseANGLE,
gl::kANGLEImplementationOpenGLName);
displays.clear();
GetEGLInitDisplays(true, true, true, command_line.get(), &displays);
EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_OPENGL));
EXPECT_EQ(displays.size(), 1u);
// OpenGLES
command_line->AppendSwitchASCII(switches::kUseANGLE,
gl::kANGLEImplementationOpenGLESName);
displays.clear();
GetEGLInitDisplays(true, true, true, command_line.get(), &displays);
EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_OPENGLES));
EXPECT_EQ(displays.size(), 1u);
// Null
command_line->AppendSwitchASCII(switches::kUseANGLE,
gl::kANGLEImplementationNullName);
displays.clear();
GetEGLInitDisplays(true, true, true, command_line.get(), &displays);
EXPECT_TRUE(base::ContainsValue(displays, gl::ANGLE_NULL));
EXPECT_EQ(displays.size(), 1u);
}
TEST(EGLInitializationDisplaysTest, NoExtensions) {
std::unique_ptr<base::CommandLine> command_line(
new base::CommandLine(base::CommandLine::NO_PROGRAM));
// With no angle platform extensions, only DEFAULT should be available
std::vector<gl::DisplayType> displays;
GetEGLInitDisplays(false, false, false, command_line.get(), &displays);
EXPECT_TRUE(base::ContainsValue(displays, gl::DEFAULT));
EXPECT_EQ(displays.size(), 1u);
}
} // namespace