blob: 59be8c8074e3c7ca41fc6eff18b93ae409af29e0 [file] [log] [blame]
//
// 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