// // 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. // #ifndef LIBANGLE_CAPS_H_ #define LIBANGLE_CAPS_H_ #include "angle_gl.h" #include "libANGLE/angletypes.h" #include #include #include #include namespace gl { typedef std::set 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::map::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::map InternalFormatToCapsMap; InternalFormatToCapsMap mCapsMap; }; struct Extensions { Extensions(); // Generate a vector of supported extension strings std::vector 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_shader_framebuffer_fetch bool shaderFramebufferFetch; // GL_ARM_shader_framebuffer_fetch bool ARMshaderFramebufferFetch; // GL_NV_shader_framebuffer_fetch bool NVshaderFramebufferFetch; // 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 TypePrecision { TypePrecision(); void setIEEEFloat(); void setTwosComplementInt(unsigned int bits); void setSimulatedInt(unsigned int range); void get(GLint *returnRange, GLint *returnPrecision) const; GLint range[2]; GLint precision; }; 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 compressedTextureFormats; std::vector programBinaryFormats; std::vector shaderBinaryFormats; TypePrecision vertexHighpFloat; TypePrecision vertexMediumpFloat; TypePrecision vertexLowpFloat; TypePrecision vertexHighpInt; TypePrecision vertexMediumpInt; TypePrecision vertexLowpInt; TypePrecision fragmentHighpFloat; TypePrecision fragmentMediumpFloat; TypePrecision fragmentLowpFloat; TypePrecision fragmentHighpInt; TypePrecision fragmentMediumpInt; TypePrecision fragmentLowpInt; 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; // Table 6.33, implementation dependent aggregate shader limits GLuint maxUniformBufferBindings; GLuint64 maxUniformBlockSize; GLuint uniformBufferOffsetAlignment; GLuint maxCombinedUniformBlocks; GLuint64 maxCombinedVertexUniformComponents; GLuint64 maxCombinedFragmentUniformComponents; GLuint maxVaryingComponents; GLuint maxVaryingVectors; GLuint maxCombinedTextureImageUnits; // Table 6.34, implementation dependent transform feedback limits GLuint maxTransformFeedbackInterleavedComponents; GLuint maxTransformFeedbackSeparateAttributes; GLuint maxTransformFeedbackSeparateComponents; }; } namespace egl { struct Caps { Caps(); // Support for NPOT surfaces bool textureNPOT; }; struct DisplayExtensions { DisplayExtensions(); // Generate a vector of supported extension strings std::vector getStrings() const; // EGL_EXT_create_context_robustness bool createContextRobustness; // EGL_ANGLE_d3d_share_handle_client_buffer bool d3dShareHandleClientBuffer; // EGL_ANGLE_surface_d3d_texture_2d_share_handle bool surfaceD3DTexture2DShareHandle; // EGL_ANGLE_query_surface_pointer bool querySurfacePointer; // EGL_ANGLE_window_fixed_size bool windowFixedSize; // EGL_NV_post_sub_buffer bool postSubBuffer; // EGL_KHR_create_context bool createContext; }; struct ClientExtensions { ClientExtensions(); // Generate a vector of supported extension strings std::vector getStrings() const; // EGL_EXT_client_extensions bool clientExtensions; // EGL_EXT_platform_base bool platformBase; // EGL_ANGLE_platform_angle bool platformANGLE; // EGL_ANGLE_platform_angle_d3d bool platformANGLED3D; // EGL_ANGLE_platform_angle_opengl bool platformANGLEOpenGL; }; } #endif // LIBANGLE_CAPS_H_