• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 #include "libGLESv2/Caps.h"
8 #include "common/debug.h"
9 #include "common/angleutils.h"
10 
11 #include "angle_gl.h"
12 
13 #include <algorithm>
14 #include <sstream>
15 
16 namespace gl
17 {
18 
TextureCaps()19 TextureCaps::TextureCaps()
20     : texturable(false),
21       filterable(false),
22       renderable(false),
23       sampleCounts()
24 {
25 }
26 
getMaxSamples() const27 GLuint TextureCaps::getMaxSamples() const
28 {
29     return !sampleCounts.empty() ? *sampleCounts.rbegin() : 0;
30 }
31 
getNearestSamples(GLuint requestedSamples) const32 GLuint TextureCaps::getNearestSamples(GLuint requestedSamples) const
33 {
34     if (requestedSamples == 0)
35     {
36         return 0;
37     }
38 
39     for (SupportedSampleSet::const_iterator i = sampleCounts.begin(); i != sampleCounts.end(); i++)
40     {
41         GLuint samples = *i;
42         if (samples >= requestedSamples)
43         {
44             return samples;
45         }
46     }
47 
48     return 0;
49 }
50 
insert(GLenum internalFormat,const TextureCaps & caps)51 void TextureCapsMap::insert(GLenum internalFormat, const TextureCaps &caps)
52 {
53     mCapsMap.insert(std::make_pair(internalFormat, caps));
54 }
55 
remove(GLenum internalFormat)56 void TextureCapsMap::remove(GLenum internalFormat)
57 {
58     InternalFormatToCapsMap::iterator i = mCapsMap.find(internalFormat);
59     if (i != mCapsMap.end())
60     {
61         mCapsMap.erase(i);
62     }
63 }
64 
get(GLenum internalFormat) const65 const TextureCaps &TextureCapsMap::get(GLenum internalFormat) const
66 {
67     static TextureCaps defaultUnsupportedTexture;
68     InternalFormatToCapsMap::const_iterator iter = mCapsMap.find(internalFormat);
69     return (iter != mCapsMap.end()) ? iter->second : defaultUnsupportedTexture;
70 }
71 
begin() const72 TextureCapsMap::const_iterator TextureCapsMap::begin() const
73 {
74     return mCapsMap.begin();
75 }
76 
end() const77 TextureCapsMap::const_iterator TextureCapsMap::end() const
78 {
79     return mCapsMap.end();
80 }
81 
size() const82 size_t TextureCapsMap::size() const
83 {
84     return mCapsMap.size();
85 }
86 
Extensions()87 Extensions::Extensions()
88     : elementIndexUint(false),
89       packedDepthStencil(false),
90       getProgramBinary(false),
91       rgb8rgba8(false),
92       textureFormatBGRA8888(false),
93       readFormatBGRA(false),
94       pixelBufferObject(false),
95       mapBuffer(false),
96       mapBufferRange(false),
97       textureHalfFloat(false),
98       textureHalfFloatLinear(false),
99       textureFloat(false),
100       textureFloatLinear(false),
101       textureRG(false),
102       textureCompressionDXT1(false),
103       textureCompressionDXT3(false),
104       textureCompressionDXT5(false),
105       depthTextures(false),
106       textureNPOT(false),
107       drawBuffers(false),
108       textureStorage(false),
109       textureFilterAnisotropic(false),
110       maxTextureAnisotropy(false),
111       occlusionQueryBoolean(false),
112       fence(false),
113       timerQuery(false),
114       robustness(false),
115       blendMinMax(false),
116       framebufferBlit(false),
117       framebufferMultisample(false),
118       instancedArrays(false),
119       packReverseRowOrder(false),
120       standardDerivatives(false),
121       shaderTextureLOD(false),
122       fragDepth(false),
123       textureUsage(false),
124       translatedShaderSource(false),
125       colorBufferFloat(false)
126 {
127 }
128 
InsertExtensionString(const std::string & extension,bool supported,std::vector<std::string> * extensionVector)129 static void InsertExtensionString(const std::string &extension, bool supported, std::vector<std::string> *extensionVector)
130 {
131     if (supported)
132     {
133         extensionVector->push_back(extension);
134     }
135 }
136 
getStrings() const137 std::vector<std::string> Extensions::getStrings() const
138 {
139     std::vector<std::string> extensionStrings;
140 
141     //                   | Extension name                     | Supported flag          | Output vector   |
142     InsertExtensionString("GL_OES_element_index_uint",         elementIndexUint,         &extensionStrings);
143     InsertExtensionString("GL_OES_packed_depth_stencil",       packedDepthStencil,       &extensionStrings);
144     InsertExtensionString("GL_OES_get_program_binary",         getProgramBinary,         &extensionStrings);
145     InsertExtensionString("GL_OES_rgb8_rgba8",                 rgb8rgba8,                &extensionStrings);
146     InsertExtensionString("GL_EXT_texture_format_BGRA8888",    textureFormatBGRA8888,    &extensionStrings);
147     InsertExtensionString("GL_EXT_read_format_bgra",           readFormatBGRA,           &extensionStrings);
148     InsertExtensionString("GL_NV_pixel_buffer_object",         pixelBufferObject,        &extensionStrings);
149     InsertExtensionString("GL_OES_mapbuffer",                  mapBuffer,                &extensionStrings);
150     InsertExtensionString("GL_EXT_map_buffer_range",           mapBufferRange,           &extensionStrings);
151     InsertExtensionString("GL_OES_texture_half_float",         textureHalfFloat,         &extensionStrings);
152     InsertExtensionString("GL_OES_texture_half_float_linear",  textureHalfFloatLinear,   &extensionStrings);
153     InsertExtensionString("GL_OES_texture_float",              textureFloat,             &extensionStrings);
154     InsertExtensionString("GL_OES_texture_float_linear",       textureFloatLinear,       &extensionStrings);
155     InsertExtensionString("GL_EXT_texture_rg",                 textureRG,                &extensionStrings);
156     InsertExtensionString("GL_EXT_texture_compression_dxt1",   textureCompressionDXT1,   &extensionStrings);
157     InsertExtensionString("GL_ANGLE_texture_compression_dxt3", textureCompressionDXT3,   &extensionStrings);
158     InsertExtensionString("GL_ANGLE_texture_compression_dxt5", textureCompressionDXT5,   &extensionStrings);
159     InsertExtensionString("GL_EXT_sRGB",                       sRGB,                     &extensionStrings);
160     InsertExtensionString("GL_ANGLE_depth_texture",            depthTextures,            &extensionStrings);
161     InsertExtensionString("GL_EXT_texture_storage",            textureStorage,           &extensionStrings);
162     InsertExtensionString("GL_OES_texture_npot",               textureNPOT,              &extensionStrings);
163     InsertExtensionString("GL_EXT_draw_buffers",               drawBuffers,              &extensionStrings);
164     InsertExtensionString("GL_EXT_texture_filter_anisotropic", textureFilterAnisotropic, &extensionStrings);
165     InsertExtensionString("GL_EXT_occlusion_query_boolean",    occlusionQueryBoolean,    &extensionStrings);
166     InsertExtensionString("GL_NV_fence",                       fence,                    &extensionStrings);
167     InsertExtensionString("GL_ANGLE_timer_query",              timerQuery,               &extensionStrings);
168     InsertExtensionString("GL_EXT_robustness",                 robustness,               &extensionStrings);
169     InsertExtensionString("GL_EXT_blend_minmax",               blendMinMax,              &extensionStrings);
170     InsertExtensionString("GL_ANGLE_framebuffer_blit",         framebufferBlit,          &extensionStrings);
171     InsertExtensionString("GL_ANGLE_framebuffer_multisample",  framebufferMultisample,   &extensionStrings);
172     InsertExtensionString("GL_ANGLE_instanced_arrays",         instancedArrays,          &extensionStrings);
173     InsertExtensionString("GL_ANGLE_pack_reverse_row_order",   packReverseRowOrder,      &extensionStrings);
174     InsertExtensionString("GL_OES_standard_derivatives",       standardDerivatives,      &extensionStrings);
175     InsertExtensionString("GL_EXT_shader_texture_lod",         shaderTextureLOD,         &extensionStrings);
176     InsertExtensionString("GL_EXT_frag_depth",                 fragDepth,                &extensionStrings);
177     InsertExtensionString("GL_ANGLE_texture_usage",            textureUsage,             &extensionStrings);
178     InsertExtensionString("GL_ANGLE_translated_shader_source", translatedShaderSource,   &extensionStrings);
179     InsertExtensionString("GL_EXT_color_buffer_float",         colorBufferFloat,         &extensionStrings);
180 
181     return extensionStrings;
182 }
183 
GetFormatSupport(const TextureCapsMap & textureCaps,const std::vector<GLenum> & requiredFormats,bool requiresFiltering,bool requiresRendering)184 static bool GetFormatSupport(const TextureCapsMap &textureCaps, const std::vector<GLenum> &requiredFormats,
185                              bool requiresFiltering, bool requiresRendering)
186 {
187     for (size_t i = 0; i < requiredFormats.size(); i++)
188     {
189         const TextureCaps &cap = textureCaps.get(requiredFormats[i]);
190 
191         if (requiresFiltering && !cap.filterable)
192         {
193             return false;
194         }
195 
196         if (requiresRendering && !cap.renderable)
197         {
198             return false;
199         }
200     }
201 
202     return true;
203 }
204 
205 // Checks for GL_OES_rgb8_rgba8 support
DetermineRGB8AndRGBA8TextureSupport(const TextureCapsMap & textureCaps)206 static bool DetermineRGB8AndRGBA8TextureSupport(const TextureCapsMap &textureCaps)
207 {
208     std::vector<GLenum> requiredFormats;
209     requiredFormats.push_back(GL_RGB8);
210     requiredFormats.push_back(GL_RGBA8);
211 
212     return GetFormatSupport(textureCaps, requiredFormats, true, true);
213 }
214 
215 // Checks for GL_EXT_texture_format_BGRA8888 support
DetermineBGRA8TextureSupport(const TextureCapsMap & textureCaps)216 static bool DetermineBGRA8TextureSupport(const TextureCapsMap &textureCaps)
217 {
218     std::vector<GLenum> requiredFormats;
219     requiredFormats.push_back(GL_BGRA8_EXT);
220 
221     return GetFormatSupport(textureCaps, requiredFormats, true, true);
222 }
223 
224 // Checks for GL_OES_texture_half_float support
DetermineHalfFloatTextureSupport(const TextureCapsMap & textureCaps)225 static bool DetermineHalfFloatTextureSupport(const TextureCapsMap &textureCaps)
226 {
227     std::vector<GLenum> requiredFormats;
228     requiredFormats.push_back(GL_RGB16F);
229     requiredFormats.push_back(GL_RGBA16F);
230 
231     return GetFormatSupport(textureCaps, requiredFormats, false, true);
232 }
233 
234 // Checks for GL_OES_texture_half_float_linear support
DetermineHalfFloatTextureFilteringSupport(const TextureCapsMap & textureCaps)235 static bool DetermineHalfFloatTextureFilteringSupport(const TextureCapsMap &textureCaps)
236 {
237     std::vector<GLenum> requiredFormats;
238     requiredFormats.push_back(GL_RGB16F);
239     requiredFormats.push_back(GL_RGBA16F);
240 
241     return GetFormatSupport(textureCaps, requiredFormats, true, false);
242 }
243 
244 // Checks for GL_OES_texture_float support
DetermineFloatTextureSupport(const TextureCapsMap & textureCaps)245 static bool DetermineFloatTextureSupport(const TextureCapsMap &textureCaps)
246 {
247     std::vector<GLenum> requiredFormats;
248     requiredFormats.push_back(GL_RGB32F);
249     requiredFormats.push_back(GL_RGBA32F);
250 
251     return GetFormatSupport(textureCaps, requiredFormats, false, true);
252 }
253 
254 // Checks for GL_OES_texture_float_linear support
DetermineFloatTextureFilteringSupport(const TextureCapsMap & textureCaps)255 static bool DetermineFloatTextureFilteringSupport(const TextureCapsMap &textureCaps)
256 {
257     std::vector<GLenum> requiredFormats;
258     requiredFormats.push_back(GL_RGB32F);
259     requiredFormats.push_back(GL_RGBA32F);
260 
261     return GetFormatSupport(textureCaps, requiredFormats, true, false);
262 }
263 
264 // Checks for GL_EXT_texture_rg support
DetermineRGTextureSupport(const TextureCapsMap & textureCaps,bool checkHalfFloatFormats,bool checkFloatFormats)265 static bool DetermineRGTextureSupport(const TextureCapsMap &textureCaps, bool checkHalfFloatFormats, bool checkFloatFormats)
266 {
267     std::vector<GLenum> requiredFormats;
268     requiredFormats.push_back(GL_R8);
269     requiredFormats.push_back(GL_RG8);
270     if (checkHalfFloatFormats)
271     {
272         requiredFormats.push_back(GL_R16F);
273         requiredFormats.push_back(GL_RG16F);
274     }
275     if (checkFloatFormats)
276     {
277         requiredFormats.push_back(GL_R32F);
278         requiredFormats.push_back(GL_RG32F);
279     }
280 
281     return GetFormatSupport(textureCaps, requiredFormats, true, false);
282 }
283 
284 // Check for GL_EXT_texture_compression_dxt1
DetermineDXT1TextureSupport(const TextureCapsMap & textureCaps)285 static bool DetermineDXT1TextureSupport(const TextureCapsMap &textureCaps)
286 {
287     std::vector<GLenum> requiredFormats;
288     requiredFormats.push_back(GL_COMPRESSED_RGB_S3TC_DXT1_EXT);
289     requiredFormats.push_back(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT);
290 
291     return GetFormatSupport(textureCaps, requiredFormats, true, false);
292 }
293 
294 // Check for GL_ANGLE_texture_compression_dxt3
DetermineDXT3TextureSupport(const TextureCapsMap & textureCaps)295 static bool DetermineDXT3TextureSupport(const TextureCapsMap &textureCaps)
296 {
297     std::vector<GLenum> requiredFormats;
298     requiredFormats.push_back(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE);
299 
300     return GetFormatSupport(textureCaps, requiredFormats, true, false);
301 }
302 
303 // Check for GL_ANGLE_texture_compression_dxt5
DetermineDXT5TextureSupport(const TextureCapsMap & textureCaps)304 static bool DetermineDXT5TextureSupport(const TextureCapsMap &textureCaps)
305 {
306     std::vector<GLenum> requiredFormats;
307     requiredFormats.push_back(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE);
308 
309     return GetFormatSupport(textureCaps, requiredFormats, true, false);
310 }
311 
312 // Check for GL_ANGLE_texture_compression_dxt5
DetermineSRGBTextureSupport(const TextureCapsMap & textureCaps)313 static bool DetermineSRGBTextureSupport(const TextureCapsMap &textureCaps)
314 {
315     std::vector<GLenum> requiredFilterFormats;
316     requiredFilterFormats.push_back(GL_SRGB8);
317     requiredFilterFormats.push_back(GL_SRGB8_ALPHA8);
318 
319     std::vector<GLenum> requiredRenderFormats;
320     requiredRenderFormats.push_back(GL_SRGB8_ALPHA8);
321 
322     return GetFormatSupport(textureCaps, requiredFilterFormats, true, false) &&
323            GetFormatSupport(textureCaps, requiredRenderFormats, false, true);
324 }
325 
326 // Check for GL_ANGLE_depth_texture
DetermineDepthTextureSupport(const TextureCapsMap & textureCaps)327 static bool DetermineDepthTextureSupport(const TextureCapsMap &textureCaps)
328 {
329     std::vector<GLenum> requiredFormats;
330     requiredFormats.push_back(GL_DEPTH_COMPONENT16);
331     requiredFormats.push_back(GL_DEPTH_COMPONENT32_OES);
332     requiredFormats.push_back(GL_DEPTH24_STENCIL8_OES);
333 
334     return GetFormatSupport(textureCaps, requiredFormats, true, true);
335 }
336 
337 // Check for GL_EXT_color_buffer_float
DetermineColorBufferFloatSupport(const TextureCapsMap & textureCaps)338 static bool DetermineColorBufferFloatSupport(const TextureCapsMap &textureCaps)
339 {
340     std::vector<GLenum> requiredFormats;
341     requiredFormats.push_back(GL_R16F);
342     requiredFormats.push_back(GL_RG16F);
343     requiredFormats.push_back(GL_RGBA16F);
344     requiredFormats.push_back(GL_R32F);
345     requiredFormats.push_back(GL_RG32F);
346     requiredFormats.push_back(GL_RGBA32F);
347     requiredFormats.push_back(GL_R11F_G11F_B10F);
348 
349     return GetFormatSupport(textureCaps, requiredFormats, false, true);
350 }
351 
setTextureExtensionSupport(const TextureCapsMap & textureCaps)352 void Extensions::setTextureExtensionSupport(const TextureCapsMap &textureCaps)
353 {
354     rgb8rgba8 = DetermineRGB8AndRGBA8TextureSupport(textureCaps);
355     textureFormatBGRA8888 = DetermineBGRA8TextureSupport(textureCaps);
356     textureHalfFloat = DetermineHalfFloatTextureSupport(textureCaps);
357     textureHalfFloatLinear = DetermineHalfFloatTextureFilteringSupport(textureCaps);
358     textureFloat = DetermineFloatTextureSupport(textureCaps);
359     textureFloatLinear = DetermineFloatTextureFilteringSupport(textureCaps);
360     textureRG = DetermineRGTextureSupport(textureCaps, textureHalfFloat, textureFloat);
361     textureCompressionDXT1 = DetermineDXT1TextureSupport(textureCaps);
362     textureCompressionDXT3 = DetermineDXT3TextureSupport(textureCaps);
363     textureCompressionDXT5 = DetermineDXT5TextureSupport(textureCaps);
364     sRGB = DetermineSRGBTextureSupport(textureCaps);
365     depthTextures = DetermineDepthTextureSupport(textureCaps);
366     colorBufferFloat = DetermineColorBufferFloatSupport(textureCaps);
367 }
368 
Caps()369 Caps::Caps()
370     : maxElementIndex(0),
371       max3DTextureSize(0),
372       max2DTextureSize(0),
373       maxArrayTextureLayers(0),
374       maxLODBias(0),
375       maxCubeMapTextureSize(0),
376       maxRenderbufferSize(0),
377       maxDrawBuffers(0),
378       maxColorAttachments(0),
379       maxViewportWidth(0),
380       maxViewportHeight(0),
381       minAliasedPointSize(0),
382       maxAliasedPointSize(0),
383       minAliasedLineWidth(0),
384       // Table 6.29
385       maxElementsIndices(0),
386       maxElementsVertices(0),
387       maxServerWaitTimeout(0),
388       // Table 6.31
389       maxVertexAttributes(0),
390       maxVertexUniformComponents(0),
391       maxVertexUniformVectors(0),
392       maxVertexUniformBlocks(0),
393       maxVertexOutputComponents(0),
394       maxVertexTextureImageUnits(0),
395       // Table 6.32
396       maxFragmentUniformComponents(0),
397       maxFragmentUniformVectors(0),
398       maxFragmentUniformBlocks(0),
399       maxFragmentInputComponents(0),
400       maxTextureImageUnits(0),
401       minProgramTexelOffset(0),
402       maxProgramTexelOffset(0),
403 
404       maxUniformBufferBindings(0),
405       maxUniformBlockSize(0),
406       uniformBufferOffsetAlignment(0),
407       maxCombinedUniformBlocks(0),
408       maxCombinedVertexUniformComponents(0),
409       maxCombinedFragmentUniformComponents(0),
410       maxVaryingComponents(0),
411       maxVaryingVectors(0),
412       maxCombinedTextureImageUnits(0),
413 
414       maxTransformFeedbackInterleavedComponents(0),
415       maxTransformFeedbackSeparateAttributes(0),
416       maxTransformFeedbackSeparateComponents(0)
417 {
418 }
419 
420 }
421