Edit

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

Branch :

  • Show log

    Commit

  • Author : John Plate
    Date : 2021-06-16 10:20:32
    Hash : 1891af05
    Message : CL: Refactor TRY macro and fix more conformance bugs Bug: angleproject:6015 Change-Id: Id54be19822fec2ac5584ffe1d1cf5bb8f00c9094 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2967467 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: John Plate <jplate@google.com>

  • src/libANGLE/cl_utils.cpp
  • //
    // Copyright 2021 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.
    //
    // cl_utils.cpp: Helper functions for the CL front end
    
    #include "libANGLE/cl_utils.h"
    
    #include "libANGLE/renderer/CLExtensions.h"
    
    namespace cl
    {
    
    size_t GetChannelCount(cl_channel_order channelOrder)
    {
        size_t count = 0u;
        switch (channelOrder)
        {
            case CL_R:
            case CL_A:
            case CL_LUMINANCE:
            case CL_INTENSITY:
            case CL_DEPTH:
                count = 1u;
                break;
            case CL_RG:
            case CL_RA:
            case CL_Rx:
                count = 2u;
                break;
            case CL_RGB:
            case CL_RGx:
            case CL_sRGB:
                count = 3u;
                break;
            case CL_RGBA:
            case CL_ARGB:
            case CL_BGRA:
            case CL_ABGR:
            case CL_RGBx:
            case CL_sRGBA:
            case CL_sBGRA:
            case CL_sRGBx:
                count = 4u;
                break;
            default:
                break;
        }
        return count;
    }
    
    size_t GetElementSize(const cl_image_format &image_format)
    {
        size_t size = 0u;
        switch (image_format.image_channel_data_type)
        {
            case CL_SNORM_INT8:
            case CL_UNORM_INT8:
            case CL_SIGNED_INT8:
            case CL_UNSIGNED_INT8:
                size = GetChannelCount(image_format.image_channel_order);
                break;
            case CL_SNORM_INT16:
            case CL_UNORM_INT16:
            case CL_SIGNED_INT16:
            case CL_UNSIGNED_INT16:
            case CL_HALF_FLOAT:
                size = 2u * GetChannelCount(image_format.image_channel_order);
                break;
            case CL_SIGNED_INT32:
            case CL_UNSIGNED_INT32:
            case CL_FLOAT:
                size = 4u * GetChannelCount(image_format.image_channel_order);
                break;
            case CL_UNORM_SHORT_565:
            case CL_UNORM_SHORT_555:
                size = 2u;
                break;
            case CL_UNORM_INT_101010:
            case CL_UNORM_INT_101010_2:
                size = 4u;
                break;
            default:
                break;
        }
        return size;
    }
    
    bool IsValidImageFormat(const cl_image_format *imageFormat, const rx::CLExtensions &extensions)
    {
        if (imageFormat == nullptr)
        {
            return false;
        }
        switch (imageFormat->image_channel_order)
        {
            case CL_R:
            case CL_A:
            case CL_LUMINANCE:
            case CL_INTENSITY:
            case CL_RG:
            case CL_RA:
            case CL_RGB:
            case CL_RGBA:
            case CL_ARGB:
            case CL_BGRA:
                break;
    
            case CL_Rx:
            case CL_RGx:
            case CL_RGBx:
                if (extensions.version < CL_MAKE_VERSION(1, 1, 0))
                {
                    return false;
                }
                break;
    
            case CL_ABGR:
            case CL_sRGB:
            case CL_sRGBA:
            case CL_sBGRA:
            case CL_sRGBx:
                if (extensions.version < CL_MAKE_VERSION(2, 0, 0))
                {
                    return false;
                }
                break;
    
            case CL_DEPTH:
                // CL_DEPTH can only be used if channel data type = CL_UNORM_INT16 or CL_FLOAT.
                if (imageFormat->image_channel_data_type != CL_UNORM_INT16 &&
                    imageFormat->image_channel_data_type != CL_FLOAT)
                {
                    return false;
                }
                if (!extensions.khrDepthImages)
                {
                    return false;
                }
                break;
    
            default:
                return false;
        }
        switch (imageFormat->image_channel_data_type)
        {
            case CL_SNORM_INT8:
            case CL_SNORM_INT16:
            case CL_UNORM_INT8:
            case CL_UNORM_INT16:
            case CL_SIGNED_INT8:
            case CL_SIGNED_INT16:
            case CL_SIGNED_INT32:
            case CL_UNSIGNED_INT8:
            case CL_UNSIGNED_INT16:
            case CL_UNSIGNED_INT32:
            case CL_HALF_FLOAT:
            case CL_FLOAT:
                break;
    
            case CL_UNORM_SHORT_565:
            case CL_UNORM_SHORT_555:
            case CL_UNORM_INT_101010:
                if (imageFormat->image_channel_order != CL_RGB &&
                    imageFormat->image_channel_order != CL_RGBx)
                {
                    return false;
                }
                break;
    
            case CL_UNORM_INT_101010_2:
                if (extensions.version < CL_MAKE_VERSION(2, 1, 0) ||
                    imageFormat->image_channel_order != CL_RGBA)
                {
                    return false;
                }
                break;
    
            default:
                return false;
        }
        return true;
    }
    
    }  // namespace cl