blob: 27e91eb9e4bc65be2a48746085ecfb8fb120307a [file] [log] [blame]
//
// 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();
// 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
std::array<TextureCaps, angle::kNumANGLEFormats> 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);
// 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_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_EXT_texture_type_2_10_10_10_REV
bool textureFormat2101010REV = 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_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 framebufferBlit = false;
// GL_ANGLE_framebuffer_multisample
bool framebufferMultisample = false;
// GL_EXT_multisampled_render_to_texture
bool multisampledRenderToTexture = 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_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;
// 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_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_sRGB_decode
bool textureSRGBDecode = 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;
// 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;
// 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_OES_texture_storage_multisample_2d_array
bool textureStorageMultisample2DArrayOES = false;
// GL_ANGLE_multiview_multisample
bool multiviewMultisample = 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_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_EXT_gpu_shader5
bool gpuShader5EXT = false;
// WEBGL_video_texture
bool webglVideoTexture = false;
// GL_APPLE_clip_distance
bool clipDistanceAPPLE = 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();
// 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;
};
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<GLint, 2> range = {0, 0};
GLint precision = 0;
};
struct Caps
{
Caps();
Caps(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.
// 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;
GLuint subPixelBits = 4;
// GL_APPLE_clip_distance/GL_EXT_clip_cull_distance
GLuint maxClipDistances = 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;
};
Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensions);
} // namespace gl
namespace egl
{
struct Caps
{
Caps();
// Support for NPOT surfaces
bool textureNPOT;
};
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_EXT_device_query
bool deviceQuery = 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_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_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_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;
};
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;
};
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_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;
};
} // namespace egl
#endif // LIBANGLE_CAPS_H_