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