Edit

kc3-lang/angle/src/libANGLE/format_map_desktop.cpp

Branch :

  • Show log

    Commit

  • Author : Clemen Deng
    Date : 2019-07-16 15:47:34
    Hash : f2412bca
    Message : Get rendering to texture working Other small fixes for desktop compatibility Bug: angleproject:3620 Change-Id: I8e75bce1f850fb891c8bb6e16f79302a6d59276c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1707932 Commit-Queue: Clemen Deng <clemendeng@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/format_map_desktop.cpp
  • // 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