Path: blob/main_old/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp
1693 views
//1// Copyright 2019 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// EGLPrintEGLinfoTest.cpp:6// This test prints out the extension strings, configs and their attributes7//89#include <gtest/gtest.h>1011#include "common/string_utils.h"12#include "test_utils/ANGLETest.h"1314using namespace angle;1516class EGLPrintEGLinfoTest : public ANGLETest17{18protected:19EGLPrintEGLinfoTest() {}2021void testSetUp() override22{23mDisplay = getEGLWindow()->getDisplay();24ASSERT_TRUE(mDisplay != EGL_NO_DISPLAY);25}2627EGLDisplay mDisplay = EGL_NO_DISPLAY;28};2930namespace31{32// Parse space separated extension string into a vector of strings33std::vector<std::string> ParseExtensions(const char *extensions)34{35std::string extensionsStr(extensions);36std::vector<std::string> extensionsVec;37SplitStringAlongWhitespace(extensionsStr, &extensionsVec);38return extensionsVec;39}4041// Query a EGL attribute42EGLint GetAttrib(EGLDisplay display, EGLConfig config, EGLint attrib)43{44EGLint value = 0;45EXPECT_EGL_TRUE(eglGetConfigAttrib(display, config, attrib, &value));46return value;47}4849// Query a egl string50const char *GetEGLString(EGLDisplay display, EGLint name)51{52const char *value = "";53value = eglQueryString(display, name);54EXPECT_TRUE(value != nullptr);55return value;56}5758// Query a GL string59const char *GetGLString(EGLint name)60{61const char *value = "";62value = reinterpret_cast<const char *>(glGetString(name));63EXPECT_TRUE(value != nullptr);64return value;65}6667} // namespace6869// Print the EGL strings and extensions70TEST_P(EGLPrintEGLinfoTest, PrintEGLInfo)71{72std::cout << " EGL Information:" << std::endl;73std::cout << "\tVendor: " << GetEGLString(mDisplay, EGL_VENDOR) << std::endl;74std::cout << "\tVersion: " << GetEGLString(mDisplay, EGL_VENDOR) << std::endl;75std::cout << "\tClient APIs: " << GetEGLString(mDisplay, EGL_CLIENT_APIS) << std::endl;7677std::cout << "\tEGL Client Extensions:" << std::endl;78for (auto extension : ParseExtensions(GetEGLString(EGL_NO_DISPLAY, EGL_EXTENSIONS)))79{80std::cout << "\t\t" << extension << std::endl;81}8283std::cout << "\tEGL Display Extensions:" << std::endl;84for (auto extension : ParseExtensions(GetEGLString(mDisplay, EGL_EXTENSIONS)))85{86std::cout << "\t\t" << extension << std::endl;87}8889std::cout << std::endl;90}9192// Print the GL strings and extensions93TEST_P(EGLPrintEGLinfoTest, PrintGLInfo)94{95std::cout << " GLES Information:" << std::endl;96std::cout << "\tVendor: " << GetGLString(GL_VENDOR) << std::endl;97std::cout << "\tVersion: " << GetGLString(GL_VERSION) << std::endl;98std::cout << "\tRenderer: " << GetGLString(GL_RENDERER) << std::endl;99std::cout << "\tShader: " << GetGLString(GL_SHADING_LANGUAGE_VERSION) << std::endl;100101std::cout << "\tExtensions:" << std::endl;102for (auto extension : ParseExtensions(GetGLString(GL_EXTENSIONS)))103{104std::cout << "\t\t" << extension << std::endl;105}106107std::cout << std::endl;108}109110#define QUERY_HELPER(enumValue, enumString, stream) \111{ \112GLint result; \113glGetIntegerv(enumValue, &result); \114ASSERT_GL_NO_ERROR(); \115stream << enumString + std::string(",") + std::to_string(result) << std::endl; \116}117118#define QUERY_ARRAY_HELPER(enumValue, enumString, size, stream) \119{ \120GLint result[size]; \121glGetIntegerv(enumValue, result); \122ASSERT_GL_NO_ERROR(); \123std::stringstream results; \124for (int i = 0; i < size; i++) \125results << result[i] << " "; \126stream << enumString + std::string(",") + results.str() << std::endl; \127}128129#define QUERY_INDEXED_HELPER(enumValue, enumString, index, stream) \130{ \131GLint result; \132glGetIntegeri_v(enumValue, index, &result); \133ASSERT_GL_NO_ERROR(); \134stream << enumString + std::string(",") + std::to_string(result) << std::endl; \135}136137#define QUERY_AND_LOG_CAPABILITY(enum, stream) QUERY_HELPER(enum, #enum, stream)138139#define QUERY_AND_LOG_CAPABILITY_ARRAY(enum, size, stream) \140QUERY_ARRAY_HELPER(enum, #enum, size, stream)141142#define QUERY_AND_LOG_CAPABILITY_INDEXED(enum, index, stream) \143QUERY_INDEXED_HELPER(enum, #enum "[" #index "]", index, stream)144145static void LogGles2Capabilities(std::ostream &stream)146{147QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, stream);148QUERY_AND_LOG_CAPABILITY(GL_MAX_CUBE_MAP_TEXTURE_SIZE, stream);149QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_VECTORS, stream);150QUERY_AND_LOG_CAPABILITY(GL_MAX_RENDERBUFFER_SIZE, stream);151QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_IMAGE_UNITS, stream);152QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_SIZE, stream);153QUERY_AND_LOG_CAPABILITY(GL_MAX_VARYING_VECTORS, stream);154QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIBS, stream);155QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, stream);156QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_VECTORS, stream);157constexpr int kMaxViewPortDimsReturnValuesSize = 2;158QUERY_AND_LOG_CAPABILITY_ARRAY(GL_MAX_VIEWPORT_DIMS, kMaxViewPortDimsReturnValuesSize, stream);159QUERY_AND_LOG_CAPABILITY(GL_NUM_COMPRESSED_TEXTURE_FORMATS, stream);160QUERY_AND_LOG_CAPABILITY(GL_NUM_SHADER_BINARY_FORMATS, stream);161}162163static void LogGles3Capabilities(std::ostream &stream)164{165QUERY_AND_LOG_CAPABILITY(GL_MAX_3D_TEXTURE_SIZE, stream);166QUERY_AND_LOG_CAPABILITY(GL_MAX_ARRAY_TEXTURE_LAYERS, stream);167QUERY_AND_LOG_CAPABILITY(GL_MAX_COLOR_ATTACHMENTS, stream);168QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, stream);169QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_UNIFORM_BLOCKS, stream);170QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, stream);171QUERY_AND_LOG_CAPABILITY(GL_MAX_DRAW_BUFFERS, stream);172QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENT_INDEX, stream);173QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENTS_INDICES, stream);174QUERY_AND_LOG_CAPABILITY(GL_MAX_ELEMENTS_VERTICES, stream);175QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_INPUT_COMPONENTS, stream);176QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_BLOCKS, stream);177QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, stream);178QUERY_AND_LOG_CAPABILITY(GL_MAX_PROGRAM_TEXEL_OFFSET, stream);179QUERY_AND_LOG_CAPABILITY(GL_MAX_SAMPLES, stream);180QUERY_AND_LOG_CAPABILITY(GL_MAX_SERVER_WAIT_TIMEOUT, stream);181QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_LOD_BIAS, stream);182QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, stream);183QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, stream);184QUERY_AND_LOG_CAPABILITY(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, stream);185QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_BLOCK_SIZE, stream);186QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_BUFFER_BINDINGS, stream);187QUERY_AND_LOG_CAPABILITY(GL_MAX_VARYING_COMPONENTS, stream);188QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_OUTPUT_COMPONENTS, stream);189QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_BLOCKS, stream);190QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_UNIFORM_COMPONENTS, stream);191QUERY_AND_LOG_CAPABILITY(GL_MIN_PROGRAM_TEXEL_OFFSET, stream);192QUERY_AND_LOG_CAPABILITY(GL_NUM_PROGRAM_BINARY_FORMATS, stream);193// GLES3 capabilities are a superset of GLES2194LogGles2Capabilities(stream);195}196197static void LogGles31Capabilities(std::ostream &stream)198{199QUERY_AND_LOG_CAPABILITY(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, stream);200QUERY_AND_LOG_CAPABILITY(GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE, stream);201QUERY_AND_LOG_CAPABILITY(GL_MAX_COLOR_TEXTURE_SAMPLES, stream);202QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, stream);203QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_ATOMIC_COUNTERS, stream);204QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, stream);205QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_IMAGE_UNIFORMS, stream);206QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES, stream);207QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS, stream);208QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, stream);209QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_ATOMIC_COUNTERS, stream);210QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_IMAGE_UNIFORMS, stream);211QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS, stream);212QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_SHARED_MEMORY_SIZE, stream);213QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, stream);214QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_UNIFORM_BLOCKS, stream);215QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_UNIFORM_COMPONENTS, stream);216QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, stream);217QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, stream);218QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, stream);219QUERY_AND_LOG_CAPABILITY(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, stream);220QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, stream);221QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, stream);222QUERY_AND_LOG_CAPABILITY_INDEXED(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, stream);223QUERY_AND_LOG_CAPABILITY(GL_MAX_DEPTH_TEXTURE_SAMPLES, stream);224QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, stream);225QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_ATOMIC_COUNTERS, stream);226QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, stream);227QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, stream);228QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_HEIGHT, stream);229QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_SAMPLES, stream);230QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_WIDTH, stream);231QUERY_AND_LOG_CAPABILITY(GL_MAX_IMAGE_UNITS, stream);232QUERY_AND_LOG_CAPABILITY(GL_MAX_INTEGER_SAMPLES, stream);233QUERY_AND_LOG_CAPABILITY(GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, stream);234QUERY_AND_LOG_CAPABILITY(GL_MAX_SAMPLE_MASK_WORDS, stream);235QUERY_AND_LOG_CAPABILITY(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, stream);236QUERY_AND_LOG_CAPABILITY(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, stream);237QUERY_AND_LOG_CAPABILITY(GL_MAX_UNIFORM_LOCATIONS, stream);238QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, stream);239QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATOMIC_COUNTERS, stream);240QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_BINDINGS, stream);241QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, stream);242QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_ATTRIB_STRIDE, stream);243QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_IMAGE_UNIFORMS, stream);244QUERY_AND_LOG_CAPABILITY(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, stream);245QUERY_AND_LOG_CAPABILITY(GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, stream);246247// GLES31 capabilities are a superset of GLES3248LogGles3Capabilities(stream);249}250251static void LogGles32Capabilities(std::ostream &stream)252{253// Most of these capabilities are not implemented yet.254ANGLE_SKIP_TEST_IF(IsVulkan());255256QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS, stream);257QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS, stream);258QUERY_AND_LOG_CAPABILITY(GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS, stream);259QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_GROUP_STACK_DEPTH, stream);260QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_LOGGED_MESSAGES, stream);261QUERY_AND_LOG_CAPABILITY(GL_MAX_DEBUG_MESSAGE_LENGTH, stream);262QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAGMENT_INTERPOLATION_OFFSET, stream);263QUERY_AND_LOG_CAPABILITY(GL_MAX_FRAMEBUFFER_LAYERS, stream);264QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS, stream);265QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_ATOMIC_COUNTERS, stream);266QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, stream);267QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_INPUT_COMPONENTS, stream);268QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_OUTPUT_COMPONENTS, stream);269QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_OUTPUT_VERTICES, stream);270QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_SHADER_INVOCATIONS, stream);271QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS, stream);272QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, stream);273QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, stream);274QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_UNIFORM_BLOCKS, stream);275QUERY_AND_LOG_CAPABILITY(GL_MAX_GEOMETRY_UNIFORM_COMPONENTS, stream);276QUERY_AND_LOG_CAPABILITY(GL_MAX_LABEL_LENGTH, stream);277QUERY_AND_LOG_CAPABILITY(GL_MAX_PATCH_VERTICES, stream);278QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS, stream);279QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS, stream);280QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, stream);281QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_INPUT_COMPONENTS, stream);282QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS, stream);283QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS, stream);284QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS, stream);285QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS, stream);286QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS, stream);287QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS, stream);288QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS, stream);289QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS, stream);290QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, stream);291QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS, stream);292QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS, stream);293QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS, stream);294QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, stream);295QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS, stream);296QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS, stream);297QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_GEN_LEVEL, stream);298QUERY_AND_LOG_CAPABILITY(GL_MAX_TESS_PATCH_COMPONENTS, stream);299QUERY_AND_LOG_CAPABILITY(GL_MAX_TEXTURE_BUFFER_SIZE, stream);300QUERY_AND_LOG_CAPABILITY(GL_MIN_FRAGMENT_INTERPOLATION_OFFSET, stream);301QUERY_AND_LOG_CAPABILITY(GL_MIN_SAMPLE_SHADING_VALUE, stream);302303// GLES32 capabilities are a superset of GLES31304LogGles31Capabilities(stream);305}306307// Prints GLES Capabilities listed at308// https://opengles.gpuinfo.org/listcapabilities.php309// in CSV format310TEST_P(EGLPrintEGLinfoTest, PrintGLESCapabilities)311{312std::cout << std::endl << "Capability name, value" << std::endl << std::endl;313314std::ostream &stream = std::cout;315316switch (getClientMajorVersion())317{318case 3:319switch (getClientMinorVersion())320{321case 2:322LogGles32Capabilities(stream);323break;324case 1:325LogGles31Capabilities(stream);326break;327case 0:328LogGles3Capabilities(stream);329break;330default:331FAIL() << "unknown client minor version.";332}333break;334case 2:335LogGles2Capabilities(stream);336break;337default:338FAIL() << "unknown client major version.";339}340341stream << std::endl;342}343344// Print the EGL configs with attributes345TEST_P(EGLPrintEGLinfoTest, PrintConfigInfo)346{347// Get all the configs348EGLint count;349EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, nullptr, 0, &count));350EXPECT_TRUE(count > 0);351std::vector<EGLConfig> configs(count);352EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, configs.data(), count, &count));353configs.resize(count);354// sort configs by increaing ID355std::sort(configs.begin(), configs.end(), [this](EGLConfig a, EGLConfig b) -> bool {356return GetAttrib(mDisplay, a, EGL_CONFIG_ID) < GetAttrib(mDisplay, b, EGL_CONFIG_ID);357});358359std::cout << "Configs - Count: " << count << std::endl;360361// For each config, print its attributes362for (auto config : configs)363{364// Config ID365std::cout << " Config: " << GetAttrib(mDisplay, config, EGL_CONFIG_ID) << std::endl;366367// Color368const char *componentType = (GetAttrib(mDisplay, config, EGL_COLOR_COMPONENT_TYPE_EXT) ==369EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT)370? "Float "371: "Fixed ";372const char *colorBuffType =373(GetAttrib(mDisplay, config, EGL_COLOR_BUFFER_TYPE) == EGL_LUMINANCE_BUFFER)374? "LUMINANCE"375: "RGB";376std::cout << "\tColor:" << GetAttrib(mDisplay, config, EGL_BUFFER_SIZE) << "bit "377<< componentType << colorBuffType378<< " Red:" << GetAttrib(mDisplay, config, EGL_RED_SIZE)379<< " Green:" << GetAttrib(mDisplay, config, EGL_GREEN_SIZE)380<< " Blue:" << GetAttrib(mDisplay, config, EGL_BLUE_SIZE)381<< " Alpha:" << GetAttrib(mDisplay, config, EGL_ALPHA_SIZE)382<< " Lum:" << GetAttrib(mDisplay, config, EGL_LUMINANCE_SIZE)383<< " AlphaMask:" << GetAttrib(mDisplay, config, EGL_ALPHA_MASK_SIZE) << std::endl;384385// Texture Binding386std::cout << "\tBinding RGB:" << (bool)GetAttrib(mDisplay, config, EGL_BIND_TO_TEXTURE_RGB)387<< " RGBA:" << (bool)GetAttrib(mDisplay, config, EGL_BIND_TO_TEXTURE_RGBA)388<< " MaxWidth:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_WIDTH)389<< " MaxHeight:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_HEIGHT)390<< " MaxPixels:" << GetAttrib(mDisplay, config, EGL_MAX_PBUFFER_PIXELS)391<< std::endl;392393// Conformant394EGLint caveatAttrib = GetAttrib(mDisplay, config, EGL_CONFIG_CAVEAT);395const char *caveat = nullptr;396switch (caveatAttrib)397{398case EGL_NONE:399caveat = "None.";400break;401case EGL_SLOW_CONFIG:402caveat = "Slow.";403break;404case EGL_NON_CONFORMANT_CONFIG:405caveat = "Non-Conformant.";406break;407default:408caveat = ".";409}410std::cout << "\tCaveate: " << caveat;411412EGLint conformant = GetAttrib(mDisplay, config, EGL_CONFORMANT);413std::cout << " Conformant: ";414if (conformant & EGL_OPENGL_BIT)415std::cout << "OpenGL ";416if (conformant & EGL_OPENGL_ES_BIT)417std::cout << "ES1 ";418if (conformant & EGL_OPENGL_ES2_BIT)419std::cout << "ES2 ";420if (conformant & EGL_OPENGL_ES3_BIT)421std::cout << "ES3";422std::cout << std::endl;423424// Ancilary buffers425std::cout << "\tAncilary "426<< "Depth:" << GetAttrib(mDisplay, config, EGL_DEPTH_SIZE)427<< " Stencil:" << GetAttrib(mDisplay, config, EGL_STENCIL_SIZE)428<< " SampleBuffs:" << GetAttrib(mDisplay, config, EGL_SAMPLE_BUFFERS)429<< " Samples:" << GetAttrib(mDisplay, config, EGL_SAMPLES) << std::endl;430431// Swap interval432std::cout << "\tSwap Interval"433<< " Min:" << GetAttrib(mDisplay, config, EGL_MIN_SWAP_INTERVAL)434<< " Max:" << GetAttrib(mDisplay, config, EGL_MAX_SWAP_INTERVAL) << std::endl;435436// Native437std::cout << "\tNative Renderable: " << GetAttrib(mDisplay, config, EGL_NATIVE_RENDERABLE)438<< ", VisualID: " << GetAttrib(mDisplay, config, EGL_NATIVE_VISUAL_ID)439<< ", VisualType: " << GetAttrib(mDisplay, config, EGL_NATIVE_VISUAL_TYPE)440<< std::endl;441442// Surface type443EGLint surfaceType = GetAttrib(mDisplay, config, EGL_SURFACE_TYPE);444std::cout << "\tSurface Type: ";445if (surfaceType & EGL_WINDOW_BIT)446std::cout << "WINDOW ";447if (surfaceType & EGL_PIXMAP_BIT)448std::cout << "PIXMAP ";449if (surfaceType & EGL_PBUFFER_BIT)450std::cout << "PBUFFER ";451if (surfaceType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT)452std::cout << "MULTISAMPLE_RESOLVE_BOX ";453if (surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)454std::cout << "SWAP_PRESERVE ";455std::cout << std::endl;456457// Renderable458EGLint rendType = GetAttrib(mDisplay, config, EGL_RENDERABLE_TYPE);459std::cout << "\tRender: ";460if (rendType & EGL_OPENGL_BIT)461std::cout << "OpenGL ";462if (rendType & EGL_OPENGL_ES_BIT)463std::cout << "ES1 ";464if (rendType & EGL_OPENGL_ES2_BIT)465std::cout << "ES2 ";466if (rendType & EGL_OPENGL_ES3_BIT)467std::cout << "ES3 ";468std::cout << std::endl;469470// Extensions471if (IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_recordable"))472{473std::cout << "\tAndroid Recordable: "474<< GetAttrib(mDisplay, config, EGL_RECORDABLE_ANDROID) << std::endl;475}476if (IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANDROID_framebuffer_target"))477{478std::cout << "\tAndroid framebuffer target: "479<< GetAttrib(mDisplay, config, EGL_FRAMEBUFFER_TARGET_ANDROID) << std::endl;480}481482// Separator between configs483std::cout << std::endl;484}485}486487ANGLE_INSTANTIATE_TEST(EGLPrintEGLinfoTest, ES2_VULKAN(), ES3_VULKAN(), ES32_VULKAN());488489// This test suite is not instantiated on some OSes.490GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLPrintEGLinfoTest);491492493