blob: 89800aab25385b488f4b69cf717aa650b24db94d [file] [log] [blame]
// 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