xref: /aosp_15_r20/external/angle/src/common/PackedEnums.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker // Copyright 2017 The ANGLE Project Authors. All rights reserved.
2*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
4*8975f5c5SAndroid Build Coastguard Worker //
5*8975f5c5SAndroid Build Coastguard Worker // PackedGLEnums_autogen.h:
6*8975f5c5SAndroid Build Coastguard Worker //   Declares ANGLE-specific enums classes for GLEnum and functions operating
7*8975f5c5SAndroid Build Coastguard Worker //   on them.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_PACKEDGLENUMS_H_
10*8975f5c5SAndroid Build Coastguard Worker #define COMMON_PACKEDGLENUMS_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEGLEnums_autogen.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedGLEnums_autogen.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include <array>
16*8975f5c5SAndroid Build Coastguard Worker #include <bitset>
17*8975f5c5SAndroid Build Coastguard Worker #include <cstddef>
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker #include <EGL/egl.h>
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker #include "common/bitset_utils.h"
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker namespace angle
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker // Return the number of elements of a packed enum, including the InvalidEnum element.
27*8975f5c5SAndroid Build Coastguard Worker template <typename E>
EnumSize()28*8975f5c5SAndroid Build Coastguard Worker constexpr size_t EnumSize()
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker     using UnderlyingType = typename std::underlying_type<E>::type;
31*8975f5c5SAndroid Build Coastguard Worker     return static_cast<UnderlyingType>(E::EnumCount);
32*8975f5c5SAndroid Build Coastguard Worker }
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker // Implementation of AllEnums which allows iterating over all the possible values for a packed enums
35*8975f5c5SAndroid Build Coastguard Worker // like so:
36*8975f5c5SAndroid Build Coastguard Worker //     for (auto value : AllEnums<MyPackedEnum>()) {
37*8975f5c5SAndroid Build Coastguard Worker //         // Do something with the enum.
38*8975f5c5SAndroid Build Coastguard Worker //     }
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker template <typename E>
41*8975f5c5SAndroid Build Coastguard Worker class EnumIterator final
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker   private:
44*8975f5c5SAndroid Build Coastguard Worker     using UnderlyingType = typename std::underlying_type<E>::type;
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker   public:
EnumIterator(E value)47*8975f5c5SAndroid Build Coastguard Worker     EnumIterator(E value) : mValue(static_cast<UnderlyingType>(value)) {}
48*8975f5c5SAndroid Build Coastguard Worker     EnumIterator &operator++()
49*8975f5c5SAndroid Build Coastguard Worker     {
50*8975f5c5SAndroid Build Coastguard Worker         mValue++;
51*8975f5c5SAndroid Build Coastguard Worker         return *this;
52*8975f5c5SAndroid Build Coastguard Worker     }
53*8975f5c5SAndroid Build Coastguard Worker     bool operator==(const EnumIterator &other) const { return mValue == other.mValue; }
54*8975f5c5SAndroid Build Coastguard Worker     bool operator!=(const EnumIterator &other) const { return mValue != other.mValue; }
55*8975f5c5SAndroid Build Coastguard Worker     E operator*() const { return static_cast<E>(mValue); }
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker   private:
58*8975f5c5SAndroid Build Coastguard Worker     UnderlyingType mValue;
59*8975f5c5SAndroid Build Coastguard Worker };
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker template <typename E, size_t MaxSize = EnumSize<E>()>
62*8975f5c5SAndroid Build Coastguard Worker struct AllEnums
63*8975f5c5SAndroid Build Coastguard Worker {
beginAllEnums64*8975f5c5SAndroid Build Coastguard Worker     EnumIterator<E> begin() const { return {static_cast<E>(0)}; }
endAllEnums65*8975f5c5SAndroid Build Coastguard Worker     EnumIterator<E> end() const { return {static_cast<E>(MaxSize)}; }
66*8975f5c5SAndroid Build Coastguard Worker };
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker // PackedEnumMap<E, T> is like an std::array<T, E::EnumCount> but is indexed with enum values. It
69*8975f5c5SAndroid Build Coastguard Worker // implements all of the std::array interface except with enum values instead of indices.
70*8975f5c5SAndroid Build Coastguard Worker template <typename E, typename T, size_t MaxSize = EnumSize<E>()>
71*8975f5c5SAndroid Build Coastguard Worker class PackedEnumMap
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker     using UnderlyingType = typename std::underlying_type<E>::type;
74*8975f5c5SAndroid Build Coastguard Worker     using Storage        = std::array<T, MaxSize>;
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker   public:
77*8975f5c5SAndroid Build Coastguard Worker     using InitPair = std::pair<E, T>;
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     constexpr PackedEnumMap() = default;
80*8975f5c5SAndroid Build Coastguard Worker 
PackedEnumMap(std::initializer_list<InitPair> init)81*8975f5c5SAndroid Build Coastguard Worker     constexpr PackedEnumMap(std::initializer_list<InitPair> init) : mPrivateData{}
82*8975f5c5SAndroid Build Coastguard Worker     {
83*8975f5c5SAndroid Build Coastguard Worker         // We use a for loop instead of range-for to work around a limitation in MSVC.
84*8975f5c5SAndroid Build Coastguard Worker         for (const InitPair *it = init.begin(); it != init.end(); ++it)
85*8975f5c5SAndroid Build Coastguard Worker         {
86*8975f5c5SAndroid Build Coastguard Worker             mPrivateData[static_cast<UnderlyingType>(it->first)] = it->second;
87*8975f5c5SAndroid Build Coastguard Worker         }
88*8975f5c5SAndroid Build Coastguard Worker     }
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker     // types:
91*8975f5c5SAndroid Build Coastguard Worker     using value_type      = T;
92*8975f5c5SAndroid Build Coastguard Worker     using pointer         = T *;
93*8975f5c5SAndroid Build Coastguard Worker     using const_pointer   = const T *;
94*8975f5c5SAndroid Build Coastguard Worker     using reference       = T &;
95*8975f5c5SAndroid Build Coastguard Worker     using const_reference = const T &;
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker     using size_type       = size_t;
98*8975f5c5SAndroid Build Coastguard Worker     using difference_type = ptrdiff_t;
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     using iterator               = typename Storage::iterator;
101*8975f5c5SAndroid Build Coastguard Worker     using const_iterator         = typename Storage::const_iterator;
102*8975f5c5SAndroid Build Coastguard Worker     using reverse_iterator       = std::reverse_iterator<iterator>;
103*8975f5c5SAndroid Build Coastguard Worker     using const_reverse_iterator = std::reverse_iterator<const_iterator>;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker     // No explicit construct/copy/destroy for aggregate type
fill(const T & u)106*8975f5c5SAndroid Build Coastguard Worker     void fill(const T &u) { mPrivateData.fill(u); }
swap(PackedEnumMap<E,T,MaxSize> & a)107*8975f5c5SAndroid Build Coastguard Worker     void swap(PackedEnumMap<E, T, MaxSize> &a) noexcept { mPrivateData.swap(a.mPrivateData); }
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker     // iterators:
begin()110*8975f5c5SAndroid Build Coastguard Worker     iterator begin() noexcept { return mPrivateData.begin(); }
begin()111*8975f5c5SAndroid Build Coastguard Worker     const_iterator begin() const noexcept { return mPrivateData.begin(); }
end()112*8975f5c5SAndroid Build Coastguard Worker     iterator end() noexcept { return mPrivateData.end(); }
end()113*8975f5c5SAndroid Build Coastguard Worker     const_iterator end() const noexcept { return mPrivateData.end(); }
114*8975f5c5SAndroid Build Coastguard Worker 
rbegin()115*8975f5c5SAndroid Build Coastguard Worker     reverse_iterator rbegin() noexcept { return mPrivateData.rbegin(); }
rbegin()116*8975f5c5SAndroid Build Coastguard Worker     const_reverse_iterator rbegin() const noexcept { return mPrivateData.rbegin(); }
rend()117*8975f5c5SAndroid Build Coastguard Worker     reverse_iterator rend() noexcept { return mPrivateData.rend(); }
rend()118*8975f5c5SAndroid Build Coastguard Worker     const_reverse_iterator rend() const noexcept { return mPrivateData.rend(); }
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     // capacity:
size()121*8975f5c5SAndroid Build Coastguard Worker     constexpr size_type size() const noexcept { return mPrivateData.size(); }
max_size()122*8975f5c5SAndroid Build Coastguard Worker     constexpr size_type max_size() const noexcept { return mPrivateData.max_size(); }
empty()123*8975f5c5SAndroid Build Coastguard Worker     constexpr bool empty() const noexcept { return mPrivateData.empty(); }
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker     // element access:
126*8975f5c5SAndroid Build Coastguard Worker     reference operator[](E n)
127*8975f5c5SAndroid Build Coastguard Worker     {
128*8975f5c5SAndroid Build Coastguard Worker         ASSERT(static_cast<size_t>(n) < mPrivateData.size());
129*8975f5c5SAndroid Build Coastguard Worker         return mPrivateData[static_cast<UnderlyingType>(n)];
130*8975f5c5SAndroid Build Coastguard Worker     }
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker     constexpr const_reference operator[](E n) const
133*8975f5c5SAndroid Build Coastguard Worker     {
134*8975f5c5SAndroid Build Coastguard Worker         ASSERT(static_cast<size_t>(n) < mPrivateData.size());
135*8975f5c5SAndroid Build Coastguard Worker         return mPrivateData[static_cast<UnderlyingType>(n)];
136*8975f5c5SAndroid Build Coastguard Worker     }
137*8975f5c5SAndroid Build Coastguard Worker 
at(E n)138*8975f5c5SAndroid Build Coastguard Worker     const_reference at(E n) const { return mPrivateData.at(static_cast<UnderlyingType>(n)); }
at(E n)139*8975f5c5SAndroid Build Coastguard Worker     reference at(E n) { return mPrivateData.at(static_cast<UnderlyingType>(n)); }
140*8975f5c5SAndroid Build Coastguard Worker 
front()141*8975f5c5SAndroid Build Coastguard Worker     reference front() { return mPrivateData.front(); }
front()142*8975f5c5SAndroid Build Coastguard Worker     const_reference front() const { return mPrivateData.front(); }
back()143*8975f5c5SAndroid Build Coastguard Worker     reference back() { return mPrivateData.back(); }
back()144*8975f5c5SAndroid Build Coastguard Worker     const_reference back() const { return mPrivateData.back(); }
145*8975f5c5SAndroid Build Coastguard Worker 
data()146*8975f5c5SAndroid Build Coastguard Worker     T *data() noexcept { return mPrivateData.data(); }
data()147*8975f5c5SAndroid Build Coastguard Worker     const T *data() const noexcept { return mPrivateData.data(); }
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     bool operator==(const PackedEnumMap &rhs) const { return mPrivateData == rhs.mPrivateData; }
150*8975f5c5SAndroid Build Coastguard Worker     bool operator!=(const PackedEnumMap &rhs) const { return mPrivateData != rhs.mPrivateData; }
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     template <typename SubT = T>
153*8975f5c5SAndroid Build Coastguard Worker     typename std::enable_if<std::is_integral<SubT>::value>::type operator+=(
154*8975f5c5SAndroid Build Coastguard Worker         const PackedEnumMap<E, SubT, MaxSize> &rhs)
155*8975f5c5SAndroid Build Coastguard Worker     {
156*8975f5c5SAndroid Build Coastguard Worker         for (E e : AllEnums<E, MaxSize>())
157*8975f5c5SAndroid Build Coastguard Worker         {
158*8975f5c5SAndroid Build Coastguard Worker             at(e) += rhs[e];
159*8975f5c5SAndroid Build Coastguard Worker         }
160*8975f5c5SAndroid Build Coastguard Worker     }
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker   private:
163*8975f5c5SAndroid Build Coastguard Worker     Storage mPrivateData;
164*8975f5c5SAndroid Build Coastguard Worker };
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker // PackedEnumBitSetE> is like an std::bitset<E::EnumCount> but is indexed with enum values. It
167*8975f5c5SAndroid Build Coastguard Worker // implements the std::bitset interface except with enum values instead of indices.
168*8975f5c5SAndroid Build Coastguard Worker template <typename E, typename DataT = uint32_t>
169*8975f5c5SAndroid Build Coastguard Worker using PackedEnumBitSet = BitSetT<EnumSize<E>(), DataT, E>;
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_DEFINE_ID_TYPE(Type)          \
174*8975f5c5SAndroid Build Coastguard Worker     class Type;                             \
175*8975f5c5SAndroid Build Coastguard Worker     struct Type##ID                         \
176*8975f5c5SAndroid Build Coastguard Worker     {                                       \
177*8975f5c5SAndroid Build Coastguard Worker         GLuint value;                       \
178*8975f5c5SAndroid Build Coastguard Worker     };                                      \
179*8975f5c5SAndroid Build Coastguard Worker     template <>                             \
180*8975f5c5SAndroid Build Coastguard Worker     struct ResourceTypeToID<Type>           \
181*8975f5c5SAndroid Build Coastguard Worker     {                                       \
182*8975f5c5SAndroid Build Coastguard Worker         using IDType = Type##ID;            \
183*8975f5c5SAndroid Build Coastguard Worker     };                                      \
184*8975f5c5SAndroid Build Coastguard Worker     template <>                             \
185*8975f5c5SAndroid Build Coastguard Worker     struct IsResourceIDType<Type##ID>       \
186*8975f5c5SAndroid Build Coastguard Worker     {                                       \
187*8975f5c5SAndroid Build Coastguard Worker         static constexpr bool value = true; \
188*8975f5c5SAndroid Build Coastguard Worker     };
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker namespace gl
191*8975f5c5SAndroid Build Coastguard Worker {
192*8975f5c5SAndroid Build Coastguard Worker 
193*8975f5c5SAndroid Build Coastguard Worker TextureType TextureTargetToType(TextureTarget target);
194*8975f5c5SAndroid Build Coastguard Worker TextureTarget NonCubeTextureTypeToTarget(TextureType type);
195*8975f5c5SAndroid Build Coastguard Worker 
196*8975f5c5SAndroid Build Coastguard Worker TextureTarget CubeFaceIndexToTextureTarget(size_t face);
197*8975f5c5SAndroid Build Coastguard Worker size_t CubeMapTextureTargetToFaceIndex(TextureTarget target);
198*8975f5c5SAndroid Build Coastguard Worker bool IsCubeMapFaceTarget(TextureTarget target);
199*8975f5c5SAndroid Build Coastguard Worker 
200*8975f5c5SAndroid Build Coastguard Worker constexpr TextureTarget kCubeMapTextureTargetMin = TextureTarget::CubeMapPositiveX;
201*8975f5c5SAndroid Build Coastguard Worker constexpr TextureTarget kCubeMapTextureTargetMax = TextureTarget::CubeMapNegativeZ;
202*8975f5c5SAndroid Build Coastguard Worker constexpr TextureTarget kAfterCubeMapTextureTargetMax =
203*8975f5c5SAndroid Build Coastguard Worker     static_cast<TextureTarget>(static_cast<uint8_t>(kCubeMapTextureTargetMax) + 1);
204*8975f5c5SAndroid Build Coastguard Worker struct AllCubeFaceTextureTargets
205*8975f5c5SAndroid Build Coastguard Worker {
beginAllCubeFaceTextureTargets206*8975f5c5SAndroid Build Coastguard Worker     angle::EnumIterator<TextureTarget> begin() const { return kCubeMapTextureTargetMin; }
endAllCubeFaceTextureTargets207*8975f5c5SAndroid Build Coastguard Worker     angle::EnumIterator<TextureTarget> end() const { return kAfterCubeMapTextureTargetMax; }
208*8975f5c5SAndroid Build Coastguard Worker };
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<ShaderType, 2> kAllGLES2ShaderTypes = {ShaderType::Vertex,
211*8975f5c5SAndroid Build Coastguard Worker                                                             ShaderType::Fragment};
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker constexpr ShaderType kShaderTypeMin = ShaderType::Vertex;
214*8975f5c5SAndroid Build Coastguard Worker constexpr ShaderType kShaderTypeMax = ShaderType::Compute;
215*8975f5c5SAndroid Build Coastguard Worker constexpr ShaderType kAfterShaderTypeMax =
216*8975f5c5SAndroid Build Coastguard Worker     static_cast<ShaderType>(static_cast<uint8_t>(kShaderTypeMax) + 1);
217*8975f5c5SAndroid Build Coastguard Worker struct AllShaderTypes
218*8975f5c5SAndroid Build Coastguard Worker {
beginAllShaderTypes219*8975f5c5SAndroid Build Coastguard Worker     angle::EnumIterator<ShaderType> begin() const { return kShaderTypeMin; }
endAllShaderTypes220*8975f5c5SAndroid Build Coastguard Worker     angle::EnumIterator<ShaderType> end() const { return kAfterShaderTypeMax; }
221*8975f5c5SAndroid Build Coastguard Worker };
222*8975f5c5SAndroid Build Coastguard Worker 
223*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kGraphicsShaderCount = static_cast<size_t>(ShaderType::EnumCount) - 1u;
224*8975f5c5SAndroid Build Coastguard Worker // Arrange the shader types in the order of rendering pipeline
225*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<ShaderType, kGraphicsShaderCount> kAllGraphicsShaderTypes = {
226*8975f5c5SAndroid Build Coastguard Worker     ShaderType::Vertex, ShaderType::TessControl, ShaderType::TessEvaluation, ShaderType::Geometry,
227*8975f5c5SAndroid Build Coastguard Worker     ShaderType::Fragment};
228*8975f5c5SAndroid Build Coastguard Worker 
229*8975f5c5SAndroid Build Coastguard Worker using ShaderBitSet = angle::PackedEnumBitSet<ShaderType, uint8_t>;
230*8975f5c5SAndroid Build Coastguard Worker static_assert(sizeof(ShaderBitSet) == sizeof(uint8_t), "Unexpected size");
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker template <typename T>
233*8975f5c5SAndroid Build Coastguard Worker using ShaderMap = angle::PackedEnumMap<ShaderType, T>;
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker const char *ShaderTypeToString(ShaderType shaderType);
236*8975f5c5SAndroid Build Coastguard Worker 
237*8975f5c5SAndroid Build Coastguard Worker TextureType SamplerTypeToTextureType(GLenum samplerType);
238*8975f5c5SAndroid Build Coastguard Worker TextureType ImageTypeToTextureType(GLenum imageType);
239*8975f5c5SAndroid Build Coastguard Worker 
240*8975f5c5SAndroid Build Coastguard Worker bool IsMultisampled(gl::TextureType type);
241*8975f5c5SAndroid Build Coastguard Worker bool IsArrayTextureType(gl::TextureType type);
242*8975f5c5SAndroid Build Coastguard Worker bool IsLayeredTextureType(gl::TextureType type);
243*8975f5c5SAndroid Build Coastguard Worker 
244*8975f5c5SAndroid Build Coastguard Worker bool IsStaticBufferUsage(BufferUsage useage);
245*8975f5c5SAndroid Build Coastguard Worker 
246*8975f5c5SAndroid Build Coastguard Worker enum class PrimitiveMode : uint8_t
247*8975f5c5SAndroid Build Coastguard Worker {
248*8975f5c5SAndroid Build Coastguard Worker     Points                 = 0x0,
249*8975f5c5SAndroid Build Coastguard Worker     Lines                  = 0x1,
250*8975f5c5SAndroid Build Coastguard Worker     LineLoop               = 0x2,
251*8975f5c5SAndroid Build Coastguard Worker     LineStrip              = 0x3,
252*8975f5c5SAndroid Build Coastguard Worker     Triangles              = 0x4,
253*8975f5c5SAndroid Build Coastguard Worker     TriangleStrip          = 0x5,
254*8975f5c5SAndroid Build Coastguard Worker     TriangleFan            = 0x6,
255*8975f5c5SAndroid Build Coastguard Worker     Unused1                = 0x7,
256*8975f5c5SAndroid Build Coastguard Worker     Unused2                = 0x8,
257*8975f5c5SAndroid Build Coastguard Worker     Unused3                = 0x9,
258*8975f5c5SAndroid Build Coastguard Worker     LinesAdjacency         = 0xA,
259*8975f5c5SAndroid Build Coastguard Worker     LineStripAdjacency     = 0xB,
260*8975f5c5SAndroid Build Coastguard Worker     TrianglesAdjacency     = 0xC,
261*8975f5c5SAndroid Build Coastguard Worker     TriangleStripAdjacency = 0xD,
262*8975f5c5SAndroid Build Coastguard Worker     Patches                = 0xE,
263*8975f5c5SAndroid Build Coastguard Worker 
264*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum = 0xF,
265*8975f5c5SAndroid Build Coastguard Worker     EnumCount   = 0xF,
266*8975f5c5SAndroid Build Coastguard Worker };
267*8975f5c5SAndroid Build Coastguard Worker 
268*8975f5c5SAndroid Build Coastguard Worker template <>
269*8975f5c5SAndroid Build Coastguard Worker constexpr PrimitiveMode FromGLenum<PrimitiveMode>(GLenum from)
270*8975f5c5SAndroid Build Coastguard Worker {
271*8975f5c5SAndroid Build Coastguard Worker     if (from >= static_cast<GLenum>(PrimitiveMode::EnumCount))
272*8975f5c5SAndroid Build Coastguard Worker     {
273*8975f5c5SAndroid Build Coastguard Worker         return PrimitiveMode::InvalidEnum;
274*8975f5c5SAndroid Build Coastguard Worker     }
275*8975f5c5SAndroid Build Coastguard Worker 
276*8975f5c5SAndroid Build Coastguard Worker     return static_cast<PrimitiveMode>(from);
277*8975f5c5SAndroid Build Coastguard Worker }
278*8975f5c5SAndroid Build Coastguard Worker 
ToGLenum(PrimitiveMode from)279*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum ToGLenum(PrimitiveMode from)
280*8975f5c5SAndroid Build Coastguard Worker {
281*8975f5c5SAndroid Build Coastguard Worker     return static_cast<GLenum>(from);
282*8975f5c5SAndroid Build Coastguard Worker }
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::Points) == GL_POINTS, "PrimitiveMode violation");
285*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::Lines) == GL_LINES, "PrimitiveMode violation");
286*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::LineLoop) == GL_LINE_LOOP, "PrimitiveMode violation");
287*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::LineStrip) == GL_LINE_STRIP, "PrimitiveMode violation");
288*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::Triangles) == GL_TRIANGLES, "PrimitiveMode violation");
289*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::TriangleStrip) == GL_TRIANGLE_STRIP,
290*8975f5c5SAndroid Build Coastguard Worker               "PrimitiveMode violation");
291*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::TriangleFan) == GL_TRIANGLE_FAN, "PrimitiveMode violation");
292*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::LinesAdjacency) == GL_LINES_ADJACENCY,
293*8975f5c5SAndroid Build Coastguard Worker               "PrimitiveMode violation");
294*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::LineStripAdjacency) == GL_LINE_STRIP_ADJACENCY,
295*8975f5c5SAndroid Build Coastguard Worker               "PrimitiveMode violation");
296*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::TrianglesAdjacency) == GL_TRIANGLES_ADJACENCY,
297*8975f5c5SAndroid Build Coastguard Worker               "PrimitiveMode violation");
298*8975f5c5SAndroid Build Coastguard Worker static_assert(ToGLenum(PrimitiveMode::TriangleStripAdjacency) == GL_TRIANGLE_STRIP_ADJACENCY,
299*8975f5c5SAndroid Build Coastguard Worker               "PrimitiveMode violation");
300*8975f5c5SAndroid Build Coastguard Worker 
301*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, PrimitiveMode value);
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker enum class DrawElementsType : size_t
304*8975f5c5SAndroid Build Coastguard Worker {
305*8975f5c5SAndroid Build Coastguard Worker     UnsignedByte  = 0,
306*8975f5c5SAndroid Build Coastguard Worker     UnsignedShort = 1,
307*8975f5c5SAndroid Build Coastguard Worker     UnsignedInt   = 2,
308*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum   = 3,
309*8975f5c5SAndroid Build Coastguard Worker     EnumCount     = 3,
310*8975f5c5SAndroid Build Coastguard Worker };
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker template <>
313*8975f5c5SAndroid Build Coastguard Worker constexpr DrawElementsType FromGLenum<DrawElementsType>(GLenum from)
314*8975f5c5SAndroid Build Coastguard Worker {
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker     GLenum scaled = (from - GL_UNSIGNED_BYTE);
317*8975f5c5SAndroid Build Coastguard Worker     // This code sequence generates a ROR instruction on x86/arm. We want to check if the lowest bit
318*8975f5c5SAndroid Build Coastguard Worker     // of scaled is set and if (scaled >> 1) is greater than a non-pot value. If we rotate the
319*8975f5c5SAndroid Build Coastguard Worker     // lowest bit to the hightest bit both conditions can be checked with a single test.
320*8975f5c5SAndroid Build Coastguard Worker     static_assert(sizeof(GLenum) == 4, "Update (scaled << 31) to sizeof(GLenum) * 8 - 1");
321*8975f5c5SAndroid Build Coastguard Worker     GLenum packed = (scaled >> 1) | (scaled << 31);
322*8975f5c5SAndroid Build Coastguard Worker 
323*8975f5c5SAndroid Build Coastguard Worker     // operator ? with a simple assignment usually translates to a cmov instruction and thus avoids
324*8975f5c5SAndroid Build Coastguard Worker     // a branch.
325*8975f5c5SAndroid Build Coastguard Worker     packed = (packed >= static_cast<GLenum>(DrawElementsType::EnumCount))
326*8975f5c5SAndroid Build Coastguard Worker                  ? static_cast<GLenum>(DrawElementsType::InvalidEnum)
327*8975f5c5SAndroid Build Coastguard Worker                  : packed;
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker     return static_cast<DrawElementsType>(packed);
330*8975f5c5SAndroid Build Coastguard Worker }
331*8975f5c5SAndroid Build Coastguard Worker 
ToGLenum(DrawElementsType from)332*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum ToGLenum(DrawElementsType from)
333*8975f5c5SAndroid Build Coastguard Worker {
334*8975f5c5SAndroid Build Coastguard Worker     return ((static_cast<GLenum>(from) << 1) + GL_UNSIGNED_BYTE);
335*8975f5c5SAndroid Build Coastguard Worker }
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VALIDATE_PACKED_ENUM(type, packed, glenum)                 \
338*8975f5c5SAndroid Build Coastguard Worker     static_assert(ToGLenum(type::packed) == glenum, #type " violation"); \
339*8975f5c5SAndroid Build Coastguard Worker     static_assert(FromGLenum<type>(glenum) == type::packed, #type " violation")
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(DrawElementsType, UnsignedByte, GL_UNSIGNED_BYTE);
342*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(DrawElementsType, UnsignedShort, GL_UNSIGNED_SHORT);
343*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(DrawElementsType, UnsignedInt, GL_UNSIGNED_INT);
344*8975f5c5SAndroid Build Coastguard Worker 
345*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, DrawElementsType value);
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker enum class BlendEquationType
348*8975f5c5SAndroid Build Coastguard Worker {
349*8975f5c5SAndroid Build Coastguard Worker     Add             = 0,  // GLenum == 0x8006
350*8975f5c5SAndroid Build Coastguard Worker     Min             = 1,  // GLenum == 0x8007
351*8975f5c5SAndroid Build Coastguard Worker     Max             = 2,  // GLenum == 0x8008
352*8975f5c5SAndroid Build Coastguard Worker     Unused          = 3,
353*8975f5c5SAndroid Build Coastguard Worker     Subtract        = 4,  // GLenum == 0x800A
354*8975f5c5SAndroid Build Coastguard Worker     ReverseSubtract = 5,  // GLenum == 0x800B
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     Multiply   = 6,   // GLenum == 0x9294
357*8975f5c5SAndroid Build Coastguard Worker     Screen     = 7,   // GLenum == 0x9295
358*8975f5c5SAndroid Build Coastguard Worker     Overlay    = 8,   // GLenum == 0x9296
359*8975f5c5SAndroid Build Coastguard Worker     Darken     = 9,   // GLenum == 0x9297
360*8975f5c5SAndroid Build Coastguard Worker     Lighten    = 10,  // GLenum == 0x9298
361*8975f5c5SAndroid Build Coastguard Worker     Colordodge = 11,  // GLenum == 0x9299
362*8975f5c5SAndroid Build Coastguard Worker     Colorburn  = 12,  // GLenum == 0x929A
363*8975f5c5SAndroid Build Coastguard Worker     Hardlight  = 13,  // GLenum == 0x929B
364*8975f5c5SAndroid Build Coastguard Worker     Softlight  = 14,  // GLenum == 0x929C
365*8975f5c5SAndroid Build Coastguard Worker     Unused2    = 15,
366*8975f5c5SAndroid Build Coastguard Worker     Difference = 16,  // GLenum == 0x929E
367*8975f5c5SAndroid Build Coastguard Worker     Unused3    = 17,
368*8975f5c5SAndroid Build Coastguard Worker     Exclusion  = 18,  // GLenum == 0x92A0
369*8975f5c5SAndroid Build Coastguard Worker 
370*8975f5c5SAndroid Build Coastguard Worker     HslHue        = 19,  // GLenum == 0x92AD
371*8975f5c5SAndroid Build Coastguard Worker     HslSaturation = 20,  // GLenum == 0x92AE
372*8975f5c5SAndroid Build Coastguard Worker     HslColor      = 21,  // GLenum == 0x92AF
373*8975f5c5SAndroid Build Coastguard Worker     HslLuminosity = 22,  // GLenum == 0x92B0
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum = 23,
376*8975f5c5SAndroid Build Coastguard Worker     EnumCount   = InvalidEnum
377*8975f5c5SAndroid Build Coastguard Worker };
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker using BlendEquationBitSet = angle::PackedEnumBitSet<gl::BlendEquationType>;
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker template <>
382*8975f5c5SAndroid Build Coastguard Worker constexpr BlendEquationType FromGLenum<BlendEquationType>(GLenum from)
383*8975f5c5SAndroid Build Coastguard Worker {
384*8975f5c5SAndroid Build Coastguard Worker     if (from <= GL_FUNC_REVERSE_SUBTRACT)
385*8975f5c5SAndroid Build Coastguard Worker     {
386*8975f5c5SAndroid Build Coastguard Worker         const GLenum scaled = (from - GL_FUNC_ADD);
387*8975f5c5SAndroid Build Coastguard Worker         return (scaled == static_cast<GLenum>(BlendEquationType::Unused))
388*8975f5c5SAndroid Build Coastguard Worker                    ? BlendEquationType::InvalidEnum
389*8975f5c5SAndroid Build Coastguard Worker                    : static_cast<BlendEquationType>(scaled);
390*8975f5c5SAndroid Build Coastguard Worker     }
391*8975f5c5SAndroid Build Coastguard Worker     if (from <= GL_EXCLUSION_KHR)
392*8975f5c5SAndroid Build Coastguard Worker     {
393*8975f5c5SAndroid Build Coastguard Worker         const GLenum scaled =
394*8975f5c5SAndroid Build Coastguard Worker             (from - GL_MULTIPLY_KHR + static_cast<uint32_t>(BlendEquationType::Multiply));
395*8975f5c5SAndroid Build Coastguard Worker         return (scaled == static_cast<GLenum>(BlendEquationType::Unused2) ||
396*8975f5c5SAndroid Build Coastguard Worker                 scaled == static_cast<GLenum>(BlendEquationType::Unused3))
397*8975f5c5SAndroid Build Coastguard Worker                    ? BlendEquationType::InvalidEnum
398*8975f5c5SAndroid Build Coastguard Worker                    : static_cast<BlendEquationType>(scaled);
399*8975f5c5SAndroid Build Coastguard Worker     }
400*8975f5c5SAndroid Build Coastguard Worker     if (from <= GL_HSL_LUMINOSITY_KHR)
401*8975f5c5SAndroid Build Coastguard Worker     {
402*8975f5c5SAndroid Build Coastguard Worker         return static_cast<BlendEquationType>(from - GL_HSL_HUE_KHR +
403*8975f5c5SAndroid Build Coastguard Worker                                               static_cast<uint32_t>(BlendEquationType::HslHue));
404*8975f5c5SAndroid Build Coastguard Worker     }
405*8975f5c5SAndroid Build Coastguard Worker     return BlendEquationType::InvalidEnum;
406*8975f5c5SAndroid Build Coastguard Worker }
407*8975f5c5SAndroid Build Coastguard Worker 
ToGLenum(BlendEquationType from)408*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum ToGLenum(BlendEquationType from)
409*8975f5c5SAndroid Build Coastguard Worker {
410*8975f5c5SAndroid Build Coastguard Worker     if (from <= BlendEquationType::ReverseSubtract)
411*8975f5c5SAndroid Build Coastguard Worker     {
412*8975f5c5SAndroid Build Coastguard Worker         return static_cast<GLenum>(from) + GL_FUNC_ADD;
413*8975f5c5SAndroid Build Coastguard Worker     }
414*8975f5c5SAndroid Build Coastguard Worker     if (from <= BlendEquationType::Exclusion)
415*8975f5c5SAndroid Build Coastguard Worker     {
416*8975f5c5SAndroid Build Coastguard Worker         return static_cast<GLenum>(from) - static_cast<GLenum>(BlendEquationType::Multiply) +
417*8975f5c5SAndroid Build Coastguard Worker                GL_MULTIPLY_KHR;
418*8975f5c5SAndroid Build Coastguard Worker     }
419*8975f5c5SAndroid Build Coastguard Worker     return static_cast<GLenum>(from) - static_cast<GLenum>(BlendEquationType::HslHue) +
420*8975f5c5SAndroid Build Coastguard Worker            GL_HSL_HUE_KHR;
421*8975f5c5SAndroid Build Coastguard Worker }
422*8975f5c5SAndroid Build Coastguard Worker 
423*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Add, GL_FUNC_ADD);
424*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Min, GL_MIN);
425*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Max, GL_MAX);
426*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Subtract, GL_FUNC_SUBTRACT);
427*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, ReverseSubtract, GL_FUNC_REVERSE_SUBTRACT);
428*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Multiply, GL_MULTIPLY_KHR);
429*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Screen, GL_SCREEN_KHR);
430*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Overlay, GL_OVERLAY_KHR);
431*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Darken, GL_DARKEN_KHR);
432*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Lighten, GL_LIGHTEN_KHR);
433*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Colordodge, GL_COLORDODGE_KHR);
434*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Colorburn, GL_COLORBURN_KHR);
435*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Hardlight, GL_HARDLIGHT_KHR);
436*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Softlight, GL_SOFTLIGHT_KHR);
437*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Difference, GL_DIFFERENCE_KHR);
438*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, Exclusion, GL_EXCLUSION_KHR);
439*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, HslHue, GL_HSL_HUE_KHR);
440*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, HslSaturation, GL_HSL_SATURATION_KHR);
441*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, HslColor, GL_HSL_COLOR_KHR);
442*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendEquationType, HslLuminosity, GL_HSL_LUMINOSITY_KHR);
443*8975f5c5SAndroid Build Coastguard Worker 
444*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, BlendEquationType value);
445*8975f5c5SAndroid Build Coastguard Worker 
446*8975f5c5SAndroid Build Coastguard Worker enum class BlendFactorType
447*8975f5c5SAndroid Build Coastguard Worker {
448*8975f5c5SAndroid Build Coastguard Worker     Zero = 0,  // GLenum == 0
449*8975f5c5SAndroid Build Coastguard Worker     One  = 1,  // GLenum == 1
450*8975f5c5SAndroid Build Coastguard Worker 
451*8975f5c5SAndroid Build Coastguard Worker     MinSrcDstType    = 2,
452*8975f5c5SAndroid Build Coastguard Worker     SrcColor         = 2,   // GLenum == 0x0300
453*8975f5c5SAndroid Build Coastguard Worker     OneMinusSrcColor = 3,   // GLenum == 0x0301
454*8975f5c5SAndroid Build Coastguard Worker     SrcAlpha         = 4,   // GLenum == 0x0302
455*8975f5c5SAndroid Build Coastguard Worker     OneMinusSrcAlpha = 5,   // GLenum == 0x0303
456*8975f5c5SAndroid Build Coastguard Worker     DstAlpha         = 6,   // GLenum == 0x0304
457*8975f5c5SAndroid Build Coastguard Worker     OneMinusDstAlpha = 7,   // GLenum == 0x0305
458*8975f5c5SAndroid Build Coastguard Worker     DstColor         = 8,   // GLenum == 0x0306
459*8975f5c5SAndroid Build Coastguard Worker     OneMinusDstColor = 9,   // GLenum == 0x0307
460*8975f5c5SAndroid Build Coastguard Worker     SrcAlphaSaturate = 10,  // GLenum == 0x0308
461*8975f5c5SAndroid Build Coastguard Worker     MaxSrcDstType    = 10,
462*8975f5c5SAndroid Build Coastguard Worker 
463*8975f5c5SAndroid Build Coastguard Worker     MinConstantType       = 11,
464*8975f5c5SAndroid Build Coastguard Worker     ConstantColor         = 11,  // GLenum == 0x8001
465*8975f5c5SAndroid Build Coastguard Worker     OneMinusConstantColor = 12,  // GLenum == 0x8002
466*8975f5c5SAndroid Build Coastguard Worker     ConstantAlpha         = 13,  // GLenum == 0x8003
467*8975f5c5SAndroid Build Coastguard Worker     OneMinusConstantAlpha = 14,  // GLenum == 0x8004
468*8975f5c5SAndroid Build Coastguard Worker     MaxConstantType       = 14,
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_blend_func_extended
471*8975f5c5SAndroid Build Coastguard Worker 
472*8975f5c5SAndroid Build Coastguard Worker     Src1Alpha = 15,  // GLenum == 0x8589
473*8975f5c5SAndroid Build Coastguard Worker 
474*8975f5c5SAndroid Build Coastguard Worker     Src1Color         = 16,  // GLenum == 0x88F9
475*8975f5c5SAndroid Build Coastguard Worker     OneMinusSrc1Color = 17,  // GLenum == 0x88FA
476*8975f5c5SAndroid Build Coastguard Worker     OneMinusSrc1Alpha = 18,  // GLenum == 0x88FB
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum = 19,
479*8975f5c5SAndroid Build Coastguard Worker     EnumCount   = 19
480*8975f5c5SAndroid Build Coastguard Worker };
481*8975f5c5SAndroid Build Coastguard Worker 
482*8975f5c5SAndroid Build Coastguard Worker template <>
483*8975f5c5SAndroid Build Coastguard Worker constexpr BlendFactorType FromGLenum<BlendFactorType>(GLenum from)
484*8975f5c5SAndroid Build Coastguard Worker {
485*8975f5c5SAndroid Build Coastguard Worker     if (from <= 1)
486*8975f5c5SAndroid Build Coastguard Worker         return static_cast<BlendFactorType>(from);
487*8975f5c5SAndroid Build Coastguard Worker     if (from >= GL_SRC_COLOR && from <= GL_SRC_ALPHA_SATURATE)
488*8975f5c5SAndroid Build Coastguard Worker         return static_cast<BlendFactorType>(from - GL_SRC_COLOR + 2);
489*8975f5c5SAndroid Build Coastguard Worker     if (from >= GL_CONSTANT_COLOR && from <= GL_ONE_MINUS_CONSTANT_ALPHA)
490*8975f5c5SAndroid Build Coastguard Worker         return static_cast<BlendFactorType>(from - GL_CONSTANT_COLOR + 11);
491*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_SRC1_ALPHA_EXT)
492*8975f5c5SAndroid Build Coastguard Worker         return BlendFactorType::Src1Alpha;
493*8975f5c5SAndroid Build Coastguard Worker     if (from >= GL_SRC1_COLOR_EXT && from <= GL_ONE_MINUS_SRC1_ALPHA_EXT)
494*8975f5c5SAndroid Build Coastguard Worker         return static_cast<BlendFactorType>(from - GL_SRC1_COLOR_EXT + 16);
495*8975f5c5SAndroid Build Coastguard Worker     return BlendFactorType::InvalidEnum;
496*8975f5c5SAndroid Build Coastguard Worker }
497*8975f5c5SAndroid Build Coastguard Worker 
ToGLenum(BlendFactorType from)498*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum ToGLenum(BlendFactorType from)
499*8975f5c5SAndroid Build Coastguard Worker {
500*8975f5c5SAndroid Build Coastguard Worker     const GLenum value = static_cast<GLenum>(from);
501*8975f5c5SAndroid Build Coastguard Worker     if (value <= 1)
502*8975f5c5SAndroid Build Coastguard Worker         return value;
503*8975f5c5SAndroid Build Coastguard Worker     if (from >= BlendFactorType::MinSrcDstType && from <= BlendFactorType::MaxSrcDstType)
504*8975f5c5SAndroid Build Coastguard Worker         return value - 2 + GL_SRC_COLOR;
505*8975f5c5SAndroid Build Coastguard Worker     if (from >= BlendFactorType::MinConstantType && from <= BlendFactorType::MaxConstantType)
506*8975f5c5SAndroid Build Coastguard Worker         return value - 11 + GL_CONSTANT_COLOR;
507*8975f5c5SAndroid Build Coastguard Worker     if (from == BlendFactorType::Src1Alpha)
508*8975f5c5SAndroid Build Coastguard Worker         return GL_SRC1_ALPHA_EXT;
509*8975f5c5SAndroid Build Coastguard Worker     return value - 16 + GL_SRC1_COLOR_EXT;
510*8975f5c5SAndroid Build Coastguard Worker }
511*8975f5c5SAndroid Build Coastguard Worker 
512*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, Zero, GL_ZERO);
513*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, One, GL_ONE);
514*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, SrcColor, GL_SRC_COLOR);
515*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusSrcColor, GL_ONE_MINUS_SRC_COLOR);
516*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, SrcAlpha, GL_SRC_ALPHA);
517*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusSrcAlpha, GL_ONE_MINUS_SRC_ALPHA);
518*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, DstAlpha, GL_DST_ALPHA);
519*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusDstAlpha, GL_ONE_MINUS_DST_ALPHA);
520*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, DstColor, GL_DST_COLOR);
521*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusDstColor, GL_ONE_MINUS_DST_COLOR);
522*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, SrcAlphaSaturate, GL_SRC_ALPHA_SATURATE);
523*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, ConstantColor, GL_CONSTANT_COLOR);
524*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusConstantColor, GL_ONE_MINUS_CONSTANT_COLOR);
525*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, ConstantAlpha, GL_CONSTANT_ALPHA);
526*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusConstantAlpha, GL_ONE_MINUS_CONSTANT_ALPHA);
527*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, Src1Alpha, GL_SRC1_ALPHA_EXT);
528*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, Src1Color, GL_SRC1_COLOR_EXT);
529*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusSrc1Color, GL_ONE_MINUS_SRC1_COLOR_EXT);
530*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(BlendFactorType, OneMinusSrc1Alpha, GL_ONE_MINUS_SRC1_ALPHA_EXT);
531*8975f5c5SAndroid Build Coastguard Worker 
532*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, BlendFactorType value);
533*8975f5c5SAndroid Build Coastguard Worker 
534*8975f5c5SAndroid Build Coastguard Worker enum class VertexAttribType
535*8975f5c5SAndroid Build Coastguard Worker {
536*8975f5c5SAndroid Build Coastguard Worker     Byte               = 0,   // GLenum == 0x1400
537*8975f5c5SAndroid Build Coastguard Worker     UnsignedByte       = 1,   // GLenum == 0x1401
538*8975f5c5SAndroid Build Coastguard Worker     Short              = 2,   // GLenum == 0x1402
539*8975f5c5SAndroid Build Coastguard Worker     UnsignedShort      = 3,   // GLenum == 0x1403
540*8975f5c5SAndroid Build Coastguard Worker     Int                = 4,   // GLenum == 0x1404
541*8975f5c5SAndroid Build Coastguard Worker     UnsignedInt        = 5,   // GLenum == 0x1405
542*8975f5c5SAndroid Build Coastguard Worker     Float              = 6,   // GLenum == 0x1406
543*8975f5c5SAndroid Build Coastguard Worker     Unused1            = 7,   // GLenum == 0x1407
544*8975f5c5SAndroid Build Coastguard Worker     Unused2            = 8,   // GLenum == 0x1408
545*8975f5c5SAndroid Build Coastguard Worker     Unused3            = 9,   // GLenum == 0x1409
546*8975f5c5SAndroid Build Coastguard Worker     Unused4            = 10,  // GLenum == 0x140A
547*8975f5c5SAndroid Build Coastguard Worker     HalfFloat          = 11,  // GLenum == 0x140B
548*8975f5c5SAndroid Build Coastguard Worker     Fixed              = 12,  // GLenum == 0x140C
549*8975f5c5SAndroid Build Coastguard Worker     MaxBasicType       = 12,
550*8975f5c5SAndroid Build Coastguard Worker     UnsignedInt2101010 = 13,  // GLenum == 0x8368
551*8975f5c5SAndroid Build Coastguard Worker     HalfFloatOES       = 14,  // GLenum == 0x8D61
552*8975f5c5SAndroid Build Coastguard Worker     Int2101010         = 15,  // GLenum == 0x8D9F
553*8975f5c5SAndroid Build Coastguard Worker     UnsignedInt1010102 = 16,  // GLenum == 0x8DF6
554*8975f5c5SAndroid Build Coastguard Worker     Int1010102         = 17,  // GLenum == 0x8DF7
555*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum        = 18,
556*8975f5c5SAndroid Build Coastguard Worker     EnumCount          = 18,
557*8975f5c5SAndroid Build Coastguard Worker };
558*8975f5c5SAndroid Build Coastguard Worker 
559*8975f5c5SAndroid Build Coastguard Worker template <>
560*8975f5c5SAndroid Build Coastguard Worker constexpr VertexAttribType FromGLenum<VertexAttribType>(GLenum from)
561*8975f5c5SAndroid Build Coastguard Worker {
562*8975f5c5SAndroid Build Coastguard Worker     GLenum packed = from - GL_BYTE;
563*8975f5c5SAndroid Build Coastguard Worker     if (packed <= static_cast<GLenum>(VertexAttribType::MaxBasicType))
564*8975f5c5SAndroid Build Coastguard Worker         return static_cast<VertexAttribType>(packed);
565*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_UNSIGNED_INT_2_10_10_10_REV)
566*8975f5c5SAndroid Build Coastguard Worker         return VertexAttribType::UnsignedInt2101010;
567*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_HALF_FLOAT_OES)
568*8975f5c5SAndroid Build Coastguard Worker         return VertexAttribType::HalfFloatOES;
569*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_INT_2_10_10_10_REV)
570*8975f5c5SAndroid Build Coastguard Worker         return VertexAttribType::Int2101010;
571*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_UNSIGNED_INT_10_10_10_2_OES)
572*8975f5c5SAndroid Build Coastguard Worker         return VertexAttribType::UnsignedInt1010102;
573*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_INT_10_10_10_2_OES)
574*8975f5c5SAndroid Build Coastguard Worker         return VertexAttribType::Int1010102;
575*8975f5c5SAndroid Build Coastguard Worker     return VertexAttribType::InvalidEnum;
576*8975f5c5SAndroid Build Coastguard Worker }
577*8975f5c5SAndroid Build Coastguard Worker 
ToGLenum(VertexAttribType from)578*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum ToGLenum(VertexAttribType from)
579*8975f5c5SAndroid Build Coastguard Worker {
580*8975f5c5SAndroid Build Coastguard Worker     // This could be optimized using a constexpr table.
581*8975f5c5SAndroid Build Coastguard Worker     if (from == VertexAttribType::Int2101010)
582*8975f5c5SAndroid Build Coastguard Worker         return GL_INT_2_10_10_10_REV;
583*8975f5c5SAndroid Build Coastguard Worker     if (from == VertexAttribType::HalfFloatOES)
584*8975f5c5SAndroid Build Coastguard Worker         return GL_HALF_FLOAT_OES;
585*8975f5c5SAndroid Build Coastguard Worker     if (from == VertexAttribType::UnsignedInt2101010)
586*8975f5c5SAndroid Build Coastguard Worker         return GL_UNSIGNED_INT_2_10_10_10_REV;
587*8975f5c5SAndroid Build Coastguard Worker     if (from == VertexAttribType::UnsignedInt1010102)
588*8975f5c5SAndroid Build Coastguard Worker         return GL_UNSIGNED_INT_10_10_10_2_OES;
589*8975f5c5SAndroid Build Coastguard Worker     if (from == VertexAttribType::Int1010102)
590*8975f5c5SAndroid Build Coastguard Worker         return GL_INT_10_10_10_2_OES;
591*8975f5c5SAndroid Build Coastguard Worker     return static_cast<GLenum>(from) + GL_BYTE;
592*8975f5c5SAndroid Build Coastguard Worker }
593*8975f5c5SAndroid Build Coastguard Worker 
594*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Byte, GL_BYTE);
595*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedByte, GL_UNSIGNED_BYTE);
596*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Short, GL_SHORT);
597*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedShort, GL_UNSIGNED_SHORT);
598*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int, GL_INT);
599*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt, GL_UNSIGNED_INT);
600*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Float, GL_FLOAT);
601*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, HalfFloat, GL_HALF_FLOAT);
602*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Fixed, GL_FIXED);
603*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int2101010, GL_INT_2_10_10_10_REV);
604*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, HalfFloatOES, GL_HALF_FLOAT_OES);
605*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt2101010, GL_UNSIGNED_INT_2_10_10_10_REV);
606*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int1010102, GL_INT_10_10_10_2_OES);
607*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt1010102, GL_UNSIGNED_INT_10_10_10_2_OES);
608*8975f5c5SAndroid Build Coastguard Worker 
609*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, VertexAttribType value);
610*8975f5c5SAndroid Build Coastguard Worker 
611*8975f5c5SAndroid Build Coastguard Worker enum class TessEvaluationType
612*8975f5c5SAndroid Build Coastguard Worker {
613*8975f5c5SAndroid Build Coastguard Worker     Triangles             = 0,
614*8975f5c5SAndroid Build Coastguard Worker     Quads                 = 1,
615*8975f5c5SAndroid Build Coastguard Worker     Isolines              = 2,
616*8975f5c5SAndroid Build Coastguard Worker     EqualSpacing          = 3,
617*8975f5c5SAndroid Build Coastguard Worker     FractionalEvenSpacing = 4,
618*8975f5c5SAndroid Build Coastguard Worker     FractionalOddSpacing  = 5,
619*8975f5c5SAndroid Build Coastguard Worker     Cw                    = 6,
620*8975f5c5SAndroid Build Coastguard Worker     Ccw                   = 7,
621*8975f5c5SAndroid Build Coastguard Worker     PointMode             = 8,
622*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum           = 9,
623*8975f5c5SAndroid Build Coastguard Worker     EnumCount             = 9
624*8975f5c5SAndroid Build Coastguard Worker };
625*8975f5c5SAndroid Build Coastguard Worker 
626*8975f5c5SAndroid Build Coastguard Worker template <>
627*8975f5c5SAndroid Build Coastguard Worker constexpr TessEvaluationType FromGLenum<TessEvaluationType>(GLenum from)
628*8975f5c5SAndroid Build Coastguard Worker {
629*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_TRIANGLES)
630*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::Triangles;
631*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_QUADS)
632*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::Quads;
633*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_ISOLINES)
634*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::Isolines;
635*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_EQUAL)
636*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::EqualSpacing;
637*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_FRACTIONAL_EVEN)
638*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::FractionalEvenSpacing;
639*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_FRACTIONAL_ODD)
640*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::FractionalOddSpacing;
641*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_CW)
642*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::Cw;
643*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_CCW)
644*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::Ccw;
645*8975f5c5SAndroid Build Coastguard Worker     if (from == GL_TESS_GEN_POINT_MODE)
646*8975f5c5SAndroid Build Coastguard Worker         return TessEvaluationType::PointMode;
647*8975f5c5SAndroid Build Coastguard Worker     return TessEvaluationType::InvalidEnum;
648*8975f5c5SAndroid Build Coastguard Worker }
649*8975f5c5SAndroid Build Coastguard Worker 
ToGLenum(TessEvaluationType from)650*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum ToGLenum(TessEvaluationType from)
651*8975f5c5SAndroid Build Coastguard Worker {
652*8975f5c5SAndroid Build Coastguard Worker     switch (from)
653*8975f5c5SAndroid Build Coastguard Worker     {
654*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::Triangles:
655*8975f5c5SAndroid Build Coastguard Worker             return GL_TRIANGLES;
656*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::Quads:
657*8975f5c5SAndroid Build Coastguard Worker             return GL_QUADS;
658*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::Isolines:
659*8975f5c5SAndroid Build Coastguard Worker             return GL_ISOLINES;
660*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::EqualSpacing:
661*8975f5c5SAndroid Build Coastguard Worker             return GL_EQUAL;
662*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::FractionalEvenSpacing:
663*8975f5c5SAndroid Build Coastguard Worker             return GL_FRACTIONAL_EVEN;
664*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::FractionalOddSpacing:
665*8975f5c5SAndroid Build Coastguard Worker             return GL_FRACTIONAL_ODD;
666*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::Cw:
667*8975f5c5SAndroid Build Coastguard Worker             return GL_CW;
668*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::Ccw:
669*8975f5c5SAndroid Build Coastguard Worker             return GL_CCW;
670*8975f5c5SAndroid Build Coastguard Worker         case TessEvaluationType::PointMode:
671*8975f5c5SAndroid Build Coastguard Worker             return GL_TESS_GEN_POINT_MODE;
672*8975f5c5SAndroid Build Coastguard Worker         default:
673*8975f5c5SAndroid Build Coastguard Worker             return GL_INVALID_ENUM;
674*8975f5c5SAndroid Build Coastguard Worker     }
675*8975f5c5SAndroid Build Coastguard Worker }
676*8975f5c5SAndroid Build Coastguard Worker 
677*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, Triangles, GL_TRIANGLES);
678*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, Quads, GL_QUADS);
679*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, Isolines, GL_ISOLINES);
680*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, EqualSpacing, GL_EQUAL);
681*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, FractionalEvenSpacing, GL_FRACTIONAL_EVEN);
682*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, FractionalOddSpacing, GL_FRACTIONAL_ODD);
683*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, Cw, GL_CW);
684*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, Ccw, GL_CCW);
685*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATE_PACKED_ENUM(TessEvaluationType, PointMode, GL_TESS_GEN_POINT_MODE);
686*8975f5c5SAndroid Build Coastguard Worker 
687*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, TessEvaluationType value);
688*8975f5c5SAndroid Build Coastguard Worker 
689*8975f5c5SAndroid Build Coastguard Worker // Typesafe object handles.
690*8975f5c5SAndroid Build Coastguard Worker 
691*8975f5c5SAndroid Build Coastguard Worker template <typename T>
692*8975f5c5SAndroid Build Coastguard Worker struct ResourceTypeToID;
693*8975f5c5SAndroid Build Coastguard Worker 
694*8975f5c5SAndroid Build Coastguard Worker template <typename T>
695*8975f5c5SAndroid Build Coastguard Worker struct IsResourceIDType;
696*8975f5c5SAndroid Build Coastguard Worker 
697*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_GL_ID_TYPES_OP(X) \
698*8975f5c5SAndroid Build Coastguard Worker     X(Buffer)                   \
699*8975f5c5SAndroid Build Coastguard Worker     X(Context)                  \
700*8975f5c5SAndroid Build Coastguard Worker     X(FenceNV)                  \
701*8975f5c5SAndroid Build Coastguard Worker     X(Framebuffer)              \
702*8975f5c5SAndroid Build Coastguard Worker     X(MemoryObject)             \
703*8975f5c5SAndroid Build Coastguard Worker     X(Path)                     \
704*8975f5c5SAndroid Build Coastguard Worker     X(ProgramPipeline)          \
705*8975f5c5SAndroid Build Coastguard Worker     X(Query)                    \
706*8975f5c5SAndroid Build Coastguard Worker     X(Renderbuffer)             \
707*8975f5c5SAndroid Build Coastguard Worker     X(Sampler)                  \
708*8975f5c5SAndroid Build Coastguard Worker     X(Semaphore)                \
709*8975f5c5SAndroid Build Coastguard Worker     X(Sync)                     \
710*8975f5c5SAndroid Build Coastguard Worker     X(Texture)                  \
711*8975f5c5SAndroid Build Coastguard Worker     X(TransformFeedback)        \
712*8975f5c5SAndroid Build Coastguard Worker     X(VertexArray)
713*8975f5c5SAndroid Build Coastguard Worker 
714*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_ID_TYPES_OP(ANGLE_DEFINE_ID_TYPE)
715*8975f5c5SAndroid Build Coastguard Worker 
716*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_GL_ID_TYPES_OP
717*8975f5c5SAndroid Build Coastguard Worker 
718*8975f5c5SAndroid Build Coastguard Worker // Shaders and programs are a bit special as they share IDs.
719*8975f5c5SAndroid Build Coastguard Worker struct ShaderProgramID
720*8975f5c5SAndroid Build Coastguard Worker {
721*8975f5c5SAndroid Build Coastguard Worker     GLuint value;
722*8975f5c5SAndroid Build Coastguard Worker };
723*8975f5c5SAndroid Build Coastguard Worker 
724*8975f5c5SAndroid Build Coastguard Worker template <>
725*8975f5c5SAndroid Build Coastguard Worker struct IsResourceIDType<ShaderProgramID>
726*8975f5c5SAndroid Build Coastguard Worker {
727*8975f5c5SAndroid Build Coastguard Worker     constexpr static bool value = true;
728*8975f5c5SAndroid Build Coastguard Worker };
729*8975f5c5SAndroid Build Coastguard Worker 
730*8975f5c5SAndroid Build Coastguard Worker class Shader;
731*8975f5c5SAndroid Build Coastguard Worker template <>
732*8975f5c5SAndroid Build Coastguard Worker struct ResourceTypeToID<Shader>
733*8975f5c5SAndroid Build Coastguard Worker {
734*8975f5c5SAndroid Build Coastguard Worker     using IDType = ShaderProgramID;
735*8975f5c5SAndroid Build Coastguard Worker };
736*8975f5c5SAndroid Build Coastguard Worker 
737*8975f5c5SAndroid Build Coastguard Worker class Program;
738*8975f5c5SAndroid Build Coastguard Worker template <>
739*8975f5c5SAndroid Build Coastguard Worker struct ResourceTypeToID<Program>
740*8975f5c5SAndroid Build Coastguard Worker {
741*8975f5c5SAndroid Build Coastguard Worker     using IDType = ShaderProgramID;
742*8975f5c5SAndroid Build Coastguard Worker };
743*8975f5c5SAndroid Build Coastguard Worker 
744*8975f5c5SAndroid Build Coastguard Worker template <typename T>
745*8975f5c5SAndroid Build Coastguard Worker struct ResourceTypeToID
746*8975f5c5SAndroid Build Coastguard Worker {
747*8975f5c5SAndroid Build Coastguard Worker     using IDType = void;
748*8975f5c5SAndroid Build Coastguard Worker };
749*8975f5c5SAndroid Build Coastguard Worker 
750*8975f5c5SAndroid Build Coastguard Worker template <typename T>
751*8975f5c5SAndroid Build Coastguard Worker struct IsResourceIDType
752*8975f5c5SAndroid Build Coastguard Worker {
753*8975f5c5SAndroid Build Coastguard Worker     static constexpr bool value = false;
754*8975f5c5SAndroid Build Coastguard Worker };
755*8975f5c5SAndroid Build Coastguard Worker 
756*8975f5c5SAndroid Build Coastguard Worker template <typename T>
757*8975f5c5SAndroid Build Coastguard Worker bool ValueEquals(T lhs, T rhs)
758*8975f5c5SAndroid Build Coastguard Worker {
759*8975f5c5SAndroid Build Coastguard Worker     return lhs.value == rhs.value;
760*8975f5c5SAndroid Build Coastguard Worker }
761*8975f5c5SAndroid Build Coastguard Worker 
762*8975f5c5SAndroid Build Coastguard Worker // Util funcs for resourceIDs
763*8975f5c5SAndroid Build Coastguard Worker template <typename T>
764*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<IsResourceIDType<T>::value, bool>::type operator==(const T &lhs,
765*8975f5c5SAndroid Build Coastguard Worker                                                                            const T &rhs)
766*8975f5c5SAndroid Build Coastguard Worker {
767*8975f5c5SAndroid Build Coastguard Worker     return lhs.value == rhs.value;
768*8975f5c5SAndroid Build Coastguard Worker }
769*8975f5c5SAndroid Build Coastguard Worker 
770*8975f5c5SAndroid Build Coastguard Worker template <typename T>
771*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<IsResourceIDType<T>::value, bool>::type operator!=(const T &lhs,
772*8975f5c5SAndroid Build Coastguard Worker                                                                            const T &rhs)
773*8975f5c5SAndroid Build Coastguard Worker {
774*8975f5c5SAndroid Build Coastguard Worker     return lhs.value != rhs.value;
775*8975f5c5SAndroid Build Coastguard Worker }
776*8975f5c5SAndroid Build Coastguard Worker 
777*8975f5c5SAndroid Build Coastguard Worker template <typename T>
778*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<IsResourceIDType<T>::value, bool>::type operator<(const T &lhs,
779*8975f5c5SAndroid Build Coastguard Worker                                                                           const T &rhs)
780*8975f5c5SAndroid Build Coastguard Worker {
781*8975f5c5SAndroid Build Coastguard Worker     return lhs.value < rhs.value;
782*8975f5c5SAndroid Build Coastguard Worker }
783*8975f5c5SAndroid Build Coastguard Worker 
784*8975f5c5SAndroid Build Coastguard Worker // Used to unbox typed values.
785*8975f5c5SAndroid Build Coastguard Worker template <typename ResourceIDType>
786*8975f5c5SAndroid Build Coastguard Worker GLuint GetIDValue(ResourceIDType id);
787*8975f5c5SAndroid Build Coastguard Worker 
788*8975f5c5SAndroid Build Coastguard Worker template <typename ResourceIDType>
789*8975f5c5SAndroid Build Coastguard Worker inline GLuint GetIDValue(ResourceIDType id)
790*8975f5c5SAndroid Build Coastguard Worker {
791*8975f5c5SAndroid Build Coastguard Worker     return id.value;
792*8975f5c5SAndroid Build Coastguard Worker }
793*8975f5c5SAndroid Build Coastguard Worker 
794*8975f5c5SAndroid Build Coastguard Worker struct UniformLocation
795*8975f5c5SAndroid Build Coastguard Worker {
796*8975f5c5SAndroid Build Coastguard Worker     int value;
797*8975f5c5SAndroid Build Coastguard Worker };
798*8975f5c5SAndroid Build Coastguard Worker 
799*8975f5c5SAndroid Build Coastguard Worker bool operator<(const UniformLocation &lhs, const UniformLocation &rhs);
800*8975f5c5SAndroid Build Coastguard Worker 
801*8975f5c5SAndroid Build Coastguard Worker struct UniformBlockIndex
802*8975f5c5SAndroid Build Coastguard Worker {
803*8975f5c5SAndroid Build Coastguard Worker     uint32_t value;
804*8975f5c5SAndroid Build Coastguard Worker };
805*8975f5c5SAndroid Build Coastguard Worker 
806*8975f5c5SAndroid Build Coastguard Worker bool IsEmulatedCompressedFormat(GLenum format);
807*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
808*8975f5c5SAndroid Build Coastguard Worker 
809*8975f5c5SAndroid Build Coastguard Worker namespace egl
810*8975f5c5SAndroid Build Coastguard Worker {
811*8975f5c5SAndroid Build Coastguard Worker MessageType ErrorCodeToMessageType(EGLint errorCode);
812*8975f5c5SAndroid Build Coastguard Worker 
813*8975f5c5SAndroid Build Coastguard Worker struct Config;
814*8975f5c5SAndroid Build Coastguard Worker class Device;
815*8975f5c5SAndroid Build Coastguard Worker class Display;
816*8975f5c5SAndroid Build Coastguard Worker class Image;
817*8975f5c5SAndroid Build Coastguard Worker class Surface;
818*8975f5c5SAndroid Build Coastguard Worker class Stream;
819*8975f5c5SAndroid Build Coastguard Worker class Sync;
820*8975f5c5SAndroid Build Coastguard Worker 
821*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_EGL_ID_TYPES_OP(X) \
822*8975f5c5SAndroid Build Coastguard Worker     X(Image)                     \
823*8975f5c5SAndroid Build Coastguard Worker     X(Surface)                   \
824*8975f5c5SAndroid Build Coastguard Worker     X(Sync)
825*8975f5c5SAndroid Build Coastguard Worker 
826*8975f5c5SAndroid Build Coastguard Worker template <typename T>
827*8975f5c5SAndroid Build Coastguard Worker struct ResourceTypeToID;
828*8975f5c5SAndroid Build Coastguard Worker 
829*8975f5c5SAndroid Build Coastguard Worker template <typename T>
830*8975f5c5SAndroid Build Coastguard Worker struct IsResourceIDType;
831*8975f5c5SAndroid Build Coastguard Worker 
832*8975f5c5SAndroid Build Coastguard Worker ANGLE_EGL_ID_TYPES_OP(ANGLE_DEFINE_ID_TYPE)
833*8975f5c5SAndroid Build Coastguard Worker 
834*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_EGL_ID_TYPES_OP
835*8975f5c5SAndroid Build Coastguard Worker 
836*8975f5c5SAndroid Build Coastguard Worker template <>
837*8975f5c5SAndroid Build Coastguard Worker struct IsResourceIDType<gl::ContextID>
838*8975f5c5SAndroid Build Coastguard Worker {
839*8975f5c5SAndroid Build Coastguard Worker     static constexpr bool value = true;
840*8975f5c5SAndroid Build Coastguard Worker };
841*8975f5c5SAndroid Build Coastguard Worker 
842*8975f5c5SAndroid Build Coastguard Worker template <typename T>
843*8975f5c5SAndroid Build Coastguard Worker struct IsResourceIDType
844*8975f5c5SAndroid Build Coastguard Worker {
845*8975f5c5SAndroid Build Coastguard Worker     static constexpr bool value = false;
846*8975f5c5SAndroid Build Coastguard Worker };
847*8975f5c5SAndroid Build Coastguard Worker 
848*8975f5c5SAndroid Build Coastguard Worker // Util funcs for resourceIDs
849*8975f5c5SAndroid Build Coastguard Worker template <typename T>
850*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<IsResourceIDType<T>::value && !std::is_same<T, gl::ContextID>::value,
851*8975f5c5SAndroid Build Coastguard Worker                         bool>::type
852*8975f5c5SAndroid Build Coastguard Worker operator==(const T &lhs, const T &rhs)
853*8975f5c5SAndroid Build Coastguard Worker {
854*8975f5c5SAndroid Build Coastguard Worker     return lhs.value == rhs.value;
855*8975f5c5SAndroid Build Coastguard Worker }
856*8975f5c5SAndroid Build Coastguard Worker 
857*8975f5c5SAndroid Build Coastguard Worker template <typename T>
858*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<IsResourceIDType<T>::value && !std::is_same<T, gl::ContextID>::value,
859*8975f5c5SAndroid Build Coastguard Worker                         bool>::type
860*8975f5c5SAndroid Build Coastguard Worker operator<(const T &lhs, const T &rhs)
861*8975f5c5SAndroid Build Coastguard Worker {
862*8975f5c5SAndroid Build Coastguard Worker     return lhs.value < rhs.value;
863*8975f5c5SAndroid Build Coastguard Worker }
864*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
865*8975f5c5SAndroid Build Coastguard Worker 
866*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_DEFINE_ID_TYPE
867*8975f5c5SAndroid Build Coastguard Worker 
868*8975f5c5SAndroid Build Coastguard Worker namespace egl_gl
869*8975f5c5SAndroid Build Coastguard Worker {
870*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget);
871*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget);
872*8975f5c5SAndroid Build Coastguard Worker gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget);
873*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl_gl
874*8975f5c5SAndroid Build Coastguard Worker 
875*8975f5c5SAndroid Build Coastguard Worker namespace gl
876*8975f5c5SAndroid Build Coastguard Worker {
877*8975f5c5SAndroid Build Coastguard Worker // First case: handling packed enums.
878*8975f5c5SAndroid Build Coastguard Worker template <typename EnumT, typename FromT>
879*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<std::is_enum<EnumT>::value, EnumT>::type PackParam(FromT from)
880*8975f5c5SAndroid Build Coastguard Worker {
881*8975f5c5SAndroid Build Coastguard Worker     return FromGLenum<EnumT>(from);
882*8975f5c5SAndroid Build Coastguard Worker }
883*8975f5c5SAndroid Build Coastguard Worker 
884*8975f5c5SAndroid Build Coastguard Worker // Second case: handling non-pointer resource ids.
885*8975f5c5SAndroid Build Coastguard Worker template <typename EnumT, typename FromT>
886*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<!std::is_pointer<FromT>::value && !std::is_enum<EnumT>::value, EnumT>::type
887*8975f5c5SAndroid Build Coastguard Worker PackParam(FromT from)
888*8975f5c5SAndroid Build Coastguard Worker {
889*8975f5c5SAndroid Build Coastguard Worker     return {from};
890*8975f5c5SAndroid Build Coastguard Worker }
891*8975f5c5SAndroid Build Coastguard Worker 
892*8975f5c5SAndroid Build Coastguard Worker template <typename EnumT>
893*8975f5c5SAndroid Build Coastguard Worker using IsEGLImage = std::is_same<EnumT, egl::ImageID>;
894*8975f5c5SAndroid Build Coastguard Worker 
895*8975f5c5SAndroid Build Coastguard Worker template <typename EnumT>
896*8975f5c5SAndroid Build Coastguard Worker using IsGLSync = std::is_same<EnumT, gl::SyncID>;
897*8975f5c5SAndroid Build Coastguard Worker 
898*8975f5c5SAndroid Build Coastguard Worker template <typename EnumT>
899*8975f5c5SAndroid Build Coastguard Worker using IsEGLSync = std::is_same<EnumT, egl::SyncID>;
900*8975f5c5SAndroid Build Coastguard Worker 
901*8975f5c5SAndroid Build Coastguard Worker // Third case: handling EGLImage, GLSync and EGLSync pointer resource ids.
902*8975f5c5SAndroid Build Coastguard Worker template <typename EnumT, typename FromT>
903*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<IsEGLImage<EnumT>::value || IsGLSync<EnumT>::value ||
904*8975f5c5SAndroid Build Coastguard Worker                             IsEGLSync<EnumT>::value,
905*8975f5c5SAndroid Build Coastguard Worker                         EnumT>::type
906*8975f5c5SAndroid Build Coastguard Worker PackParam(FromT from)
907*8975f5c5SAndroid Build Coastguard Worker {
908*8975f5c5SAndroid Build Coastguard Worker     return {static_cast<GLuint>(reinterpret_cast<uintptr_t>(from))};
909*8975f5c5SAndroid Build Coastguard Worker }
910*8975f5c5SAndroid Build Coastguard Worker 
911*8975f5c5SAndroid Build Coastguard Worker // Fourth case: handling non-EGLImage non-GLsync resource ids.
912*8975f5c5SAndroid Build Coastguard Worker template <typename EnumT, typename FromT>
913*8975f5c5SAndroid Build Coastguard Worker typename std::enable_if<std::is_pointer<FromT>::value && !std::is_enum<EnumT>::value &&
914*8975f5c5SAndroid Build Coastguard Worker                             !IsEGLImage<EnumT>::value && !IsGLSync<EnumT>::value,
915*8975f5c5SAndroid Build Coastguard Worker                         EnumT>::type
916*8975f5c5SAndroid Build Coastguard Worker PackParam(FromT from)
917*8975f5c5SAndroid Build Coastguard Worker {
918*8975f5c5SAndroid Build Coastguard Worker     static_assert(sizeof(typename std::remove_pointer<EnumT>::type) ==
919*8975f5c5SAndroid Build Coastguard Worker                       sizeof(typename std::remove_pointer<FromT>::type),
920*8975f5c5SAndroid Build Coastguard Worker                   "Types have different sizes");
921*8975f5c5SAndroid Build Coastguard Worker     static_assert(
922*8975f5c5SAndroid Build Coastguard Worker         std::is_same<
923*8975f5c5SAndroid Build Coastguard Worker             decltype(std::remove_pointer<EnumT>::type::value),
924*8975f5c5SAndroid Build Coastguard Worker             typename std::remove_const<typename std::remove_pointer<FromT>::type>::type>::value,
925*8975f5c5SAndroid Build Coastguard Worker         "Data types are different");
926*8975f5c5SAndroid Build Coastguard Worker     return reinterpret_cast<EnumT>(from);
927*8975f5c5SAndroid Build Coastguard Worker }
928*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
929*8975f5c5SAndroid Build Coastguard Worker 
930*8975f5c5SAndroid Build Coastguard Worker #endif  // COMMON_PACKEDGLENUMS_H_
931