| // 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 |