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.
7 #include "libGLESv2/Caps.h"
8 #include "common/debug.h"
9 #include "common/angleutils.h"
19 TextureCaps::TextureCaps()
27 GLuint TextureCaps::getMaxSamples() const
29 return !sampleCounts.empty() ? *sampleCounts.rbegin() : 0;
32 GLuint TextureCaps::getNearestSamples(GLuint requestedSamples) const
34 if (requestedSamples == 0)
39 for (SupportedSampleSet::const_iterator i = sampleCounts.begin(); i != sampleCounts.end(); i++)
42 if (samples >= requestedSamples)
51 void TextureCapsMap::insert(GLenum internalFormat, const TextureCaps &caps)
53 mCapsMap.insert(std::make_pair(internalFormat, caps));
56 void TextureCapsMap::remove(GLenum internalFormat)
58 InternalFormatToCapsMap::iterator i = mCapsMap.find(internalFormat);
59 if (i != mCapsMap.end())
65 const TextureCaps &TextureCapsMap::get(GLenum internalFormat) const
67 static TextureCaps defaultUnsupportedTexture;
68 InternalFormatToCapsMap::const_iterator iter = mCapsMap.find(internalFormat);
69 return (iter != mCapsMap.end()) ? iter->second : defaultUnsupportedTexture;
72 TextureCapsMap::const_iterator TextureCapsMap::begin() const
74 return mCapsMap.begin();
77 TextureCapsMap::const_iterator TextureCapsMap::end() const
79 return mCapsMap.end();
82 size_t TextureCapsMap::size() const
84 return mCapsMap.size();
87 Extensions::Extensions()
88 : elementIndexUint(false),
89 packedDepthStencil(false),
90 getProgramBinary(false),
92 textureFormatBGRA8888(false),
93 readFormatBGRA(false),
94 pixelBufferObject(false),
96 mapBufferRange(false),
97 textureHalfFloat(false),
98 textureHalfFloatLinear(false),
100 textureFloatLinear(false),
102 textureCompressionDXT1(false),
103 textureCompressionDXT3(false),
104 textureCompressionDXT5(false),
105 depthTextures(false),
108 textureStorage(false),
109 textureFilterAnisotropic(false),
110 maxTextureAnisotropy(false),
111 occlusionQueryBoolean(false),
116 framebufferBlit(false),
117 framebufferMultisample(false),
118 instancedArrays(false),
119 packReverseRowOrder(false),
120 standardDerivatives(false),
121 shaderTextureLOD(false),
124 translatedShaderSource(false),
125 colorBufferFloat(false)
129 static void InsertExtensionString(const std::string &extension, bool supported, std::vector<std::string> *extensionVector)
133 extensionVector->push_back(extension);
137 std::vector<std::string> Extensions::getStrings() const
139 std::vector<std::string> extensionStrings;
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);
181 return extensionStrings;
184 static bool GetFormatSupport(const TextureCapsMap &textureCaps, const std::vector<GLenum> &requiredFormats,
185 bool requiresFiltering, bool requiresRendering)
187 for (size_t i = 0; i < requiredFormats.size(); i++)
189 const TextureCaps &cap = textureCaps.get(requiredFormats[i]);
191 if (requiresFiltering && !cap.filterable)
196 if (requiresRendering && !cap.renderable)
205 // Checks for GL_OES_rgb8_rgba8 support
206 static bool DetermineRGB8AndRGBA8TextureSupport(const TextureCapsMap &textureCaps)
208 std::vector<GLenum> requiredFormats;
209 requiredFormats.push_back(GL_RGB8);
210 requiredFormats.push_back(GL_RGBA8);
212 return GetFormatSupport(textureCaps, requiredFormats, true, true);
215 // Checks for GL_EXT_texture_format_BGRA8888 support
216 static bool DetermineBGRA8TextureSupport(const TextureCapsMap &textureCaps)
218 std::vector<GLenum> requiredFormats;
219 requiredFormats.push_back(GL_BGRA8_EXT);
221 return GetFormatSupport(textureCaps, requiredFormats, true, true);
224 // Checks for GL_OES_texture_half_float support
225 static bool DetermineHalfFloatTextureSupport(const TextureCapsMap &textureCaps)
227 std::vector<GLenum> requiredFormats;
228 requiredFormats.push_back(GL_RGB16F);
229 requiredFormats.push_back(GL_RGBA16F);
231 return GetFormatSupport(textureCaps, requiredFormats, false, true);
234 // Checks for GL_OES_texture_half_float_linear support
235 static bool DetermineHalfFloatTextureFilteringSupport(const TextureCapsMap &textureCaps)
237 std::vector<GLenum> requiredFormats;
238 requiredFormats.push_back(GL_RGB16F);
239 requiredFormats.push_back(GL_RGBA16F);
241 return GetFormatSupport(textureCaps, requiredFormats, true, false);
244 // Checks for GL_OES_texture_float support
245 static bool DetermineFloatTextureSupport(const TextureCapsMap &textureCaps)
247 std::vector<GLenum> requiredFormats;
248 requiredFormats.push_back(GL_RGB32F);
249 requiredFormats.push_back(GL_RGBA32F);
251 return GetFormatSupport(textureCaps, requiredFormats, false, true);
254 // Checks for GL_OES_texture_float_linear support
255 static bool DetermineFloatTextureFilteringSupport(const TextureCapsMap &textureCaps)
257 std::vector<GLenum> requiredFormats;
258 requiredFormats.push_back(GL_RGB32F);
259 requiredFormats.push_back(GL_RGBA32F);
261 return GetFormatSupport(textureCaps, requiredFormats, true, false);
264 // Checks for GL_EXT_texture_rg support
265 static bool DetermineRGTextureSupport(const TextureCapsMap &textureCaps, bool checkHalfFloatFormats, bool checkFloatFormats)
267 std::vector<GLenum> requiredFormats;
268 requiredFormats.push_back(GL_R8);
269 requiredFormats.push_back(GL_RG8);
270 if (checkHalfFloatFormats)
272 requiredFormats.push_back(GL_R16F);
273 requiredFormats.push_back(GL_RG16F);
275 if (checkFloatFormats)
277 requiredFormats.push_back(GL_R32F);
278 requiredFormats.push_back(GL_RG32F);
281 return GetFormatSupport(textureCaps, requiredFormats, true, false);
284 // Check for GL_EXT_texture_compression_dxt1
285 static bool DetermineDXT1TextureSupport(const TextureCapsMap &textureCaps)
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);
291 return GetFormatSupport(textureCaps, requiredFormats, true, false);
294 // Check for GL_ANGLE_texture_compression_dxt3
295 static bool DetermineDXT3TextureSupport(const TextureCapsMap &textureCaps)
297 std::vector<GLenum> requiredFormats;
298 requiredFormats.push_back(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE);
300 return GetFormatSupport(textureCaps, requiredFormats, true, false);
303 // Check for GL_ANGLE_texture_compression_dxt5
304 static bool DetermineDXT5TextureSupport(const TextureCapsMap &textureCaps)
306 std::vector<GLenum> requiredFormats;
307 requiredFormats.push_back(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE);
309 return GetFormatSupport(textureCaps, requiredFormats, true, false);
312 // Check for GL_ANGLE_texture_compression_dxt5
313 static bool DetermineSRGBTextureSupport(const TextureCapsMap &textureCaps)
315 std::vector<GLenum> requiredFilterFormats;
316 requiredFilterFormats.push_back(GL_SRGB8);
317 requiredFilterFormats.push_back(GL_SRGB8_ALPHA8);
319 std::vector<GLenum> requiredRenderFormats;
320 requiredRenderFormats.push_back(GL_SRGB8_ALPHA8);
322 return GetFormatSupport(textureCaps, requiredFilterFormats, true, false) &&
323 GetFormatSupport(textureCaps, requiredRenderFormats, false, true);
326 // Check for GL_ANGLE_depth_texture
327 static bool DetermineDepthTextureSupport(const TextureCapsMap &textureCaps)
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);
334 return GetFormatSupport(textureCaps, requiredFormats, true, true);
337 // Check for GL_EXT_color_buffer_float
338 static bool DetermineColorBufferFloatSupport(const TextureCapsMap &textureCaps)
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);
349 return GetFormatSupport(textureCaps, requiredFormats, false, true);
352 void Extensions::setTextureExtensionSupport(const TextureCapsMap &textureCaps)
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);
370 : maxElementIndex(0),
373 maxArrayTextureLayers(0),
375 maxCubeMapTextureSize(0),
376 maxRenderbufferSize(0),
378 maxColorAttachments(0),
380 maxViewportHeight(0),
381 minAliasedPointSize(0),
382 maxAliasedPointSize(0),
383 minAliasedLineWidth(0),
385 maxElementsIndices(0),
386 maxElementsVertices(0),
387 maxServerWaitTimeout(0),
389 maxVertexAttributes(0),
390 maxVertexUniformComponents(0),
391 maxVertexUniformVectors(0),
392 maxVertexUniformBlocks(0),
393 maxVertexOutputComponents(0),
394 maxVertexTextureImageUnits(0),
396 maxFragmentUniformComponents(0),
397 maxFragmentUniformVectors(0),
398 maxFragmentUniformBlocks(0),
399 maxFragmentInputComponents(0),
400 maxTextureImageUnits(0),
401 minProgramTexelOffset(0),
402 maxProgramTexelOffset(0),
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),
414 maxTransformFeedbackInterleavedComponents(0),
415 maxTransformFeedbackSeparateAttributes(0),
416 maxTransformFeedbackSeparateComponents(0)