Home | History | Annotate | Download | only in libGLESv2
      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 
     17 namespace gl
     18 {
     19 
     20 typedef std::set<GLuint> SupportedSampleSet;
     21 
     22 struct 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 
     45 class 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 
     65 struct 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 
    208 struct 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