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 // gl_enum_utils.cpp:
7*8975f5c5SAndroid Build Coastguard Worker // Utility functions for converting GLenums to string.
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "common/gl_enum_utils.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "common/bitset_utils.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "common/string_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker #include <iomanip>
15*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker namespace gl
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker namespace
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Worker template <typename EnumType>
OutputGLenumStringImpl(std::ostream & out,EnumType enumGroup,unsigned int value)23*8975f5c5SAndroid Build Coastguard Worker void OutputGLenumStringImpl(std::ostream &out, EnumType enumGroup, unsigned int value)
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker const char *enumStr = GLenumToString(enumGroup, value);
26*8975f5c5SAndroid Build Coastguard Worker if (enumStr != kUnknownGLenumString)
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker out << enumStr;
29*8975f5c5SAndroid Build Coastguard Worker return;
30*8975f5c5SAndroid Build Coastguard Worker }
31*8975f5c5SAndroid Build Coastguard Worker
32*8975f5c5SAndroid Build Coastguard Worker if (enumGroup == EnumType::Boolean)
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker // If an unknown enum was submitted as GLboolean, just write out the value.
35*8975f5c5SAndroid Build Coastguard Worker if (enumStr == kUnknownGLenumString)
36*8975f5c5SAndroid Build Coastguard Worker {
37*8975f5c5SAndroid Build Coastguard Worker out << value;
38*8975f5c5SAndroid Build Coastguard Worker }
39*8975f5c5SAndroid Build Coastguard Worker else
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker out << enumStr;
42*8975f5c5SAndroid Build Coastguard Worker }
43*8975f5c5SAndroid Build Coastguard Worker
44*8975f5c5SAndroid Build Coastguard Worker return;
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker
47*8975f5c5SAndroid Build Coastguard Worker if (enumGroup != EnumType::AllEnums)
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker // Retry with the "Default" group
50*8975f5c5SAndroid Build Coastguard Worker enumStr = GLenumToString(EnumType::AllEnums, value);
51*8975f5c5SAndroid Build Coastguard Worker if (enumStr != kUnknownGLenumString)
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker out << enumStr;
54*8975f5c5SAndroid Build Coastguard Worker return;
55*8975f5c5SAndroid Build Coastguard Worker }
56*8975f5c5SAndroid Build Coastguard Worker }
57*8975f5c5SAndroid Build Coastguard Worker
58*8975f5c5SAndroid Build Coastguard Worker out << std::hex << "0x" << std::setfill('0') << std::setw(4) << value << std::dec;
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker
61*8975f5c5SAndroid Build Coastguard Worker template <typename EnumType>
GLbitfieldToStringImpl(EnumType enumGroup,unsigned int value)62*8975f5c5SAndroid Build Coastguard Worker std::string GLbitfieldToStringImpl(EnumType enumGroup, unsigned int value)
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker std::stringstream st;
65*8975f5c5SAndroid Build Coastguard Worker
66*8975f5c5SAndroid Build Coastguard Worker if (value == 0)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker return "0";
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker
71*8975f5c5SAndroid Build Coastguard Worker const angle::BitSet<32> bitSet(value);
72*8975f5c5SAndroid Build Coastguard Worker bool first = true;
73*8975f5c5SAndroid Build Coastguard Worker for (const auto index : bitSet)
74*8975f5c5SAndroid Build Coastguard Worker {
75*8975f5c5SAndroid Build Coastguard Worker if (!first)
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker st << " | ";
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker first = false;
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker unsigned int mask = 1u << index;
82*8975f5c5SAndroid Build Coastguard Worker OutputGLenumString(st, enumGroup, mask);
83*8975f5c5SAndroid Build Coastguard Worker }
84*8975f5c5SAndroid Build Coastguard Worker
85*8975f5c5SAndroid Build Coastguard Worker return st.str();
86*8975f5c5SAndroid Build Coastguard Worker }
87*8975f5c5SAndroid Build Coastguard Worker } // namespace
88*8975f5c5SAndroid Build Coastguard Worker
89*8975f5c5SAndroid Build Coastguard Worker const char kUnknownGLenumString[] = "EnumUnknown";
90*8975f5c5SAndroid Build Coastguard Worker
OutputGLenumString(std::ostream & out,GLESEnum enumGroup,unsigned int value)91*8975f5c5SAndroid Build Coastguard Worker void OutputGLenumString(std::ostream &out, GLESEnum enumGroup, unsigned int value)
92*8975f5c5SAndroid Build Coastguard Worker {
93*8975f5c5SAndroid Build Coastguard Worker return OutputGLenumStringImpl(out, enumGroup, value);
94*8975f5c5SAndroid Build Coastguard Worker }
95*8975f5c5SAndroid Build Coastguard Worker
OutputGLenumString(std::ostream & out,BigGLEnum enumGroup,unsigned int value)96*8975f5c5SAndroid Build Coastguard Worker void OutputGLenumString(std::ostream &out, BigGLEnum enumGroup, unsigned int value)
97*8975f5c5SAndroid Build Coastguard Worker {
98*8975f5c5SAndroid Build Coastguard Worker return OutputGLenumStringImpl(out, enumGroup, value);
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker
OutputGLbitfieldString(std::ostream & out,GLESEnum enumGroup,unsigned int value)101*8975f5c5SAndroid Build Coastguard Worker void OutputGLbitfieldString(std::ostream &out, GLESEnum enumGroup, unsigned int value)
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker out << GLbitfieldToString(enumGroup, value);
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker
GLbooleanToString(unsigned int value)106*8975f5c5SAndroid Build Coastguard Worker const char *GLbooleanToString(unsigned int value)
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker return GLenumToString(GLESEnum::Boolean, value);
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker
GLbitfieldToString(GLESEnum enumGroup,unsigned int value)111*8975f5c5SAndroid Build Coastguard Worker std::string GLbitfieldToString(GLESEnum enumGroup, unsigned int value)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker return GLbitfieldToStringImpl(enumGroup, value);
114*8975f5c5SAndroid Build Coastguard Worker }
115*8975f5c5SAndroid Build Coastguard Worker
GLbitfieldToString(BigGLEnum enumGroup,unsigned int value)116*8975f5c5SAndroid Build Coastguard Worker std::string GLbitfieldToString(BigGLEnum enumGroup, unsigned int value)
117*8975f5c5SAndroid Build Coastguard Worker {
118*8975f5c5SAndroid Build Coastguard Worker return GLbitfieldToStringImpl(enumGroup, value);
119*8975f5c5SAndroid Build Coastguard Worker }
120*8975f5c5SAndroid Build Coastguard Worker
GLinternalFormatToString(unsigned int format)121*8975f5c5SAndroid Build Coastguard Worker const char *GLinternalFormatToString(unsigned int format)
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker return GLenumToString(gl::GLESEnum::InternalFormat, format);
124*8975f5c5SAndroid Build Coastguard Worker }
125*8975f5c5SAndroid Build Coastguard Worker
StringToGLbitfield(const char * str)126*8975f5c5SAndroid Build Coastguard Worker unsigned int StringToGLbitfield(const char *str)
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker unsigned int value = 0;
129*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> strings =
130*8975f5c5SAndroid Build Coastguard Worker angle::SplitString(str, " |", angle::WhitespaceHandling::TRIM_WHITESPACE,
131*8975f5c5SAndroid Build Coastguard Worker angle::SplitResult::SPLIT_WANT_NONEMPTY);
132*8975f5c5SAndroid Build Coastguard Worker for (const std::string &enumString : strings)
133*8975f5c5SAndroid Build Coastguard Worker {
134*8975f5c5SAndroid Build Coastguard Worker value |= StringToGLenum(enumString.c_str());
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker return value;
137*8975f5c5SAndroid Build Coastguard Worker }
138*8975f5c5SAndroid Build Coastguard Worker } // namespace gl
139