diff options
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/Caps.h')
-rw-r--r-- | gfx/angle/checkout/src/libANGLE/Caps.h | 1354 |
1 files changed, 1354 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/Caps.h b/gfx/angle/checkout/src/libANGLE/Caps.h new file mode 100644 index 0000000000..988ad3c4b8 --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/Caps.h @@ -0,0 +1,1354 @@ +// +// Copyright 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 <array> +#include <map> +#include <set> +#include <string> +#include <vector> + +namespace gl +{ + +struct Extensions; + +struct TextureCaps +{ + TextureCaps(); + TextureCaps(const TextureCaps &other); + TextureCaps &operator=(const TextureCaps &other); + + ~TextureCaps(); + + // Supports for basic texturing: glTexImage, glTexSubImage, etc + bool texturable = false; + + // Support for linear or anisotropic filtering + bool filterable = false; + + // Support for being used as a framebuffer attachment, i.e. glFramebufferTexture2D + bool textureAttachment = false; + + // Support for being used as a renderbuffer format, i.e. glFramebufferRenderbuffer + bool renderbuffer = false; + + // Support for blend modes while being used as a framebuffer attachment + bool blendable = false; + + // 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::FormatID formatID) const; + void set(angle::FormatID formatID, const TextureCaps &caps); + + private: + TextureCaps &get(angle::FormatID formatID); + + // Indexed by angle::FormatID + angle::FormatMap<TextureCaps> mFormatData; +}; + +void InitMinimumTextureCapsMap(const Version &clientVersion, + const Extensions &extensions, + TextureCapsMap *capsMap); + +// Returns true if all the formats required to support GL_ANGLE_compressed_texture_etc are +// present. Does not determine if they are natively supported without decompression. +bool DetermineCompressedTextureETCSupport(const TextureCapsMap &textureCaps); + +struct Extensions +{ + Extensions(); + Extensions(const Extensions &other); + + Extensions &operator=(const Extensions &other); + + // 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_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_type_2_10_10_10_REV + // GL_EXT_texture_compression_dxt1, GL_ANGLE_texture_compression_dxt3, + // GL_ANGLE_texture_compression_dxt5 + // GL_KHR_texture_compression_astc_ldr, GL_OES_texture_compression_astc. + // NOTE: GL_KHR_texture_compression_astc_hdr must be enabled separately. Support for the + // HDR profile cannot be determined from the format enums alone. + // 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 + // GL_EXT_texture_compression_bptc + // GL_EXT_texture_compression_rgtc + void setTextureExtensionSupport(const TextureCapsMap &textureCaps); + + // indicate if any depth texture extension is available + bool depthTextureAny() const { return (depthTextureANGLE || depthTextureOES); } + + // ES2 Extension support + + // GL_OES_element_index_uint + bool elementIndexUintOES = false; + + // GL_OES_packed_depth_stencil + bool packedDepthStencilOES = false; + + // GL_NV_read_depth + bool readDepthNV = false; + + // GL_NV_read_stencil + bool readStencilNV = false; + + // GL_NV_depth_buffer_float2 + bool depthBufferFloat2NV = false; + + // GL_OES_get_program_binary + bool getProgramBinaryOES = false; + + // GL_OES_rgb8_rgba8 + // Implies that TextureCaps for GL_RGB8 and GL_RGBA8 exist + bool rgb8rgba8OES = false; + + // GL_EXT_texture_format_BGRA8888 + // Implies that TextureCaps for GL_BGRA8 exist + bool textureFormatBGRA8888 = false; + + // GL_EXT_read_format_bgra + bool readFormatBGRA = false; + + // GL_NV_pixel_buffer_object + bool pixelBufferObjectNV = false; + + // GL_ARB_sync + bool glSyncARB = false; + + // GL_OES_mapbuffer and GL_EXT_map_buffer_range + bool mapBufferOES = false; + bool mapBufferRange = false; + + // 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 = false; + + // 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 = false; + bool textureHalfFloatLinear = false; + + // 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 textureFloatOES = false; + bool textureFloatLinearOES = false; + + // 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 = false; + + // GL_EXT_texture_type_2_10_10_10_REV + bool textureFormat2101010REV = false; + + // 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 = false; + bool textureCompressionDXT3 = false; + bool textureCompressionDXT5 = false; + + // 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 = false; + + // GL_KHR_texture_compression_astc_ldr + bool textureCompressionASTCLDRKHR = false; + + // GL_KHR_texture_compression_astc_hdr + bool textureCompressionASTCHDRKHR = false; + + // GL_OES_texture_compression_astc + bool textureCompressionASTCOES = false; + + // GL_KHR_texture_compression_astc_sliced_3d + bool textureCompressionSliced3dASTCKHR = false; + + // GL_EXT_texture_compression_bptc + bool textureCompressionBPTC = false; + + // GL_EXT_texture_compression_rgtc + bool textureCompressionRGTC = false; + + // GL_OES_compressed_ETC1_RGB8_texture + // Implies that TextureCaps for GL_ETC1_RGB8_OES exist + bool compressedETC1RGB8TextureOES = false; + + // GL_EXT_compressed_ETC1_RGB8_sub_texture + bool compressedETC1RGB8SubTexture = false; + + // OES_compressed_ETC2_RGB8_texture + bool compressedETC2RGB8TextureOES = false; + + // OES_compressed_ETC2_sRGB8_texture + bool compressedETC2sRGB8TextureOES = false; + + // OES_compressed_ETC2_punchthroughA_RGBA8_texture + bool compressedETC2PunchthroughARGB8TextureOES = false; + + // OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture + bool compressedETC2PunchthroughAsRGB8AlphaTextureOES = false; + + // OES_compressed_ETC2_RGBA8_texture + bool compressedETC2RGBA8TextureOES = false; + + // OES_compressed_ETC2_sRGB8_alpha8_texture + bool compressedETC2sRGB8Alpha8TextureOES = false; + + // OES_compressed_EAC_R11_unsigned_texture + bool compressedEACR11UnsignedTextureOES = false; + + // OES_compressed_EAC_R11_signed_texture + bool compressedEACR11SignedTextureOES = false; + + // OES_compressed_EAC_RG11_unsigned_texture + bool compressedEACRG11UnsignedTextureOES = false; + + // OES_compressed_EAC_RG11_signed_texture + bool compressedEACRG11SignedTextureOES = false; + + // ANGLE_compressed_texture_etc + // ONLY exposed if ETC texture formats are natively supported without decompression + // Backends should enable this extension explicitly. It is not enabled with + // setTextureExtensionSupport, use DetermineCompressedTextureETCSupport to check if all of the + // individual formats required to support this extension are available. + bool compressedTextureETC = false; + + // GL_IMG_texture_compression_pvrtc + bool compressedTexturePVRTC = false; + + // GL_EXT_pvrtc_sRGB + bool compressedTexturePVRTCsRGB = false; + + // GL_EXT_sRGB + // Implies that TextureCaps for GL_SRGB8_ALPHA8 and GL_SRGB8 exist + // TODO: Don't advertise this extension in ES3 + bool sRGB = false; + + // GL_EXT_texture_sRGB_R8 + bool sRGBR8EXT = false; + + // GL_ANGLE_depth_texture + bool depthTextureANGLE = false; + + // OES_depth_texture + bool depthTextureOES = false; + + // GL_OES_depth_texture_cube_map + bool depthTextureCubeMapOES = false; + + // GL_OES_depth24 + // Allows DEPTH_COMPONENT24_OES as a valid Renderbuffer format. + bool depth24OES = false; + + // GL_OES_depth32 + // Allows DEPTH_COMPONENT32_OES as a valid Renderbuffer format. + bool depth32OES = false; + + // GL_OES_texture_3D + bool texture3DOES = false; + + // GL_EXT_texture_storage + bool textureStorage = false; + + // GL_OES_texture_npot + bool textureNPOTOES = false; + + // GL_EXT_draw_buffers + bool drawBuffers = false; + + // GL_EXT_draw_buffers_indexed + bool drawBuffersIndexedEXT = false; + + // GL_OES_draw_buffers_indexed + bool drawBuffersIndexedOES = false; + + // Any version of the draw_buffers_indexed + bool drawBuffersIndexedAny() const { return (drawBuffersIndexedEXT || drawBuffersIndexedOES); } + + // GL_EXT_texture_filter_anisotropic + bool textureFilterAnisotropic = false; + GLfloat maxTextureAnisotropy = 0.0f; + + // GL_EXT_occlusion_query_boolean + bool occlusionQueryBoolean = false; + + // GL_NV_fence + bool fenceNV = false; + + // GL_EXT_disjoint_timer_query + bool disjointTimerQuery = false; + GLuint queryCounterBitsTimeElapsed = 0; + GLuint queryCounterBitsTimestamp = 0; + + // GL_EXT_robustness + bool robustness = false; + + // GL_KHR_robust_buffer_access_behavior + bool robustBufferAccessBehavior = false; + + // GL_EXT_blend_minmax + bool blendMinMax = false; + + // GL_ANGLE_framebuffer_blit + bool framebufferBlitANGLE = false; + // GL_NV_framebuffer_blit + bool framebufferBlitNV = false; + // Any version of the framebuffer_blit extension + bool framebufferBlitAny() const { return (framebufferBlitANGLE || framebufferBlitNV); } + + // GL_ANGLE_framebuffer_multisample + bool framebufferMultisample = false; + + // GL_EXT_multisampled_render_to_texture + bool multisampledRenderToTexture = false; + + // GL_EXT_multisampled_render_to_texture2 + bool multisampledRenderToTexture2 = false; + + // GL_ANGLE_instanced_arrays + bool instancedArraysANGLE = false; + // GL_EXT_instanced_arrays + bool instancedArraysEXT = false; + // Any version of the instanced arrays extension + bool instancedArraysAny() const { return (instancedArraysANGLE || instancedArraysEXT); } + + // GL_ANGLE_pack_reverse_row_order + bool packReverseRowOrder = false; + + // GL_OES_standard_derivatives + bool standardDerivativesOES = false; + + // GL_EXT_shader_texture_lod + bool shaderTextureLOD = false; + + // GL_EXT_shader_framebuffer_fetch_non_coherent + bool shaderFramebufferFetchNonCoherentEXT = false; + + // GL_EXT_frag_depth + bool fragDepth = false; + + // OVR_multiview + bool multiview = false; + GLuint maxViews = 1; + + // OVR_multiview2 + bool multiview2 = false; + + // GL_ANGLE_texture_usage + bool textureUsage = false; + + // GL_ANGLE_translated_shader_source + bool translatedShaderSource = false; + + // GL_OES_fbo_render_mipmap + bool fboRenderMipmapOES = false; + + // GL_EXT_discard_framebuffer + bool discardFramebuffer = false; + + // EXT_debug_marker + bool debugMarker = false; + + // EXT_debug_label + bool debugLabel = false; + + // GL_OES_EGL_image + bool eglImageOES = false; + + // GL_OES_EGL_image_external + bool eglImageExternalOES = false; + + // GL_OES_EGL_image_external_essl3 + bool eglImageExternalEssl3OES = false; + + // GL_EXT_EGL_image_external_wrap_modes + bool eglImageExternalWrapModesEXT = false; + + // GL_OES_EGL_sync + bool eglSyncOES = false; + + // GL_EXT_memory_object + bool memoryObject = false; + + // GL_EXT_memory_object_fd + bool memoryObjectFd = false; + + // GL_ANGLE_memory_object_flags + bool memoryObjectFlagsANGLE = false; + + // GL_ANGLE_memory_object_fuchsia + bool memoryObjectFuchsiaANGLE = false; + + // GL_EXT_semaphore + bool semaphore = false; + + // GL_EXT_semaphore_fd + bool semaphoreFd = false; + + // GL_ANGLE_semaphore_fuchsia + bool semaphoreFuchsiaANGLE = false; + + // NV_EGL_stream_consumer_external + bool eglStreamConsumerExternalNV = false; + + // EXT_unpack_subimage + bool unpackSubimage = false; + + // NV_pack_subimage + bool packSubimage = false; + + // GL_NV_shader_noperspective_interpolation + bool noperspectiveInterpolationNV = false; + + // GL_OES_vertex_half_float + bool vertexHalfFloatOES = false; + + // GL_OES_vertex_array_object + bool vertexArrayObjectOES = false; + + // GL_OES_vertex_type_10_10_10_2 + bool vertexAttribType1010102OES = false; + + // GL_KHR_debug + bool debug = false; + GLuint maxDebugMessageLength = 0; + GLuint maxDebugLoggedMessages = 0; + GLuint maxDebugGroupStackDepth = 0; + GLuint maxLabelLength = 0; + + // KHR_no_error + bool noError = false; + + // GL_ANGLE_lossy_etc_decode + bool lossyETCDecode = false; + + // GL_CHROMIUM_bind_uniform_location + bool bindUniformLocation = false; + + // GL_CHROMIUM_sync_query + bool syncQuery = false; + + // GL_CHROMIUM_copy_texture + bool copyTexture = false; + + // GL_CHROMIUM_copy_compressed_texture + bool copyCompressedTexture = false; + + // GL_ANGLE_copy_texture_3d + bool copyTexture3d = false; + + // GL_ANGLE_webgl_compatibility + bool webglCompatibility = false; + + // GL_ANGLE_request_extension + bool requestExtension = false; + + // GL_CHROMIUM_bind_generates_resource + bool bindGeneratesResource = false; + + // GL_ANGLE_robust_client_memory + bool robustClientMemory = false; + + // GL_OES_texture_border_clamp + bool textureBorderClampOES = false; + + // GL_EXT_texture_border_clamp + bool textureBorderClampEXT = false; + + // Any version of the texture border clamp extension + bool textureBorderClampAny() const { return (textureBorderClampOES || textureBorderClampEXT); } + + // GL_EXT_texture_sRGB_decode + bool textureSRGBDecode = false; + + // GL_EXT_texture_format_sRGB_override + bool textureSRGBOverride = false; + + // GL_EXT_sRGB_write_control + bool sRGBWriteControl = false; + + // GL_CHROMIUM_color_buffer_float_rgb + bool colorBufferFloatRGB = false; + + // GL_CHROMIUM_color_buffer_float_rgba + bool colorBufferFloatRGBA = false; + + // GL_EXT_EGL_image_array + bool eglImageArray = false; + + // ES3 Extension support + + // GL_EXT_color_buffer_float + bool colorBufferFloat = false; + + // GL_EXT_multisample_compatibility. + // written against ES 3.1 but can apply to earlier versions. + bool multisampleCompatibility = false; + + // GL_CHROMIUM_framebuffer_mixed_samples + bool framebufferMixedSamples = false; + + // GL_EXT_texture_norm16 + // written against ES 3.1 but can apply to ES 3.0 as well. + bool textureNorm16 = false; + + // GL_OES_surfaceless_context + bool surfacelessContextOES = false; + + // GL_ANGLE_client_arrays + bool clientArrays = false; + + // GL_ANGLE_robust_resource_initialization + bool robustResourceInitialization = false; + + // GL_ANGLE_program_cache_control + bool programCacheControl = false; + + // GL_ANGLE_texture_rectangle + bool textureRectangle = false; + + // GL_EXT_geometry_shader + bool geometryShader = false; + + // GLES1 emulation: GLES1 extensions + // GL_OES_point_size_array + bool pointSizeArrayOES = false; + + // GL_OES_texture_cube_map + bool textureCubeMapOES = false; + + // GL_OES_point_sprite + bool pointSpriteOES = false; + + // GL_OES_draw_texture + bool drawTextureOES = false; + + // GL_OES_framebuffer_object + bool framebufferObjectOES = false; + + // EGL_ANGLE_explicit_context GL subextensions + // GL_ANGLE_explicit_context_gles1 + bool explicitContextGles1 = false; + // GL_ANGLE_explicit_context + bool explicitContext = false; + + // GL_KHR_parallel_shader_compile + bool parallelShaderCompile = false; + + // GL_EXT_separate_shader_objects + bool separateShaderObjects = false; + + // GL_OES_texture_storage_multisample_2d_array + bool textureStorageMultisample2DArrayOES = false; + + // GL_ANGLE_multiview_multisample + bool multiviewMultisample = false; + + // GL_KHR_blend_equation_advanced + bool blendEquationAdvancedKHR = false; + + // GL_EXT_blend_func_extended + bool blendFuncExtended = false; + GLuint maxDualSourceDrawBuffers = 0; + + // GL_EXT_float_blend + bool floatBlend = false; + + // GL_ANGLE_memory_size + bool memorySize = false; + + // GL_ANGLE_texture_multisample + bool textureMultisample = false; + + // GL_ANGLE_multi_draw + bool multiDraw = false; + + // GL_ANGLE_provoking_vertex + bool provokingVertex = false; + + // GL_CHROMIUM_texture_filtering_hint + bool textureFilteringCHROMIUM = false; + + // GL_CHROMIUM_lose_context + bool loseContextCHROMIUM = false; + + // GL_ANGLE_texture_external_update + bool textureExternalUpdateANGLE = false; + + // GL_ANGLE_base_vertex_base_instance + bool baseVertexBaseInstance = false; + + // GL_ANGLE_get_image + bool getImageANGLE = false; + + // GL_OES_draw_elements_base_vertex + bool drawElementsBaseVertexOES = false; + // GL_EXT_draw_elements_base_vertex + bool drawElementsBaseVertexEXT = false; + // Any version of the base vertex extension + bool drawElementsBaseVertexAny() const + { + return (drawElementsBaseVertexOES || drawElementsBaseVertexEXT); + } + + // GL_EXT_shader_non_constant_global_initializers + bool shaderNonConstGlobalInitializersEXT = false; + + // GL_OES_shader_io_blocks + bool shaderIoBlocksOES = false; + // GL_EXT_shader_io_blocks + bool shaderIoBlocksEXT = false; + // Any version of shader io block extension + bool shaderIoBlocksAny() const { return (shaderIoBlocksOES || shaderIoBlocksEXT); } + + // GL_EXT_gpu_shader5 + bool gpuShader5EXT = false; + // WEBGL_video_texture + bool webglVideoTexture = false; + + // GL_APPLE_clip_distance + bool clipDistanceAPPLE = false; + + // GL_EXT_clip_control + bool clipControlEXT = false; + + // GL_OES_texture_cube_map_array + bool textureCubeMapArrayOES = false; + // GL_EXT_texture_cube_map_array + bool textureCubeMapArrayEXT = false; + // Any version of the texture cube map array extension + bool textureCubeMapArrayAny() const + { + return (textureCubeMapArrayOES || textureCubeMapArrayEXT); + } + + // GL_EXT_shadow_samplers + bool shadowSamplersEXT = false; + + // GL_EXT_buffer_storage + bool bufferStorageEXT = false; + + // GL_EXT_external_buffer + bool externalBufferEXT = false; + + // GL_OES_texture_stencil8 + bool stencilIndex8 = false; + + // GL_OES_sample_shading + bool sampleShadingOES = false; + + // OES_shader_multisample_interpolation + bool multisampleInterpolationOES = false; + + // GL_OES_shader_image_atomic + bool shaderImageAtomicOES = false; + + // GL_OES_sample_variables + bool sampleVariablesOES = false; + + // GL_NV_robustness_video_memory_purge + bool robustnessVideoMemoryPurgeNV = false; + + // GL_ANGLE_get_tex_level_parameter + bool getTexLevelParameterANGLE = false; + + // GL_EXT_tessellation_shader + bool tessellationShaderEXT = false; + + // GL_EXT_copy_image + bool copyImageEXT = false; + + // GL_OES_texture_buffer + bool textureBufferOES = false; + // GL_EXT_texture_buffer + bool textureBufferEXT = false; + // Any version of the texture buffer extension + bool textureBufferAny() const { return (textureBufferOES || textureBufferEXT); } + + // GL_EXT_YUV_target + bool yuvTargetEXT = false; + + // GL_EXT_clip_cull_distance + bool clipCullDistanceEXT = false; + + // GL_ANGLE_get_serialized_context_string + bool getSerializedContextStringANGLE = false; + + // GL_EXT_primitive_bounding_box + bool primitiveBoundingBoxEXT = false; +}; + +// Pointer to a boolean memeber of the Extensions struct +using ExtensionBool = bool Extensions::*; + +struct ExtensionInfo +{ + // If this extension can be enabled or disabled with glRequestExtension + // (GL_ANGLE_request_extension) + bool Requestable = false; + bool Disablable = false; + + // Pointer to a boolean member of the Extensions struct + ExtensionBool ExtensionsMember = nullptr; +}; + +using ExtensionInfoMap = std::map<std::string, ExtensionInfo>; +const ExtensionInfoMap &GetExtensionInfoMap(); + +struct Limitations +{ + Limitations(); + Limitations(const Limitations &other); + + Limitations &operator=(const Limitations &other); + + // Renderer doesn't support gl_FrontFacing in fragment shaders + bool noFrontFacingSupport = false; + + // Renderer doesn't support GL_SAMPLE_ALPHA_TO_COVERAGE + bool noSampleAlphaToCoverageSupport = false; + + // In glVertexAttribDivisorANGLE, attribute zero must have a zero divisor + bool attributeZeroRequiresZeroDivisorInEXT = false; + + // Unable to support different values for front and back faces for stencil refs and masks + bool noSeparateStencilRefsAndMasks = false; + + // Renderer doesn't support non-constant indexing loops in fragment shader + bool shadersRequireIndexedLoopValidation = false; + + // 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 = false; + + // D3D9 does not support flexible varying register packing. + bool noFlexibleVaryingPacking = false; + + // D3D does not support having multiple transform feedback outputs go to the same buffer. + bool noDoubleBoundTransformFeedbackBuffers = false; + + // D3D does not support vertex attribute aliasing + bool noVertexAttributeAliasing = false; + + // Renderer doesn't support GL_TEXTURE_COMPARE_MODE=GL_NONE on a shadow sampler. + // TODO(http://anglebug.com/5231): add validation code to front-end. + bool noShadowSamplerCompareModeNone = false; + + // PVRTC1 textures must be squares. + bool squarePvrtc1 = false; + + // ETC1 texture support is emulated. + bool emulatedEtc1 = false; +}; + +struct TypePrecision +{ + TypePrecision(); + TypePrecision(const TypePrecision &other); + + TypePrecision &operator=(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<GLint, 2> range = {0, 0}; + GLint precision = 0; +}; + +struct Caps +{ + Caps(); + Caps(const Caps &other); + Caps &operator=(const Caps &other); + + ~Caps(); + + // If the values could be got by using GetIntegeri_v, they should + // be GLint instead of GLuint and call LimitToInt() to ensure + // they will not overflow. + + GLfloat minInterpolationOffset = 0; + GLfloat maxInterpolationOffset = 0; + GLint subPixelInterpolationOffsetBits = 0; + + // ES 3.1 (April 29, 2015) 20.39: implementation dependent values + GLint64 maxElementIndex = 0; + GLint max3DTextureSize = 0; + GLint max2DTextureSize = 0; + GLint maxRectangleTextureSize = 0; + GLint maxArrayTextureLayers = 0; + GLfloat maxLODBias = 0.0f; + GLint maxCubeMapTextureSize = 0; + GLint maxRenderbufferSize = 0; + GLfloat minAliasedPointSize = 1.0f; + GLfloat maxAliasedPointSize = 1.0f; + GLfloat minAliasedLineWidth = 0.0f; + GLfloat maxAliasedLineWidth = 0.0f; + + // ES 3.1 (April 29, 2015) 20.40: implementation dependent values (cont.) + GLint maxDrawBuffers = 0; + GLint maxFramebufferWidth = 0; + GLint maxFramebufferHeight = 0; + GLint maxFramebufferSamples = 0; + GLint maxColorAttachments = 0; + GLint maxViewportWidth = 0; + GLint maxViewportHeight = 0; + GLint maxSampleMaskWords = 0; + GLint maxColorTextureSamples = 0; + GLint maxDepthTextureSamples = 0; + GLint maxIntegerSamples = 0; + GLint64 maxServerWaitTimeout = 0; + + // ES 3.1 (April 29, 2015) Table 20.41: Implementation dependent values (cont.) + GLint maxVertexAttribRelativeOffset = 0; + GLint maxVertexAttribBindings = 0; + GLint maxVertexAttribStride = 0; + GLint maxElementsIndices = 0; + GLint maxElementsVertices = 0; + std::vector<GLenum> compressedTextureFormats; + std::vector<GLenum> programBinaryFormats; + std::vector<GLenum> 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; + + // Implementation dependent limits required on all shader types. + // TODO(jiawei.shao@intel.com): organize all such limits into ShaderMap. + // ES 3.1 (April 29, 2015) Table 20.43: Implementation dependent Vertex shader limits + // ES 3.1 (April 29, 2015) Table 20.44: Implementation dependent Fragment shader limits + // ES 3.1 (April 29, 2015) Table 20.45: implementation dependent compute shader limits + // GL_EXT_geometry_shader (May 31, 2016) Table 20.43gs: Implementation dependent geometry shader + // limits + // GL_EXT_geometry_shader (May 31, 2016) Table 20.46: Implementation dependent aggregate shader + // limits + ShaderMap<GLint> maxShaderUniformBlocks = {}; + ShaderMap<GLint> maxShaderTextureImageUnits = {}; + ShaderMap<GLint> maxShaderStorageBlocks = {}; + ShaderMap<GLint> maxShaderUniformComponents = {}; + ShaderMap<GLint> maxShaderAtomicCounterBuffers = {}; + ShaderMap<GLint> maxShaderAtomicCounters = {}; + ShaderMap<GLint> maxShaderImageUniforms = {}; + // Note that we can query MAX_COMPUTE_UNIFORM_COMPONENTS and MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT + // by GetIntegerv, but we can only use GetInteger64v on MAX_VERTEX_UNIFORM_COMPONENTS and + // MAX_FRAGMENT_UNIFORM_COMPONENTS. Currently we use GLuint64 to store all these values so that + // we can put them together into one ShaderMap. + ShaderMap<GLint64> maxCombinedShaderUniformComponents = {}; + + // ES 3.1 (April 29, 2015) Table 20.43: Implementation dependent Vertex shader limits + GLint maxVertexAttributes = 0; + GLint maxVertexUniformVectors = 0; + GLint maxVertexOutputComponents = 0; + + // ES 3.1 (April 29, 2015) Table 20.44: Implementation dependent Fragment shader limits + GLint maxFragmentUniformVectors = 0; + GLint maxFragmentInputComponents = 0; + GLint minProgramTextureGatherOffset = 0; + GLint maxProgramTextureGatherOffset = 0; + GLint minProgramTexelOffset = 0; + GLint maxProgramTexelOffset = 0; + + // ES 3.1 (April 29, 2015) Table 20.45: implementation dependent compute shader limits + std::array<GLint, 3> maxComputeWorkGroupCount = {0, 0, 0}; + std::array<GLint, 3> maxComputeWorkGroupSize = {0, 0, 0}; + GLint maxComputeWorkGroupInvocations = 0; + GLint maxComputeSharedMemorySize = 0; + + // ES 3.1 (April 29, 2015) Table 20.46: implementation dependent aggregate shader limits + GLint maxUniformBufferBindings = 0; + GLint64 maxUniformBlockSize = 0; + GLint uniformBufferOffsetAlignment = 0; + GLint maxCombinedUniformBlocks = 0; + GLint maxVaryingComponents = 0; + GLint maxVaryingVectors = 0; + GLint maxCombinedTextureImageUnits = 0; + GLint maxCombinedShaderOutputResources = 0; + + // ES 3.1 (April 29, 2015) Table 20.47: implementation dependent aggregate shader limits (cont.) + GLint maxUniformLocations = 0; + GLint maxAtomicCounterBufferBindings = 0; + GLint maxAtomicCounterBufferSize = 0; + GLint maxCombinedAtomicCounterBuffers = 0; + GLint maxCombinedAtomicCounters = 0; + GLint maxImageUnits = 0; + GLint maxCombinedImageUniforms = 0; + GLint maxShaderStorageBufferBindings = 0; + GLint64 maxShaderStorageBlockSize = 0; + GLint maxCombinedShaderStorageBlocks = 0; + GLint shaderStorageBufferOffsetAlignment = 0; + + // ES 3.1 (April 29, 2015) Table 20.48: implementation dependent transform feedback limits + GLint maxTransformFeedbackInterleavedComponents = 0; + GLint maxTransformFeedbackSeparateAttributes = 0; + GLint maxTransformFeedbackSeparateComponents = 0; + + // ES 3.1 (April 29, 2015) Table 20.49: Framebuffer Dependent Values + GLint maxSamples = 0; + + // GL_EXT_geometry_shader (May 31, 2016) Table 20.40: Implementation-Dependent Values (cont.) + GLint maxFramebufferLayers = 0; + GLint layerProvokingVertex = 0; + + // GL_EXT_geometry_shader (May 31, 2016) Table 20.43gs: Implementation dependent geometry shader + // limits + GLint maxGeometryInputComponents = 0; + GLint maxGeometryOutputComponents = 0; + GLint maxGeometryOutputVertices = 0; + GLint maxGeometryTotalOutputComponents = 0; + GLint maxGeometryShaderInvocations = 0; + + // GL_EXT_tessellation_shader + GLint maxTessControlInputComponents = 0; + GLint maxTessControlOutputComponents = 0; + GLint maxTessControlTotalOutputComponents = 0; + + GLint maxTessPatchComponents = 0; + GLint maxPatchVertices = 0; + GLint maxTessGenLevel = 0; + + GLint maxTessEvaluationInputComponents = 0; + GLint maxTessEvaluationOutputComponents = 0; + + GLuint subPixelBits = 4; + + // GL_APPLE_clip_distance/GL_EXT_clip_cull_distance + GLuint maxClipDistances = 0; + GLuint maxCullDistances = 0; + GLuint maxCombinedClipAndCullDistances = 0; + + // GLES1 emulation: Caps for ES 1.1. Taken from Table 6.20 / 6.22 in the OpenGL ES 1.1 spec. + GLuint maxMultitextureUnits = 0; + GLuint maxClipPlanes = 0; + GLuint maxLights = 0; + static constexpr int GlobalMatrixStackDepth = 16; + GLuint maxModelviewMatrixStackDepth = 0; + GLuint maxProjectionMatrixStackDepth = 0; + GLuint maxTextureMatrixStackDepth = 0; + GLfloat minSmoothPointSize = 0.0f; + GLfloat maxSmoothPointSize = 0.0f; + GLfloat minSmoothLineWidth = 0.0f; + GLfloat maxSmoothLineWidth = 0.0f; + + // ES 3.2 Table 20.41: Implementation Dependent Values (cont.) + GLint maxTextureBufferSize = 0; + GLint textureBufferOffsetAlignment = 0; +}; + +Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions); +} // namespace gl + +namespace egl +{ + +struct Caps +{ + Caps(); + + // Support for NPOT surfaces + bool textureNPOT; + + // Support for Stencil8 configs + bool stencil8; +}; + +struct DisplayExtensions +{ + DisplayExtensions(); + + // Generate a vector of supported extension strings + std::vector<std::string> getStrings() const; + + // EGL_EXT_create_context_robustness + bool createContextRobustness = false; + + // EGL_ANGLE_d3d_share_handle_client_buffer + bool d3dShareHandleClientBuffer = false; + + // EGL_ANGLE_d3d_texture_client_buffer + bool d3dTextureClientBuffer = false; + + // EGL_ANGLE_surface_d3d_texture_2d_share_handle + bool surfaceD3DTexture2DShareHandle = false; + + // EGL_ANGLE_query_surface_pointer + bool querySurfacePointer = false; + + // EGL_ANGLE_window_fixed_size + bool windowFixedSize = false; + + // EGL_ANGLE_keyed_mutex + bool keyedMutex = false; + + // EGL_ANGLE_surface_orientation + bool surfaceOrientation = false; + + // EGL_NV_post_sub_buffer + bool postSubBuffer = false; + + // EGL_KHR_create_context + bool createContext = false; + + // EGL_KHR_image + bool image = false; + + // EGL_KHR_image_base + bool imageBase = false; + + // EGL_KHR_image_pixmap + bool imagePixmap = false; + + // EGL_KHR_gl_texture_2D_image + bool glTexture2DImage = false; + + // EGL_KHR_gl_texture_cubemap_image + bool glTextureCubemapImage = false; + + // EGL_KHR_gl_texture_3D_image + bool glTexture3DImage = false; + + // EGL_KHR_gl_renderbuffer_image + bool glRenderbufferImage = false; + + // EGL_KHR_get_all_proc_addresses + bool getAllProcAddresses = false; + + // EGL_ANGLE_flexible_surface_compatibility + bool flexibleSurfaceCompatibility = false; + + // EGL_ANGLE_direct_composition + bool directComposition = false; + + // EGL_ANGLE_windows_ui_composition + bool windowsUIComposition = false; + + // KHR_create_context_no_error + bool createContextNoError = false; + + // EGL_KHR_stream + bool stream = false; + + // EGL_KHR_stream_consumer_gltexture + bool streamConsumerGLTexture = false; + + // EGL_NV_stream_consumer_gltexture_yuv + bool streamConsumerGLTextureYUV = false; + + // EGL_ANGLE_stream_producer_d3d_texture + bool streamProducerD3DTexture = false; + + // EGL_KHR_fence_sync + bool fenceSync = false; + + // EGL_KHR_wait_sync + bool waitSync = false; + + // EGL_ANGLE_create_context_webgl_compatibility + bool createContextWebGLCompatibility = false; + + // EGL_CHROMIUM_create_context_bind_generates_resource + bool createContextBindGeneratesResource = false; + + // EGL_CHROMIUM_sync_control + bool syncControlCHROMIUM = false; + + // EGL_ANGLE_sync_control_rate + bool syncControlRateANGLE = false; + + // EGL_KHR_swap_buffers_with_damage + bool swapBuffersWithDamage = false; + + // EGL_EXT_pixel_format_float + bool pixelFormatFloat = false; + + // EGL_KHR_surfaceless_context + bool surfacelessContext = false; + + // EGL_ANGLE_display_texture_share_group + bool displayTextureShareGroup = false; + + // EGL_ANGLE_display_semaphore_share_group + bool displaySemaphoreShareGroup = false; + + // EGL_ANGLE_create_context_client_arrays + bool createContextClientArrays = false; + + // EGL_ANGLE_program_cache_control + bool programCacheControl = false; + + // EGL_ANGLE_robust_resource_initialization + bool robustResourceInitialization = false; + + // EGL_ANGLE_iosurface_client_buffer + bool iosurfaceClientBuffer = false; + + // EGL_ANGLE_metal_texture_client_buffer + bool mtlTextureClientBuffer = false; + + // EGL_ANGLE_create_context_extensions_enabled + bool createContextExtensionsEnabled = false; + + // EGL_ANDROID_presentation_time + bool presentationTime = false; + + // EGL_ANDROID_blob_cache + bool blobCache = false; + + // EGL_ANDROID_image_native_buffer + bool imageNativeBuffer = false; + + // EGL_ANDROID_get_frame_timestamps + bool getFrameTimestamps = false; + + // EGL_ANDROID_recordable + bool recordable = false; + + // EGL_ANGLE_power_preference + bool powerPreference = false; + + // EGL_ANGLE_image_d3d11_texture + bool imageD3D11Texture = false; + + // EGL_ANDROID_get_native_client_buffer + bool getNativeClientBufferANDROID = false; + + // EGL_ANDROID_create_native_client_buffer + bool createNativeClientBufferANDROID = false; + + // EGL_ANDROID_native_fence_sync + bool nativeFenceSyncANDROID = false; + + // EGL_ANGLE_create_context_backwards_compatible + bool createContextBackwardsCompatible = false; + + // EGL_KHR_no_config_context + bool noConfigContext = false; + + // EGL_IMG_context_priority + bool contextPriority = false; + + // EGL_ANGLE_ggp_stream_descriptor + bool ggpStreamDescriptor = false; + + // EGL_ANGLE_swap_with_frame_token + bool swapWithFrameToken = false; + + // EGL_KHR_gl_colorspace + bool glColorspace = false; + + // EGL_EXT_gl_colorspace_display_p3_linear + bool glColorspaceDisplayP3Linear = false; + + // EGL_EXT_gl_colorspace_display_p3 + bool glColorspaceDisplayP3 = false; + + // EGL_EXT_gl_colorspace_scrgb + bool glColorspaceScrgb = false; + + // EGL_EXT_gl_colorspace_scrgb_linear + bool glColorspaceScrgbLinear = false; + + // EGL_EXT_gl_colorspace_display_p3_passthrough + bool glColorspaceDisplayP3Passthrough = false; + + // EGL_ANDROID_framebuffer_target + bool framebufferTargetANDROID = false; + + // EGL_EXT_image_gl_colorspace + bool imageGlColorspace = false; + + // EGL_EXT_image_dma_buf_import + bool imageDmaBufImportEXT = false; + + // EGL_EXT_image_dma_buf_import_modifiers + bool imageDmaBufImportModifiersEXT = false; + + // EGL_NOK_texture_from_pixmap + bool textureFromPixmapNOK = false; + + // EGL_NV_robustness_video_memory_purge + bool robustnessVideoMemoryPurgeNV = false; + + // EGL_KHR_reusable_sync + bool reusableSyncKHR = false; + + // EGL_ANGLE_external_context_and_surface + bool externalContextAndSurface = false; + + // EGL_EXT_buffer_age + bool bufferAgeEXT = false; +}; + +struct DeviceExtensions +{ + DeviceExtensions(); + + // Generate a vector of supported extension strings + std::vector<std::string> getStrings() const; + + // EGL_ANGLE_device_d3d + bool deviceD3D = false; + + // EGL_ANGLE_device_cgl + bool deviceCGL = false; + + // EGL_ANGLE_device_eagl + bool deviceEAGL = false; + + // EGL_ANGLE_device_metal + bool deviceMetal = false; +}; + +struct ClientExtensions +{ + ClientExtensions(); + ClientExtensions(const ClientExtensions &other); + + // Generate a vector of supported extension strings + std::vector<std::string> getStrings() const; + + // EGL_EXT_client_extensions + bool clientExtensions = false; + + // EGL_EXT_platform_base + bool platformBase = false; + + // EGL_EXT_platform_device + bool platformDevice = false; + + // EGL_ANGLE_platform_angle + bool platformANGLE = false; + + // EGL_ANGLE_platform_angle_d3d + bool platformANGLED3D = false; + + // EGL_ANGLE_platform_angle_d3d11on12 + bool platformANGLED3D11ON12 = false; + + // EGL_ANGLE_platform_angle_opengl + bool platformANGLEOpenGL = false; + + // EGL_ANGLE_platform_angle_null + bool platformANGLENULL = false; + + // EGL_ANGLE_platform_angle_vulkan + bool platformANGLEVulkan = false; + + // EGL_ANGLE_platform_angle_metal + bool platformANGLEMetal = false; + + // EGL_ANGLE_platform_angle_context_virtualization + bool platformANGLEContextVirtualization = false; + + // EGL_ANGLE_platform_angle_device_context_volatile_eagl + bool platformANGLEDeviceContextVolatileEagl = false; + + // EGL_ANGLE_platform_angle_device_context_volatile_cgl + bool platformANGLEDeviceContextVolatileCgl = false; + + // EGL_ANGLE_device_creation + bool deviceCreation = false; + + // EGL_ANGLE_device_creation_d3d11 + bool deviceCreationD3D11 = false; + + // EGL_ANGLE_x11_visual + bool x11Visual = false; + + // EGL_ANGLE_experimental_present_path + bool experimentalPresentPath = false; + + // EGL_KHR_client_get_all_proc_addresses + bool clientGetAllProcAddresses = false; + + // EGL_KHR_debug + bool debug = false; + + // EGL_ANGLE_explicit_context + bool explicitContext = false; + + // EGL_ANGLE_feature_control + bool featureControlANGLE = false; + + // EGL_ANGLE_platform_angle_device_type_swiftshader + bool platformANGLEDeviceTypeSwiftShader = false; + + // EGL_ANGLE_platform_angle_device_type_egl_angle + bool platformANGLEDeviceTypeEGLANGLE = false; + + // EGL_EXT_device_query + bool deviceQueryEXT = false; +}; + +} // namespace egl + +#endif // LIBANGLE_CAPS_H_ |