1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <memory>
6 
7 #include "base/stl_util.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/gl/gl_version_info.h"
10 
11 namespace gl {
12 
TEST(GLVersionInfoTest,ParseGLVersionStringTest)13 TEST(GLVersionInfoTest, ParseGLVersionStringTest) {
14   const struct GLVersionTestData {
15     const char* gl_version;
16     unsigned expected_gl_major;
17     unsigned expected_gl_minor;
18     bool expected_is_es;
19     bool expected_is_es2;
20     bool expected_is_es3;
21     const char* expected_driver_vendor;
22     const char* expected_driver_version;
23   } kTestData[] = {
24       {"4.3 (Core Profile) Mesa 11.2.0", 4, 3, false, false, false, "Mesa",
25        "11.2.0"},
26       {"4.5.0 NVIDIA 364.19", 4, 5, false, false, false, "NVIDIA", "364.19"},
27       {"OpenGL ES 2.0 (ANGLE 2.1.0.cd1b12260360)", 2, 0, true, true, false,
28        "ANGLE", "2.1.0.cd1b12260360"},
29       {"2.1 INTEL-10.6.33", 2, 1, false, false, false, "INTEL", "10.6.33"},
30       {"2.1", 2, 1, false, false, false, "", ""},
31       {"OpenGL ES 3.0", 3, 0, true, false, true, "", ""},
32       {"OpenGL ES 3.2 v1.r12p0-04rel0.44f2946824bb8739781564bffe2110c9", 3, 2,
33        true, false, true, "ARM", "12.0.04rel0"},
34       {"OpenGL ES 3.0 V@84.0 AU@05.00.00.046.002 (CL@)", 3, 0, true, false,
35        true, "", "84.0"},
36       {"2.1.0 - Build 8.15.10.2342", 2, 1, false, false, false, "",
37        "8.15.10.2342"},
38       {"4.2.11631", 4, 2, false, false, false, "", ""},
39       {"4.3.12458 13.200.16.0", 4, 3, false, false, false, "", "13.200.16.0"},
40       {"1.4 (2.1 Mesa 7.11)", 1, 4, false, false, false, "Mesa", "7.11"},
41       {"OpenGL ES 2.0 build 1.12@2701748", 2, 0, true, true, false, "", "1.12"},
42       {"OpenGL ES 3.1 V6.2.4.138003", 3, 1, true, false, true, "",
43        "6.2.4.138003"},
44       {"OpenGL ES 3.0 Mesa 12.0.3 (git-8b8f097)", 3, 0, true, false, true,
45        "Mesa", "12.0.3"},
46       {"4.5.14008 Compatibility Profile Context 21.19.137.514", 4, 5, false,
47        false, false, "", "21.19.137.514"},
48       {"4.5.13497 Compatibility Profile/Debug Context 23.20.782.0", 4, 5, false,
49        false, false, "", "23.20.782.0"},
50       // This is a non spec compliant string from Nexus6 on Android N.
51       {"OpenGL ES 3.1V@104.0", 3, 1, true, false, true, "", "104.0"}};
52 
53   gfx::ExtensionSet extensions;
54   for (size_t ii = 0; ii < base::size(kTestData); ++ii) {
55     GLVersionInfo version_info(kTestData[ii].gl_version, nullptr, extensions);
56     EXPECT_EQ(kTestData[ii].expected_gl_major, version_info.major_version);
57     EXPECT_EQ(kTestData[ii].expected_gl_minor, version_info.minor_version);
58     EXPECT_EQ(kTestData[ii].expected_is_es, version_info.is_es);
59     EXPECT_EQ(kTestData[ii].expected_is_es2, version_info.is_es2);
60     EXPECT_EQ(kTestData[ii].expected_is_es3, version_info.is_es3);
61     EXPECT_STREQ(kTestData[ii].expected_driver_vendor,
62                  version_info.driver_vendor.c_str());
63     EXPECT_STREQ(kTestData[ii].expected_driver_version,
64                  version_info.driver_version.c_str());
65   }
66 }
67 
TEST(GLVersionInfoTest,DriverVendorForANGLE)68 TEST(GLVersionInfoTest, DriverVendorForANGLE) {
69   const struct GLVersionTestData {
70     const char* gl_version;
71     const char* gl_renderer;
72     unsigned expected_gl_major;
73     unsigned expected_gl_minor;
74     bool expected_is_es;
75     bool expected_is_es2;
76     bool expected_is_es3;
77     bool expected_is_d3d;
78     const char* expected_driver_vendor;
79     const char* expected_driver_version;
80   } kTestData[] = {
81       {"OpenGL ES 2.0 (ANGLE 2.1.0.44063c804e4f)",
82        "ANGLE (NVIDIA Quadro P400 Direct3D11 vs_5_0 ps_5_0)",
83        2, 0, true, true, false, true,
84        "ANGLE (NVIDIA)", "2.1.0.44063c804e4f"},
85       {"OpenGL ES 2.0 (ANGLE 2.1.0.44063c804e4f)",
86        "ANGLE (Intel(R) HD Graphics 630 Direct3D11 vs_5_0 ps_5_0)",
87        2, 0, true, true, false, true,
88        "ANGLE (Intel)", "2.1.0.44063c804e4f"},
89       {"OpenGL ES 2.0 (ANGLE 2.1.0.44063c804e4f)",
90        "ANGLE (Radeon RX550/550 Series Direct3D11 vs_5_0 ps_5_0)",
91        2, 0, true, true, false, true,
92        "ANGLE (AMD)", "2.1.0.44063c804e4f"},
93       {"OpenGL ES 2.0 (ANGLE 2.1.0.44063c804e4f)",
94        "ANGLE (Vulkan 1.1.120(Intel(R) UHD Graphics 630 (0x00003E92)))",
95        2, 0, true, true, false, false,
96        "ANGLE (Intel)", "2.1.0.44063c804e4f"},
97       {"OpenGL ES 2.0 (ANGLE 2.1.0.44063c804e4f)",
98        "ANGLE (Intel, Intel(R) UHD Graphics 630, OpenGL 4.5 core)",
99        2, 0, true, true, false, false,
100        "ANGLE (Intel)", "2.1.0.44063c804e4f"},
101   };
102 
103   gfx::ExtensionSet extensions;
104   for (size_t ii = 0; ii < base::size(kTestData); ++ii) {
105     GLVersionInfo version_info(kTestData[ii].gl_version,
106                                kTestData[ii].gl_renderer, extensions);
107     EXPECT_TRUE(version_info.is_angle);
108 
109     EXPECT_EQ(kTestData[ii].expected_gl_major, version_info.major_version);
110     EXPECT_EQ(kTestData[ii].expected_gl_minor, version_info.minor_version);
111     EXPECT_EQ(kTestData[ii].expected_is_es, version_info.is_es);
112     EXPECT_EQ(kTestData[ii].expected_is_es2, version_info.is_es2);
113     EXPECT_EQ(kTestData[ii].expected_is_es3, version_info.is_es3);
114     EXPECT_EQ(kTestData[ii].expected_is_d3d, version_info.is_d3d);
115     EXPECT_STREQ(kTestData[ii].expected_driver_vendor,
116                  version_info.driver_vendor.c_str());
117     EXPECT_STREQ(kTestData[ii].expected_driver_version,
118                  version_info.driver_version.c_str());
119   }
120 }
121 }
122