blob: 29041a14ac8e1b2e319229ce4da88c774439d5f1 [file] [log] [blame]
//
// 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 "libANGLE/Version.h"
#include <map>
#include <set>
#include <string>
#include <vector>
#include <array>
namespace gl
{
struct Extensions;
typedef std::set<GLuint> SupportedSampleSet;
struct TextureCaps
{
TextureCaps();
// Supports for basic texturing: glTexImage, glTexSubImage, etc
bool texturable;
// Support for linear or anisotropic filtering
bool filterable;
// Support for being used as a framebuffer attachment or renderbuffer format
bool renderable;
// 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
{
public:
typedef std::map<GLenum, TextureCaps>::const_iterator const_iterator;
void insert(GLenum internalFormat, const TextureCaps &caps);
void remove(GLenum internalFormat);
void clear();
const TextureCaps &get(GLenum internalFormat) const;
const_iterator begin() const;
const_iterator end() const;
size_t size() const;
private:
typedef std::map<GLenum, TextureCaps> InternalFormatToCapsMap;
InternalFormatToCapsMap mCapsMap;
};
TextureCapsMap GenerateMinimumTextureCapsMap(const Version &clientVersion,
const Extensions &extensions);
struct Extensions
{
Extensions();
// Generate a vector of supported extension strings
std::vector<std::string> getStrings() const;
// Set all texture related extension support based on the supported textures.
// Determines support for:
// GL_OES_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_ANGLE_timer_query
bool timerQuery;
// GL_EXT_disjoint_timer_query
bool disjointTimerQuery;
GLuint queryCounterBitsTimeElapsed;
GLuint queryCounterBitsTimestamp;
// GL_EXT_robustness
bool robustness;
// 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_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;
// 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;
};
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<std::string, ExtensionInfo>;
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();
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;
GLint precision;
};
struct Caps
{
Caps();
// ES 3.1 (April 29, 2015) 20.39: implementation dependent values
GLuint64 maxElementIndex;
GLuint max3DTextureSize;
GLuint max2DTextureSize;
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<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;
// 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<GLuint, 3> maxComputeWorkGroupCount;
std::array<GLuint, 3> 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);
}
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;
// 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_create_context_robust_resource_initialization
bool createContextRobustResourceInitialization;
};
struct DeviceExtensions
{
DeviceExtensions();
// Generate a vector of supported extension strings
std::vector<std::string> getStrings() const;
// EGL_ANGLE_device_d3d
bool deviceD3D;
};
struct ClientExtensions
{
ClientExtensions();
// Generate a vector of supported extension strings
std::vector<std::string> 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_