Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / Caps.cpp
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
19 TextureCaps::TextureCaps()
20     : texturable(false),
21       filterable(false),
22       renderable(false),
23       sampleCounts()
24 {
25 }
26
27 GLuint TextureCaps::getMaxSamples() const
28 {
29     return !sampleCounts.empty() ? *sampleCounts.rbegin() : 0;
30 }
31
32 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
51 void TextureCapsMap::insert(GLenum internalFormat, const TextureCaps &caps)
52 {
53     mCapsMap.insert(std::make_pair(internalFormat, caps));
54 }
55
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
65 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
72 TextureCapsMap::const_iterator TextureCapsMap::begin() const
73 {
74     return mCapsMap.begin();
75 }
76
77 TextureCapsMap::const_iterator TextureCapsMap::end() const
78 {
79     return mCapsMap.end();
80 }
81
82 size_t TextureCapsMap::size() const
83 {
84     return mCapsMap.size();
85 }
86
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
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
137 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }