| // Copyright 2018 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. |
| // |
| // PackedGLEnums.cpp: |
| // Declares ANGLE-specific enums classes for GLEnum and functions operating |
| // on them. |
| |
| #include "common/PackedEnums.h" |
| |
| #include "common/utilities.h" |
| |
| namespace gl |
| { |
| |
| TextureType TextureTargetToType(TextureTarget target) |
| { |
| switch (target) |
| { |
| case TextureTarget::CubeMapNegativeX: |
| case TextureTarget::CubeMapNegativeY: |
| case TextureTarget::CubeMapNegativeZ: |
| case TextureTarget::CubeMapPositiveX: |
| case TextureTarget::CubeMapPositiveY: |
| case TextureTarget::CubeMapPositiveZ: |
| return TextureType::CubeMap; |
| case TextureTarget::CubeMapArray: |
| return TextureType::CubeMapArray; |
| case TextureTarget::External: |
| return TextureType::External; |
| case TextureTarget::Rectangle: |
| return TextureType::Rectangle; |
| case TextureTarget::_2D: |
| return TextureType::_2D; |
| case TextureTarget::_2DArray: |
| return TextureType::_2DArray; |
| case TextureTarget::_2DMultisample: |
| return TextureType::_2DMultisample; |
| case TextureTarget::_2DMultisampleArray: |
| return TextureType::_2DMultisampleArray; |
| case TextureTarget::_3D: |
| return TextureType::_3D; |
| case TextureTarget::VideoImage: |
| return TextureType::VideoImage; |
| case TextureTarget::Buffer: |
| return TextureType::Buffer; |
| case TextureTarget::InvalidEnum: |
| return TextureType::InvalidEnum; |
| default: |
| UNREACHABLE(); |
| return TextureType::InvalidEnum; |
| } |
| } |
| |
| bool IsCubeMapFaceTarget(TextureTarget target) |
| { |
| return TextureTargetToType(target) == TextureType::CubeMap; |
| } |
| |
| TextureTarget NonCubeTextureTypeToTarget(TextureType type) |
| { |
| switch (type) |
| { |
| case TextureType::External: |
| return TextureTarget::External; |
| case TextureType::Rectangle: |
| return TextureTarget::Rectangle; |
| case TextureType::_2D: |
| return TextureTarget::_2D; |
| case TextureType::_2DArray: |
| return TextureTarget::_2DArray; |
| case TextureType::_2DMultisample: |
| return TextureTarget::_2DMultisample; |
| case TextureType::_2DMultisampleArray: |
| return TextureTarget::_2DMultisampleArray; |
| case TextureType::_3D: |
| return TextureTarget::_3D; |
| case TextureType::CubeMapArray: |
| return TextureTarget::CubeMapArray; |
| case TextureType::VideoImage: |
| return TextureTarget::VideoImage; |
| case TextureType::Buffer: |
| return TextureTarget::Buffer; |
| default: |
| UNREACHABLE(); |
| return TextureTarget::InvalidEnum; |
| } |
| } |
| |
| // Check that we can do arithmetic on TextureTarget to convert from / to cube map faces |
| static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeX) - |
| static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == |
| 1u, |
| ""); |
| static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveY) - |
| static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == |
| 2u, |
| ""); |
| static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeY) - |
| static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == |
| 3u, |
| ""); |
| static_assert(static_cast<uint8_t>(TextureTarget::CubeMapPositiveZ) - |
| static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == |
| 4u, |
| ""); |
| static_assert(static_cast<uint8_t>(TextureTarget::CubeMapNegativeZ) - |
| static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) == |
| 5u, |
| ""); |
| |
| TextureTarget CubeFaceIndexToTextureTarget(size_t face) |
| { |
| ASSERT(face < 6u); |
| return static_cast<TextureTarget>(static_cast<uint8_t>(TextureTarget::CubeMapPositiveX) + face); |
| } |
| |
| size_t CubeMapTextureTargetToFaceIndex(TextureTarget target) |
| { |
| ASSERT(IsCubeMapFaceTarget(target)); |
| return static_cast<uint8_t>(target) - static_cast<uint8_t>(TextureTarget::CubeMapPositiveX); |
| } |
| |
| TextureType SamplerTypeToTextureType(GLenum samplerType) |
| { |
| switch (samplerType) |
| { |
| case GL_SAMPLER_2D: |
| case GL_INT_SAMPLER_2D: |
| case GL_UNSIGNED_INT_SAMPLER_2D: |
| case GL_SAMPLER_2D_SHADOW: |
| return TextureType::_2D; |
| |
| case GL_SAMPLER_EXTERNAL_OES: |
| case GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT: |
| return TextureType::External; |
| |
| case GL_SAMPLER_CUBE: |
| case GL_INT_SAMPLER_CUBE: |
| case GL_UNSIGNED_INT_SAMPLER_CUBE: |
| case GL_SAMPLER_CUBE_SHADOW: |
| return TextureType::CubeMap; |
| |
| case GL_SAMPLER_CUBE_MAP_ARRAY: |
| case GL_INT_SAMPLER_CUBE_MAP_ARRAY: |
| case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: |
| case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: |
| return TextureType::CubeMapArray; |
| |
| case GL_SAMPLER_2D_ARRAY: |
| case GL_INT_SAMPLER_2D_ARRAY: |
| case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: |
| case GL_SAMPLER_2D_ARRAY_SHADOW: |
| return TextureType::_2DArray; |
| |
| case GL_SAMPLER_3D: |
| case GL_INT_SAMPLER_3D: |
| case GL_UNSIGNED_INT_SAMPLER_3D: |
| return TextureType::_3D; |
| |
| case GL_SAMPLER_2D_MULTISAMPLE: |
| case GL_INT_SAMPLER_2D_MULTISAMPLE: |
| case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: |
| return TextureType::_2DMultisample; |
| |
| case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: |
| case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: |
| case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: |
| return TextureType::_2DMultisampleArray; |
| |
| case GL_SAMPLER_BUFFER: |
| case GL_INT_SAMPLER_BUFFER: |
| case GL_UNSIGNED_INT_SAMPLER_BUFFER: |
| return TextureType::Buffer; |
| |
| case GL_SAMPLER_2D_RECT_ANGLE: |
| return TextureType::Rectangle; |
| |
| case GL_SAMPLER_VIDEO_IMAGE_WEBGL: |
| return TextureType::VideoImage; |
| |
| default: |
| UNREACHABLE(); |
| return TextureType::InvalidEnum; |
| } |
| } |
| |
| TextureType ImageTypeToTextureType(GLenum imageType) |
| { |
| switch (imageType) |
| { |
| case GL_IMAGE_2D: |
| case GL_INT_IMAGE_2D: |
| case GL_UNSIGNED_INT_IMAGE_2D: |
| return TextureType::_2D; |
| |
| case GL_IMAGE_CUBE: |
| case GL_INT_IMAGE_CUBE: |
| case GL_UNSIGNED_INT_IMAGE_CUBE: |
| return TextureType::CubeMap; |
| |
| case GL_IMAGE_CUBE_MAP_ARRAY: |
| case GL_INT_IMAGE_CUBE_MAP_ARRAY: |
| case GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY: |
| return TextureType::CubeMapArray; |
| |
| case GL_IMAGE_2D_ARRAY: |
| case GL_INT_IMAGE_2D_ARRAY: |
| case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: |
| return TextureType::_2DArray; |
| |
| case GL_IMAGE_3D: |
| case GL_INT_IMAGE_3D: |
| case GL_UNSIGNED_INT_IMAGE_3D: |
| return TextureType::_3D; |
| |
| case GL_IMAGE_BUFFER: |
| case GL_INT_IMAGE_BUFFER: |
| case GL_UNSIGNED_INT_IMAGE_BUFFER: |
| return TextureType::Buffer; |
| |
| default: |
| UNREACHABLE(); |
| return TextureType::InvalidEnum; |
| } |
| } |
| |
| bool IsMultisampled(TextureType type) |
| { |
| switch (type) |
| { |
| case TextureType::_2DMultisample: |
| case TextureType::_2DMultisampleArray: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool IsArrayTextureType(TextureType type) |
| { |
| switch (type) |
| { |
| case TextureType::_2DArray: |
| case TextureType::_2DMultisampleArray: |
| case TextureType::CubeMapArray: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool IsStaticBufferUsage(BufferUsage useage) |
| { |
| switch (useage) |
| { |
| case BufferUsage::StaticCopy: |
| case BufferUsage::StaticDraw: |
| case BufferUsage::StaticRead: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| std::ostream &operator<<(std::ostream &os, PrimitiveMode value) |
| { |
| switch (value) |
| { |
| case PrimitiveMode::LineLoop: |
| os << "GL_LINE_LOOP"; |
| break; |
| case PrimitiveMode::Lines: |
| os << "GL_LINES"; |
| break; |
| case PrimitiveMode::LinesAdjacency: |
| os << "GL_LINES_ADJACENCY"; |
| break; |
| case PrimitiveMode::LineStrip: |
| os << "GL_LINE_STRIP"; |
| break; |
| case PrimitiveMode::LineStripAdjacency: |
| os << "GL_LINE_STRIP_ADJANCENCY"; |
| break; |
| case PrimitiveMode::Patches: |
| os << "GL_PATCHES"; |
| break; |
| case PrimitiveMode::Points: |
| os << "GL_POINTS"; |
| break; |
| case PrimitiveMode::TriangleFan: |
| os << "GL_TRIANGLE_FAN"; |
| break; |
| case PrimitiveMode::Triangles: |
| os << "GL_TRIANGLES"; |
| break; |
| case PrimitiveMode::TrianglesAdjacency: |
| os << "GL_TRIANGLES_ADJANCENCY"; |
| break; |
| case PrimitiveMode::TriangleStrip: |
| os << "GL_TRIANGLE_STRIP"; |
| break; |
| case PrimitiveMode::TriangleStripAdjacency: |
| os << "GL_TRIANGLE_STRIP_ADJACENCY"; |
| break; |
| default: |
| os << "GL_INVALID_ENUM"; |
| break; |
| } |
| return os; |
| } |
| |
| std::ostream &operator<<(std::ostream &os, DrawElementsType value) |
| { |
| switch (value) |
| { |
| case DrawElementsType::UnsignedByte: |
| os << "GL_UNSIGNED_BYTE"; |
| break; |
| case DrawElementsType::UnsignedShort: |
| os << "GL_UNSIGNED_SHORT"; |
| break; |
| case DrawElementsType::UnsignedInt: |
| os << "GL_UNSIGNED_INT"; |
| break; |
| default: |
| os << "GL_INVALID_ENUM"; |
| break; |
| } |
| |
| return os; |
| } |
| |
| std::ostream &operator<<(std::ostream &os, BlendEquationType value) |
| { |
| switch (value) |
| { |
| case BlendEquationType::Add: |
| os << "GL_FUNC_ADD"; |
| break; |
| case BlendEquationType::Min: |
| os << "GL_MIN"; |
| break; |
| case BlendEquationType::Max: |
| os << "GL_MAX"; |
| break; |
| case BlendEquationType::Subtract: |
| os << "GL_FUNC_SUBTRACT"; |
| break; |
| case BlendEquationType::ReverseSubtract: |
| os << "GL_FUNC_REVERSE_SUBTRACT"; |
| break; |
| case BlendEquationType::Multiply: |
| os << "GL_MULTIPLY_KHR"; |
| break; |
| case BlendEquationType::Screen: |
| os << "GL_SCREEN_KHR"; |
| break; |
| case BlendEquationType::Overlay: |
| os << "GL_OVERLAY_KHR"; |
| break; |
| case BlendEquationType::Darken: |
| os << "GL_DARKEN_KHR"; |
| break; |
| case BlendEquationType::Lighten: |
| os << "GL_LIGHTEN_KHR"; |
| break; |
| case BlendEquationType::Colordodge: |
| os << "GL_COLORDODGE_KHR"; |
| break; |
| case BlendEquationType::Colorburn: |
| os << "GL_COLORBURN_KHR"; |
| break; |
| case BlendEquationType::Hardlight: |
| os << "GL_HARDLIGHT_KHR"; |
| break; |
| case BlendEquationType::Softlight: |
| os << "GL_SOFTLIGHT_KHR"; |
| break; |
| case BlendEquationType::Difference: |
| os << "GL_DIFFERENCE_KHR"; |
| break; |
| case BlendEquationType::Exclusion: |
| os << "GL_EXCLUSION_KHR"; |
| break; |
| case BlendEquationType::HslHue: |
| os << "GL_HSL_HUE_KHR"; |
| break; |
| case BlendEquationType::HslSaturation: |
| os << "GL_HSL_SATURATION_KHR"; |
| break; |
| case BlendEquationType::HslColor: |
| os << "GL_HSL_COLOR_KHR"; |
| break; |
| case BlendEquationType::HslLuminosity: |
| os << "GL_HSL_LUMINOSITY_KHR"; |
| break; |
| default: |
| os << "GL_INVALID_ENUM"; |
| break; |
| } |
| |
| return os; |
| } |
| |
| std::ostream &operator<<(std::ostream &os, BlendFactorType value) |
| { |
| switch (value) |
| { |
| case BlendFactorType::Zero: |
| os << "GL_ZERO"; |
| break; |
| case BlendFactorType::One: |
| os << "GL_ONE"; |
| break; |
| case BlendFactorType::SrcColor: |
| os << "GL_SRC_COLOR"; |
| break; |
| case BlendFactorType::OneMinusSrcColor: |
| os << "GL_ONE_MINUS_SRC_COLOR"; |
| break; |
| case BlendFactorType::SrcAlpha: |
| os << "GL_SRC_ALPHA"; |
| break; |
| case BlendFactorType::OneMinusSrcAlpha: |
| os << "GL_ONE_MINUS_SRC_ALPHA"; |
| break; |
| case BlendFactorType::DstAlpha: |
| os << "GL_DST_ALPHA"; |
| break; |
| case BlendFactorType::OneMinusDstAlpha: |
| os << "GL_ONE_MINUS_DST_ALPHA"; |
| break; |
| case BlendFactorType::DstColor: |
| os << "GL_DST_COLOR"; |
| break; |
| case BlendFactorType::OneMinusDstColor: |
| os << "GL_ONE_MINUS_DST_COLOR"; |
| break; |
| case BlendFactorType::SrcAlphaSaturate: |
| os << "GL_SRC_ALPHA_SATURATE"; |
| break; |
| case BlendFactorType::ConstantColor: |
| os << "GL_CONSTANT_COLOR"; |
| break; |
| case BlendFactorType::OneMinusConstantColor: |
| os << "GL_ONE_MINUS_CONSTANT_COLOR"; |
| break; |
| case BlendFactorType::ConstantAlpha: |
| os << "GL_CONSTANT_ALPHA"; |
| break; |
| case BlendFactorType::OneMinusConstantAlpha: |
| os << "GL_ONE_MINUS_CONSTANT_ALPHA"; |
| break; |
| case BlendFactorType::Src1Alpha: |
| os << "GL_SRC1_ALPHA_EXT"; |
| break; |
| case BlendFactorType::Src1Color: |
| os << "GL_SRC1_COLOR_EXT"; |
| break; |
| case BlendFactorType::OneMinusSrc1Color: |
| os << "GL_ONE_MINUS_SRC1_COLOR_EXT"; |
| break; |
| case BlendFactorType::OneMinusSrc1Alpha: |
| os << "GL_ONE_MINUS_SRC1_ALPHA_EXT"; |
| break; |
| default: |
| os << "GL_INVALID_ENUM"; |
| break; |
| } |
| |
| return os; |
| } |
| |
| std::ostream &operator<<(std::ostream &os, VertexAttribType value) |
| { |
| switch (value) |
| { |
| case VertexAttribType::Byte: |
| os << "GL_BYTE"; |
| break; |
| case VertexAttribType::Fixed: |
| os << "GL_FIXED"; |
| break; |
| case VertexAttribType::Float: |
| os << "GL_FLOAT"; |
| break; |
| case VertexAttribType::HalfFloat: |
| os << "GL_HALF_FLOAT"; |
| break; |
| case VertexAttribType::HalfFloatOES: |
| os << "GL_HALF_FLOAT_OES"; |
| break; |
| case VertexAttribType::Int: |
| os << "GL_INT"; |
| break; |
| case VertexAttribType::Int2101010: |
| os << "GL_INT_2_10_10_10_REV"; |
| break; |
| case VertexAttribType::Int1010102: |
| os << "GL_INT_10_10_10_2_OES"; |
| break; |
| case VertexAttribType::Short: |
| os << "GL_SHORT"; |
| break; |
| case VertexAttribType::UnsignedByte: |
| os << "GL_UNSIGNED_BYTE"; |
| break; |
| case VertexAttribType::UnsignedInt: |
| os << "GL_UNSIGNED_INT"; |
| break; |
| case VertexAttribType::UnsignedInt2101010: |
| os << "GL_UNSIGNED_INT_2_10_10_10_REV"; |
| break; |
| case VertexAttribType::UnsignedInt1010102: |
| os << "GL_UNSIGNED_INT_10_10_10_2_OES"; |
| break; |
| case VertexAttribType::UnsignedShort: |
| os << "GL_UNSIGNED_SHORT"; |
| break; |
| default: |
| os << "GL_INVALID_ENUM"; |
| break; |
| } |
| return os; |
| } |
| |
| std::ostream &operator<<(std::ostream &os, TessEvaluationType value) |
| { |
| switch (value) |
| { |
| case TessEvaluationType::Triangles: |
| os << "GL_TRIANGLES"; |
| break; |
| case TessEvaluationType::Quads: |
| os << "GL_QUADS"; |
| break; |
| case TessEvaluationType::Isolines: |
| os << "GL_ISOLINES"; |
| break; |
| case TessEvaluationType::EqualSpacing: |
| os << "GL_EQUAL"; |
| break; |
| case TessEvaluationType::FractionalEvenSpacing: |
| os << "GL_FRACTIONAL_EVEN"; |
| break; |
| case TessEvaluationType::FractionalOddSpacing: |
| os << "GL_FRACTIONAL_ODD"; |
| break; |
| case TessEvaluationType::Cw: |
| os << "GL_CW"; |
| break; |
| case TessEvaluationType::Ccw: |
| os << "GL_CCW"; |
| break; |
| case TessEvaluationType::PointMode: |
| os << "GL_TESS_GEN_POINT_MODE"; |
| break; |
| default: |
| os << "GL_INVALID_ENUM"; |
| break; |
| } |
| return os; |
| } |
| |
| const char *ShaderTypeToString(ShaderType shaderType) |
| { |
| constexpr ShaderMap<const char *> kShaderTypeNameMap = { |
| {ShaderType::Vertex, "Vertex"}, |
| {ShaderType::TessControl, "Tessellation control"}, |
| {ShaderType::TessEvaluation, "Tessellation evaluation"}, |
| {ShaderType::Geometry, "Geometry"}, |
| {ShaderType::Fragment, "Fragment"}, |
| {ShaderType::Compute, "Compute"}}; |
| return kShaderTypeNameMap[shaderType]; |
| } |
| } // namespace gl |
| |
| namespace egl |
| { |
| MessageType ErrorCodeToMessageType(EGLint errorCode) |
| { |
| switch (errorCode) |
| { |
| case EGL_BAD_ALLOC: |
| case EGL_CONTEXT_LOST: |
| case EGL_NOT_INITIALIZED: |
| return MessageType::Critical; |
| |
| case EGL_BAD_ACCESS: |
| case EGL_BAD_ATTRIBUTE: |
| case EGL_BAD_CONFIG: |
| case EGL_BAD_CONTEXT: |
| case EGL_BAD_CURRENT_SURFACE: |
| case EGL_BAD_DISPLAY: |
| case EGL_BAD_MATCH: |
| case EGL_BAD_NATIVE_PIXMAP: |
| case EGL_BAD_NATIVE_WINDOW: |
| case EGL_BAD_PARAMETER: |
| case EGL_BAD_SURFACE: |
| case EGL_BAD_STREAM_KHR: |
| case EGL_BAD_STATE_KHR: |
| case EGL_BAD_DEVICE_EXT: |
| return MessageType::Error; |
| |
| case EGL_SUCCESS: |
| default: |
| UNREACHABLE(); |
| return MessageType::InvalidEnum; |
| } |
| } |
| } // namespace egl |
| |
| namespace egl_gl |
| { |
| |
| gl::TextureTarget EGLCubeMapTargetToCubeMapTarget(EGLenum eglTarget) |
| { |
| ASSERT(egl::IsCubeMapTextureTarget(eglTarget)); |
| return gl::CubeFaceIndexToTextureTarget(egl::CubeMapTextureTargetToLayerIndex(eglTarget)); |
| } |
| |
| gl::TextureTarget EGLImageTargetToTextureTarget(EGLenum eglTarget) |
| { |
| switch (eglTarget) |
| { |
| case EGL_GL_TEXTURE_2D_KHR: |
| return gl::TextureTarget::_2D; |
| |
| case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: |
| case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: |
| case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: |
| case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: |
| case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: |
| case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: |
| return EGLCubeMapTargetToCubeMapTarget(eglTarget); |
| |
| case EGL_GL_TEXTURE_3D_KHR: |
| return gl::TextureTarget::_3D; |
| |
| default: |
| UNREACHABLE(); |
| return gl::TextureTarget::InvalidEnum; |
| } |
| } |
| |
| gl::TextureType EGLTextureTargetToTextureType(EGLenum eglTarget) |
| { |
| switch (eglTarget) |
| { |
| case EGL_TEXTURE_2D: |
| return gl::TextureType::_2D; |
| |
| case EGL_TEXTURE_RECTANGLE_ANGLE: |
| return gl::TextureType::Rectangle; |
| |
| default: |
| UNREACHABLE(); |
| return gl::TextureType::InvalidEnum; |
| } |
| } |
| } // namespace egl_gl |