xref: /aosp_15_r20/external/angle/src/common/gl_enum_utils.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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