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