xref: /aosp_15_r20/external/angle/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // EGLPrintEGLinfoTest.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //   This test prints out the extension strings, configs and their attributes
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include <gtest/gtest.h>
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/string_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_HAS_RAPIDJSON)
16*8975f5c5SAndroid Build Coastguard Worker #    include "common/serializer/JsonSerializer.h"
17*8975f5c5SAndroid Build Coastguard Worker #    include "test_utils/runner/TestSuite.h"
18*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_HAS_RAPIDJSON)
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker class EGLPrintEGLinfoTest : public ANGLETest<>
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker   protected:
EGLPrintEGLinfoTest()25*8975f5c5SAndroid Build Coastguard Worker     EGLPrintEGLinfoTest() {}
26*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()27*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
28*8975f5c5SAndroid Build Coastguard Worker     {
29*8975f5c5SAndroid Build Coastguard Worker         mDisplay = getEGLWindow()->getDisplay();
30*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(mDisplay != EGL_NO_DISPLAY);
31*8975f5c5SAndroid Build Coastguard Worker     }
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay mDisplay = EGL_NO_DISPLAY;
34*8975f5c5SAndroid Build Coastguard Worker };
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker namespace
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker // Parse space separated extension string into a vector of strings
ParseExtensions(const char * extensions)39*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> ParseExtensions(const char *extensions)
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker     std::string extensionsStr(extensions);
42*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> extensionsVec;
43*8975f5c5SAndroid Build Coastguard Worker     SplitStringAlongWhitespace(extensionsStr, &extensionsVec);
44*8975f5c5SAndroid Build Coastguard Worker     return extensionsVec;
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker // Query a EGL attribute
GetAttrib(EGLDisplay display,EGLConfig config,EGLint attrib)48*8975f5c5SAndroid Build Coastguard Worker EGLint GetAttrib(EGLDisplay display, EGLConfig config, EGLint attrib)
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker     EGLint value = 0;
51*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglGetConfigAttrib(display, config, attrib, &value));
52*8975f5c5SAndroid Build Coastguard Worker     return value;
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker // Query a egl string
GetEGLString(EGLDisplay display,EGLint name)56*8975f5c5SAndroid Build Coastguard Worker const char *GetEGLString(EGLDisplay display, EGLint name)
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker     const char *value = "";
59*8975f5c5SAndroid Build Coastguard Worker     value             = eglQueryString(display, name);
60*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_ERROR(EGL_SUCCESS);
61*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(value != nullptr);
62*8975f5c5SAndroid Build Coastguard Worker     return value;
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker // Query a GL string
GetGLString(EGLint name)66*8975f5c5SAndroid Build Coastguard Worker const char *GetGLString(EGLint name)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     const char *value = "";
69*8975f5c5SAndroid Build Coastguard Worker     value             = reinterpret_cast<const char *>(glGetString(name));
70*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_NO_ERROR);
71*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(value != nullptr);
72*8975f5c5SAndroid Build Coastguard Worker     return value;
73*8975f5c5SAndroid Build Coastguard Worker }
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker }  // namespace
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker // Print the EGL strings and extensions
TEST_P(EGLPrintEGLinfoTest,PrintEGLInfo)78*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPrintEGLinfoTest, PrintEGLInfo)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker     std::cout << "    EGL Information:" << std::endl;
81*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tVendor: " << GetEGLString(mDisplay, EGL_VENDOR) << std::endl;
82*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tVersion: " << GetEGLString(mDisplay, EGL_VERSION) << std::endl;
83*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tClient APIs: " << GetEGLString(mDisplay, EGL_CLIENT_APIS) << std::endl;
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tEGL Client Extensions:" << std::endl;
86*8975f5c5SAndroid Build Coastguard Worker     for (auto extension : ParseExtensions(GetEGLString(EGL_NO_DISPLAY, EGL_EXTENSIONS)))
87*8975f5c5SAndroid Build Coastguard Worker     {
88*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\t\t" << extension << std::endl;
89*8975f5c5SAndroid Build Coastguard Worker     }
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tEGL Display Extensions:" << std::endl;
92*8975f5c5SAndroid Build Coastguard Worker     for (auto extension : ParseExtensions(GetEGLString(mDisplay, EGL_EXTENSIONS)))
93*8975f5c5SAndroid Build Coastguard Worker     {
94*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\t\t" << extension << std::endl;
95*8975f5c5SAndroid Build Coastguard Worker     }
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker     std::cout << std::endl;
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker // Print the GL strings and extensions
TEST_P(EGLPrintEGLinfoTest,PrintGLInfo)101*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPrintEGLinfoTest, PrintGLInfo)
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker     std::cout << "    GLES Information:" << std::endl;
104*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tVendor: " << GetGLString(GL_VENDOR) << std::endl;
105*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tVersion: " << GetGLString(GL_VERSION) << std::endl;
106*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tRenderer: " << GetGLString(GL_RENDERER) << std::endl;
107*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tShader: " << GetGLString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     std::cout << "\tExtensions:" << std::endl;
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker     const std::vector<std::string> extensions = ParseExtensions(GetGLString(GL_EXTENSIONS));
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     for (const std::string &extension : extensions)
114*8975f5c5SAndroid Build Coastguard Worker     {
115*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\t\t" << extension << std::endl;
116*8975f5c5SAndroid Build Coastguard Worker     }
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     std::cout << std::endl;
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_HAS_RAPIDJSON)
121*8975f5c5SAndroid Build Coastguard Worker     angle::TestSuite *testSuite = angle::TestSuite::GetInstance();
122*8975f5c5SAndroid Build Coastguard Worker     if (!testSuite->hasTestArtifactsDirectory())
123*8975f5c5SAndroid Build Coastguard Worker     {
124*8975f5c5SAndroid Build Coastguard Worker         return;
125*8975f5c5SAndroid Build Coastguard Worker     }
126*8975f5c5SAndroid Build Coastguard Worker     JsonSerializer json;
127*8975f5c5SAndroid Build Coastguard Worker     json.addCString("Vendor", GetGLString(GL_VENDOR));
128*8975f5c5SAndroid Build Coastguard Worker     json.addCString("Version", GetGLString(GL_VERSION));
129*8975f5c5SAndroid Build Coastguard Worker     json.addCString("Renderer", GetGLString(GL_RENDERER));
130*8975f5c5SAndroid Build Coastguard Worker     json.addCString("ShaderLanguageVersion", GetGLString(GL_SHADING_LANGUAGE_VERSION));
131*8975f5c5SAndroid Build Coastguard Worker     json.addVectorOfStrings("Extensions", extensions);
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kBufferSize = 1000;
134*8975f5c5SAndroid Build Coastguard Worker     std::array<char, kBufferSize> buffer;
135*8975f5c5SAndroid Build Coastguard Worker     std::time_t timeNow = std::time(nullptr);
136*8975f5c5SAndroid Build Coastguard Worker     std::strftime(buffer.data(), buffer.size(), "%B %e, %Y", std::localtime(&timeNow));
137*8975f5c5SAndroid Build Coastguard Worker     json.addCString("DateRecorded", buffer.data());
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker     std::stringstream fnameStream;
140*8975f5c5SAndroid Build Coastguard Worker     fnameStream << "GLinfo_" << GetParam() << ".json";
141*8975f5c5SAndroid Build Coastguard Worker     std::string fname = fnameStream.str();
142*8975f5c5SAndroid Build Coastguard Worker 
143*8975f5c5SAndroid Build Coastguard Worker     const std::string artifactPath = testSuite->reserveTestArtifactPath(fname);
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker     {
146*8975f5c5SAndroid Build Coastguard Worker         std::vector<uint8_t> jsonData = json.getData();
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker         FILE *fp = fopen(artifactPath.c_str(), "wb");
149*8975f5c5SAndroid Build Coastguard Worker         ASSERT(fp);
150*8975f5c5SAndroid Build Coastguard Worker         fwrite(jsonData.data(), sizeof(uint8_t), jsonData.size(), fp);
151*8975f5c5SAndroid Build Coastguard Worker         fclose(fp);
152*8975f5c5SAndroid Build Coastguard Worker     }
153*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_HAS_RAPIDJSON)
154*8975f5c5SAndroid Build Coastguard Worker }
155*8975f5c5SAndroid Build Coastguard Worker 
156*8975f5c5SAndroid Build Coastguard Worker #define QUERY_HELPER(enumValue, enumString, stream)                                    \
157*8975f5c5SAndroid Build Coastguard Worker     {                                                                                  \
158*8975f5c5SAndroid Build Coastguard Worker         GLint result;                                                                  \
159*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(enumValue, &result);                                             \
160*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();                                                          \
161*8975f5c5SAndroid Build Coastguard Worker         stream << enumString + std::string(",") + std::to_string(result) << std::endl; \
162*8975f5c5SAndroid Build Coastguard Worker     }
163*8975f5c5SAndroid Build Coastguard Worker 
164*8975f5c5SAndroid Build Coastguard Worker #define QUERY_ARRAY_HELPER(enumValue, enumString, size, stream)               \
165*8975f5c5SAndroid Build Coastguard Worker     {                                                                         \
166*8975f5c5SAndroid Build Coastguard Worker         GLint result[size];                                                   \
167*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(enumValue, result);                                     \
168*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();                                                 \
169*8975f5c5SAndroid Build Coastguard Worker         std::stringstream results;                                            \
170*8975f5c5SAndroid Build Coastguard Worker         for (int i = 0; i < size; i++)                                        \
171*8975f5c5SAndroid Build Coastguard Worker             results << result[i] << " ";                                      \
172*8975f5c5SAndroid Build Coastguard Worker         stream << enumString + std::string(",") + results.str() << std::endl; \
173*8975f5c5SAndroid Build Coastguard Worker     }
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker #define QUERY_INDEXED_HELPER(enumValue, enumString, index, stream)                     \
176*8975f5c5SAndroid Build Coastguard Worker     {                                                                                  \
177*8975f5c5SAndroid Build Coastguard Worker         GLint result;                                                                  \
178*8975f5c5SAndroid Build Coastguard Worker         glGetIntegeri_v(enumValue, index, &result);                                    \
179*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();                                                          \
180*8975f5c5SAndroid Build Coastguard Worker         stream << enumString + std::string(",") + std::to_string(result) << std::endl; \
181*8975f5c5SAndroid Build Coastguard Worker     }
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker #define QUERY_AND_LOG_CAPABILITY(enum, stream) QUERY_HELPER(enum, #enum, stream)
184*8975f5c5SAndroid Build Coastguard Worker 
185*8975f5c5SAndroid Build Coastguard Worker #define QUERY_AND_LOG_CAPABILITY_ARRAY(enum, size, stream) \
186*8975f5c5SAndroid Build Coastguard Worker     QUERY_ARRAY_HELPER(enum, #enum, size, stream)
187*8975f5c5SAndroid Build Coastguard Worker 
188*8975f5c5SAndroid Build Coastguard Worker #define QUERY_AND_LOG_CAPABILITY_INDEXED(enum, index, stream) \
189*8975f5c5SAndroid Build Coastguard Worker     QUERY_INDEXED_HELPER(enum, #enum "[" #index "]", index, stream)
190*8975f5c5SAndroid Build Coastguard Worker 
LogGles2Capabilities(std::ostream & stream)191*8975f5c5SAndroid Build Coastguard Worker static void LogGles2Capabilities(std::ostream &stream)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, stream);
194*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_CUBE_MAP_TEXTURE_SIZE, stream);
195*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_VECTORS, stream);
196*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_RENDERBUFFER_SIZE, stream);
197*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_IMAGE_UNITS, stream);
198*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_SIZE, stream);
199*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VARYING_VECTORS, stream);
200*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIBS, stream);
201*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, stream);
202*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_VECTORS, stream);
203*8975f5c5SAndroid Build Coastguard Worker     constexpr int kMaxViewPortDimsReturnValuesSize = 2;
204*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY_ARRAY(GL_MAX_VIEWPORT_DIMS, kMaxViewPortDimsReturnValuesSize, stream);
205*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_NUM_COMPRESSED_TEXTURE_FORMATS, stream);
206*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_NUM_SHADER_BINARY_FORMATS, stream);
207*8975f5c5SAndroid Build Coastguard Worker }
208*8975f5c5SAndroid Build Coastguard Worker 
LogGles3Capabilities(std::ostream & stream)209*8975f5c5SAndroid Build Coastguard Worker static void LogGles3Capabilities(std::ostream &stream)
210*8975f5c5SAndroid Build Coastguard Worker {
211*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_3D_TEXTURE_SIZE, stream);
212*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_ARRAY_TEXTURE_LAYERS, stream);
213*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COLOR_ATTACHMENTS, stream);
214*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, stream);
215*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_UNIFORM_BLOCKS, stream);
216*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, stream);
217*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_DRAW_BUFFERS, stream);
218*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENT_INDEX, stream);
219*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENTS_INDICES, stream);
220*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENTS_VERTICES, stream);
221*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_INPUT_COMPONENTS, stream);
222*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, stream);
223*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, stream);
224*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_PROGRAM_TEXEL_OFFSET, stream);
225*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_SAMPLES, stream);
226*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_SERVER_WAIT_TIMEOUT, stream);
227*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_LOD_BIAS, stream);
228*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, stream);
229*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, stream);
230*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, stream);
231*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_BLOCK_SIZE, stream);
232*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_BUFFER_BINDINGS, stream);
233*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VARYING_COMPONENTS, stream);
234*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_OUTPUT_COMPONENTS, stream);
235*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_BLOCKS, stream);
236*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_COMPONENTS, stream);
237*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MIN_PROGRAM_TEXEL_OFFSET, stream);
238*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_NUM_PROGRAM_BINARY_FORMATS, stream);
239*8975f5c5SAndroid Build Coastguard Worker     // GLES3 capabilities are a superset of GLES2
240*8975f5c5SAndroid Build Coastguard Worker     LogGles2Capabilities(stream);
241*8975f5c5SAndroid Build Coastguard Worker }
242*8975f5c5SAndroid Build Coastguard Worker 
LogGles31Capabilities(std::ostream & stream)243*8975f5c5SAndroid Build Coastguard Worker static void LogGles31Capabilities(std::ostream &stream)
244*8975f5c5SAndroid Build Coastguard Worker {
245*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, stream);
246*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE, stream);
247*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COLOR_TEXTURE_SAMPLES, stream);
248*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, stream);
249*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_ATOMIC_COUNTERS, stream);
250*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, stream);
251*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_IMAGE_UNIFORMS, stream);
252*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES, stream);
253*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS, stream);
254*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, stream);
255*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_ATOMIC_COUNTERS, stream);
256*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_IMAGE_UNIFORMS, stream);
257*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS, stream);
258*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_SHARED_MEMORY_SIZE, stream);
259*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, stream);
260*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_UNIFORM_BLOCKS, stream);
261*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_UNIFORM_COMPONENTS, stream);
262*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, stream);
263*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, stream);
264*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, stream);
265*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, stream);
266*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, stream);
267*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, stream);
268*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, stream);
269*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_DEPTH_TEXTURE_SAMPLES, stream);
270*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, stream);
271*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_ATOMIC_COUNTERS, stream);
272*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, stream);
273*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, stream);
274*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_HEIGHT, stream);
275*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_SAMPLES, stream);
276*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_WIDTH, stream);
277*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_IMAGE_UNITS, stream);
278*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_INTEGER_SAMPLES, stream);
279*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, stream);
280*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_SAMPLE_MASK_WORDS, stream);
281*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, stream);
282*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, stream);
283*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_LOCATIONS, stream);
284*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, stream);
285*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATOMIC_COUNTERS, stream);
286*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_BINDINGS, stream);
287*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, stream);
288*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_STRIDE, stream);
289*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_IMAGE_UNIFORMS, stream);
290*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, stream);
291*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, stream);
292*8975f5c5SAndroid Build Coastguard Worker 
293*8975f5c5SAndroid Build Coastguard Worker     // GLES31 capabilities are a superset of GLES3
294*8975f5c5SAndroid Build Coastguard Worker     LogGles3Capabilities(stream);
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker 
LogGles32Capabilities(std::ostream & stream)297*8975f5c5SAndroid Build Coastguard Worker static void LogGles32Capabilities(std::ostream &stream)
298*8975f5c5SAndroid Build Coastguard Worker {
299*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS, stream);
300*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS, stream);
301*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS, stream);
302*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_GROUP_STACK_DEPTH, stream);
303*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_LOGGED_MESSAGES, stream);
304*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_MESSAGE_LENGTH, stream);
305*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_INTERPOLATION_OFFSET, stream);
306*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_LAYERS, stream);
307*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS, stream);
308*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_ATOMIC_COUNTERS, stream);
309*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, stream);
310*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_INPUT_COMPONENTS, stream);
311*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_OUTPUT_COMPONENTS, stream);
312*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_OUTPUT_VERTICES, stream);
313*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_SHADER_INVOCATIONS, stream);
314*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS, stream);
315*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, stream);
316*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, stream);
317*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_UNIFORM_BLOCKS, stream);
318*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_UNIFORM_COMPONENTS, stream);
319*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_LABEL_LENGTH, stream);
320*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_PATCH_VERTICES, stream);
321*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS, stream);
322*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS, stream);
323*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, stream);
324*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_INPUT_COMPONENTS, stream);
325*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS, stream);
326*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS, stream);
327*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS, stream);
328*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS, stream);
329*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS, stream);
330*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS, stream);
331*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS, stream);
332*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS, stream);
333*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, stream);
334*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS, stream);
335*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS, stream);
336*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS, stream);
337*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, stream);
338*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS, stream);
339*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS, stream);
340*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_GEN_LEVEL, stream);
341*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_PATCH_COMPONENTS, stream);
342*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_BUFFER_SIZE, stream);
343*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MIN_FRAGMENT_INTERPOLATION_OFFSET, stream);
344*8975f5c5SAndroid Build Coastguard Worker     QUERY_AND_LOG_CAPABILITY(GL_MIN_SAMPLE_SHADING_VALUE, stream);
345*8975f5c5SAndroid Build Coastguard Worker 
346*8975f5c5SAndroid Build Coastguard Worker     // GLES32 capabilities are a superset of GLES31
347*8975f5c5SAndroid Build Coastguard Worker     LogGles31Capabilities(stream);
348*8975f5c5SAndroid Build Coastguard Worker }
349*8975f5c5SAndroid Build Coastguard Worker 
350*8975f5c5SAndroid Build Coastguard Worker // Prints GLES Capabilities listed at
351*8975f5c5SAndroid Build Coastguard Worker // https://opengles.gpuinfo.org/listcapabilities.php
352*8975f5c5SAndroid Build Coastguard Worker // in CSV format
TEST_P(EGLPrintEGLinfoTest,PrintGLESCapabilities)353*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPrintEGLinfoTest, PrintGLESCapabilities)
354*8975f5c5SAndroid Build Coastguard Worker {
355*8975f5c5SAndroid Build Coastguard Worker     std::cout << std::endl << "Capability name, value" << std::endl << std::endl;
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker     std::ostream &stream = std::cout;
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker     switch (getClientMajorVersion())
360*8975f5c5SAndroid Build Coastguard Worker     {
361*8975f5c5SAndroid Build Coastguard Worker         case 1:
362*8975f5c5SAndroid Build Coastguard Worker             break;
363*8975f5c5SAndroid Build Coastguard Worker         case 2:
364*8975f5c5SAndroid Build Coastguard Worker             LogGles2Capabilities(stream);
365*8975f5c5SAndroid Build Coastguard Worker             break;
366*8975f5c5SAndroid Build Coastguard Worker         case 3:
367*8975f5c5SAndroid Build Coastguard Worker             switch (getClientMinorVersion())
368*8975f5c5SAndroid Build Coastguard Worker             {
369*8975f5c5SAndroid Build Coastguard Worker                 case 2:
370*8975f5c5SAndroid Build Coastguard Worker                     LogGles32Capabilities(stream);
371*8975f5c5SAndroid Build Coastguard Worker                     break;
372*8975f5c5SAndroid Build Coastguard Worker                 case 1:
373*8975f5c5SAndroid Build Coastguard Worker                     LogGles31Capabilities(stream);
374*8975f5c5SAndroid Build Coastguard Worker                     break;
375*8975f5c5SAndroid Build Coastguard Worker                 case 0:
376*8975f5c5SAndroid Build Coastguard Worker                     LogGles3Capabilities(stream);
377*8975f5c5SAndroid Build Coastguard Worker                     break;
378*8975f5c5SAndroid Build Coastguard Worker                 default:
379*8975f5c5SAndroid Build Coastguard Worker                     FAIL() << "unknown client minor version.";
380*8975f5c5SAndroid Build Coastguard Worker             }
381*8975f5c5SAndroid Build Coastguard Worker             break;
382*8975f5c5SAndroid Build Coastguard Worker         default:
383*8975f5c5SAndroid Build Coastguard Worker             FAIL() << "unknown client major version.";
384*8975f5c5SAndroid Build Coastguard Worker     }
385*8975f5c5SAndroid Build Coastguard Worker 
386*8975f5c5SAndroid Build Coastguard Worker     stream << std::endl;
387*8975f5c5SAndroid Build Coastguard Worker }
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker // Print the EGL configs with attributes
TEST_P(EGLPrintEGLinfoTest,PrintConfigInfo)390*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPrintEGLinfoTest, PrintConfigInfo)
391*8975f5c5SAndroid Build Coastguard Worker {
392*8975f5c5SAndroid Build Coastguard Worker     // Get all the configs
393*8975f5c5SAndroid Build Coastguard Worker     EGLint count;
394*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, nullptr, 0, &count));
395*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(count > 0);
396*8975f5c5SAndroid Build Coastguard Worker     std::vector<EGLConfig> configs(count);
397*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, configs.data(), count, &count));
398*8975f5c5SAndroid Build Coastguard Worker     configs.resize(count);
399*8975f5c5SAndroid Build Coastguard Worker     // sort configs by increaing ID
400*8975f5c5SAndroid Build Coastguard Worker     std::sort(configs.begin(), configs.end(), [this](EGLConfig a, EGLConfig b) -> bool {
401*8975f5c5SAndroid Build Coastguard Worker         return GetAttrib(mDisplay, a, EGL_CONFIG_ID) < GetAttrib(mDisplay, b, EGL_CONFIG_ID);
402*8975f5c5SAndroid Build Coastguard Worker     });
403*8975f5c5SAndroid Build Coastguard Worker 
404*8975f5c5SAndroid Build Coastguard Worker     std::cout << "Configs - Count: " << count << std::endl;
405*8975f5c5SAndroid Build Coastguard Worker 
406*8975f5c5SAndroid Build Coastguard Worker     // For each config, print its attributes
407*8975f5c5SAndroid Build Coastguard Worker     for (auto config : configs)
408*8975f5c5SAndroid Build Coastguard Worker     {
409*8975f5c5SAndroid Build Coastguard Worker         // Config ID
410*8975f5c5SAndroid Build Coastguard Worker         std::cout << "    Config: " << GetAttrib(mDisplay, config, EGL_CONFIG_ID) << std::endl;
411*8975f5c5SAndroid Build Coastguard Worker 
412*8975f5c5SAndroid Build Coastguard Worker         // Color
413*8975f5c5SAndroid Build Coastguard Worker         const char *componentType = (GetAttrib(mDisplay, config, EGL_COLOR_COMPONENT_TYPE_EXT) ==
414*8975f5c5SAndroid Build Coastguard Worker                                      EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT)
415*8975f5c5SAndroid Build Coastguard Worker                                         ? "Float "
416*8975f5c5SAndroid Build Coastguard Worker                                         : "Fixed ";
417*8975f5c5SAndroid Build Coastguard Worker         const char *colorBuffType =
418*8975f5c5SAndroid Build Coastguard Worker             (GetAttrib(mDisplay, config, EGL_COLOR_BUFFER_TYPE) == EGL_LUMINANCE_BUFFER)
419*8975f5c5SAndroid Build Coastguard Worker                 ? "LUMINANCE"
420*8975f5c5SAndroid Build Coastguard Worker                 : "RGB";
421*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tColor:" << GetAttrib(mDisplay, config, EGL_BUFFER_SIZE) << "bit "
422*8975f5c5SAndroid Build Coastguard Worker                   << componentType << colorBuffType
423*8975f5c5SAndroid Build Coastguard Worker                   << " Red:" << GetAttrib(mDisplay, config, EGL_RED_SIZE)
424*8975f5c5SAndroid Build Coastguard Worker                   << " Green:" << GetAttrib(mDisplay, config, EGL_GREEN_SIZE)
425*8975f5c5SAndroid Build Coastguard Worker                   << " Blue:" << GetAttrib(mDisplay, config, EGL_BLUE_SIZE)
426*8975f5c5SAndroid Build Coastguard Worker                   << " Alpha:" << GetAttrib(mDisplay, config, EGL_ALPHA_SIZE)
427*8975f5c5SAndroid Build Coastguard Worker                   << " Lum:" << GetAttrib(mDisplay, config, EGL_LUMINANCE_SIZE)
428*8975f5c5SAndroid Build Coastguard Worker                   << " AlphaMask:" << GetAttrib(mDisplay, config, EGL_ALPHA_MASK_SIZE) << std::endl;
429*8975f5c5SAndroid Build Coastguard Worker 
430*8975f5c5SAndroid Build Coastguard Worker         // Texture Binding
431*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tBinding RGB:" << (bool)GetAttrib(mDisplay, config, EGL_BIND_TO_TEXTURE_RGB)
432*8975f5c5SAndroid Build Coastguard Worker                   << " RGBA:" << (bool)GetAttrib(mDisplay, config, EGL_BIND_TO_TEXTURE_RGBA)
433*8975f5c5SAndroid Build Coastguard Worker                   << " MaxWidth:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_WIDTH)
434*8975f5c5SAndroid Build Coastguard Worker                   << " MaxHeight:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_HEIGHT)
435*8975f5c5SAndroid Build Coastguard Worker                   << " MaxPixels:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_PIXELS)
436*8975f5c5SAndroid Build Coastguard Worker                   << std::endl;
437*8975f5c5SAndroid Build Coastguard Worker 
438*8975f5c5SAndroid Build Coastguard Worker         // Conformant
439*8975f5c5SAndroid Build Coastguard Worker         EGLint caveatAttrib = GetAttrib(mDisplay, config, EGL_CONFIG_CAVEAT);
440*8975f5c5SAndroid Build Coastguard Worker         const char *caveat  = nullptr;
441*8975f5c5SAndroid Build Coastguard Worker         switch (caveatAttrib)
442*8975f5c5SAndroid Build Coastguard Worker         {
443*8975f5c5SAndroid Build Coastguard Worker             case EGL_NONE:
444*8975f5c5SAndroid Build Coastguard Worker                 caveat = "None.";
445*8975f5c5SAndroid Build Coastguard Worker                 break;
446*8975f5c5SAndroid Build Coastguard Worker             case EGL_SLOW_CONFIG:
447*8975f5c5SAndroid Build Coastguard Worker                 caveat = "Slow.";
448*8975f5c5SAndroid Build Coastguard Worker                 break;
449*8975f5c5SAndroid Build Coastguard Worker             case EGL_NON_CONFORMANT_CONFIG:
450*8975f5c5SAndroid Build Coastguard Worker                 caveat = "Non-Conformant.";
451*8975f5c5SAndroid Build Coastguard Worker                 break;
452*8975f5c5SAndroid Build Coastguard Worker             default:
453*8975f5c5SAndroid Build Coastguard Worker                 caveat = ".";
454*8975f5c5SAndroid Build Coastguard Worker         }
455*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tCaveate: " << caveat;
456*8975f5c5SAndroid Build Coastguard Worker 
457*8975f5c5SAndroid Build Coastguard Worker         EGLint conformant = GetAttrib(mDisplay, config, EGL_CONFORMANT);
458*8975f5c5SAndroid Build Coastguard Worker         std::cout << " Conformant: ";
459*8975f5c5SAndroid Build Coastguard Worker         if (conformant & EGL_OPENGL_ES_BIT)
460*8975f5c5SAndroid Build Coastguard Worker             std::cout << "ES1 ";
461*8975f5c5SAndroid Build Coastguard Worker         if (conformant & EGL_OPENGL_ES2_BIT)
462*8975f5c5SAndroid Build Coastguard Worker             std::cout << "ES2 ";
463*8975f5c5SAndroid Build Coastguard Worker         if (conformant & EGL_OPENGL_ES3_BIT)
464*8975f5c5SAndroid Build Coastguard Worker             std::cout << "ES3";
465*8975f5c5SAndroid Build Coastguard Worker         std::cout << std::endl;
466*8975f5c5SAndroid Build Coastguard Worker 
467*8975f5c5SAndroid Build Coastguard Worker         // Ancilary buffers
468*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tAncilary " << "Depth:" << GetAttrib(mDisplay, config, EGL_DEPTH_SIZE)
469*8975f5c5SAndroid Build Coastguard Worker                   << " Stencil:" << GetAttrib(mDisplay, config, EGL_STENCIL_SIZE)
470*8975f5c5SAndroid Build Coastguard Worker                   << " SampleBuffs:" << GetAttrib(mDisplay, config, EGL_SAMPLE_BUFFERS)
471*8975f5c5SAndroid Build Coastguard Worker                   << " Samples:" << GetAttrib(mDisplay, config, EGL_SAMPLES) << std::endl;
472*8975f5c5SAndroid Build Coastguard Worker 
473*8975f5c5SAndroid Build Coastguard Worker         // Swap interval
474*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tSwap Interval"
475*8975f5c5SAndroid Build Coastguard Worker                   << " Min:" << GetAttrib(mDisplay, config, EGL_MIN_SWAP_INTERVAL)
476*8975f5c5SAndroid Build Coastguard Worker                   << " Max:" << GetAttrib(mDisplay, config, EGL_MAX_SWAP_INTERVAL) << std::endl;
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker         // Native
479*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tNative Renderable: " << GetAttrib(mDisplay, config, EGL_NATIVE_RENDERABLE)
480*8975f5c5SAndroid Build Coastguard Worker                   << ", VisualID: " << GetAttrib(mDisplay, config, EGL_NATIVE_VISUAL_ID)
481*8975f5c5SAndroid Build Coastguard Worker                   << ", VisualType: " << GetAttrib(mDisplay, config, EGL_NATIVE_VISUAL_TYPE)
482*8975f5c5SAndroid Build Coastguard Worker                   << std::endl;
483*8975f5c5SAndroid Build Coastguard Worker 
484*8975f5c5SAndroid Build Coastguard Worker         // Surface type
485*8975f5c5SAndroid Build Coastguard Worker         EGLint surfaceType = GetAttrib(mDisplay, config, EGL_SURFACE_TYPE);
486*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tSurface Type: ";
487*8975f5c5SAndroid Build Coastguard Worker         if (surfaceType & EGL_WINDOW_BIT)
488*8975f5c5SAndroid Build Coastguard Worker             std::cout << "WINDOW ";
489*8975f5c5SAndroid Build Coastguard Worker         if (surfaceType & EGL_PIXMAP_BIT)
490*8975f5c5SAndroid Build Coastguard Worker             std::cout << "PIXMAP ";
491*8975f5c5SAndroid Build Coastguard Worker         if (surfaceType & EGL_PBUFFER_BIT)
492*8975f5c5SAndroid Build Coastguard Worker             std::cout << "PBUFFER ";
493*8975f5c5SAndroid Build Coastguard Worker         if (surfaceType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT)
494*8975f5c5SAndroid Build Coastguard Worker             std::cout << "MULTISAMPLE_RESOLVE_BOX ";
495*8975f5c5SAndroid Build Coastguard Worker         if (surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
496*8975f5c5SAndroid Build Coastguard Worker             std::cout << "SWAP_PRESERVE ";
497*8975f5c5SAndroid Build Coastguard Worker         std::cout << std::endl;
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker         // Renderable
500*8975f5c5SAndroid Build Coastguard Worker         EGLint rendType = GetAttrib(mDisplay, config, EGL_RENDERABLE_TYPE);
501*8975f5c5SAndroid Build Coastguard Worker         std::cout << "\tRender: ";
502*8975f5c5SAndroid Build Coastguard Worker         if (rendType & EGL_OPENGL_ES_BIT)
503*8975f5c5SAndroid Build Coastguard Worker             std::cout << "ES1 ";
504*8975f5c5SAndroid Build Coastguard Worker         if (rendType & EGL_OPENGL_ES2_BIT)
505*8975f5c5SAndroid Build Coastguard Worker             std::cout << "ES2 ";
506*8975f5c5SAndroid Build Coastguard Worker         if (rendType & EGL_OPENGL_ES3_BIT)
507*8975f5c5SAndroid Build Coastguard Worker             std::cout << "ES3 ";
508*8975f5c5SAndroid Build Coastguard Worker         std::cout << std::endl;
509*8975f5c5SAndroid Build Coastguard Worker 
510*8975f5c5SAndroid Build Coastguard Worker         // Extensions
511*8975f5c5SAndroid Build Coastguard Worker         if (IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_recordable"))
512*8975f5c5SAndroid Build Coastguard Worker         {
513*8975f5c5SAndroid Build Coastguard Worker             std::cout << "\tAndroid Recordable: "
514*8975f5c5SAndroid Build Coastguard Worker                       << GetAttrib(mDisplay, config, EGL_RECORDABLE_ANDROID) << std::endl;
515*8975f5c5SAndroid Build Coastguard Worker         }
516*8975f5c5SAndroid Build Coastguard Worker         if (IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_framebuffer_target"))
517*8975f5c5SAndroid Build Coastguard Worker         {
518*8975f5c5SAndroid Build Coastguard Worker             std::cout << "\tAndroid framebuffer target: "
519*8975f5c5SAndroid Build Coastguard Worker                       << GetAttrib(mDisplay, config, EGL_FRAMEBUFFER_TARGET_ANDROID) << std::endl;
520*8975f5c5SAndroid Build Coastguard Worker         }
521*8975f5c5SAndroid Build Coastguard Worker 
522*8975f5c5SAndroid Build Coastguard Worker         // Separator between configs
523*8975f5c5SAndroid Build Coastguard Worker         std::cout << std::endl;
524*8975f5c5SAndroid Build Coastguard Worker     }
525*8975f5c5SAndroid Build Coastguard Worker }
526*8975f5c5SAndroid Build Coastguard Worker 
527*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(EGLPrintEGLinfoTest,
528*8975f5c5SAndroid Build Coastguard Worker                        ES1_VULKAN(),
529*8975f5c5SAndroid Build Coastguard Worker                        ES1_VULKAN_SWIFTSHADER(),
530*8975f5c5SAndroid Build Coastguard Worker                        ES2_VULKAN(),
531*8975f5c5SAndroid Build Coastguard Worker                        ES3_VULKAN(),
532*8975f5c5SAndroid Build Coastguard Worker                        ES32_VULKAN(),
533*8975f5c5SAndroid Build Coastguard Worker                        ES31_VULKAN_SWIFTSHADER(),
534*8975f5c5SAndroid Build Coastguard Worker                        ES32_EGL());
535*8975f5c5SAndroid Build Coastguard Worker 
536*8975f5c5SAndroid Build Coastguard Worker // This test suite is not instantiated on some OSes.
537*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLPrintEGLinfoTest);
538