// // 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/Version.h" #include "libANGLE/angletypes.h" #include "libANGLE/renderer/Format.h" #include #include #include #include #include namespace gl { struct Extensions; typedef std::set SupportedSampleSet; struct TextureCaps { TextureCaps(); TextureCaps(const TextureCaps &other); ~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; // Set of supported sample counts, only guaranteed to be valid in ES3. 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; }; TextureCaps GenerateMinimumTextureCaps(GLenum internalFormat, const Version &clientVersion, const Extensions &extensions); class TextureCapsMap final : angle::NonCopyable { public: TextureCapsMap(); ~TextureCapsMap(); // These methods are deprecated. Please use angle::Format for new features. void insert(GLenum internalFormat, const TextureCaps &caps); const TextureCaps &get(GLenum internalFormat) const; void clear(); // Prefer using angle::Format methods. const TextureCaps &get(angle::Format::ID formatID) const; void set(angle::Format::ID formatID, const TextureCaps &caps); private: TextureCaps &get(angle::Format::ID formatID); // Indexed by angle::Format::ID std::array mFormatData; }; void InitMinimumTextureCapsMap(const Version &clientVersion, const Extensions &extensions, TextureCapsMap *capsMap); 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_packed_depth_stencil // GL_OES_rgb8_rgba8 // GL_EXT_texture_format_BGRA8888 // GL_EXT_color_buffer_half_float, // 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_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr // GL_OES_compressed_ETC1_RGB8_texture // GL_EXT_sRGB // GL_ANGLE_depth_texture, GL_OES_depth32 // GL_EXT_color_buffer_float // GL_EXT_texture_norm16 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_EXT_color_buffer_half_float // Together with GL_OES_texture_half_float in a GLES 2.0 context, implies that half-float // textures are renderable. bool colorBufferHalfFloat; // 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 exist 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_texture_compression_s3tc_srgb // Implies that TextureCaps exist for GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, and // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT bool textureCompressionS3TCsRGB; // GL_KHR_texture_compression_astc_hdr bool textureCompressionASTCHDR; // GL_KHR_texture_compression_astc_ldr bool textureCompressionASTCLDR; // GL_OES_compressed_ETC1_RGB8_texture // Implies that TextureCaps for GL_ETC1_RGB8_OES exist bool compressedETC1RGB8Texture; // 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_OES_depth32 // Allows DEPTH_COMPONENT32_OES as a valid Renderbuffer format. bool depth32; // 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_EXT_disjoint_timer_query bool disjointTimerQuery; GLuint queryCounterBitsTimeElapsed; GLuint queryCounterBitsTimestamp; // GL_EXT_robustness bool robustness; // GL_KHR_robust_buffer_access_behavior bool robustBufferAccessBehavior; // GL_EXT_blend_minmax bool blendMinMax; // GL_ANGLE_framebuffer_blit bool framebufferBlit; // GL_ANGLE_framebuffer_multisample bool framebufferMultisample; // 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; // ANGLE_multiview bool multiview; GLuint maxViews; // GL_ANGLE_texture_usage bool textureUsage; // GL_ANGLE_translated_shader_source bool translatedShaderSource; // GL_OES_fbo_render_mipmap bool fboRenderMipmap; // GL_EXT_discard_framebuffer bool discardFramebuffer; // EXT_debug_marker bool debugMarker; // GL_OES_EGL_image bool eglImage; // GL_OES_EGL_image_external bool eglImageExternal; // GL_OES_EGL_image_external_essl3 bool eglImageExternalEssl3; // NV_EGL_stream_consumer_external bool eglStreamConsumerExternal; // EXT_unpack_subimage bool unpackSubimage; // NV_pack_subimage bool packSubimage; // GL_OES_vertex_array_object bool vertexArrayObject; // GL_KHR_debug bool debug; GLuint maxDebugMessageLength; GLuint maxDebugLoggedMessages; GLuint maxDebugGroupStackDepth; GLuint maxLabelLength; // KHR_no_error bool noError; // GL_ANGLE_lossy_etc_decode bool lossyETCDecode; // GL_CHROMIUM_bind_uniform_location bool bindUniformLocation; // GL_CHROMIUM_sync_query bool syncQuery; // GL_CHROMIUM_copy_texture bool copyTexture; // GL_CHROMIUM_copy_compressed_texture bool copyCompressedTexture; // GL_ANGLE_webgl_compatibility bool webglCompatibility; // GL_ANGLE_request_extension bool requestExtension; // GL_CHROMIUM_bind_generates_resource bool bindGeneratesResource; // GL_ANGLE_robust_client_memory bool robustClientMemory; // GL_EXT_texture_sRGB_decode bool textureSRGBDecode; // GL_EXT_sRGB_write_control bool sRGBWriteControl; // GL_CHROMIUM_color_buffer_float_rgb bool colorBufferFloatRGB; // GL_CHROMIUM_color_buffer_float_rgba bool colorBufferFloatRGBA; // ES3 Extension support // GL_EXT_color_buffer_float bool colorBufferFloat; // GL_EXT_multisample_compatibility. // written against ES 3.1 but can apply to earlier versions. bool multisampleCompatibility; // GL_CHROMIUM_framebuffer_mixed_samples bool framebufferMixedSamples; // GL_EXT_texture_norm16 // written against ES 3.1 but can apply to ES 3.0 as well. bool textureNorm16; // GL_CHROMIUM_path_rendering bool pathRendering; // GL_OES_surfaceless_context bool surfacelessContext; // GL_ANGLE_client_arrays bool clientArrays; // GL_ANGLE_robust_resource_initialization bool robustResourceInitialization; // GL_ANGLE_program_cache_control bool programCacheControl; // GL_ANGLE_texture_rectangle bool textureRectangle; // GL_EXT_geometry_shader bool geometryShader; // GL_EXT_geometry_shader (May 31, 2016) Table 20.43gs: Implementation dependent geometry shader // limits // TODO(jiawei.shao@intel.com): add all implementation dependent geometry shader limits. GLuint maxGeometryOutputVertices; GLuint maxGeometryShaderInvocations; }; struct ExtensionInfo { // If this extension can be enabled with glRequestExtension (GL_ANGLE_request_extension) bool Requestable = false; // Pointer to a boolean member of the Extensions struct typedef bool(Extensions::*ExtensionBool); ExtensionBool ExtensionsMember = nullptr; }; using ExtensionInfoMap = std::map; const ExtensionInfoMap &GetExtensionInfoMap(); struct Limitations { Limitations(); // Renderer doesn't support gl_FrontFacing in fragment shaders bool noFrontFacingSupport; // Renderer doesn't support GL_SAMPLE_ALPHA_TO_COVERAGE bool noSampleAlphaToCoverageSupport; // In glVertexAttribDivisorANGLE, attribute zero must have a zero divisor bool attributeZeroRequiresZeroDivisorInEXT; // Unable to support different values for front and back faces for stencil refs and masks bool noSeparateStencilRefsAndMasks; // Renderer doesn't support non-constant indexing loops in fragment shader bool shadersRequireIndexedLoopValidation; // Renderer doesn't support Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA // and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR blend functions. bool noSimultaneousConstantColorAndAlphaBlendFunc; }; struct TypePrecision { TypePrecision(); TypePrecision(const TypePrecision &other); void setIEEEFloat(); void setTwosComplementInt(unsigned int bits); void setSimulatedFloat(unsigned int range, unsigned int precision); void setSimulatedInt(unsigned int range); void get(GLint *returnRange, GLint *returnPrecision) const; std::array range; GLint precision; }; struct Caps { Caps(); Caps(const Caps &other); ~Caps(); // ES 3.1 (April 29, 2015) 20.39: implementation dependent values GLuint64 maxElementIndex; GLuint max3DTextureSize; GLuint max2DTextureSize; GLuint maxRectangleTextureSize; GLuint maxArrayTextureLayers; GLfloat maxLODBias; GLuint maxCubeMapTextureSize; GLuint maxRenderbufferSize; GLfloat minAliasedPointSize; GLfloat maxAliasedPointSize; GLfloat minAliasedLineWidth; GLfloat maxAliasedLineWidth; // ES 3.1 (April 29, 2015) 20.40: implementation dependent values (cont.) GLuint maxDrawBuffers; GLuint maxFramebufferWidth; GLuint maxFramebufferHeight; GLuint maxFramebufferSamples; GLuint maxColorAttachments; GLuint maxViewportWidth; GLuint maxViewportHeight; GLuint maxSampleMaskWords; GLuint maxColorTextureSamples; GLuint maxDepthTextureSamples; GLuint maxIntegerSamples; GLuint64 maxServerWaitTimeout; // ES 3.1 (April 29, 2015) Table 20.41: Implementation dependent values (cont.) GLint maxVertexAttribRelativeOffset; GLuint maxVertexAttribBindings; GLint maxVertexAttribStride; 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; // ES 3.1 (April 29, 2015) Table 20.43: Implementation dependent Vertex shader limits GLuint maxVertexAttributes; GLuint maxVertexUniformComponents; GLuint maxVertexUniformVectors; GLuint maxVertexUniformBlocks; GLuint maxVertexOutputComponents; GLuint maxVertexTextureImageUnits; GLuint maxVertexAtomicCounterBuffers; GLuint maxVertexAtomicCounters; GLuint maxVertexImageUniforms; GLuint maxVertexShaderStorageBlocks; // ES 3.1 (April 29, 2015) Table 20.44: Implementation dependent Fragment shader limits GLuint maxFragmentUniformComponents; GLuint maxFragmentUniformVectors; GLuint maxFragmentUniformBlocks; GLuint maxFragmentInputComponents; GLuint maxTextureImageUnits; GLuint maxFragmentAtomicCounterBuffers; GLuint maxFragmentAtomicCounters; GLuint maxFragmentImageUniforms; GLuint maxFragmentShaderStorageBlocks; GLint minProgramTextureGatherOffset; GLuint maxProgramTextureGatherOffset; GLint minProgramTexelOffset; GLint maxProgramTexelOffset; // ES 3.1 (April 29, 2015) Table 20.45: implementation dependent compute shader limits std::array maxComputeWorkGroupCount; std::array maxComputeWorkGroupSize; GLuint maxComputeWorkGroupInvocations; GLuint maxComputeUniformBlocks; GLuint maxComputeTextureImageUnits; GLuint maxComputeSharedMemorySize; GLuint maxComputeUniformComponents; GLuint maxComputeAtomicCounterBuffers; GLuint maxComputeAtomicCounters; GLuint maxComputeImageUniforms; GLuint maxCombinedComputeUniformComponents; GLuint maxComputeShaderStorageBlocks; // ES 3.1 (April 29, 2015) Table 20.46: implementation dependent aggregate shader limits GLuint maxUniformBufferBindings; GLuint64 maxUniformBlockSize; GLuint uniformBufferOffsetAlignment; GLuint maxCombinedUniformBlocks; GLuint64 maxCombinedVertexUniformComponents; GLuint64 maxCombinedFragmentUniformComponents; GLuint maxVaryingComponents; GLuint maxVaryingVectors; GLuint maxCombinedTextureImageUnits; GLuint maxCombinedShaderOutputResources; // ES 3.1 (April 29, 2015) Table 20.47: implementation dependent aggregate shader limits (cont.) GLuint maxUniformLocations; GLuint maxAtomicCounterBufferBindings; GLuint maxAtomicCounterBufferSize; GLuint maxCombinedAtomicCounterBuffers; GLuint maxCombinedAtomicCounters; GLuint maxImageUnits; GLuint maxCombinedImageUniforms; GLuint maxShaderStorageBufferBindings; GLuint64 maxShaderStorageBlockSize; GLuint maxCombinedShaderStorageBlocks; GLuint shaderStorageBufferOffsetAlignment; // ES 3.1 (April 29, 2015) Table 20.48: implementation dependent transform feedback limits GLuint maxTransformFeedbackInterleavedComponents; GLuint maxTransformFeedbackSeparateAttributes; GLuint maxTransformFeedbackSeparateComponents; // ES 3.1 (April 29, 2015) Table 20.49: Framebuffer Dependent Values GLuint maxSamples; }; Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions); } 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_d3d_texture_client_buffer bool d3dTextureClientBuffer; // 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_ANGLE_keyed_mutex bool keyedMutex; // EGL_ANGLE_surface_orientation bool surfaceOrientation; // EGL_NV_post_sub_buffer bool postSubBuffer; // EGL_KHR_create_context bool createContext; // EGL_EXT_device_query bool deviceQuery; // EGL_KHR_image bool image; // EGL_KHR_image_base bool imageBase; // EGL_KHR_image_pixmap bool imagePixmap; // EGL_KHR_gl_texture_2D_image bool glTexture2DImage; // EGL_KHR_gl_texture_cubemap_image bool glTextureCubemapImage; // EGL_KHR_gl_texture_3D_image bool glTexture3DImage; // EGL_KHR_gl_renderbuffer_image bool glRenderbufferImage; // EGL_KHR_get_all_proc_addresses bool getAllProcAddresses; // EGL_ANGLE_flexible_surface_compatibility bool flexibleSurfaceCompatibility; // EGL_ANGLE_direct_composition bool directComposition; // KHR_create_context_no_error bool createContextNoError; // EGL_KHR_stream bool stream; // EGL_KHR_stream_consumer_gltexture bool streamConsumerGLTexture; // EGL_NV_stream_consumer_gltexture_yuv bool streamConsumerGLTextureYUV; // EGL_ANGLE_stream_producer_d3d_texture_nv12 bool streamProducerD3DTextureNV12; // EGL_ANGLE_create_context_webgl_compatibility bool createContextWebGLCompatibility; // EGL_CHROMIUM_create_context_bind_generates_resource bool createContextBindGeneratesResource; // EGL_CHROMIUM_get_sync_values bool getSyncValues; // EGL_EXT_swap_buffers_with_damage bool swapBuffersWithDamage; // EGL_EXT_pixel_format_float bool pixelFormatFloat; // EGL_KHR_surfaceless_context bool surfacelessContext; // EGL_ANGLE_display_texture_share_group bool displayTextureShareGroup; // EGL_ANGLE_create_context_client_arrays bool createContextClientArrays; // EGL_ANGLE_program_cache_control bool programCacheControl; // EGL_ANGLE_robust_resource_initialization bool robustResourceInitialization; }; struct DeviceExtensions { DeviceExtensions(); // Generate a vector of supported extension strings std::vector getStrings() const; // EGL_ANGLE_device_d3d bool deviceD3D; }; struct ClientExtensions { ClientExtensions(); ClientExtensions(const ClientExtensions &other); // Generate a vector of supported extension strings std::vector getStrings() const; // EGL_EXT_client_extensions bool clientExtensions; // EGL_EXT_platform_base bool platformBase; // EGL_EXT_platform_device bool platformDevice; // EGL_ANGLE_platform_angle bool platformANGLE; // EGL_ANGLE_platform_angle_d3d bool platformANGLED3D; // EGL_ANGLE_platform_angle_opengl bool platformANGLEOpenGL; // EGL_ANGLE_platform_angle_null bool platformANGLENULL; // EGL_ANGLE_platform_angle_vulkan bool platformANGLEVulkan; // EGL_ANGLE_device_creation bool deviceCreation; // EGL_ANGLE_device_creation_d3d11 bool deviceCreationD3D11; // EGL_ANGLE_x11_visual bool x11Visual; // EGL_ANGLE_experimental_present_path bool experimentalPresentPath; // EGL_KHR_client_get_all_proc_addresses bool clientGetAllProcAddresses; }; } // namespace egl #endif // LIBANGLE_CAPS_H_