| // | |
| // 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 <iomanip> | |
| #include <sstream> | |
| namespace gl | |
| { | |
| namespace | |
| { | |
| template <typename EnumType> | |
| 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 <typename EnumType> | |
| 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<std::string> 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 |