| #ifndef LIBGLESV2_CAPS_H | |
| #define LIBGLESV2_CAPS_H | |
| // | |
| // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| #include "angle_gl.h" | |
| #include <set> | |
| #include <unordered_map> | |
| #include <vector> | |
| #include <string> | |
| namespace gl | |
| { | |
| typedef std::set<GLuint> SupportedSampleSet; | |
| struct TextureCaps | |
| { | |
| TextureCaps(); | |
| // Supports for basic texturing: glTexImage, glTexSubImage, etc | |
| bool texturable; | |
| // Support for linear or anisotropic filtering | |
| bool filterable; | |
| // Support for being used as a framebuffer attachment or renderbuffer format | |
| bool renderable; | |
| SupportedSampleSet sampleCounts; | |
| // Get the maximum number of samples supported | |
| GLuint getMaxSamples() const; | |
| // Get the number of supported samples that is at least as many as requested. Returns 0 if | |
| // there are no sample counts available | |
| GLuint getNearestSamples(GLuint requestedSamples) const; | |
| }; | |
| class TextureCapsMap | |
| { | |
| public: | |
| typedef std::unordered_map<GLenum, TextureCaps>::const_iterator const_iterator; | |
| void insert(GLenum internalFormat, const TextureCaps &caps); | |
| void remove(GLenum internalFormat); | |
| const TextureCaps &get(GLenum internalFormat) const; | |
| const_iterator begin() const; | |
| const_iterator end() const; | |
| size_t size() const; | |
| private: | |
| typedef std::unordered_map<GLenum, TextureCaps> InternalFormatToCapsMap; | |
| InternalFormatToCapsMap mCapsMap; | |
| }; | |
| struct Extensions | |
| { | |
| Extensions(); | |
| // Generate a vector of supported extension strings | |
| std::vector<std::string> getStrings() const; | |
| // Set all texture related extension support based on the supported textures. | |
| // Determines support for: | |
| // GL_OES_rgb8_rgba8 | |
| // GL_EXT_texture_format_BGRA8888 | |
| // GL_OES_texture_half_float, GL_OES_texture_half_float_linear | |
| // GL_OES_texture_float, GL_OES_texture_float_linear | |
| // GL_EXT_texture_rg | |
| // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5 | |
| // GL_EXT_sRGB | |
| // GL_ANGLE_depth_texture | |
| // GL_EXT_color_buffer_float | |
| void setTextureExtensionSupport(const TextureCapsMap &textureCaps); | |
| // ES2 Extension support | |
| // GL_OES_element_index_uint | |
| bool elementIndexUint; | |
| // GL_OES_packed_depth_stencil | |
| bool packedDepthStencil; | |
| // GL_OES_get_program_binary | |
| bool getProgramBinary; | |
| // GL_OES_rgb8_rgba8 | |
| // Implies that TextureCaps for GL_RGB8 and GL_RGBA8 exist | |
| bool rgb8rgba8; | |
| // GL_EXT_texture_format_BGRA8888 | |
| // Implies that TextureCaps for GL_BGRA8 exist | |
| bool textureFormatBGRA8888; | |
| // GL_EXT_read_format_bgra | |
| bool readFormatBGRA; | |
| // GL_NV_pixel_buffer_object | |
| bool pixelBufferObject; | |
| // GL_OES_mapbuffer and GL_EXT_map_buffer_range | |
| bool mapBuffer; | |
| bool mapBufferRange; | |
| // GL_OES_texture_half_float and GL_OES_texture_half_float_linear | |
| // Implies that TextureCaps for GL_RGB16F, GL_RGBA16F, GL_ALPHA32F_EXT, GL_LUMINANCE32F_EXT and | |
| // GL_LUMINANCE_ALPHA32F_EXT exist | |
| bool textureHalfFloat; | |
| bool textureHalfFloatLinear; | |
| // GL_OES_texture_float and GL_OES_texture_float_linear | |
| // Implies that TextureCaps for GL_RGB32F, GL_RGBA32F, GL_ALPHA16F_EXT, GL_LUMINANCE16F_EXT and | |
| // GL_LUMINANCE_ALPHA16F_EXT exist | |
| bool textureFloat; | |
| bool textureFloatLinear; | |
| // GL_EXT_texture_rg | |
| // Implies that TextureCaps for GL_R8, GL_RG8 (and floating point R/RG texture formats if floating point extensions | |
| // are also present) exist | |
| bool textureRG; | |
| // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3 and GL_ANGLE_texture_compression_dxt5 | |
| // Implies that TextureCaps for GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT | |
| // GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE and GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE | |
| bool textureCompressionDXT1; | |
| bool textureCompressionDXT3; | |
| bool textureCompressionDXT5; | |
| // GL_EXT_sRGB | |
| // Implies that TextureCaps for GL_SRGB8_ALPHA8 and GL_SRGB8 exist | |
| // TODO: Don't advertise this extension in ES3 | |
| bool sRGB; | |
| // GL_ANGLE_depth_texture | |
| bool depthTextures; | |
| // GL_EXT_texture_storage | |
| bool textureStorage; | |
| // GL_OES_texture_npot | |
| bool textureNPOT; | |
| // GL_EXT_draw_buffers | |
| bool drawBuffers; | |
| // GL_EXT_texture_filter_anisotropic | |
| bool textureFilterAnisotropic; | |
| GLfloat maxTextureAnisotropy; | |
| // GL_EXT_occlusion_query_boolean | |
| bool occlusionQueryBoolean; | |
| // GL_NV_fence | |
| bool fence; | |
| // GL_ANGLE_timer_query | |
| bool timerQuery; | |
| // GL_EXT_robustness | |
| bool robustness; | |
| // GL_EXT_blend_minmax | |
| bool blendMinMax; | |
| // GL_ANGLE_framebuffer_blit | |
| bool framebufferBlit; | |
| // GL_ANGLE_framebuffer_multisample | |
| bool framebufferMultisample; | |
| GLuint maxSamples; | |
| // GL_ANGLE_instanced_arrays | |
| bool instancedArrays; | |
| // GL_ANGLE_pack_reverse_row_order | |
| bool packReverseRowOrder; | |
| // GL_OES_standard_derivatives | |
| bool standardDerivatives; | |
| // GL_EXT_shader_texture_lod | |
| bool shaderTextureLOD; | |
| // GL_EXT_frag_depth | |
| bool fragDepth; | |
| // GL_ANGLE_texture_usage | |
| bool textureUsage; | |
| // GL_ANGLE_translated_shader_source | |
| bool translatedShaderSource; | |
| // ES3 Extension support | |
| // GL_EXT_color_buffer_float | |
| bool colorBufferFloat; | |
| }; | |
| struct Caps | |
| { | |
| Caps(); | |
| // Table 6.28, implementation dependent values | |
| GLuint64 maxElementIndex; | |
| GLuint max3DTextureSize; | |
| GLuint max2DTextureSize; | |
| GLuint maxArrayTextureLayers; | |
| GLfloat maxLODBias; | |
| GLuint maxCubeMapTextureSize; | |
| GLuint maxRenderbufferSize; | |
| GLuint maxDrawBuffers; | |
| GLuint maxColorAttachments; | |
| GLuint maxViewportWidth; | |
| GLuint maxViewportHeight; | |
| GLfloat minAliasedPointSize; | |
| GLfloat maxAliasedPointSize; | |
| GLfloat minAliasedLineWidth; | |
| GLfloat maxAliasedLineWidth; | |
| // Table 6.29, implementation dependent values (cont.) | |
| GLuint maxElementsIndices; | |
| GLuint maxElementsVertices; | |
| std::vector<GLenum> compressedTextureFormats; | |
| std::vector<GLenum> programBinaryFormats; | |
| std::vector<GLenum> shaderBinaryFormats; | |
| GLuint64 maxServerWaitTimeout; | |
| // Table 6.31, implementation dependent vertex shader limits | |
| GLuint maxVertexAttributes; | |
| GLuint maxVertexUniformComponents; | |
| GLuint maxVertexUniformVectors; | |
| GLuint maxVertexUniformBlocks; | |
| GLuint maxVertexOutputComponents; | |
| GLuint maxVertexTextureImageUnits; | |
| // Table 6.32, implementation dependent fragment shader limits | |
| GLuint maxFragmentUniformComponents; | |
| GLuint maxFragmentUniformVectors; | |
| GLuint maxFragmentUniformBlocks; | |
| GLuint maxFragmentInputComponents; | |
| GLuint maxTextureImageUnits; | |
| GLint minProgramTexelOffset; | |
| GLint maxProgramTexelOffset; | |
| }; | |
| } | |
| #endif // LIBGLESV2_CAPS_H |