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