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