xref: /aosp_15_r20/external/angle/src/libANGLE/Caps.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Caps.h"
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include <algorithm>
17*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
18*8975f5c5SAndroid Build Coastguard Worker 
InsertExtensionString(const std::string & extension,bool supported,std::vector<std::string> * extensionVector)19*8975f5c5SAndroid Build Coastguard Worker static void InsertExtensionString(const std::string &extension,
20*8975f5c5SAndroid Build Coastguard Worker                                   bool supported,
21*8975f5c5SAndroid Build Coastguard Worker                                   std::vector<std::string> *extensionVector)
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     if (supported)
24*8975f5c5SAndroid Build Coastguard Worker     {
25*8975f5c5SAndroid Build Coastguard Worker         extensionVector->push_back(extension);
26*8975f5c5SAndroid Build Coastguard Worker     }
27*8975f5c5SAndroid Build Coastguard Worker }
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker namespace gl
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker TextureCaps::TextureCaps() = default;
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker TextureCaps::TextureCaps(const TextureCaps &other) = default;
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker TextureCaps &TextureCaps::operator=(const TextureCaps &other) = default;
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker TextureCaps::~TextureCaps() = default;
39*8975f5c5SAndroid Build Coastguard Worker 
getMaxSamples() const40*8975f5c5SAndroid Build Coastguard Worker GLuint TextureCaps::getMaxSamples() const
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker     return !sampleCounts.empty() ? *sampleCounts.rbegin() : 0;
43*8975f5c5SAndroid Build Coastguard Worker }
44*8975f5c5SAndroid Build Coastguard Worker 
getNearestSamples(GLuint requestedSamples) const45*8975f5c5SAndroid Build Coastguard Worker GLuint TextureCaps::getNearestSamples(GLuint requestedSamples) const
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     if (requestedSamples == 0)
48*8975f5c5SAndroid Build Coastguard Worker     {
49*8975f5c5SAndroid Build Coastguard Worker         return 0;
50*8975f5c5SAndroid Build Coastguard Worker     }
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     for (SupportedSampleSet::const_iterator i = sampleCounts.begin(); i != sampleCounts.end(); i++)
53*8975f5c5SAndroid Build Coastguard Worker     {
54*8975f5c5SAndroid Build Coastguard Worker         GLuint samples = *i;
55*8975f5c5SAndroid Build Coastguard Worker         if (samples >= requestedSamples)
56*8975f5c5SAndroid Build Coastguard Worker         {
57*8975f5c5SAndroid Build Coastguard Worker             return samples;
58*8975f5c5SAndroid Build Coastguard Worker         }
59*8975f5c5SAndroid Build Coastguard Worker     }
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     return 0;
62*8975f5c5SAndroid Build Coastguard Worker }
63*8975f5c5SAndroid Build Coastguard Worker 
GenerateMinimumTextureCaps(GLenum sizedInternalFormat,const Version & clientVersion,const Extensions & extensions)64*8975f5c5SAndroid Build Coastguard Worker TextureCaps GenerateMinimumTextureCaps(GLenum sizedInternalFormat,
65*8975f5c5SAndroid Build Coastguard Worker                                        const Version &clientVersion,
66*8975f5c5SAndroid Build Coastguard Worker                                        const Extensions &extensions)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     TextureCaps caps;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     const InternalFormat &internalFormatInfo = GetSizedInternalFormatInfo(sizedInternalFormat);
71*8975f5c5SAndroid Build Coastguard Worker     caps.texturable        = internalFormatInfo.textureSupport(clientVersion, extensions);
72*8975f5c5SAndroid Build Coastguard Worker     caps.filterable        = internalFormatInfo.filterSupport(clientVersion, extensions);
73*8975f5c5SAndroid Build Coastguard Worker     caps.textureAttachment = internalFormatInfo.textureAttachmentSupport(clientVersion, extensions);
74*8975f5c5SAndroid Build Coastguard Worker     caps.renderbuffer      = internalFormatInfo.renderbufferSupport(clientVersion, extensions);
75*8975f5c5SAndroid Build Coastguard Worker     caps.blendable         = internalFormatInfo.blendSupport(clientVersion, extensions);
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     caps.sampleCounts.insert(0);
78*8975f5c5SAndroid Build Coastguard Worker     if (internalFormatInfo.isRequiredRenderbufferFormat(clientVersion))
79*8975f5c5SAndroid Build Coastguard Worker     {
80*8975f5c5SAndroid Build Coastguard Worker         if ((clientVersion.major >= 3 && clientVersion.minor >= 1) ||
81*8975f5c5SAndroid Build Coastguard Worker             (clientVersion.major >= 3 && !internalFormatInfo.isInt()))
82*8975f5c5SAndroid Build Coastguard Worker         {
83*8975f5c5SAndroid Build Coastguard Worker             caps.sampleCounts.insert(4);
84*8975f5c5SAndroid Build Coastguard Worker         }
85*8975f5c5SAndroid Build Coastguard Worker     }
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     return caps;
88*8975f5c5SAndroid Build Coastguard Worker }
89*8975f5c5SAndroid Build Coastguard Worker 
TextureCapsMap()90*8975f5c5SAndroid Build Coastguard Worker TextureCapsMap::TextureCapsMap() {}
91*8975f5c5SAndroid Build Coastguard Worker 
~TextureCapsMap()92*8975f5c5SAndroid Build Coastguard Worker TextureCapsMap::~TextureCapsMap() {}
93*8975f5c5SAndroid Build Coastguard Worker 
insert(GLenum internalFormat,const TextureCaps & caps)94*8975f5c5SAndroid Build Coastguard Worker void TextureCapsMap::insert(GLenum internalFormat, const TextureCaps &caps)
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     angle::FormatID formatID = angle::Format::InternalFormatToID(internalFormat);
97*8975f5c5SAndroid Build Coastguard Worker     get(formatID)            = caps;
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker 
clear()100*8975f5c5SAndroid Build Coastguard Worker void TextureCapsMap::clear()
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     mFormatData.fill(TextureCaps());
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker 
get(GLenum internalFormat) const105*8975f5c5SAndroid Build Coastguard Worker const TextureCaps &TextureCapsMap::get(GLenum internalFormat) const
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker     angle::FormatID formatID = angle::Format::InternalFormatToID(internalFormat);
108*8975f5c5SAndroid Build Coastguard Worker     return get(formatID);
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
get(angle::FormatID formatID) const111*8975f5c5SAndroid Build Coastguard Worker const TextureCaps &TextureCapsMap::get(angle::FormatID formatID) const
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     return mFormatData[formatID];
114*8975f5c5SAndroid Build Coastguard Worker }
115*8975f5c5SAndroid Build Coastguard Worker 
get(angle::FormatID formatID)116*8975f5c5SAndroid Build Coastguard Worker TextureCaps &TextureCapsMap::get(angle::FormatID formatID)
117*8975f5c5SAndroid Build Coastguard Worker {
118*8975f5c5SAndroid Build Coastguard Worker     return mFormatData[formatID];
119*8975f5c5SAndroid Build Coastguard Worker }
120*8975f5c5SAndroid Build Coastguard Worker 
set(angle::FormatID formatID,const TextureCaps & caps)121*8975f5c5SAndroid Build Coastguard Worker void TextureCapsMap::set(angle::FormatID formatID, const TextureCaps &caps)
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker     get(formatID) = caps;
124*8975f5c5SAndroid Build Coastguard Worker }
125*8975f5c5SAndroid Build Coastguard Worker 
InitMinimumTextureCapsMap(const Version & clientVersion,const Extensions & extensions,TextureCapsMap * capsMap)126*8975f5c5SAndroid Build Coastguard Worker void InitMinimumTextureCapsMap(const Version &clientVersion,
127*8975f5c5SAndroid Build Coastguard Worker                                const Extensions &extensions,
128*8975f5c5SAndroid Build Coastguard Worker                                TextureCapsMap *capsMap)
129*8975f5c5SAndroid Build Coastguard Worker {
130*8975f5c5SAndroid Build Coastguard Worker     for (GLenum internalFormat : GetAllSizedInternalFormats())
131*8975f5c5SAndroid Build Coastguard Worker     {
132*8975f5c5SAndroid Build Coastguard Worker         capsMap->insert(internalFormat,
133*8975f5c5SAndroid Build Coastguard Worker                         GenerateMinimumTextureCaps(internalFormat, clientVersion, extensions));
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker Extensions::Extensions() = default;
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker Extensions::Extensions(const Extensions &other) = default;
140*8975f5c5SAndroid Build Coastguard Worker 
141*8975f5c5SAndroid Build Coastguard Worker Extensions &Extensions::operator=(const Extensions &other) = default;
142*8975f5c5SAndroid Build Coastguard Worker 
getStrings() const143*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> Extensions::getStrings() const
144*8975f5c5SAndroid Build Coastguard Worker {
145*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> extensionStrings;
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     for (const auto &extensionInfo : GetExtensionInfoMap())
148*8975f5c5SAndroid Build Coastguard Worker     {
149*8975f5c5SAndroid Build Coastguard Worker         if (this->*(extensionInfo.second.ExtensionsMember))
150*8975f5c5SAndroid Build Coastguard Worker         {
151*8975f5c5SAndroid Build Coastguard Worker             extensionStrings.push_back(extensionInfo.first);
152*8975f5c5SAndroid Build Coastguard Worker         }
153*8975f5c5SAndroid Build Coastguard Worker     }
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     return extensionStrings;
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker Limitations::Limitations()                         = default;
159*8975f5c5SAndroid Build Coastguard Worker Limitations::Limitations(const Limitations &other) = default;
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker Limitations &Limitations::operator=(const Limitations &other) = default;
162*8975f5c5SAndroid Build Coastguard Worker 
GetFormatSupportBase(const TextureCapsMap & textureCaps,const GLenum * requiredFormats,size_t requiredFormatsSize,bool requiresTexturing,bool requiresFiltering,bool requiresAttachingTexture,bool requiresRenderbufferSupport,bool requiresBlending)163*8975f5c5SAndroid Build Coastguard Worker static bool GetFormatSupportBase(const TextureCapsMap &textureCaps,
164*8975f5c5SAndroid Build Coastguard Worker                                  const GLenum *requiredFormats,
165*8975f5c5SAndroid Build Coastguard Worker                                  size_t requiredFormatsSize,
166*8975f5c5SAndroid Build Coastguard Worker                                  bool requiresTexturing,
167*8975f5c5SAndroid Build Coastguard Worker                                  bool requiresFiltering,
168*8975f5c5SAndroid Build Coastguard Worker                                  bool requiresAttachingTexture,
169*8975f5c5SAndroid Build Coastguard Worker                                  bool requiresRenderbufferSupport,
170*8975f5c5SAndroid Build Coastguard Worker                                  bool requiresBlending)
171*8975f5c5SAndroid Build Coastguard Worker {
172*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < requiredFormatsSize; i++)
173*8975f5c5SAndroid Build Coastguard Worker     {
174*8975f5c5SAndroid Build Coastguard Worker         const TextureCaps &cap = textureCaps.get(requiredFormats[i]);
175*8975f5c5SAndroid Build Coastguard Worker         if (requiresTexturing && !cap.texturable)
176*8975f5c5SAndroid Build Coastguard Worker         {
177*8975f5c5SAndroid Build Coastguard Worker             return false;
178*8975f5c5SAndroid Build Coastguard Worker         }
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker         if (requiresFiltering && !cap.filterable)
181*8975f5c5SAndroid Build Coastguard Worker         {
182*8975f5c5SAndroid Build Coastguard Worker             return false;
183*8975f5c5SAndroid Build Coastguard Worker         }
184*8975f5c5SAndroid Build Coastguard Worker 
185*8975f5c5SAndroid Build Coastguard Worker         if (requiresAttachingTexture && !cap.textureAttachment)
186*8975f5c5SAndroid Build Coastguard Worker         {
187*8975f5c5SAndroid Build Coastguard Worker             return false;
188*8975f5c5SAndroid Build Coastguard Worker         }
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker         if (requiresRenderbufferSupport && !cap.renderbuffer)
191*8975f5c5SAndroid Build Coastguard Worker         {
192*8975f5c5SAndroid Build Coastguard Worker             return false;
193*8975f5c5SAndroid Build Coastguard Worker         }
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker         if (requiresBlending && !cap.blendable)
196*8975f5c5SAndroid Build Coastguard Worker         {
197*8975f5c5SAndroid Build Coastguard Worker             return false;
198*8975f5c5SAndroid Build Coastguard Worker         }
199*8975f5c5SAndroid Build Coastguard Worker     }
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     return true;
202*8975f5c5SAndroid Build Coastguard Worker }
203*8975f5c5SAndroid Build Coastguard Worker 
204*8975f5c5SAndroid Build Coastguard Worker template <size_t N>
GetFormatSupport(const TextureCapsMap & textureCaps,const GLenum (& requiredFormats)[N],bool requiresTexturing,bool requiresFiltering,bool requiresAttachingTexture,bool requiresRenderbufferSupport,bool requiresBlending)205*8975f5c5SAndroid Build Coastguard Worker static bool GetFormatSupport(const TextureCapsMap &textureCaps,
206*8975f5c5SAndroid Build Coastguard Worker                              const GLenum (&requiredFormats)[N],
207*8975f5c5SAndroid Build Coastguard Worker                              bool requiresTexturing,
208*8975f5c5SAndroid Build Coastguard Worker                              bool requiresFiltering,
209*8975f5c5SAndroid Build Coastguard Worker                              bool requiresAttachingTexture,
210*8975f5c5SAndroid Build Coastguard Worker                              bool requiresRenderbufferSupport,
211*8975f5c5SAndroid Build Coastguard Worker                              bool requiresBlending)
212*8975f5c5SAndroid Build Coastguard Worker {
213*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupportBase(textureCaps, requiredFormats, N, requiresTexturing,
214*8975f5c5SAndroid Build Coastguard Worker                                 requiresFiltering, requiresAttachingTexture,
215*8975f5c5SAndroid Build Coastguard Worker                                 requiresRenderbufferSupport, requiresBlending);
216*8975f5c5SAndroid Build Coastguard Worker }
217*8975f5c5SAndroid Build Coastguard Worker 
218*8975f5c5SAndroid Build Coastguard Worker // Check for GL_OES_packed_depth_stencil support
DeterminePackedDepthStencilSupport(const TextureCapsMap & textureCaps)219*8975f5c5SAndroid Build Coastguard Worker static bool DeterminePackedDepthStencilSupport(const TextureCapsMap &textureCaps)
220*8975f5c5SAndroid Build Coastguard Worker {
221*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
222*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH24_STENCIL8,
223*8975f5c5SAndroid Build Coastguard Worker     };
224*8975f5c5SAndroid Build Coastguard Worker 
225*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, true, true, false);
226*8975f5c5SAndroid Build Coastguard Worker }
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_NV_read_depth support
DetermineReadDepthSupport(const TextureCapsMap & textureCaps)229*8975f5c5SAndroid Build Coastguard Worker static bool DetermineReadDepthSupport(const TextureCapsMap &textureCaps)
230*8975f5c5SAndroid Build Coastguard Worker {
231*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
232*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT16,
233*8975f5c5SAndroid Build Coastguard Worker     };
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, false, false);
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_NV_read_stencil support
DetermineReadStencilSupport(const TextureCapsMap & textureCaps)239*8975f5c5SAndroid Build Coastguard Worker static bool DetermineReadStencilSupport(const TextureCapsMap &textureCaps)
240*8975f5c5SAndroid Build Coastguard Worker {
241*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
242*8975f5c5SAndroid Build Coastguard Worker         GL_STENCIL_INDEX8,
243*8975f5c5SAndroid Build Coastguard Worker     };
244*8975f5c5SAndroid Build Coastguard Worker 
245*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, true, false, false);
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker 
248*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_NV_depth_buffer_float2 support
DetermineDepthBufferFloat2Support(const TextureCapsMap & textureCaps)249*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDepthBufferFloat2Support(const TextureCapsMap &textureCaps)
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
252*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT32F,
253*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH32F_STENCIL8,
254*8975f5c5SAndroid Build Coastguard Worker     };
255*8975f5c5SAndroid Build Coastguard Worker 
256*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, false, false);
257*8975f5c5SAndroid Build Coastguard Worker }
258*8975f5c5SAndroid Build Coastguard Worker 
259*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_ARM_rgba8 support
DetermineRGBA8TextureSupport(const TextureCapsMap & textureCaps)260*8975f5c5SAndroid Build Coastguard Worker static bool DetermineRGBA8TextureSupport(const TextureCapsMap &textureCaps)
261*8975f5c5SAndroid Build Coastguard Worker {
262*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
263*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8,
264*8975f5c5SAndroid Build Coastguard Worker     };
265*8975f5c5SAndroid Build Coastguard Worker 
266*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, false, true, false);
267*8975f5c5SAndroid Build Coastguard Worker }
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_required_internalformat support
DetermineRequiredInternalFormatTextureSupport(const TextureCapsMap & textureCaps)270*8975f5c5SAndroid Build Coastguard Worker static bool DetermineRequiredInternalFormatTextureSupport(const TextureCapsMap &textureCaps)
271*8975f5c5SAndroid Build Coastguard Worker {
272*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredTexturingFormats[] = {
273*8975f5c5SAndroid Build Coastguard Worker         GL_ALPHA8_OES,
274*8975f5c5SAndroid Build Coastguard Worker         GL_LUMINANCE8_OES,
275*8975f5c5SAndroid Build Coastguard Worker         GL_LUMINANCE8_ALPHA8_OES,
276*8975f5c5SAndroid Build Coastguard Worker         GL_LUMINANCE4_ALPHA4_OES,
277*8975f5c5SAndroid Build Coastguard Worker         GL_RGB565_OES,
278*8975f5c5SAndroid Build Coastguard Worker         GL_RGB8_OES,
279*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA4_OES,
280*8975f5c5SAndroid Build Coastguard Worker         GL_RGB5_A1_OES,
281*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8_OES,
282*8975f5c5SAndroid Build Coastguard Worker     };
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredRenderingFormats[] = {
285*8975f5c5SAndroid Build Coastguard Worker         GL_RGB565_OES, GL_RGB8_OES, GL_RGBA4_OES, GL_RGB5_A1_OES, GL_RGBA8_OES,
286*8975f5c5SAndroid Build Coastguard Worker     };
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredTexturingFormats, true, false, false, false,
289*8975f5c5SAndroid Build Coastguard Worker                             false) &&
290*8975f5c5SAndroid Build Coastguard Worker            GetFormatSupport(textureCaps, requiredRenderingFormats, false, false, false, true,
291*8975f5c5SAndroid Build Coastguard Worker                             false);
292*8975f5c5SAndroid Build Coastguard Worker }
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_rgb8_rgba8 support
DetermineRGB8TextureSupport(const TextureCapsMap & textureCaps)295*8975f5c5SAndroid Build Coastguard Worker static bool DetermineRGB8TextureSupport(const TextureCapsMap &textureCaps)
296*8975f5c5SAndroid Build Coastguard Worker {
297*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
298*8975f5c5SAndroid Build Coastguard Worker         GL_RGB8,
299*8975f5c5SAndroid Build Coastguard Worker     };
300*8975f5c5SAndroid Build Coastguard Worker 
301*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, false, true, false);
302*8975f5c5SAndroid Build Coastguard Worker }
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_EXT_texture_format_BGRA8888 support
DetermineBGRA8TextureSupport(const TextureCapsMap & textureCaps)305*8975f5c5SAndroid Build Coastguard Worker static bool DetermineBGRA8TextureSupport(const TextureCapsMap &textureCaps)
306*8975f5c5SAndroid Build Coastguard Worker {
307*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
308*8975f5c5SAndroid Build Coastguard Worker         GL_BGRA8_EXT,
309*8975f5c5SAndroid Build Coastguard Worker     };
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, true, true, false);
312*8975f5c5SAndroid Build Coastguard Worker }
313*8975f5c5SAndroid Build Coastguard Worker 
314*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_EXT_read_format_bgra support
DetermineBGRAReadFormatSupport(const TextureCapsMap & textureCaps)315*8975f5c5SAndroid Build Coastguard Worker static bool DetermineBGRAReadFormatSupport(const TextureCapsMap &textureCaps)
316*8975f5c5SAndroid Build Coastguard Worker {
317*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
318*8975f5c5SAndroid Build Coastguard Worker         GL_BGRA8_EXT,
319*8975f5c5SAndroid Build Coastguard Worker         // TODO(http://anglebug.com/42262931): GL_EXT_read_format_bgra specifies 2 more types, which
320*8975f5c5SAndroid Build Coastguard Worker         // are currently ignored. The equivalent formats would be: GL_BGRA4_ANGLEX,
321*8975f5c5SAndroid Build Coastguard Worker         // GL_BGR5_A1_ANGLEX
322*8975f5c5SAndroid Build Coastguard Worker     };
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, true, false);
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_color_buffer_half_float support
DetermineColorBufferHalfFloatSupport(const TextureCapsMap & textureCaps)328*8975f5c5SAndroid Build Coastguard Worker static bool DetermineColorBufferHalfFloatSupport(const TextureCapsMap &textureCaps)
329*8975f5c5SAndroid Build Coastguard Worker {
330*8975f5c5SAndroid Build Coastguard Worker     // EXT_color_buffer_half_float issue #2 states that an implementation doesn't need to support
331*8975f5c5SAndroid Build Coastguard Worker     // rendering to any of the formats but is expected to be able to render to at least one. WebGL
332*8975f5c5SAndroid Build Coastguard Worker     // requires that at least RGBA16F is renderable so we make the same requirement.
333*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
334*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA16F,
335*8975f5c5SAndroid Build Coastguard Worker     };
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, true, true, false);
338*8975f5c5SAndroid Build Coastguard Worker }
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_texture_half_float support
DetermineHalfFloatTextureSupport(const TextureCapsMap & textureCaps)341*8975f5c5SAndroid Build Coastguard Worker static bool DetermineHalfFloatTextureSupport(const TextureCapsMap &textureCaps)
342*8975f5c5SAndroid Build Coastguard Worker {
343*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
344*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA16F, GL_RGB16F, GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE16F_EXT, GL_ALPHA16F_EXT,
345*8975f5c5SAndroid Build Coastguard Worker     };
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, false, false, false);
348*8975f5c5SAndroid Build Coastguard Worker }
349*8975f5c5SAndroid Build Coastguard Worker 
350*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_texture_half_float_linear support
DetermineHalfFloatTextureFilteringSupport(const TextureCapsMap & textureCaps,bool checkLegacyFormats)351*8975f5c5SAndroid Build Coastguard Worker static bool DetermineHalfFloatTextureFilteringSupport(const TextureCapsMap &textureCaps,
352*8975f5c5SAndroid Build Coastguard Worker                                                       bool checkLegacyFormats)
353*8975f5c5SAndroid Build Coastguard Worker {
354*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {GL_RGBA16F, GL_RGB16F};
355*8975f5c5SAndroid Build Coastguard Worker     // If GL_OES_texture_half_float is present, this extension must also support legacy formats
356*8975f5c5SAndroid Build Coastguard Worker     // introduced by that extension
357*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormatsES2[] = {GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE16F_EXT,
358*8975f5c5SAndroid Build Coastguard Worker                                              GL_ALPHA16F_EXT};
359*8975f5c5SAndroid Build Coastguard Worker 
360*8975f5c5SAndroid Build Coastguard Worker     if (checkLegacyFormats &&
361*8975f5c5SAndroid Build Coastguard Worker         !GetFormatSupport(textureCaps, requiredFormatsES2, false, true, false, false, false))
362*8975f5c5SAndroid Build Coastguard Worker     {
363*8975f5c5SAndroid Build Coastguard Worker         return false;
364*8975f5c5SAndroid Build Coastguard Worker     }
365*8975f5c5SAndroid Build Coastguard Worker 
366*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, true, false, false, false);
367*8975f5c5SAndroid Build Coastguard Worker }
368*8975f5c5SAndroid Build Coastguard Worker 
369*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_texture_float support
DetermineFloatTextureSupport(const TextureCapsMap & textureCaps)370*8975f5c5SAndroid Build Coastguard Worker static bool DetermineFloatTextureSupport(const TextureCapsMap &textureCaps)
371*8975f5c5SAndroid Build Coastguard Worker {
372*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
373*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA32F, GL_RGB32F, GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE32F_EXT, GL_ALPHA32F_EXT,
374*8975f5c5SAndroid Build Coastguard Worker     };
375*8975f5c5SAndroid Build Coastguard Worker 
376*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, false, false, false);
377*8975f5c5SAndroid Build Coastguard Worker }
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_texture_float_linear support
DetermineFloatTextureFilteringSupport(const TextureCapsMap & textureCaps,bool checkLegacyFormats)380*8975f5c5SAndroid Build Coastguard Worker static bool DetermineFloatTextureFilteringSupport(const TextureCapsMap &textureCaps,
381*8975f5c5SAndroid Build Coastguard Worker                                                   bool checkLegacyFormats)
382*8975f5c5SAndroid Build Coastguard Worker {
383*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
384*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA32F,
385*8975f5c5SAndroid Build Coastguard Worker         GL_RGB32F,
386*8975f5c5SAndroid Build Coastguard Worker     };
387*8975f5c5SAndroid Build Coastguard Worker     // If GL_OES_texture_float is present, this extension must also support legacy formats
388*8975f5c5SAndroid Build Coastguard Worker     // introduced by that extension
389*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormatsES2[] = {
390*8975f5c5SAndroid Build Coastguard Worker         GL_LUMINANCE_ALPHA32F_EXT,
391*8975f5c5SAndroid Build Coastguard Worker         GL_LUMINANCE32F_EXT,
392*8975f5c5SAndroid Build Coastguard Worker         GL_ALPHA32F_EXT,
393*8975f5c5SAndroid Build Coastguard Worker     };
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker     if (checkLegacyFormats &&
396*8975f5c5SAndroid Build Coastguard Worker         !GetFormatSupport(textureCaps, requiredFormatsES2, false, true, false, false, false))
397*8975f5c5SAndroid Build Coastguard Worker     {
398*8975f5c5SAndroid Build Coastguard Worker         return false;
399*8975f5c5SAndroid Build Coastguard Worker     }
400*8975f5c5SAndroid Build Coastguard Worker 
401*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, true, false, false, false);
402*8975f5c5SAndroid Build Coastguard Worker }
403*8975f5c5SAndroid Build Coastguard Worker 
404*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_EXT_texture_rg support
DetermineRGTextureSupport(const TextureCapsMap & textureCaps,bool checkHalfFloatFormats,bool checkFloatFormats)405*8975f5c5SAndroid Build Coastguard Worker static bool DetermineRGTextureSupport(const TextureCapsMap &textureCaps,
406*8975f5c5SAndroid Build Coastguard Worker                                       bool checkHalfFloatFormats,
407*8975f5c5SAndroid Build Coastguard Worker                                       bool checkFloatFormats)
408*8975f5c5SAndroid Build Coastguard Worker {
409*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
410*8975f5c5SAndroid Build Coastguard Worker         GL_R8,
411*8975f5c5SAndroid Build Coastguard Worker         GL_RG8,
412*8975f5c5SAndroid Build Coastguard Worker     };
413*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredHalfFloatFormats[] = {
414*8975f5c5SAndroid Build Coastguard Worker         GL_R16F,
415*8975f5c5SAndroid Build Coastguard Worker         GL_RG16F,
416*8975f5c5SAndroid Build Coastguard Worker     };
417*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFloatFormats[] = {
418*8975f5c5SAndroid Build Coastguard Worker         GL_R32F,
419*8975f5c5SAndroid Build Coastguard Worker         GL_RG32F,
420*8975f5c5SAndroid Build Coastguard Worker     };
421*8975f5c5SAndroid Build Coastguard Worker 
422*8975f5c5SAndroid Build Coastguard Worker     if (checkHalfFloatFormats &&
423*8975f5c5SAndroid Build Coastguard Worker         !GetFormatSupport(textureCaps, requiredHalfFloatFormats, true, false, false, false, false))
424*8975f5c5SAndroid Build Coastguard Worker     {
425*8975f5c5SAndroid Build Coastguard Worker         return false;
426*8975f5c5SAndroid Build Coastguard Worker     }
427*8975f5c5SAndroid Build Coastguard Worker 
428*8975f5c5SAndroid Build Coastguard Worker     if (checkFloatFormats &&
429*8975f5c5SAndroid Build Coastguard Worker         !GetFormatSupport(textureCaps, requiredFloatFormats, true, false, false, false, false))
430*8975f5c5SAndroid Build Coastguard Worker     {
431*8975f5c5SAndroid Build Coastguard Worker         return false;
432*8975f5c5SAndroid Build Coastguard Worker     }
433*8975f5c5SAndroid Build Coastguard Worker 
434*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, true, true, false);
435*8975f5c5SAndroid Build Coastguard Worker }
436*8975f5c5SAndroid Build Coastguard Worker 
DetermineTextureFormat2101010Support(const TextureCapsMap & textureCaps)437*8975f5c5SAndroid Build Coastguard Worker static bool DetermineTextureFormat2101010Support(const TextureCapsMap &textureCaps)
438*8975f5c5SAndroid Build Coastguard Worker {
439*8975f5c5SAndroid Build Coastguard Worker     // GL_EXT_texture_type_2_10_10_10_REV specifies both RGBA and RGB support.
440*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
441*8975f5c5SAndroid Build Coastguard Worker         GL_RGB10_A2,
442*8975f5c5SAndroid Build Coastguard Worker         GL_RGB10_EXT,
443*8975f5c5SAndroid Build Coastguard Worker     };
444*8975f5c5SAndroid Build Coastguard Worker 
445*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
446*8975f5c5SAndroid Build Coastguard Worker }
447*8975f5c5SAndroid Build Coastguard Worker 
448*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_texture_compression_dxt1 support
DetermineDXT1TextureSupport(const TextureCapsMap & textureCaps)449*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDXT1TextureSupport(const TextureCapsMap &textureCaps)
450*8975f5c5SAndroid Build Coastguard Worker {
451*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
452*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
453*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
454*8975f5c5SAndroid Build Coastguard Worker     };
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
457*8975f5c5SAndroid Build Coastguard Worker }
458*8975f5c5SAndroid Build Coastguard Worker 
459*8975f5c5SAndroid Build Coastguard Worker // Check for GL_ANGLE_texture_compression_dxt3 support
DetermineDXT3TextureSupport(const TextureCapsMap & textureCaps)460*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDXT3TextureSupport(const TextureCapsMap &textureCaps)
461*8975f5c5SAndroid Build Coastguard Worker {
462*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
463*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,
464*8975f5c5SAndroid Build Coastguard Worker     };
465*8975f5c5SAndroid Build Coastguard Worker 
466*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
467*8975f5c5SAndroid Build Coastguard Worker }
468*8975f5c5SAndroid Build Coastguard Worker 
469*8975f5c5SAndroid Build Coastguard Worker // Check for GL_ANGLE_texture_compression_dxt5 support
DetermineDXT5TextureSupport(const TextureCapsMap & textureCaps)470*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDXT5TextureSupport(const TextureCapsMap &textureCaps)
471*8975f5c5SAndroid Build Coastguard Worker {
472*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
473*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,
474*8975f5c5SAndroid Build Coastguard Worker     };
475*8975f5c5SAndroid Build Coastguard Worker 
476*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
477*8975f5c5SAndroid Build Coastguard Worker }
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_texture_compression_s3tc_srgb support
DetermineS3TCsRGBTextureSupport(const TextureCapsMap & textureCaps)480*8975f5c5SAndroid Build Coastguard Worker static bool DetermineS3TCsRGBTextureSupport(const TextureCapsMap &textureCaps)
481*8975f5c5SAndroid Build Coastguard Worker {
482*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
483*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,
484*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
485*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,
486*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,
487*8975f5c5SAndroid Build Coastguard Worker     };
488*8975f5c5SAndroid Build Coastguard Worker 
489*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
490*8975f5c5SAndroid Build Coastguard Worker }
491*8975f5c5SAndroid Build Coastguard Worker 
492*8975f5c5SAndroid Build Coastguard Worker // Check for GL_KHR_texture_compression_astc_ldr support
DetermineASTCLDRTextureSupport(const TextureCapsMap & textureCaps)493*8975f5c5SAndroid Build Coastguard Worker static bool DetermineASTCLDRTextureSupport(const TextureCapsMap &textureCaps)
494*8975f5c5SAndroid Build Coastguard Worker {
495*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
496*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_4x4_KHR,           GL_COMPRESSED_RGBA_ASTC_5x4_KHR,
497*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_5x5_KHR,           GL_COMPRESSED_RGBA_ASTC_6x5_KHR,
498*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_6x6_KHR,           GL_COMPRESSED_RGBA_ASTC_8x5_KHR,
499*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_8x6_KHR,           GL_COMPRESSED_RGBA_ASTC_8x8_KHR,
500*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_10x5_KHR,          GL_COMPRESSED_RGBA_ASTC_10x6_KHR,
501*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_10x8_KHR,          GL_COMPRESSED_RGBA_ASTC_10x10_KHR,
502*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_12x10_KHR,         GL_COMPRESSED_RGBA_ASTC_12x12_KHR,
503*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,
504*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
505*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
506*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,   GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
507*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,  GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
508*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,  GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
509*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,
510*8975f5c5SAndroid Build Coastguard Worker     };
511*8975f5c5SAndroid Build Coastguard Worker 
512*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
513*8975f5c5SAndroid Build Coastguard Worker }
514*8975f5c5SAndroid Build Coastguard Worker 
515*8975f5c5SAndroid Build Coastguard Worker // Check for GL_OES_texture_compression_astc support
DetermineASTCOESTExtureSupport(const TextureCapsMap & textureCaps)516*8975f5c5SAndroid Build Coastguard Worker static bool DetermineASTCOESTExtureSupport(const TextureCapsMap &textureCaps)
517*8975f5c5SAndroid Build Coastguard Worker {
518*8975f5c5SAndroid Build Coastguard Worker     if (!DetermineASTCLDRTextureSupport(textureCaps))
519*8975f5c5SAndroid Build Coastguard Worker     {
520*8975f5c5SAndroid Build Coastguard Worker         return false;
521*8975f5c5SAndroid Build Coastguard Worker     }
522*8975f5c5SAndroid Build Coastguard Worker 
523*8975f5c5SAndroid Build Coastguard Worker     // The OES version of the extension also requires the 3D ASTC formats
524*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
525*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_3x3x3_OES,         GL_COMPRESSED_RGBA_ASTC_4x3x3_OES,
526*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_4x4x3_OES,         GL_COMPRESSED_RGBA_ASTC_4x4x4_OES,
527*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_5x4x4_OES,         GL_COMPRESSED_RGBA_ASTC_5x5x4_OES,
528*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_5x5x5_OES,         GL_COMPRESSED_RGBA_ASTC_6x5x5_OES,
529*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_ASTC_6x6x5_OES,         GL_COMPRESSED_RGBA_ASTC_6x6x6_OES,
530*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES,
531*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES,
532*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES,
533*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES,
534*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES,
535*8975f5c5SAndroid Build Coastguard Worker     };
536*8975f5c5SAndroid Build Coastguard Worker 
537*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
538*8975f5c5SAndroid Build Coastguard Worker }
539*8975f5c5SAndroid Build Coastguard Worker 
540*8975f5c5SAndroid Build Coastguard Worker // Check for GL_ETC1_RGB8_OES support
DetermineETC1RGB8TextureSupport(const TextureCapsMap & textureCaps)541*8975f5c5SAndroid Build Coastguard Worker static bool DetermineETC1RGB8TextureSupport(const TextureCapsMap &textureCaps)
542*8975f5c5SAndroid Build Coastguard Worker {
543*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
544*8975f5c5SAndroid Build Coastguard Worker         GL_ETC1_RGB8_OES,
545*8975f5c5SAndroid Build Coastguard Worker     };
546*8975f5c5SAndroid Build Coastguard Worker 
547*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
548*8975f5c5SAndroid Build Coastguard Worker }
549*8975f5c5SAndroid Build Coastguard Worker 
550*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_ETC2_RGB8_texture support
DetermineETC2RGB8TextureSupport(const TextureCapsMap & textureCaps)551*8975f5c5SAndroid Build Coastguard Worker static bool DetermineETC2RGB8TextureSupport(const TextureCapsMap &textureCaps)
552*8975f5c5SAndroid Build Coastguard Worker {
553*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
554*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGB8_ETC2,
555*8975f5c5SAndroid Build Coastguard Worker     };
556*8975f5c5SAndroid Build Coastguard Worker 
557*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
558*8975f5c5SAndroid Build Coastguard Worker }
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_ETC2_sRGB8_texture support
DetermineETC2sRGB8TextureSupport(const TextureCapsMap & textureCaps)561*8975f5c5SAndroid Build Coastguard Worker static bool DetermineETC2sRGB8TextureSupport(const TextureCapsMap &textureCaps)
562*8975f5c5SAndroid Build Coastguard Worker {
563*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
564*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ETC2,
565*8975f5c5SAndroid Build Coastguard Worker     };
566*8975f5c5SAndroid Build Coastguard Worker 
567*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
568*8975f5c5SAndroid Build Coastguard Worker }
569*8975f5c5SAndroid Build Coastguard Worker 
570*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_ETC2_punchthroughA_RGBA8_texture support
DetermineETC2PunchthroughARGB8TextureSupport(const TextureCapsMap & textureCaps)571*8975f5c5SAndroid Build Coastguard Worker static bool DetermineETC2PunchthroughARGB8TextureSupport(const TextureCapsMap &textureCaps)
572*8975f5c5SAndroid Build Coastguard Worker {
573*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
574*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
575*8975f5c5SAndroid Build Coastguard Worker     };
576*8975f5c5SAndroid Build Coastguard Worker 
577*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
578*8975f5c5SAndroid Build Coastguard Worker }
579*8975f5c5SAndroid Build Coastguard Worker 
580*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture support
DetermineETC2PunchthroughAsRGB8AlphaTextureSupport(const TextureCapsMap & textureCaps)581*8975f5c5SAndroid Build Coastguard Worker static bool DetermineETC2PunchthroughAsRGB8AlphaTextureSupport(const TextureCapsMap &textureCaps)
582*8975f5c5SAndroid Build Coastguard Worker {
583*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
584*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
585*8975f5c5SAndroid Build Coastguard Worker     };
586*8975f5c5SAndroid Build Coastguard Worker 
587*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
588*8975f5c5SAndroid Build Coastguard Worker }
589*8975f5c5SAndroid Build Coastguard Worker 
590*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_ETC2_RGBA8_texture support
DetermineETC2RGBA8TextureSupport(const TextureCapsMap & textureCaps)591*8975f5c5SAndroid Build Coastguard Worker static bool DetermineETC2RGBA8TextureSupport(const TextureCapsMap &textureCaps)
592*8975f5c5SAndroid Build Coastguard Worker {
593*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
594*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA8_ETC2_EAC,
595*8975f5c5SAndroid Build Coastguard Worker     };
596*8975f5c5SAndroid Build Coastguard Worker 
597*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
598*8975f5c5SAndroid Build Coastguard Worker }
599*8975f5c5SAndroid Build Coastguard Worker 
600*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_ETC2_sRGB8_alpha8_texture support
DetermineETC2sRGB8Alpha8TextureSupport(const TextureCapsMap & textureCaps)601*8975f5c5SAndroid Build Coastguard Worker static bool DetermineETC2sRGB8Alpha8TextureSupport(const TextureCapsMap &textureCaps)
602*8975f5c5SAndroid Build Coastguard Worker {
603*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
604*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
605*8975f5c5SAndroid Build Coastguard Worker     };
606*8975f5c5SAndroid Build Coastguard Worker 
607*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
608*8975f5c5SAndroid Build Coastguard Worker }
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_EAC_R11_unsigned_texture support
DetermineEACR11UnsignedTextureSupport(const TextureCapsMap & textureCaps)611*8975f5c5SAndroid Build Coastguard Worker static bool DetermineEACR11UnsignedTextureSupport(const TextureCapsMap &textureCaps)
612*8975f5c5SAndroid Build Coastguard Worker {
613*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
614*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_R11_EAC,
615*8975f5c5SAndroid Build Coastguard Worker     };
616*8975f5c5SAndroid Build Coastguard Worker 
617*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
618*8975f5c5SAndroid Build Coastguard Worker }
619*8975f5c5SAndroid Build Coastguard Worker 
620*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_EAC_R11_signed_texture support
DetermineEACR11SignedTextureSupport(const TextureCapsMap & textureCaps)621*8975f5c5SAndroid Build Coastguard Worker static bool DetermineEACR11SignedTextureSupport(const TextureCapsMap &textureCaps)
622*8975f5c5SAndroid Build Coastguard Worker {
623*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
624*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SIGNED_R11_EAC,
625*8975f5c5SAndroid Build Coastguard Worker     };
626*8975f5c5SAndroid Build Coastguard Worker 
627*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
628*8975f5c5SAndroid Build Coastguard Worker }
629*8975f5c5SAndroid Build Coastguard Worker 
630*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_EAC_RG11_unsigned_texture support
DetermineEACRG11UnsignedTextureSupport(const TextureCapsMap & textureCaps)631*8975f5c5SAndroid Build Coastguard Worker static bool DetermineEACRG11UnsignedTextureSupport(const TextureCapsMap &textureCaps)
632*8975f5c5SAndroid Build Coastguard Worker {
633*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
634*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RG11_EAC,
635*8975f5c5SAndroid Build Coastguard Worker     };
636*8975f5c5SAndroid Build Coastguard Worker 
637*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
638*8975f5c5SAndroid Build Coastguard Worker }
639*8975f5c5SAndroid Build Coastguard Worker 
640*8975f5c5SAndroid Build Coastguard Worker // Check for OES_compressed_EAC_RG11_signed_texture support
DetermineEACRG11SignedTextureSupport(const TextureCapsMap & textureCaps)641*8975f5c5SAndroid Build Coastguard Worker static bool DetermineEACRG11SignedTextureSupport(const TextureCapsMap &textureCaps)
642*8975f5c5SAndroid Build Coastguard Worker {
643*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
644*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SIGNED_RG11_EAC,
645*8975f5c5SAndroid Build Coastguard Worker     };
646*8975f5c5SAndroid Build Coastguard Worker 
647*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
648*8975f5c5SAndroid Build Coastguard Worker }
649*8975f5c5SAndroid Build Coastguard Worker 
650*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_sRGB support
DetermineSRGBTextureSupport(const TextureCapsMap & textureCaps)651*8975f5c5SAndroid Build Coastguard Worker static bool DetermineSRGBTextureSupport(const TextureCapsMap &textureCaps)
652*8975f5c5SAndroid Build Coastguard Worker {
653*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFilterFormats[] = {
654*8975f5c5SAndroid Build Coastguard Worker         GL_SRGB8,
655*8975f5c5SAndroid Build Coastguard Worker         GL_SRGB8_ALPHA8,
656*8975f5c5SAndroid Build Coastguard Worker     };
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredRenderFormats[] = {
659*8975f5c5SAndroid Build Coastguard Worker         GL_SRGB8_ALPHA8,
660*8975f5c5SAndroid Build Coastguard Worker     };
661*8975f5c5SAndroid Build Coastguard Worker 
662*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFilterFormats, true, true, false, false, false) &&
663*8975f5c5SAndroid Build Coastguard Worker            GetFormatSupport(textureCaps, requiredRenderFormats, true, false, true, true, false);
664*8975f5c5SAndroid Build Coastguard Worker }
665*8975f5c5SAndroid Build Coastguard Worker 
666*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_texture_sRGB_R8 support
DetermineSRGBR8TextureSupport(const TextureCapsMap & textureCaps)667*8975f5c5SAndroid Build Coastguard Worker static bool DetermineSRGBR8TextureSupport(const TextureCapsMap &textureCaps)
668*8975f5c5SAndroid Build Coastguard Worker {
669*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFilterFormats[] = {GL_SR8_EXT};
670*8975f5c5SAndroid Build Coastguard Worker 
671*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFilterFormats, true, true, false, false, false);
672*8975f5c5SAndroid Build Coastguard Worker }
673*8975f5c5SAndroid Build Coastguard Worker 
674*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_texture_sRGB_RG8 support
DetermineSRGBRG8TextureSupport(const TextureCapsMap & textureCaps)675*8975f5c5SAndroid Build Coastguard Worker static bool DetermineSRGBRG8TextureSupport(const TextureCapsMap &textureCaps)
676*8975f5c5SAndroid Build Coastguard Worker {
677*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFilterFormats[] = {GL_SRG8_EXT};
678*8975f5c5SAndroid Build Coastguard Worker 
679*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFilterFormats, true, true, false, false, false);
680*8975f5c5SAndroid Build Coastguard Worker }
681*8975f5c5SAndroid Build Coastguard Worker 
682*8975f5c5SAndroid Build Coastguard Worker // Check for GL_ANGLE_depth_texture support
DetermineDepthTextureANGLESupport(const TextureCapsMap & textureCaps)683*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDepthTextureANGLESupport(const TextureCapsMap &textureCaps)
684*8975f5c5SAndroid Build Coastguard Worker {
685*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
686*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT16,
687*8975f5c5SAndroid Build Coastguard Worker #if !ANGLE_PLATFORM_IOS_FAMILY
688*8975f5c5SAndroid Build Coastguard Worker         // anglebug.com/42264611
689*8975f5c5SAndroid Build Coastguard Worker         // TODO(dino): Temporarily Removing the need for GL_DEPTH_COMPONENT32_OES
690*8975f5c5SAndroid Build Coastguard Worker         // because it is not supported on iOS.
691*8975f5c5SAndroid Build Coastguard Worker         // TODO(dino): I think this needs to be a runtime check when running an iOS app on Mac.
692*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT32_OES,
693*8975f5c5SAndroid Build Coastguard Worker #endif
694*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH24_STENCIL8_OES,
695*8975f5c5SAndroid Build Coastguard Worker     };
696*8975f5c5SAndroid Build Coastguard Worker 
697*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, false, false);
698*8975f5c5SAndroid Build Coastguard Worker }
699*8975f5c5SAndroid Build Coastguard Worker 
700*8975f5c5SAndroid Build Coastguard Worker // Check for GL_OES_depth_texture support
DetermineDepthTextureOESSupport(const TextureCapsMap & textureCaps)701*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDepthTextureOESSupport(const TextureCapsMap &textureCaps)
702*8975f5c5SAndroid Build Coastguard Worker {
703*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
704*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT16,
705*8975f5c5SAndroid Build Coastguard Worker #if !ANGLE_PLATFORM_IOS_FAMILY
706*8975f5c5SAndroid Build Coastguard Worker         // anglebug.com/42264611
707*8975f5c5SAndroid Build Coastguard Worker         // TODO(dino): Temporarily Removing the need for GL_DEPTH_COMPONENT32_OES
708*8975f5c5SAndroid Build Coastguard Worker         // because it is not supported on iOS.
709*8975f5c5SAndroid Build Coastguard Worker         // TODO(dino): I think this needs to be a runtime check when running an iOS app on Mac.
710*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT32_OES,
711*8975f5c5SAndroid Build Coastguard Worker #endif
712*8975f5c5SAndroid Build Coastguard Worker     };
713*8975f5c5SAndroid Build Coastguard Worker 
714*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, true, false);
715*8975f5c5SAndroid Build Coastguard Worker }
716*8975f5c5SAndroid Build Coastguard Worker 
717*8975f5c5SAndroid Build Coastguard Worker // Check for GL_OES_depth24
DetermineDepth24OESSupport(const TextureCapsMap & textureCaps)718*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDepth24OESSupport(const TextureCapsMap &textureCaps)
719*8975f5c5SAndroid Build Coastguard Worker {
720*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
721*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT24_OES,
722*8975f5c5SAndroid Build Coastguard Worker     };
723*8975f5c5SAndroid Build Coastguard Worker 
724*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, false, true, false);
725*8975f5c5SAndroid Build Coastguard Worker }
726*8975f5c5SAndroid Build Coastguard Worker 
727*8975f5c5SAndroid Build Coastguard Worker // Check for GL_OES_depth32 support
DetermineDepth32Support(const TextureCapsMap & textureCaps)728*8975f5c5SAndroid Build Coastguard Worker static bool DetermineDepth32Support(const TextureCapsMap &textureCaps)
729*8975f5c5SAndroid Build Coastguard Worker {
730*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
731*8975f5c5SAndroid Build Coastguard Worker         GL_DEPTH_COMPONENT32_OES,
732*8975f5c5SAndroid Build Coastguard Worker     };
733*8975f5c5SAndroid Build Coastguard Worker 
734*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, true, true, false);
735*8975f5c5SAndroid Build Coastguard Worker }
736*8975f5c5SAndroid Build Coastguard Worker 
737*8975f5c5SAndroid Build Coastguard Worker // Check for GL_CHROMIUM_color_buffer_float_rgb support
DetermineColorBufferFloatRGBSupport(const TextureCapsMap & textureCaps)738*8975f5c5SAndroid Build Coastguard Worker static bool DetermineColorBufferFloatRGBSupport(const TextureCapsMap &textureCaps)
739*8975f5c5SAndroid Build Coastguard Worker {
740*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
741*8975f5c5SAndroid Build Coastguard Worker         GL_RGB32F,
742*8975f5c5SAndroid Build Coastguard Worker     };
743*8975f5c5SAndroid Build Coastguard Worker 
744*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, false, false);
745*8975f5c5SAndroid Build Coastguard Worker }
746*8975f5c5SAndroid Build Coastguard Worker 
747*8975f5c5SAndroid Build Coastguard Worker // Check for GL_CHROMIUM_color_buffer_float_rgba support
DetermineColorBufferFloatRGBASupport(const TextureCapsMap & textureCaps)748*8975f5c5SAndroid Build Coastguard Worker static bool DetermineColorBufferFloatRGBASupport(const TextureCapsMap &textureCaps)
749*8975f5c5SAndroid Build Coastguard Worker {
750*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
751*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA32F,
752*8975f5c5SAndroid Build Coastguard Worker     };
753*8975f5c5SAndroid Build Coastguard Worker 
754*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, true, false);
755*8975f5c5SAndroid Build Coastguard Worker }
756*8975f5c5SAndroid Build Coastguard Worker 
757*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_color_buffer_float support
DetermineColorBufferFloatSupport(const TextureCapsMap & textureCaps)758*8975f5c5SAndroid Build Coastguard Worker static bool DetermineColorBufferFloatSupport(const TextureCapsMap &textureCaps)
759*8975f5c5SAndroid Build Coastguard Worker {
760*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum nonBlendableFormats[] = {
761*8975f5c5SAndroid Build Coastguard Worker         GL_R32F,
762*8975f5c5SAndroid Build Coastguard Worker         GL_RG32F,
763*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA32F,
764*8975f5c5SAndroid Build Coastguard Worker     };
765*8975f5c5SAndroid Build Coastguard Worker 
766*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum blendableFormats[] = {
767*8975f5c5SAndroid Build Coastguard Worker         GL_R16F,
768*8975f5c5SAndroid Build Coastguard Worker         GL_RG16F,
769*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA16F,
770*8975f5c5SAndroid Build Coastguard Worker         GL_R11F_G11F_B10F,
771*8975f5c5SAndroid Build Coastguard Worker     };
772*8975f5c5SAndroid Build Coastguard Worker 
773*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, nonBlendableFormats, true, false, true, true, false) &&
774*8975f5c5SAndroid Build Coastguard Worker            GetFormatSupport(textureCaps, blendableFormats, true, false, true, true, true);
775*8975f5c5SAndroid Build Coastguard Worker }
776*8975f5c5SAndroid Build Coastguard Worker 
777*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_float_blend support
DetermineFloatBlendSupport(const TextureCapsMap & textureCaps)778*8975f5c5SAndroid Build Coastguard Worker static bool DetermineFloatBlendSupport(const TextureCapsMap &textureCaps)
779*8975f5c5SAndroid Build Coastguard Worker {
780*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
781*8975f5c5SAndroid Build Coastguard Worker         GL_R32F,
782*8975f5c5SAndroid Build Coastguard Worker         GL_RG32F,
783*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA32F,
784*8975f5c5SAndroid Build Coastguard Worker     };
785*8975f5c5SAndroid Build Coastguard Worker 
786*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, true, true);
787*8975f5c5SAndroid Build Coastguard Worker }
788*8975f5c5SAndroid Build Coastguard Worker 
789*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_texture_norm16 support
DetermineTextureNorm16Support(const TextureCapsMap & textureCaps)790*8975f5c5SAndroid Build Coastguard Worker static bool DetermineTextureNorm16Support(const TextureCapsMap &textureCaps)
791*8975f5c5SAndroid Build Coastguard Worker {
792*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFilterFormats[] = {
793*8975f5c5SAndroid Build Coastguard Worker         GL_R16_EXT,       GL_RG16_EXT,       GL_RGB16_EXT,       GL_RGBA16_EXT,
794*8975f5c5SAndroid Build Coastguard Worker         GL_R16_SNORM_EXT, GL_RG16_SNORM_EXT, GL_RGB16_SNORM_EXT, GL_RGBA16_SNORM_EXT,
795*8975f5c5SAndroid Build Coastguard Worker     };
796*8975f5c5SAndroid Build Coastguard Worker 
797*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredRenderFormats[] = {
798*8975f5c5SAndroid Build Coastguard Worker         GL_R16_EXT,
799*8975f5c5SAndroid Build Coastguard Worker         GL_RG16_EXT,
800*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA16_EXT,
801*8975f5c5SAndroid Build Coastguard Worker     };
802*8975f5c5SAndroid Build Coastguard Worker 
803*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFilterFormats, true, true, false, false, false) &&
804*8975f5c5SAndroid Build Coastguard Worker            GetFormatSupport(textureCaps, requiredRenderFormats, true, false, true, true, false);
805*8975f5c5SAndroid Build Coastguard Worker }
806*8975f5c5SAndroid Build Coastguard Worker 
807*8975f5c5SAndroid Build Coastguard Worker // Check for EXT_texture_compression_rgtc support
DetermineRGTCTextureSupport(const TextureCapsMap & textureCaps)808*8975f5c5SAndroid Build Coastguard Worker static bool DetermineRGTCTextureSupport(const TextureCapsMap &textureCaps)
809*8975f5c5SAndroid Build Coastguard Worker {
810*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
811*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RED_RGTC1_EXT, GL_COMPRESSED_SIGNED_RED_RGTC1_EXT,
812*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT};
813*8975f5c5SAndroid Build Coastguard Worker 
814*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
815*8975f5c5SAndroid Build Coastguard Worker }
816*8975f5c5SAndroid Build Coastguard Worker 
817*8975f5c5SAndroid Build Coastguard Worker // Check for EXT_texture_compression_bptc support
DetermineBPTCTextureSupport(const TextureCapsMap & textureCaps)818*8975f5c5SAndroid Build Coastguard Worker static bool DetermineBPTCTextureSupport(const TextureCapsMap &textureCaps)
819*8975f5c5SAndroid Build Coastguard Worker {
820*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
821*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT,
822*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT};
823*8975f5c5SAndroid Build Coastguard Worker 
824*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
825*8975f5c5SAndroid Build Coastguard Worker }
826*8975f5c5SAndroid Build Coastguard Worker 
827*8975f5c5SAndroid Build Coastguard Worker // Check for GL_IMG_texture_compression_pvrtc support
DeterminePVRTCTextureSupport(const TextureCapsMap & textureCaps)828*8975f5c5SAndroid Build Coastguard Worker static bool DeterminePVRTCTextureSupport(const TextureCapsMap &textureCaps)
829*8975f5c5SAndroid Build Coastguard Worker {
830*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
831*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,
832*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG};
833*8975f5c5SAndroid Build Coastguard Worker 
834*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
835*8975f5c5SAndroid Build Coastguard Worker }
836*8975f5c5SAndroid Build Coastguard Worker 
837*8975f5c5SAndroid Build Coastguard Worker // Check for GL_EXT_pvrtc_sRGB support
DeterminePVRTCsRGBTextureSupport(const TextureCapsMap & textureCaps)838*8975f5c5SAndroid Build Coastguard Worker static bool DeterminePVRTCsRGBTextureSupport(const TextureCapsMap &textureCaps)
839*8975f5c5SAndroid Build Coastguard Worker {
840*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
841*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT, GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT,
842*8975f5c5SAndroid Build Coastguard Worker         GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT, GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT};
843*8975f5c5SAndroid Build Coastguard Worker 
844*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
845*8975f5c5SAndroid Build Coastguard Worker }
846*8975f5c5SAndroid Build Coastguard Worker 
DetermineCompressedTextureETCSupport(const TextureCapsMap & textureCaps)847*8975f5c5SAndroid Build Coastguard Worker bool DetermineCompressedTextureETCSupport(const TextureCapsMap &textureCaps)
848*8975f5c5SAndroid Build Coastguard Worker {
849*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {GL_COMPRESSED_R11_EAC,
850*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_SIGNED_R11_EAC,
851*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_RG11_EAC,
852*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_SIGNED_RG11_EAC,
853*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_RGB8_ETC2,
854*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_SRGB8_ETC2,
855*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
856*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
857*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_RGBA8_ETC2_EAC,
858*8975f5c5SAndroid Build Coastguard Worker                                           GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC};
859*8975f5c5SAndroid Build Coastguard Worker 
860*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, true, false, false, false);
861*8975f5c5SAndroid Build Coastguard Worker }
862*8975f5c5SAndroid Build Coastguard Worker 
863*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_OES_texture_stencil8 support
DetermineStencilIndex8Support(const TextureCapsMap & textureCaps)864*8975f5c5SAndroid Build Coastguard Worker static bool DetermineStencilIndex8Support(const TextureCapsMap &textureCaps)
865*8975f5c5SAndroid Build Coastguard Worker {
866*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
867*8975f5c5SAndroid Build Coastguard Worker         GL_STENCIL_INDEX8,
868*8975f5c5SAndroid Build Coastguard Worker     };
869*8975f5c5SAndroid Build Coastguard Worker 
870*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, true, false, true, false, false);
871*8975f5c5SAndroid Build Coastguard Worker }
872*8975f5c5SAndroid Build Coastguard Worker 
873*8975f5c5SAndroid Build Coastguard Worker // Checks for GL_QCOM_render_shared_exponent support
DetermineRenderSharedExponentSupport(const TextureCapsMap & textureCaps)874*8975f5c5SAndroid Build Coastguard Worker static bool DetermineRenderSharedExponentSupport(const TextureCapsMap &textureCaps)
875*8975f5c5SAndroid Build Coastguard Worker {
876*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredFormats[] = {
877*8975f5c5SAndroid Build Coastguard Worker         GL_RGB9_E5,
878*8975f5c5SAndroid Build Coastguard Worker     };
879*8975f5c5SAndroid Build Coastguard Worker 
880*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredFormats, false, false, true, true, true);
881*8975f5c5SAndroid Build Coastguard Worker }
882*8975f5c5SAndroid Build Coastguard Worker 
DetermineRenderSnormSupport(const TextureCapsMap & textureCaps,bool textureNorm16EXT)883*8975f5c5SAndroid Build Coastguard Worker static bool DetermineRenderSnormSupport(const TextureCapsMap &textureCaps, bool textureNorm16EXT)
884*8975f5c5SAndroid Build Coastguard Worker {
885*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredSnorm8Formats[] = {
886*8975f5c5SAndroid Build Coastguard Worker         GL_R8_SNORM,
887*8975f5c5SAndroid Build Coastguard Worker         GL_RG8_SNORM,
888*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA8_SNORM,
889*8975f5c5SAndroid Build Coastguard Worker     };
890*8975f5c5SAndroid Build Coastguard Worker 
891*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum requiredSnorm16Formats[] = {
892*8975f5c5SAndroid Build Coastguard Worker         GL_R16_SNORM_EXT,
893*8975f5c5SAndroid Build Coastguard Worker         GL_RG16_SNORM_EXT,
894*8975f5c5SAndroid Build Coastguard Worker         GL_RGBA16_SNORM_EXT,
895*8975f5c5SAndroid Build Coastguard Worker     };
896*8975f5c5SAndroid Build Coastguard Worker 
897*8975f5c5SAndroid Build Coastguard Worker     if (textureNorm16EXT &&
898*8975f5c5SAndroid Build Coastguard Worker         !GetFormatSupport(textureCaps, requiredSnorm16Formats, false, false, true, true, true))
899*8975f5c5SAndroid Build Coastguard Worker     {
900*8975f5c5SAndroid Build Coastguard Worker         return false;
901*8975f5c5SAndroid Build Coastguard Worker     }
902*8975f5c5SAndroid Build Coastguard Worker 
903*8975f5c5SAndroid Build Coastguard Worker     return GetFormatSupport(textureCaps, requiredSnorm8Formats, false, false, true, true, true);
904*8975f5c5SAndroid Build Coastguard Worker }
905*8975f5c5SAndroid Build Coastguard Worker 
setTextureExtensionSupport(const TextureCapsMap & textureCaps)906*8975f5c5SAndroid Build Coastguard Worker void Extensions::setTextureExtensionSupport(const TextureCapsMap &textureCaps)
907*8975f5c5SAndroid Build Coastguard Worker {
908*8975f5c5SAndroid Build Coastguard Worker     // TODO(ynovikov): rgb8Rgba8OES, colorBufferHalfFloatEXT, textureHalfFloatOES,
909*8975f5c5SAndroid Build Coastguard Worker     // textureHalfFloatLinearOES, textureFloatOES, textureFloatLinearOES, textureRgEXT, sRGB,
910*8975f5c5SAndroid Build Coastguard Worker     // colorBufferFloatRgbCHROMIUM, colorBufferFloatRgbaCHROMIUM and colorBufferFloatEXT were
911*8975f5c5SAndroid Build Coastguard Worker     // verified. Verify the rest.
912*8975f5c5SAndroid Build Coastguard Worker     packedDepthStencilOES    = DeterminePackedDepthStencilSupport(textureCaps);
913*8975f5c5SAndroid Build Coastguard Worker     rgba8ARM                 = DetermineRGBA8TextureSupport(textureCaps);
914*8975f5c5SAndroid Build Coastguard Worker     rgb8Rgba8OES             = rgba8ARM && DetermineRGB8TextureSupport(textureCaps);
915*8975f5c5SAndroid Build Coastguard Worker     readDepthNV              = DetermineReadDepthSupport(textureCaps);
916*8975f5c5SAndroid Build Coastguard Worker     readStencilNV            = DetermineReadStencilSupport(textureCaps);
917*8975f5c5SAndroid Build Coastguard Worker     depthBufferFloat2NV      = DetermineDepthBufferFloat2Support(textureCaps);
918*8975f5c5SAndroid Build Coastguard Worker     requiredInternalformatOES = DetermineRequiredInternalFormatTextureSupport(textureCaps);
919*8975f5c5SAndroid Build Coastguard Worker     textureFormatBGRA8888EXT = DetermineBGRA8TextureSupport(textureCaps);
920*8975f5c5SAndroid Build Coastguard Worker     readFormatBgraEXT        = DetermineBGRAReadFormatSupport(textureCaps);
921*8975f5c5SAndroid Build Coastguard Worker     textureHalfFloatOES      = DetermineHalfFloatTextureSupport(textureCaps);
922*8975f5c5SAndroid Build Coastguard Worker     textureHalfFloatLinearOES =
923*8975f5c5SAndroid Build Coastguard Worker         DetermineHalfFloatTextureFilteringSupport(textureCaps, textureHalfFloatOES);
924*8975f5c5SAndroid Build Coastguard Worker     textureFloatOES       = DetermineFloatTextureSupport(textureCaps);
925*8975f5c5SAndroid Build Coastguard Worker     textureFloatLinearOES = DetermineFloatTextureFilteringSupport(textureCaps, textureFloatOES);
926*8975f5c5SAndroid Build Coastguard Worker     textureRgEXT = DetermineRGTextureSupport(textureCaps, textureHalfFloatOES, textureFloatOES);
927*8975f5c5SAndroid Build Coastguard Worker     colorBufferHalfFloatEXT =
928*8975f5c5SAndroid Build Coastguard Worker         textureHalfFloatOES && DetermineColorBufferHalfFloatSupport(textureCaps);
929*8975f5c5SAndroid Build Coastguard Worker     textureType2101010REVEXT      = DetermineTextureFormat2101010Support(textureCaps);
930*8975f5c5SAndroid Build Coastguard Worker     textureCompressionDxt1EXT     = DetermineDXT1TextureSupport(textureCaps);
931*8975f5c5SAndroid Build Coastguard Worker     textureCompressionDxt3ANGLE   = DetermineDXT3TextureSupport(textureCaps);
932*8975f5c5SAndroid Build Coastguard Worker     textureCompressionDxt5ANGLE   = DetermineDXT5TextureSupport(textureCaps);
933*8975f5c5SAndroid Build Coastguard Worker     textureCompressionS3tcSrgbEXT = DetermineS3TCsRGBTextureSupport(textureCaps);
934*8975f5c5SAndroid Build Coastguard Worker     textureCompressionAstcLdrKHR  = DetermineASTCLDRTextureSupport(textureCaps);
935*8975f5c5SAndroid Build Coastguard Worker     textureCompressionAstcOES     = DetermineASTCOESTExtureSupport(textureCaps);
936*8975f5c5SAndroid Build Coastguard Worker     compressedETC1RGB8TextureOES  = DetermineETC1RGB8TextureSupport(textureCaps);
937*8975f5c5SAndroid Build Coastguard Worker     compressedETC2RGB8TextureOES  = DetermineETC2RGB8TextureSupport(textureCaps);
938*8975f5c5SAndroid Build Coastguard Worker     compressedETC2SRGB8TextureOES = DetermineETC2sRGB8TextureSupport(textureCaps);
939*8975f5c5SAndroid Build Coastguard Worker     compressedETC2PunchthroughARGBA8TextureOES =
940*8975f5c5SAndroid Build Coastguard Worker         DetermineETC2PunchthroughARGB8TextureSupport(textureCaps);
941*8975f5c5SAndroid Build Coastguard Worker     compressedETC2PunchthroughASRGB8AlphaTextureOES =
942*8975f5c5SAndroid Build Coastguard Worker         DetermineETC2PunchthroughAsRGB8AlphaTextureSupport(textureCaps);
943*8975f5c5SAndroid Build Coastguard Worker     compressedETC2RGBA8TextureOES       = DetermineETC2RGBA8TextureSupport(textureCaps);
944*8975f5c5SAndroid Build Coastguard Worker     compressedETC2SRGB8Alpha8TextureOES = DetermineETC2sRGB8Alpha8TextureSupport(textureCaps);
945*8975f5c5SAndroid Build Coastguard Worker     compressedEACR11UnsignedTextureOES  = DetermineEACR11UnsignedTextureSupport(textureCaps);
946*8975f5c5SAndroid Build Coastguard Worker     compressedEACR11SignedTextureOES    = DetermineEACR11SignedTextureSupport(textureCaps);
947*8975f5c5SAndroid Build Coastguard Worker     compressedEACRG11UnsignedTextureOES = DetermineEACRG11UnsignedTextureSupport(textureCaps);
948*8975f5c5SAndroid Build Coastguard Worker     compressedEACRG11SignedTextureOES   = DetermineEACRG11SignedTextureSupport(textureCaps);
949*8975f5c5SAndroid Build Coastguard Worker     sRGBEXT                             = DetermineSRGBTextureSupport(textureCaps);
950*8975f5c5SAndroid Build Coastguard Worker     textureSRGBR8EXT                    = DetermineSRGBR8TextureSupport(textureCaps);
951*8975f5c5SAndroid Build Coastguard Worker     textureSRGBRG8EXT                   = DetermineSRGBRG8TextureSupport(textureCaps);
952*8975f5c5SAndroid Build Coastguard Worker     depthTextureANGLE                   = DetermineDepthTextureANGLESupport(textureCaps);
953*8975f5c5SAndroid Build Coastguard Worker     depthTextureOES                     = DetermineDepthTextureOESSupport(textureCaps);
954*8975f5c5SAndroid Build Coastguard Worker     depth24OES                          = DetermineDepth24OESSupport(textureCaps);
955*8975f5c5SAndroid Build Coastguard Worker     depth32OES                          = DetermineDepth32Support(textureCaps);
956*8975f5c5SAndroid Build Coastguard Worker     colorBufferFloatRgbCHROMIUM         = DetermineColorBufferFloatRGBSupport(textureCaps);
957*8975f5c5SAndroid Build Coastguard Worker     colorBufferFloatRgbaCHROMIUM        = DetermineColorBufferFloatRGBASupport(textureCaps);
958*8975f5c5SAndroid Build Coastguard Worker     colorBufferFloatEXT                 = DetermineColorBufferFloatSupport(textureCaps);
959*8975f5c5SAndroid Build Coastguard Worker     floatBlendEXT                       = DetermineFloatBlendSupport(textureCaps);
960*8975f5c5SAndroid Build Coastguard Worker     textureNorm16EXT                    = DetermineTextureNorm16Support(textureCaps);
961*8975f5c5SAndroid Build Coastguard Worker     textureCompressionRgtcEXT           = DetermineRGTCTextureSupport(textureCaps);
962*8975f5c5SAndroid Build Coastguard Worker     textureCompressionBptcEXT           = DetermineBPTCTextureSupport(textureCaps);
963*8975f5c5SAndroid Build Coastguard Worker     textureCompressionPvrtcIMG          = DeterminePVRTCTextureSupport(textureCaps);
964*8975f5c5SAndroid Build Coastguard Worker     pvrtcSRGBEXT                        = DeterminePVRTCsRGBTextureSupport(textureCaps);
965*8975f5c5SAndroid Build Coastguard Worker     textureStencil8OES                  = DetermineStencilIndex8Support(textureCaps);
966*8975f5c5SAndroid Build Coastguard Worker     renderSharedExponentQCOM            = DetermineRenderSharedExponentSupport(textureCaps);
967*8975f5c5SAndroid Build Coastguard Worker     renderSnormEXT = DetermineRenderSnormSupport(textureCaps, textureNorm16EXT);
968*8975f5c5SAndroid Build Coastguard Worker }
969*8975f5c5SAndroid Build Coastguard Worker 
970*8975f5c5SAndroid Build Coastguard Worker TypePrecision::TypePrecision() = default;
971*8975f5c5SAndroid Build Coastguard Worker 
972*8975f5c5SAndroid Build Coastguard Worker TypePrecision::TypePrecision(const TypePrecision &other) = default;
973*8975f5c5SAndroid Build Coastguard Worker 
974*8975f5c5SAndroid Build Coastguard Worker TypePrecision &TypePrecision::operator=(const TypePrecision &other) = default;
975*8975f5c5SAndroid Build Coastguard Worker 
setIEEEFloat()976*8975f5c5SAndroid Build Coastguard Worker void TypePrecision::setIEEEFloat()
977*8975f5c5SAndroid Build Coastguard Worker {
978*8975f5c5SAndroid Build Coastguard Worker     range     = {{127, 127}};
979*8975f5c5SAndroid Build Coastguard Worker     precision = 23;
980*8975f5c5SAndroid Build Coastguard Worker }
981*8975f5c5SAndroid Build Coastguard Worker 
setIEEEHalfFloat()982*8975f5c5SAndroid Build Coastguard Worker void TypePrecision::setIEEEHalfFloat()
983*8975f5c5SAndroid Build Coastguard Worker {
984*8975f5c5SAndroid Build Coastguard Worker     range     = {{15, 15}};
985*8975f5c5SAndroid Build Coastguard Worker     precision = 10;
986*8975f5c5SAndroid Build Coastguard Worker }
987*8975f5c5SAndroid Build Coastguard Worker 
setTwosComplementInt(unsigned int bits)988*8975f5c5SAndroid Build Coastguard Worker void TypePrecision::setTwosComplementInt(unsigned int bits)
989*8975f5c5SAndroid Build Coastguard Worker {
990*8975f5c5SAndroid Build Coastguard Worker     range     = {{static_cast<GLint>(bits) - 1, static_cast<GLint>(bits) - 2}};
991*8975f5c5SAndroid Build Coastguard Worker     precision = 0;
992*8975f5c5SAndroid Build Coastguard Worker }
993*8975f5c5SAndroid Build Coastguard Worker 
setSimulatedFloat(unsigned int r,unsigned int p)994*8975f5c5SAndroid Build Coastguard Worker void TypePrecision::setSimulatedFloat(unsigned int r, unsigned int p)
995*8975f5c5SAndroid Build Coastguard Worker {
996*8975f5c5SAndroid Build Coastguard Worker     range     = {{static_cast<GLint>(r), static_cast<GLint>(r)}};
997*8975f5c5SAndroid Build Coastguard Worker     precision = static_cast<GLint>(p);
998*8975f5c5SAndroid Build Coastguard Worker }
999*8975f5c5SAndroid Build Coastguard Worker 
setSimulatedInt(unsigned int r)1000*8975f5c5SAndroid Build Coastguard Worker void TypePrecision::setSimulatedInt(unsigned int r)
1001*8975f5c5SAndroid Build Coastguard Worker {
1002*8975f5c5SAndroid Build Coastguard Worker     range     = {{static_cast<GLint>(r), static_cast<GLint>(r)}};
1003*8975f5c5SAndroid Build Coastguard Worker     precision = 0;
1004*8975f5c5SAndroid Build Coastguard Worker }
1005*8975f5c5SAndroid Build Coastguard Worker 
get(GLint * returnRange,GLint * returnPrecision) const1006*8975f5c5SAndroid Build Coastguard Worker void TypePrecision::get(GLint *returnRange, GLint *returnPrecision) const
1007*8975f5c5SAndroid Build Coastguard Worker {
1008*8975f5c5SAndroid Build Coastguard Worker     std::copy(range.begin(), range.end(), returnRange);
1009*8975f5c5SAndroid Build Coastguard Worker     *returnPrecision = precision;
1010*8975f5c5SAndroid Build Coastguard Worker }
1011*8975f5c5SAndroid Build Coastguard Worker 
1012*8975f5c5SAndroid Build Coastguard Worker Caps::Caps()                             = default;
1013*8975f5c5SAndroid Build Coastguard Worker Caps::Caps(const Caps &other)            = default;
1014*8975f5c5SAndroid Build Coastguard Worker Caps::~Caps()                            = default;
1015*8975f5c5SAndroid Build Coastguard Worker Caps &Caps::operator=(const Caps &other) = default;
1016*8975f5c5SAndroid Build Coastguard Worker 
GenerateMinimumCaps(const Version & clientVersion,const Extensions & extensions)1017*8975f5c5SAndroid Build Coastguard Worker Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions)
1018*8975f5c5SAndroid Build Coastguard Worker {
1019*8975f5c5SAndroid Build Coastguard Worker     Caps caps;
1020*8975f5c5SAndroid Build Coastguard Worker 
1021*8975f5c5SAndroid Build Coastguard Worker     // EXT_draw_buffers. Set to 1 even if the extension is not present. Framebuffer and blend state
1022*8975f5c5SAndroid Build Coastguard Worker     // depends on this being > 0.
1023*8975f5c5SAndroid Build Coastguard Worker     caps.maxDrawBuffers      = 1;
1024*8975f5c5SAndroid Build Coastguard Worker     caps.maxColorAttachments = 1;
1025*8975f5c5SAndroid Build Coastguard Worker 
1026*8975f5c5SAndroid Build Coastguard Worker     // GLES1 emulation (Minimums taken from Table 6.20 / 6.22 (ES 1.1 spec))
1027*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion < Version(2, 0))
1028*8975f5c5SAndroid Build Coastguard Worker     {
1029*8975f5c5SAndroid Build Coastguard Worker         caps.maxMultitextureUnits = 2;
1030*8975f5c5SAndroid Build Coastguard Worker         caps.maxLights            = 8;
1031*8975f5c5SAndroid Build Coastguard Worker         caps.maxClipPlanes        = 1;
1032*8975f5c5SAndroid Build Coastguard Worker 
1033*8975f5c5SAndroid Build Coastguard Worker         caps.maxModelviewMatrixStackDepth  = 16;
1034*8975f5c5SAndroid Build Coastguard Worker         caps.maxProjectionMatrixStackDepth = 2;
1035*8975f5c5SAndroid Build Coastguard Worker         caps.maxTextureMatrixStackDepth    = 2;
1036*8975f5c5SAndroid Build Coastguard Worker 
1037*8975f5c5SAndroid Build Coastguard Worker         caps.minSmoothPointSize = 1.0f;
1038*8975f5c5SAndroid Build Coastguard Worker         caps.maxSmoothPointSize = 1.0f;
1039*8975f5c5SAndroid Build Coastguard Worker     }
1040*8975f5c5SAndroid Build Coastguard Worker 
1041*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(2, 0))
1042*8975f5c5SAndroid Build Coastguard Worker     {
1043*8975f5c5SAndroid Build Coastguard Worker         // Table 6.18
1044*8975f5c5SAndroid Build Coastguard Worker         caps.max2DTextureSize      = 64;
1045*8975f5c5SAndroid Build Coastguard Worker         caps.maxCubeMapTextureSize = 16;
1046*8975f5c5SAndroid Build Coastguard Worker         caps.maxViewportWidth      = caps.max2DTextureSize;
1047*8975f5c5SAndroid Build Coastguard Worker         caps.maxViewportHeight     = caps.max2DTextureSize;
1048*8975f5c5SAndroid Build Coastguard Worker         caps.minAliasedPointSize   = 1;
1049*8975f5c5SAndroid Build Coastguard Worker         caps.maxAliasedPointSize   = 1;
1050*8975f5c5SAndroid Build Coastguard Worker         caps.minAliasedLineWidth   = 1;
1051*8975f5c5SAndroid Build Coastguard Worker         caps.maxAliasedLineWidth   = 1;
1052*8975f5c5SAndroid Build Coastguard Worker 
1053*8975f5c5SAndroid Build Coastguard Worker         // Table 6.19
1054*8975f5c5SAndroid Build Coastguard Worker         caps.vertexHighpFloat.setSimulatedFloat(62, 16);
1055*8975f5c5SAndroid Build Coastguard Worker         caps.vertexMediumpFloat.setSimulatedFloat(14, 10);
1056*8975f5c5SAndroid Build Coastguard Worker         caps.vertexLowpFloat.setSimulatedFloat(1, 8);
1057*8975f5c5SAndroid Build Coastguard Worker         caps.vertexHighpInt.setSimulatedInt(16);
1058*8975f5c5SAndroid Build Coastguard Worker         caps.vertexMediumpInt.setSimulatedInt(10);
1059*8975f5c5SAndroid Build Coastguard Worker         caps.vertexLowpInt.setSimulatedInt(8);
1060*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentHighpFloat.setSimulatedFloat(62, 16);
1061*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentMediumpFloat.setSimulatedFloat(14, 10);
1062*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentLowpFloat.setSimulatedFloat(1, 8);
1063*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentHighpInt.setSimulatedInt(16);
1064*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentMediumpInt.setSimulatedInt(10);
1065*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentLowpInt.setSimulatedInt(8);
1066*8975f5c5SAndroid Build Coastguard Worker 
1067*8975f5c5SAndroid Build Coastguard Worker         // Table 6.20
1068*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexAttributes                              = 8;
1069*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexUniformVectors                          = 128;
1070*8975f5c5SAndroid Build Coastguard Worker         caps.maxVaryingVectors                                = 8;
1071*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedTextureImageUnits                     = 8;
1072*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::Fragment] = 8;
1073*8975f5c5SAndroid Build Coastguard Worker         caps.maxFragmentUniformVectors                        = 16;
1074*8975f5c5SAndroid Build Coastguard Worker         caps.maxRenderbufferSize                              = 1;
1075*8975f5c5SAndroid Build Coastguard Worker 
1076*8975f5c5SAndroid Build Coastguard Worker         // Table 3.35
1077*8975f5c5SAndroid Build Coastguard Worker         caps.maxSamples = 4;
1078*8975f5c5SAndroid Build Coastguard Worker     }
1079*8975f5c5SAndroid Build Coastguard Worker 
1080*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 0))
1081*8975f5c5SAndroid Build Coastguard Worker     {
1082*8975f5c5SAndroid Build Coastguard Worker         // Table 6.28
1083*8975f5c5SAndroid Build Coastguard Worker         caps.maxElementIndex       = (1 << 24) - 1;
1084*8975f5c5SAndroid Build Coastguard Worker         caps.max3DTextureSize      = 256;
1085*8975f5c5SAndroid Build Coastguard Worker         caps.max2DTextureSize      = 2048;
1086*8975f5c5SAndroid Build Coastguard Worker         caps.maxArrayTextureLayers = 256;
1087*8975f5c5SAndroid Build Coastguard Worker         caps.maxLODBias            = 2.0f;
1088*8975f5c5SAndroid Build Coastguard Worker         caps.maxCubeMapTextureSize = 2048;
1089*8975f5c5SAndroid Build Coastguard Worker         caps.maxRenderbufferSize   = 2048;
1090*8975f5c5SAndroid Build Coastguard Worker         caps.maxDrawBuffers        = 4;
1091*8975f5c5SAndroid Build Coastguard Worker         caps.maxColorAttachments   = 4;
1092*8975f5c5SAndroid Build Coastguard Worker         caps.maxViewportWidth      = caps.max2DTextureSize;
1093*8975f5c5SAndroid Build Coastguard Worker         caps.maxViewportHeight     = caps.max2DTextureSize;
1094*8975f5c5SAndroid Build Coastguard Worker 
1095*8975f5c5SAndroid Build Coastguard Worker         // Table 6.29
1096*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_R11_EAC);
1097*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_SIGNED_R11_EAC);
1098*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_RG11_EAC);
1099*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_SIGNED_RG11_EAC);
1100*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_RGB8_ETC2);
1101*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_SRGB8_ETC2);
1102*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2);
1103*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2);
1104*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_RGBA8_ETC2_EAC);
1105*8975f5c5SAndroid Build Coastguard Worker         caps.compressedTextureFormats.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC);
1106*8975f5c5SAndroid Build Coastguard Worker         caps.vertexHighpFloat.setIEEEFloat();
1107*8975f5c5SAndroid Build Coastguard Worker         caps.vertexHighpInt.setTwosComplementInt(32);
1108*8975f5c5SAndroid Build Coastguard Worker         caps.vertexMediumpInt.setTwosComplementInt(16);
1109*8975f5c5SAndroid Build Coastguard Worker         caps.vertexLowpInt.setTwosComplementInt(8);
1110*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentHighpFloat.setIEEEFloat();
1111*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentHighpInt.setSimulatedInt(32);
1112*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentMediumpInt.setTwosComplementInt(16);
1113*8975f5c5SAndroid Build Coastguard Worker         caps.fragmentLowpInt.setTwosComplementInt(8);
1114*8975f5c5SAndroid Build Coastguard Worker         caps.maxServerWaitTimeout = 0;
1115*8975f5c5SAndroid Build Coastguard Worker 
1116*8975f5c5SAndroid Build Coastguard Worker         // Table 6.31
1117*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexAttributes                            = 16;
1118*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::Vertex] = 1024;
1119*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexUniformVectors                        = 256;
1120*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformBlocks[ShaderType::Vertex]     = limits::kMinimumShaderUniformBlocks;
1121*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexOutputComponents = limits::kMinimumVertexOutputComponents;
1122*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::Vertex] = 16;
1123*8975f5c5SAndroid Build Coastguard Worker 
1124*8975f5c5SAndroid Build Coastguard Worker         // Table 6.32
1125*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::Fragment] = 896;
1126*8975f5c5SAndroid Build Coastguard Worker         caps.maxFragmentUniformVectors                        = 224;
1127*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformBlocks[ShaderType::Fragment]     = limits::kMinimumShaderUniformBlocks;
1128*8975f5c5SAndroid Build Coastguard Worker         caps.maxFragmentInputComponents                       = 60;
1129*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::Fragment] = 16;
1130*8975f5c5SAndroid Build Coastguard Worker         caps.minProgramTexelOffset                            = -8;
1131*8975f5c5SAndroid Build Coastguard Worker         caps.maxProgramTexelOffset                            = 7;
1132*8975f5c5SAndroid Build Coastguard Worker 
1133*8975f5c5SAndroid Build Coastguard Worker         // Table 6.33
1134*8975f5c5SAndroid Build Coastguard Worker         caps.maxUniformBufferBindings     = 24;
1135*8975f5c5SAndroid Build Coastguard Worker         caps.maxUniformBlockSize          = 16384;
1136*8975f5c5SAndroid Build Coastguard Worker         caps.uniformBufferOffsetAlignment = 256;
1137*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedUniformBlocks     = 24;
1138*8975f5c5SAndroid Build Coastguard Worker         caps.maxVaryingComponents         = 60;
1139*8975f5c5SAndroid Build Coastguard Worker         caps.maxVaryingVectors            = 15;
1140*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedTextureImageUnits = 32;
1141*8975f5c5SAndroid Build Coastguard Worker 
1142*8975f5c5SAndroid Build Coastguard Worker         // Table 6.34
1143*8975f5c5SAndroid Build Coastguard Worker         caps.maxTransformFeedbackInterleavedComponents = 64;
1144*8975f5c5SAndroid Build Coastguard Worker         caps.maxTransformFeedbackSeparateAttributes    = 4;
1145*8975f5c5SAndroid Build Coastguard Worker         caps.maxTransformFeedbackSeparateComponents    = 4;
1146*8975f5c5SAndroid Build Coastguard Worker     }
1147*8975f5c5SAndroid Build Coastguard Worker 
1148*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 1))
1149*8975f5c5SAndroid Build Coastguard Worker     {
1150*8975f5c5SAndroid Build Coastguard Worker         // Table 20.40
1151*8975f5c5SAndroid Build Coastguard Worker         caps.maxFramebufferWidth    = 2048;
1152*8975f5c5SAndroid Build Coastguard Worker         caps.maxFramebufferHeight   = 2048;
1153*8975f5c5SAndroid Build Coastguard Worker         caps.maxFramebufferSamples  = 4;
1154*8975f5c5SAndroid Build Coastguard Worker         caps.maxSampleMaskWords     = 1;
1155*8975f5c5SAndroid Build Coastguard Worker         caps.maxColorTextureSamples = 1;
1156*8975f5c5SAndroid Build Coastguard Worker         caps.maxDepthTextureSamples = 1;
1157*8975f5c5SAndroid Build Coastguard Worker         caps.maxIntegerSamples      = 1;
1158*8975f5c5SAndroid Build Coastguard Worker 
1159*8975f5c5SAndroid Build Coastguard Worker         // Table 20.41
1160*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexAttribRelativeOffset = 2047;
1161*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexAttribBindings       = 16;
1162*8975f5c5SAndroid Build Coastguard Worker         caps.maxVertexAttribStride         = 2048;
1163*8975f5c5SAndroid Build Coastguard Worker 
1164*8975f5c5SAndroid Build Coastguard Worker         // Table 20.43
1165*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Vertex] = 0;
1166*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounters[ShaderType::Vertex]       = 0;
1167*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderImageUniforms[ShaderType::Vertex]        = 0;
1168*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderStorageBlocks[ShaderType::Vertex]        = 0;
1169*8975f5c5SAndroid Build Coastguard Worker 
1170*8975f5c5SAndroid Build Coastguard Worker         // Table 20.44
1171*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::Fragment]    = 1024;
1172*8975f5c5SAndroid Build Coastguard Worker         caps.maxFragmentUniformVectors                           = 256;
1173*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Fragment] = 0;
1174*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounters[ShaderType::Fragment]       = 0;
1175*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderImageUniforms[ShaderType::Fragment]        = 0;
1176*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderStorageBlocks[ShaderType::Fragment]        = 0;
1177*8975f5c5SAndroid Build Coastguard Worker         caps.minProgramTextureGatherOffset                       = caps.minProgramTexelOffset;
1178*8975f5c5SAndroid Build Coastguard Worker         caps.maxProgramTextureGatherOffset                       = caps.maxProgramTexelOffset;
1179*8975f5c5SAndroid Build Coastguard Worker 
1180*8975f5c5SAndroid Build Coastguard Worker         // Table 20.45
1181*8975f5c5SAndroid Build Coastguard Worker         caps.maxComputeWorkGroupCount                        = {{65535, 65535, 65535}};
1182*8975f5c5SAndroid Build Coastguard Worker         caps.maxComputeWorkGroupSize                         = {{128, 128, 64}};
1183*8975f5c5SAndroid Build Coastguard Worker         caps.maxComputeWorkGroupInvocations                  = 128;
1184*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformBlocks[ShaderType::Compute]     = limits::kMinimumShaderUniformBlocks;
1185*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::Compute] = 16;
1186*8975f5c5SAndroid Build Coastguard Worker         caps.maxComputeSharedMemorySize                      = 16384;
1187*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::Compute] = 1024;
1188*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Compute] = 1;
1189*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounters[ShaderType::Compute]       = 8;
1190*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderImageUniforms[ShaderType::Compute]        = 4;
1191*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderStorageBlocks[ShaderType::Compute]        = 4;
1192*8975f5c5SAndroid Build Coastguard Worker 
1193*8975f5c5SAndroid Build Coastguard Worker         // Table 20.46
1194*8975f5c5SAndroid Build Coastguard Worker         caps.maxUniformBufferBindings         = 36;
1195*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedTextureImageUnits     = 48;
1196*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedShaderOutputResources = 4;
1197*8975f5c5SAndroid Build Coastguard Worker 
1198*8975f5c5SAndroid Build Coastguard Worker         // Table 20.47
1199*8975f5c5SAndroid Build Coastguard Worker         caps.maxUniformLocations                = 1024;
1200*8975f5c5SAndroid Build Coastguard Worker         caps.maxAtomicCounterBufferBindings     = 1;
1201*8975f5c5SAndroid Build Coastguard Worker         caps.maxAtomicCounterBufferSize         = 32;
1202*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedAtomicCounterBuffers    = 1;
1203*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedAtomicCounters          = 8;
1204*8975f5c5SAndroid Build Coastguard Worker         caps.maxImageUnits                      = 4;
1205*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedImageUniforms           = 4;
1206*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderStorageBufferBindings     = 4;
1207*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderStorageBlockSize          = 1 << 27;
1208*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedShaderStorageBlocks     = 4;
1209*8975f5c5SAndroid Build Coastguard Worker         caps.shaderStorageBufferOffsetAlignment = 256;
1210*8975f5c5SAndroid Build Coastguard Worker     }
1211*8975f5c5SAndroid Build Coastguard Worker 
1212*8975f5c5SAndroid Build Coastguard Worker     if (clientVersion >= Version(3, 2))
1213*8975f5c5SAndroid Build Coastguard Worker     {
1214*8975f5c5SAndroid Build Coastguard Worker         // Table 21.40
1215*8975f5c5SAndroid Build Coastguard Worker         caps.lineWidthGranularity    = 1.0;
1216*8975f5c5SAndroid Build Coastguard Worker         caps.minMultisampleLineWidth = 1.0;
1217*8975f5c5SAndroid Build Coastguard Worker         caps.maxMultisampleLineWidth = 1.0;
1218*8975f5c5SAndroid Build Coastguard Worker     }
1219*8975f5c5SAndroid Build Coastguard Worker 
1220*8975f5c5SAndroid Build Coastguard Worker     if (extensions.blendFuncExtendedEXT)
1221*8975f5c5SAndroid Build Coastguard Worker     {
1222*8975f5c5SAndroid Build Coastguard Worker         caps.maxDualSourceDrawBuffers = 1;
1223*8975f5c5SAndroid Build Coastguard Worker     }
1224*8975f5c5SAndroid Build Coastguard Worker 
1225*8975f5c5SAndroid Build Coastguard Worker     if (extensions.textureRectangleANGLE)
1226*8975f5c5SAndroid Build Coastguard Worker     {
1227*8975f5c5SAndroid Build Coastguard Worker         caps.maxRectangleTextureSize = 64;
1228*8975f5c5SAndroid Build Coastguard Worker     }
1229*8975f5c5SAndroid Build Coastguard Worker 
1230*8975f5c5SAndroid Build Coastguard Worker     if (extensions.geometryShaderAny())
1231*8975f5c5SAndroid Build Coastguard Worker     {
1232*8975f5c5SAndroid Build Coastguard Worker         // Table 20.40 (GL_EXT_geometry_shader)
1233*8975f5c5SAndroid Build Coastguard Worker         caps.maxFramebufferLayers = 256;
1234*8975f5c5SAndroid Build Coastguard Worker         caps.layerProvokingVertex = GL_LAST_VERTEX_CONVENTION_EXT;
1235*8975f5c5SAndroid Build Coastguard Worker 
1236*8975f5c5SAndroid Build Coastguard Worker         // Table 20.43gs (GL_EXT_geometry_shader)
1237*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::Geometry] = 1024;
1238*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformBlocks[ShaderType::Geometry]     = limits::kMinimumShaderUniformBlocks;
1239*8975f5c5SAndroid Build Coastguard Worker         caps.maxGeometryInputComponents                       = 64;
1240*8975f5c5SAndroid Build Coastguard Worker         caps.maxGeometryOutputComponents                      = 64;
1241*8975f5c5SAndroid Build Coastguard Worker         caps.maxGeometryOutputVertices                        = 256;
1242*8975f5c5SAndroid Build Coastguard Worker         caps.maxGeometryTotalOutputComponents                 = 1024;
1243*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::Geometry] = 16;
1244*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::Geometry] = 0;
1245*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounters[ShaderType::Geometry]       = 0;
1246*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderStorageBlocks[ShaderType::Geometry]        = 0;
1247*8975f5c5SAndroid Build Coastguard Worker         caps.maxGeometryShaderInvocations                        = 32;
1248*8975f5c5SAndroid Build Coastguard Worker 
1249*8975f5c5SAndroid Build Coastguard Worker         // Table 20.46 (GL_EXT_geometry_shader)
1250*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderImageUniforms[ShaderType::Geometry] = 0;
1251*8975f5c5SAndroid Build Coastguard Worker 
1252*8975f5c5SAndroid Build Coastguard Worker         // Table 20.46 (GL_EXT_geometry_shader)
1253*8975f5c5SAndroid Build Coastguard Worker         caps.maxUniformBufferBindings     = 48;
1254*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedUniformBlocks     = 36;
1255*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedTextureImageUnits = 64;
1256*8975f5c5SAndroid Build Coastguard Worker     }
1257*8975f5c5SAndroid Build Coastguard Worker 
1258*8975f5c5SAndroid Build Coastguard Worker     if (extensions.tessellationShaderAny())
1259*8975f5c5SAndroid Build Coastguard Worker     {
1260*8975f5c5SAndroid Build Coastguard Worker         // Table 20.43 "Implementation Dependent Tessellation Shader Limits"
1261*8975f5c5SAndroid Build Coastguard Worker         caps.maxTessControlInputComponents                          = 64;
1262*8975f5c5SAndroid Build Coastguard Worker         caps.maxTessControlOutputComponents                         = 64;
1263*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::TessControl]    = 16;
1264*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::TessControl]    = 1024;
1265*8975f5c5SAndroid Build Coastguard Worker         caps.maxTessControlTotalOutputComponents                    = 2048;
1266*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderImageUniforms[ShaderType::TessControl]        = 0;
1267*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounters[ShaderType::TessControl]       = 0;
1268*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::TessControl] = 0;
1269*8975f5c5SAndroid Build Coastguard Worker 
1270*8975f5c5SAndroid Build Coastguard Worker         caps.maxTessPatchComponents = 120;
1271*8975f5c5SAndroid Build Coastguard Worker         caps.maxPatchVertices       = 32;
1272*8975f5c5SAndroid Build Coastguard Worker         caps.maxTessGenLevel        = 64;
1273*8975f5c5SAndroid Build Coastguard Worker 
1274*8975f5c5SAndroid Build Coastguard Worker         caps.maxTessEvaluationInputComponents                          = 64;
1275*8975f5c5SAndroid Build Coastguard Worker         caps.maxTessEvaluationOutputComponents                         = 64;
1276*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderTextureImageUnits[ShaderType::TessEvaluation]    = 16;
1277*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderUniformComponents[ShaderType::TessEvaluation]    = 1024;
1278*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderImageUniforms[ShaderType::TessEvaluation]        = 0;
1279*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounters[ShaderType::TessEvaluation]       = 0;
1280*8975f5c5SAndroid Build Coastguard Worker         caps.maxShaderAtomicCounterBuffers[ShaderType::TessEvaluation] = 0;
1281*8975f5c5SAndroid Build Coastguard Worker 
1282*8975f5c5SAndroid Build Coastguard Worker         // Table 20.46 "Implementation Dependent Aggregate Shader Limits"
1283*8975f5c5SAndroid Build Coastguard Worker         caps.maxUniformBufferBindings     = 72;
1284*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedUniformBlocks     = 60;
1285*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedTextureImageUnits = 96;
1286*8975f5c5SAndroid Build Coastguard Worker     }
1287*8975f5c5SAndroid Build Coastguard Worker 
1288*8975f5c5SAndroid Build Coastguard Worker     for (ShaderType shaderType : AllShaderTypes())
1289*8975f5c5SAndroid Build Coastguard Worker     {
1290*8975f5c5SAndroid Build Coastguard Worker         caps.maxCombinedShaderUniformComponents[shaderType] =
1291*8975f5c5SAndroid Build Coastguard Worker             caps.maxShaderUniformBlocks[shaderType] *
1292*8975f5c5SAndroid Build Coastguard Worker                 static_cast<GLuint>(caps.maxUniformBlockSize / 4) +
1293*8975f5c5SAndroid Build Coastguard Worker             caps.maxShaderUniformComponents[shaderType];
1294*8975f5c5SAndroid Build Coastguard Worker     }
1295*8975f5c5SAndroid Build Coastguard Worker 
1296*8975f5c5SAndroid Build Coastguard Worker     return caps;
1297*8975f5c5SAndroid Build Coastguard Worker }
1298*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
1299*8975f5c5SAndroid Build Coastguard Worker 
1300*8975f5c5SAndroid Build Coastguard Worker namespace egl
1301*8975f5c5SAndroid Build Coastguard Worker {
1302*8975f5c5SAndroid Build Coastguard Worker 
1303*8975f5c5SAndroid Build Coastguard Worker Caps::Caps() = default;
1304*8975f5c5SAndroid Build Coastguard Worker 
1305*8975f5c5SAndroid Build Coastguard Worker DisplayExtensions::DisplayExtensions() = default;
1306*8975f5c5SAndroid Build Coastguard Worker 
getStrings() const1307*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> DisplayExtensions::getStrings() const
1308*8975f5c5SAndroid Build Coastguard Worker {
1309*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> extensionStrings;
1310*8975f5c5SAndroid Build Coastguard Worker 
1311*8975f5c5SAndroid Build Coastguard Worker     // clang-format off
1312*8975f5c5SAndroid Build Coastguard Worker     //                   | Extension name                                       | Supported flag                    | Output vector   |
1313*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_create_context_robustness",                   createContextRobustness,            &extensionStrings);
1314*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_d3d_share_handle_client_buffer",            d3dShareHandleClientBuffer,         &extensionStrings);
1315*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_d3d_texture_client_buffer",                 d3dTextureClientBuffer,             &extensionStrings);
1316*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_surface_d3d_texture_2d_share_handle",       surfaceD3DTexture2DShareHandle,     &extensionStrings);
1317*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_query_surface_pointer",                     querySurfacePointer,                &extensionStrings);
1318*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_window_fixed_size",                         windowFixedSize,                    &extensionStrings);
1319*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_keyed_mutex",                               keyedMutex,                         &extensionStrings);
1320*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_surface_orientation",                       surfaceOrientation,                 &extensionStrings);
1321*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_direct_composition",                        directComposition,                  &extensionStrings);
1322*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_windows_ui_composition",                    windowsUIComposition,               &extensionStrings);
1323*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_NV_post_sub_buffer",                              postSubBuffer,                      &extensionStrings);
1324*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_create_context",                              createContext,                      &extensionStrings);
1325*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_image",                                       image,                              &extensionStrings);
1326*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_image_base",                                  imageBase,                          &extensionStrings);
1327*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_image_pixmap",                                imagePixmap,                        &extensionStrings);
1328*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_image_gl_colorspace",                         imageGlColorspace,                  &extensionStrings);
1329*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_gl_colorspace",                               glColorspace,                       &extensionStrings);
1330*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_scrgb",                         glColorspaceScrgb,                  &extensionStrings);
1331*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_scrgb_linear",                  glColorspaceScrgbLinear,            &extensionStrings);
1332*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_display_p3",                    glColorspaceDisplayP3,              &extensionStrings);
1333*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_display_p3_linear",             glColorspaceDisplayP3Linear,        &extensionStrings);
1334*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_display_p3_passthrough",        glColorspaceDisplayP3Passthrough,   &extensionStrings);
1335*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_colorspace_attribute_passthrough",          eglColorspaceAttributePassthroughANGLE,  &extensionStrings);
1336*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_bt2020_linear",                 glColorspaceBt2020Linear,           &extensionStrings);
1337*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_bt2020_pq",                     glColorspaceBt2020Pq,               &extensionStrings);
1338*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_gl_colorspace_bt2020_hlg",                    glColorspaceBt2020Hlg,              &extensionStrings);
1339*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_gl_texture_2D_image",                         glTexture2DImage,                   &extensionStrings);
1340*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_gl_texture_cubemap_image",                    glTextureCubemapImage,              &extensionStrings);
1341*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_gl_texture_3D_image",                         glTexture3DImage,                   &extensionStrings);
1342*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_gl_renderbuffer_image",                       glRenderbufferImage,                &extensionStrings);
1343*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_get_all_proc_addresses",                      getAllProcAddresses,                &extensionStrings);
1344*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_stream",                                      stream,                             &extensionStrings);
1345*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_stream_consumer_gltexture",                   streamConsumerGLTexture,            &extensionStrings);
1346*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_NV_stream_consumer_gltexture_yuv",                streamConsumerGLTextureYUV,         &extensionStrings);
1347*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_fence_sync",                                  fenceSync,                          &extensionStrings);
1348*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_wait_sync",                                   waitSync,                           &extensionStrings);
1349*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_stream_producer_d3d_texture",               streamProducerD3DTexture,           &extensionStrings);
1350*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_create_context_webgl_compatibility",        createContextWebGLCompatibility,    &extensionStrings);
1351*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_CHROMIUM_create_context_bind_generates_resource", createContextBindGeneratesResource, &extensionStrings);
1352*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_CHROMIUM_sync_control",                           syncControlCHROMIUM,                &extensionStrings);
1353*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_sync_control_rate",                         syncControlRateANGLE,               &extensionStrings);
1354*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_swap_buffers_with_damage",                    swapBuffersWithDamage,              &extensionStrings);
1355*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_pixel_format_float",                          pixelFormatFloat,                   &extensionStrings);
1356*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_surfaceless_context",                         surfacelessContext,                 &extensionStrings);
1357*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_display_texture_share_group",               displayTextureShareGroup,           &extensionStrings);
1358*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_display_semaphore_share_group",             displaySemaphoreShareGroup,         &extensionStrings);
1359*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_create_context_client_arrays",              createContextClientArrays,          &extensionStrings);
1360*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_program_cache_control",                     programCacheControlANGLE,           &extensionStrings);
1361*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_robust_resource_initialization",            robustResourceInitializationANGLE,  &extensionStrings);
1362*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_iosurface_client_buffer",                   iosurfaceClientBuffer,              &extensionStrings);
1363*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_metal_texture_client_buffer",               mtlTextureClientBuffer,             &extensionStrings);
1364*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_create_context_extensions_enabled",         createContextExtensionsEnabled,     &extensionStrings);
1365*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_presentation_time",                       presentationTime,                   &extensionStrings);
1366*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_blob_cache",                              blobCache,                          &extensionStrings);
1367*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_framebuffer_target",                      framebufferTargetANDROID,           &extensionStrings);
1368*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_image_native_buffer",                     imageNativeBuffer,                  &extensionStrings);
1369*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_get_frame_timestamps",                    getFrameTimestamps,                 &extensionStrings);
1370*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_front_buffer_auto_refresh",               frontBufferAutoRefreshANDROID,      &extensionStrings);
1371*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_timestamp_surface_attribute",               timestampSurfaceAttributeANGLE,     &extensionStrings);
1372*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_recordable",                              recordable,                         &extensionStrings);
1373*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_power_preference",                          powerPreference,                    &extensionStrings);
1374*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_wait_until_work_scheduled",                 waitUntilWorkScheduled,             &extensionStrings);
1375*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_image_d3d11_texture",                       imageD3D11Texture,                  &extensionStrings);
1376*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_create_native_client_buffer",             createNativeClientBufferANDROID,    &extensionStrings);
1377*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_get_native_client_buffer",                getNativeClientBufferANDROID,       &extensionStrings);
1378*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANDROID_native_fence_sync",                       nativeFenceSyncANDROID,             &extensionStrings);
1379*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_create_context_backwards_compatible",       createContextBackwardsCompatible,   &extensionStrings);
1380*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_no_config_context",                           noConfigContext,                    &extensionStrings);
1381*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_IMG_context_priority",                            contextPriority,                    &extensionStrings);
1382*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_create_context_no_error",                     createContextNoError,               &extensionStrings);
1383*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_image_dma_buf_import",                        imageDmaBufImportEXT,               &extensionStrings);
1384*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_image_dma_buf_import_modifiers",              imageDmaBufImportModifiersEXT,      &extensionStrings);
1385*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_NOK_texture_from_pixmap",                         textureFromPixmapNOK,               &extensionStrings);
1386*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_NV_robustness_video_memory_purge",                robustnessVideoMemoryPurgeNV,       &extensionStrings);
1387*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_reusable_sync",                               reusableSyncKHR,                    &extensionStrings);
1388*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_external_context_and_surface",              externalContextAndSurface,          &extensionStrings);
1389*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_buffer_age",                                  bufferAgeEXT,                       &extensionStrings);
1390*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_mutable_render_buffer",                       mutableRenderBufferKHR,             &extensionStrings);
1391*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_protected_content",                           protectedContentEXT,                &extensionStrings);
1392*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_create_surface_swap_interval",              createSurfaceSwapIntervalANGLE,     &extensionStrings);
1393*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_context_virtualization",                    contextVirtualizationANGLE,         &extensionStrings);
1394*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_lock_surface3",                               lockSurface3KHR,                    &extensionStrings);
1395*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_vulkan_image",                              vulkanImageANGLE,                   &extensionStrings);
1396*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_metal_create_context_ownership_identity",   metalCreateContextOwnershipIdentityANGLE, &extensionStrings);
1397*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_partial_update",                              partialUpdateKHR,                   &extensionStrings);
1398*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_metal_shared_event_sync",                   mtlSyncSharedEventANGLE,            &extensionStrings);
1399*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_global_fence_sync",                         globalFenceSyncANGLE,               &extensionStrings);
1400*8975f5c5SAndroid Build Coastguard Worker     // clang-format on
1401*8975f5c5SAndroid Build Coastguard Worker 
1402*8975f5c5SAndroid Build Coastguard Worker     return extensionStrings;
1403*8975f5c5SAndroid Build Coastguard Worker }
1404*8975f5c5SAndroid Build Coastguard Worker 
1405*8975f5c5SAndroid Build Coastguard Worker DeviceExtensions::DeviceExtensions() = default;
1406*8975f5c5SAndroid Build Coastguard Worker 
getStrings() const1407*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> DeviceExtensions::getStrings() const
1408*8975f5c5SAndroid Build Coastguard Worker {
1409*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> extensionStrings;
1410*8975f5c5SAndroid Build Coastguard Worker 
1411*8975f5c5SAndroid Build Coastguard Worker     // clang-format off
1412*8975f5c5SAndroid Build Coastguard Worker     //                   | Extension name                                 | Supported flag                | Output vector   |
1413*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_d3d",                          deviceD3D,                      &extensionStrings);
1414*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_d3d9",                         deviceD3D9,                     &extensionStrings);
1415*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_d3d11",                        deviceD3D11,                    &extensionStrings);
1416*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_cgl",                          deviceCGL,                      &extensionStrings);
1417*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_metal",                        deviceMetal,                    &extensionStrings);
1418*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_vulkan",                       deviceVulkan,                   &extensionStrings);
1419*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_device_drm",                            deviceDrmEXT,                   &extensionStrings);
1420*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_device_drm_render_node",                deviceDrmRenderNodeEXT,         &extensionStrings);
1421*8975f5c5SAndroid Build Coastguard Worker 
1422*8975f5c5SAndroid Build Coastguard Worker     // clang-format on
1423*8975f5c5SAndroid Build Coastguard Worker 
1424*8975f5c5SAndroid Build Coastguard Worker     return extensionStrings;
1425*8975f5c5SAndroid Build Coastguard Worker }
1426*8975f5c5SAndroid Build Coastguard Worker 
1427*8975f5c5SAndroid Build Coastguard Worker ClientExtensions::ClientExtensions()                              = default;
1428*8975f5c5SAndroid Build Coastguard Worker ClientExtensions::ClientExtensions(const ClientExtensions &other) = default;
1429*8975f5c5SAndroid Build Coastguard Worker 
getStrings() const1430*8975f5c5SAndroid Build Coastguard Worker std::vector<std::string> ClientExtensions::getStrings() const
1431*8975f5c5SAndroid Build Coastguard Worker {
1432*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::string> extensionStrings;
1433*8975f5c5SAndroid Build Coastguard Worker 
1434*8975f5c5SAndroid Build Coastguard Worker     // clang-format off
1435*8975f5c5SAndroid Build Coastguard Worker     //                   | Extension name                                    | Supported flag                   | Output vector   |
1436*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_client_extensions",                        clientExtensions,                   &extensionStrings);
1437*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_device_query",                             deviceQueryEXT,                     &extensionStrings);
1438*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_platform_base",                            platformBase,                       &extensionStrings);
1439*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_platform_device",                          platformDevice,                     &extensionStrings);
1440*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_platform_gbm",                             platformGbmKHR,                     &extensionStrings);
1441*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_EXT_platform_wayland",                         platformWaylandEXT,                 &extensionStrings);
1442*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_MESA_platform_surfaceless",                    platformSurfacelessMESA,            &extensionStrings);
1443*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle",                         platformANGLE,                      &extensionStrings);
1444*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_d3d",                     platformANGLED3D,                   &extensionStrings);
1445*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_d3d11on12",               platformANGLED3D11ON12,             &extensionStrings);
1446*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_d3d_luid",                platformANGLED3DLUID,               &extensionStrings);
1447*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_device_type_egl_angle",   platformANGLEDeviceTypeEGLANGLE,    &extensionStrings);
1448*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_device_type_swiftshader", platformANGLEDeviceTypeSwiftShader, &extensionStrings);
1449*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_opengl",                  platformANGLEOpenGL,                &extensionStrings);
1450*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_null",                    platformANGLENULL,                  &extensionStrings);
1451*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_webgpu",                  platformANGLEWebgpu,                &extensionStrings);
1452*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_vulkan",                  platformANGLEVulkan,                &extensionStrings);
1453*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_metal",                   platformANGLEMetal,                 &extensionStrings);
1454*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_device_context_volatile_cgl",   platformANGLEDeviceContextVolatileCgl, &extensionStrings);
1455*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_platform_angle_device_id",               platformANGLEDeviceId,              &extensionStrings);
1456*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_creation",                        deviceCreation,                     &extensionStrings);
1457*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_device_creation_d3d11",                  deviceCreationD3D11,                &extensionStrings);
1458*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_x11_visual",                             x11Visual,                          &extensionStrings);
1459*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_experimental_present_path",              experimentalPresentPath,            &extensionStrings);
1460*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_client_get_all_proc_addresses",            clientGetAllProcAddresses,          &extensionStrings);
1461*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_KHR_debug",                                    debug,                              &extensionStrings);
1462*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_feature_control",                        featureControlANGLE,                &extensionStrings);
1463*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_display_power_preference",               displayPowerPreferenceANGLE,        &extensionStrings);
1464*8975f5c5SAndroid Build Coastguard Worker     InsertExtensionString("EGL_ANGLE_no_error",                               noErrorANGLE,                       &extensionStrings);
1465*8975f5c5SAndroid Build Coastguard Worker     // clang-format on
1466*8975f5c5SAndroid Build Coastguard Worker 
1467*8975f5c5SAndroid Build Coastguard Worker     return extensionStrings;
1468*8975f5c5SAndroid Build Coastguard Worker }
1469*8975f5c5SAndroid Build Coastguard Worker 
1470*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
1471