1#ifndef LIBGLESV2_CAPS_H
2#define LIBGLESV2_CAPS_H
3
4//
5// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
6// Use of this source code is governed by a BSD-style license that can be
7// found in the LICENSE file.
8//
9
10#include "angle_gl.h"
11
12#include <set>
13#include <unordered_map>
14#include <vector>
15#include <string>
16
17namespace gl
18{
19
20typedef std::set<GLuint> SupportedSampleSet;
21
22struct TextureCaps
23{
24    TextureCaps();
25
26    // Supports for basic texturing: glTexImage, glTexSubImage, etc
27    bool texturable;
28
29    // Support for linear or anisotropic filtering
30    bool filterable;
31
32    // Support for being used as a framebuffer attachment or renderbuffer format
33    bool renderable;
34
35    SupportedSampleSet sampleCounts;
36
37    // Get the maximum number of samples supported
38    GLuint getMaxSamples() const;
39
40    // Get the number of supported samples that is at least as many as requested.  Returns 0 if
41    // there are no sample counts available
42    GLuint getNearestSamples(GLuint requestedSamples) const;
43};
44
45class TextureCapsMap
46{
47  public:
48    typedef std::unordered_map<GLenum, TextureCaps>::const_iterator const_iterator;
49
50    void insert(GLenum internalFormat, const TextureCaps &caps);
51    void remove(GLenum internalFormat);
52
53    const TextureCaps &get(GLenum internalFormat) const;
54
55    const_iterator begin() const;
56    const_iterator end() const;
57
58    size_t size() const;
59
60  private:
61    typedef std::unordered_map<GLenum, TextureCaps> InternalFormatToCapsMap;
62    InternalFormatToCapsMap mCapsMap;
63};
64
65struct Extensions
66{
67    Extensions();
68
69    // Generate a vector of supported extension strings
70    std::vector<std::string> getStrings() const;
71
72    // Set all texture related extension support based on the supported textures.
73    // Determines support for:
74    // GL_OES_rgb8_rgba8
75    // GL_EXT_texture_format_BGRA8888
76    // GL_OES_texture_half_float, GL_OES_texture_half_float_linear
77    // GL_OES_texture_float, GL_OES_texture_float_linear
78    // GL_EXT_texture_rg
79    // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5
80    // GL_EXT_sRGB
81    // GL_ANGLE_depth_texture
82    // GL_EXT_color_buffer_float
83    void setTextureExtensionSupport(const TextureCapsMap &textureCaps);
84
85    // ES2 Extension support
86
87    // GL_OES_element_index_uint
88    bool elementIndexUint;
89
90    // GL_OES_packed_depth_stencil
91    bool packedDepthStencil;
92
93    // GL_OES_get_program_binary
94    bool getProgramBinary;
95
96    // GL_OES_rgb8_rgba8
97    // Implies that TextureCaps for GL_RGB8 and GL_RGBA8 exist
98    bool rgb8rgba8;
99
100    // GL_EXT_texture_format_BGRA8888
101    // Implies that TextureCaps for GL_BGRA8 exist
102    bool textureFormatBGRA8888;
103
104    // GL_EXT_read_format_bgra
105    bool readFormatBGRA;
106
107    // GL_NV_pixel_buffer_object
108    bool pixelBufferObject;
109
110    // GL_OES_mapbuffer and GL_EXT_map_buffer_range
111    bool mapBuffer;
112    bool mapBufferRange;
113
114    // GL_OES_texture_half_float and GL_OES_texture_half_float_linear
115    // Implies that TextureCaps for GL_RGB16F, GL_RGBA16F, GL_ALPHA32F_EXT, GL_LUMINANCE32F_EXT and
116    // GL_LUMINANCE_ALPHA32F_EXT exist
117    bool textureHalfFloat;
118    bool textureHalfFloatLinear;
119
120    // GL_OES_texture_float and GL_OES_texture_float_linear
121    // Implies that TextureCaps for GL_RGB32F, GL_RGBA32F, GL_ALPHA16F_EXT, GL_LUMINANCE16F_EXT and
122    // GL_LUMINANCE_ALPHA16F_EXT exist
123    bool textureFloat;
124    bool textureFloatLinear;
125
126    // GL_EXT_texture_rg
127    // Implies that TextureCaps for GL_R8, GL_RG8 (and floating point R/RG texture formats if floating point extensions
128    // are also present) exist
129    bool textureRG;
130
131    // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3 and GL_ANGLE_texture_compression_dxt5
132    // Implies that TextureCaps for GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
133    // GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE and GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE
134    bool textureCompressionDXT1;
135    bool textureCompressionDXT3;
136    bool textureCompressionDXT5;
137
138    // GL_EXT_sRGB
139    // Implies that TextureCaps for GL_SRGB8_ALPHA8 and GL_SRGB8 exist
140    // TODO: Don't advertise this extension in ES3
141    bool sRGB;
142
143    // GL_ANGLE_depth_texture
144    bool depthTextures;
145
146    // GL_EXT_texture_storage
147    bool textureStorage;
148
149    // GL_OES_texture_npot
150    bool textureNPOT;
151
152    // GL_EXT_draw_buffers
153    bool drawBuffers;
154
155    // GL_EXT_texture_filter_anisotropic
156    bool textureFilterAnisotropic;
157    GLfloat maxTextureAnisotropy;
158
159    // GL_EXT_occlusion_query_boolean
160    bool occlusionQueryBoolean;
161
162    // GL_NV_fence
163    bool fence;
164
165    // GL_ANGLE_timer_query
166    bool timerQuery;
167
168    // GL_EXT_robustness
169    bool robustness;
170
171    // GL_EXT_blend_minmax
172    bool blendMinMax;
173
174    // GL_ANGLE_framebuffer_blit
175    bool framebufferBlit;
176
177    // GL_ANGLE_framebuffer_multisample
178    bool framebufferMultisample;
179    GLuint maxSamples;
180
181    // GL_ANGLE_instanced_arrays
182    bool instancedArrays;
183
184    // GL_ANGLE_pack_reverse_row_order
185    bool packReverseRowOrder;
186
187    // GL_OES_standard_derivatives
188    bool standardDerivatives;
189
190    // GL_EXT_shader_texture_lod
191    bool shaderTextureLOD;
192
193    // GL_EXT_frag_depth
194    bool fragDepth;
195
196    // GL_ANGLE_texture_usage
197    bool textureUsage;
198
199    // GL_ANGLE_translated_shader_source
200    bool translatedShaderSource;
201
202    // ES3 Extension support
203
204    // GL_EXT_color_buffer_float
205    bool colorBufferFloat;
206};
207
208struct Caps
209{
210    Caps();
211
212    // Table 6.28, implementation dependent values
213    GLuint64 maxElementIndex;
214    GLuint max3DTextureSize;
215    GLuint max2DTextureSize;
216    GLuint maxArrayTextureLayers;
217    GLfloat maxLODBias;
218    GLuint maxCubeMapTextureSize;
219    GLuint maxRenderbufferSize;
220    GLuint maxDrawBuffers;
221    GLuint maxColorAttachments;
222    GLuint maxViewportWidth;
223    GLuint maxViewportHeight;
224    GLfloat minAliasedPointSize;
225    GLfloat maxAliasedPointSize;
226    GLfloat minAliasedLineWidth;
227    GLfloat maxAliasedLineWidth;
228
229    // Table 6.29, implementation dependent values (cont.)
230    GLuint maxElementsIndices;
231    GLuint maxElementsVertices;
232    std::vector<GLenum> compressedTextureFormats;
233    std::vector<GLenum> programBinaryFormats;
234    std::vector<GLenum> shaderBinaryFormats;
235    GLuint64 maxServerWaitTimeout;
236
237    // Table 6.31, implementation dependent vertex shader limits
238    GLuint maxVertexAttributes;
239    GLuint maxVertexUniformComponents;
240    GLuint maxVertexUniformVectors;
241    GLuint maxVertexUniformBlocks;
242    GLuint maxVertexOutputComponents;
243    GLuint maxVertexTextureImageUnits;
244
245    // Table 6.32, implementation dependent fragment shader limits
246    GLuint maxFragmentUniformComponents;
247    GLuint maxFragmentUniformVectors;
248    GLuint maxFragmentUniformBlocks;
249    GLuint maxFragmentInputComponents;
250    GLuint maxTextureImageUnits;
251    GLint minProgramTexelOffset;
252    GLint maxProgramTexelOffset;
253
254    // Table 6.33, implementation dependent aggregate shader limits
255    GLuint maxUniformBufferBindings;
256    GLuint64 maxUniformBlockSize;
257    GLuint uniformBufferOffsetAlignment;
258    GLuint maxCombinedUniformBlocks;
259    GLuint64 maxCombinedVertexUniformComponents;
260    GLuint64 maxCombinedFragmentUniformComponents;
261    GLuint maxVaryingComponents;
262    GLuint maxVaryingVectors;
263    GLuint maxCombinedTextureImageUnits;
264
265    // Table 6.34, implementation dependent transform feedback limits
266    GLuint maxTransformFeedbackInterleavedComponents;
267    GLuint maxTransformFeedbackSeparateAttributes;
268    GLuint maxTransformFeedbackSeparateComponents;
269};
270
271}
272
273#endif // LIBGLESV2_CAPS_H
274