1 //
2 // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // gl_enum_utils.cpp:
7 //   Utility functions for converting GLenums to string.
8 
9 #include "libANGLE/gl_enum_utils.h"
10 
11 #include "common/bitset_utils.h"
12 
13 #include <iomanip>
14 #include <sstream>
15 
16 namespace gl
17 {
18 const char kUnknownGLenumString[] = "EnumUnknown";
19 
OutputGLenumString(std::ostream & out,GLenumGroup enumGroup,unsigned int value)20 void OutputGLenumString(std::ostream &out, GLenumGroup enumGroup, unsigned int value)
21 {
22     const char *enumStr = GLenumToString(enumGroup, value);
23     if (enumStr != kUnknownGLenumString)
24     {
25         out << enumStr;
26         return;
27     }
28 
29     if (enumGroup != GLenumGroup::DefaultGroup)
30     {
31         // Retry with the "Default" group
32         enumStr = GLenumToString(GLenumGroup::DefaultGroup, value);
33         if (enumStr != kUnknownGLenumString)
34         {
35             out << enumStr;
36             return;
37         }
38     }
39 
40     out << std::hex << "0x" << std::setfill('0') << std::setw(4) << value << std::dec;
41 }
42 
OutputGLbitfieldString(std::ostream & out,GLenumGroup enumGroup,unsigned int value)43 void OutputGLbitfieldString(std::ostream &out, GLenumGroup enumGroup, unsigned int value)
44 {
45     out << GLbitfieldToString(enumGroup, value);
46 }
47 
GLbooleanToString(unsigned int value)48 const char *GLbooleanToString(unsigned int value)
49 {
50     switch (value)
51     {
52         case 0x0:
53             return "GL_FALSE";
54         case 0x1:
55             return "GL_TRUE";
56         default:
57             return kUnknownGLenumString;
58     }
59 }
60 
GLbitfieldToString(GLenumGroup enumGroup,unsigned int value)61 std::string GLbitfieldToString(GLenumGroup enumGroup, unsigned int value)
62 {
63     std::stringstream st;
64 
65     if (value == 0)
66     {
67         return "0";
68     }
69 
70     const angle::BitSet<32> bitSet(value);
71     bool first = true;
72     for (const auto index : bitSet)
73     {
74         if (!first)
75         {
76             st << " | ";
77         }
78         first = false;
79 
80         unsigned int mask = 1u << index;
81         OutputGLenumString(st, enumGroup, mask);
82     }
83 
84     return st.str();
85 }
86 }  // namespace gl
87