// Copyright 2019 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. // // format_map_desktop: // Determining the sized internal format from a (format,type) pair. // Also check DesktopGL format combinations for validity. #include "angle_gl.h" #include "common/debug.h" #include "formatutils.h" #include "renderer/gl/functionsgl_enums.h" // TODO(http://anglebug.com/3730): switch ANGLE to generate its own GL enum types from gl.xml namespace gl { bool ValidDesktopFormat(GLenum format) { switch (format) { case GL_STENCIL_INDEX: case GL_DEPTH_COMPONENT: case GL_DEPTH_STENCIL: case GL_RED: case GL_GREEN: case GL_BLUE: case GL_RG: case GL_RGB: case GL_RGBA: case GL_BGR: case GL_BGRA: case GL_RED_INTEGER: case GL_GREEN_INTEGER: case GL_BLUE_INTEGER: case GL_RG_INTEGER: case GL_RGB_INTEGER: case GL_RGBA_INTEGER: case GL_BGR_INTEGER: case GL_BGRA_INTEGER: return true; default: return false; } } bool ValidDesktopType(GLenum type) { switch (type) { case GL_UNSIGNED_BYTE: case GL_BYTE: case GL_UNSIGNED_SHORT: case GL_SHORT: case GL_UNSIGNED_INT: case GL_INT: case GL_HALF_FLOAT: case GL_FLOAT: case GL_UNSIGNED_BYTE_3_3_2: case GL_UNSIGNED_BYTE_2_3_3_REV: case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5_REV: case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4_REV: case GL_UNSIGNED_SHORT_5_5_5_1: case GL_UNSIGNED_SHORT_1_5_5_5_REV: case GL_UNSIGNED_INT_10_10_10_2: case GL_UNSIGNED_INT_2_10_10_10_REV: case GL_UNSIGNED_INT_24_8: case GL_UNSIGNED_INT_10F_11F_11F_REV: case GL_UNSIGNED_INT_5_9_9_9_REV: case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return true; default: return false; } } // From OpenGL 4.6 spec section 8.4 bool ValidDesktopFormatCombination(GLenum format, GLenum type, GLenum internalFormat) { ASSERT(ValidDesktopFormat(format) && ValidDesktopType(type)); const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type); const InternalFormat &formatInfo = GetInternalFormatInfo(format, type); switch (format) { case GL_RED_INTEGER: case GL_GREEN_INTEGER: case GL_BLUE_INTEGER: case GL_RG_INTEGER: case GL_RGB_INTEGER: case GL_RGBA_INTEGER: case GL_BGR_INTEGER: case GL_BGRA_INTEGER: switch (type) { case GL_HALF_FLOAT: case GL_FLOAT: case GL_UNSIGNED_INT_10F_11F_11F_REV: case GL_UNSIGNED_INT_5_9_9_9_REV: return false; default: break; } if (!internalFormatInfo.isInt()) return false; break; default: // format is not an integer if (internalFormatInfo.isInt()) return false; if (formatInfo.isDepthOrStencil() != internalFormatInfo.isDepthOrStencil()) return false; if (format == GL_STENCIL_INDEX && internalFormat != GL_STENCIL_INDEX) return false; break; } return true; } } // namespace gl