// // Copyright 2019 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // gl_enum_utils.cpp: // Utility functions for converting GLenums to string. #include "common/gl_enum_utils.h" #include "common/bitset_utils.h" #include "common/string_utils.h" #include #include namespace gl { namespace { template void OutputGLenumStringImpl(std::ostream &out, EnumType enumGroup, unsigned int value) { const char *enumStr = GLenumToString(enumGroup, value); if (enumStr != kUnknownGLenumString) { out << enumStr; return; } if (enumGroup == EnumType::Boolean) { // If an unknown enum was submitted as GLboolean, just write out the value. if (enumStr == kUnknownGLenumString) { out << value; } else { out << enumStr; } return; } if (enumGroup != EnumType::AllEnums) { // Retry with the "Default" group enumStr = GLenumToString(EnumType::AllEnums, value); if (enumStr != kUnknownGLenumString) { out << enumStr; return; } } out << std::hex << "0x" << std::setfill('0') << std::setw(4) << value << std::dec; } template std::string GLbitfieldToStringImpl(EnumType enumGroup, unsigned int value) { std::stringstream st; if (value == 0) { return "0"; } const angle::BitSet<32> bitSet(value); bool first = true; for (const auto index : bitSet) { if (!first) { st << " | "; } first = false; unsigned int mask = 1u << index; OutputGLenumString(st, enumGroup, mask); } return st.str(); } } // namespace const char kUnknownGLenumString[] = "EnumUnknown"; void OutputGLenumString(std::ostream &out, GLESEnum enumGroup, unsigned int value) { return OutputGLenumStringImpl(out, enumGroup, value); } void OutputGLenumString(std::ostream &out, BigGLEnum enumGroup, unsigned int value) { return OutputGLenumStringImpl(out, enumGroup, value); } void OutputGLbitfieldString(std::ostream &out, GLESEnum enumGroup, unsigned int value) { out << GLbitfieldToString(enumGroup, value); } const char *GLbooleanToString(unsigned int value) { return GLenumToString(GLESEnum::Boolean, value); } std::string GLbitfieldToString(GLESEnum enumGroup, unsigned int value) { return GLbitfieldToStringImpl(enumGroup, value); } std::string GLbitfieldToString(BigGLEnum enumGroup, unsigned int value) { return GLbitfieldToStringImpl(enumGroup, value); } const char *GLinternalFormatToString(unsigned int format) { return GLenumToString(gl::GLESEnum::InternalFormat, format); } unsigned int StringToGLbitfield(const char *str) { unsigned int value = 0; std::vector strings = angle::SplitString(str, " |", angle::WhitespaceHandling::TRIM_WHITESPACE, angle::SplitResult::SPLIT_WANT_NONEMPTY); for (const std::string &enumString : strings) { value |= StringToGLenum(enumString.c_str()); } return value; } } // namespace gl