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