1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker // cl_utils.cpp: Helper functions for the CL front end 7*8975f5c5SAndroid Build Coastguard Worker 8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h" 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedCLEnums_autogen.h" 11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLExtensions.h" 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker namespace cl 14*8975f5c5SAndroid Build Coastguard Worker { 15*8975f5c5SAndroid Build Coastguard Worker GetChannelCount(cl_channel_order channelOrder)16*8975f5c5SAndroid Build Coastguard Workersize_t GetChannelCount(cl_channel_order channelOrder) 17*8975f5c5SAndroid Build Coastguard Worker { 18*8975f5c5SAndroid Build Coastguard Worker size_t count = 0u; 19*8975f5c5SAndroid Build Coastguard Worker switch (channelOrder) 20*8975f5c5SAndroid Build Coastguard Worker { 21*8975f5c5SAndroid Build Coastguard Worker case CL_R: 22*8975f5c5SAndroid Build Coastguard Worker case CL_A: 23*8975f5c5SAndroid Build Coastguard Worker case CL_LUMINANCE: 24*8975f5c5SAndroid Build Coastguard Worker case CL_INTENSITY: 25*8975f5c5SAndroid Build Coastguard Worker case CL_DEPTH: 26*8975f5c5SAndroid Build Coastguard Worker count = 1u; 27*8975f5c5SAndroid Build Coastguard Worker break; 28*8975f5c5SAndroid Build Coastguard Worker case CL_RG: 29*8975f5c5SAndroid Build Coastguard Worker case CL_RA: 30*8975f5c5SAndroid Build Coastguard Worker case CL_Rx: 31*8975f5c5SAndroid Build Coastguard Worker count = 2u; 32*8975f5c5SAndroid Build Coastguard Worker break; 33*8975f5c5SAndroid Build Coastguard Worker case CL_RGB: 34*8975f5c5SAndroid Build Coastguard Worker case CL_RGx: 35*8975f5c5SAndroid Build Coastguard Worker case CL_sRGB: 36*8975f5c5SAndroid Build Coastguard Worker count = 3u; 37*8975f5c5SAndroid Build Coastguard Worker break; 38*8975f5c5SAndroid Build Coastguard Worker case CL_RGBA: 39*8975f5c5SAndroid Build Coastguard Worker case CL_ARGB: 40*8975f5c5SAndroid Build Coastguard Worker case CL_BGRA: 41*8975f5c5SAndroid Build Coastguard Worker case CL_ABGR: 42*8975f5c5SAndroid Build Coastguard Worker case CL_RGBx: 43*8975f5c5SAndroid Build Coastguard Worker case CL_sRGBA: 44*8975f5c5SAndroid Build Coastguard Worker case CL_sBGRA: 45*8975f5c5SAndroid Build Coastguard Worker case CL_sRGBx: 46*8975f5c5SAndroid Build Coastguard Worker count = 4u; 47*8975f5c5SAndroid Build Coastguard Worker break; 48*8975f5c5SAndroid Build Coastguard Worker default: 49*8975f5c5SAndroid Build Coastguard Worker break; 50*8975f5c5SAndroid Build Coastguard Worker } 51*8975f5c5SAndroid Build Coastguard Worker return count; 52*8975f5c5SAndroid Build Coastguard Worker } 53*8975f5c5SAndroid Build Coastguard Worker GetElementSize(const cl_image_format & image_format)54*8975f5c5SAndroid Build Coastguard Workersize_t GetElementSize(const cl_image_format &image_format) 55*8975f5c5SAndroid Build Coastguard Worker { 56*8975f5c5SAndroid Build Coastguard Worker size_t size = 0u; 57*8975f5c5SAndroid Build Coastguard Worker switch (image_format.image_channel_data_type) 58*8975f5c5SAndroid Build Coastguard Worker { 59*8975f5c5SAndroid Build Coastguard Worker case CL_SNORM_INT8: 60*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT8: 61*8975f5c5SAndroid Build Coastguard Worker case CL_SIGNED_INT8: 62*8975f5c5SAndroid Build Coastguard Worker case CL_UNSIGNED_INT8: 63*8975f5c5SAndroid Build Coastguard Worker size = GetChannelCount(image_format.image_channel_order); 64*8975f5c5SAndroid Build Coastguard Worker break; 65*8975f5c5SAndroid Build Coastguard Worker case CL_SNORM_INT16: 66*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT16: 67*8975f5c5SAndroid Build Coastguard Worker case CL_SIGNED_INT16: 68*8975f5c5SAndroid Build Coastguard Worker case CL_UNSIGNED_INT16: 69*8975f5c5SAndroid Build Coastguard Worker case CL_HALF_FLOAT: 70*8975f5c5SAndroid Build Coastguard Worker size = 2u * GetChannelCount(image_format.image_channel_order); 71*8975f5c5SAndroid Build Coastguard Worker break; 72*8975f5c5SAndroid Build Coastguard Worker case CL_SIGNED_INT32: 73*8975f5c5SAndroid Build Coastguard Worker case CL_UNSIGNED_INT32: 74*8975f5c5SAndroid Build Coastguard Worker case CL_FLOAT: 75*8975f5c5SAndroid Build Coastguard Worker size = 4u * GetChannelCount(image_format.image_channel_order); 76*8975f5c5SAndroid Build Coastguard Worker break; 77*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_SHORT_565: 78*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_SHORT_555: 79*8975f5c5SAndroid Build Coastguard Worker size = 2u; 80*8975f5c5SAndroid Build Coastguard Worker break; 81*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT_101010: 82*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT_101010_2: 83*8975f5c5SAndroid Build Coastguard Worker size = 4u; 84*8975f5c5SAndroid Build Coastguard Worker break; 85*8975f5c5SAndroid Build Coastguard Worker default: 86*8975f5c5SAndroid Build Coastguard Worker break; 87*8975f5c5SAndroid Build Coastguard Worker } 88*8975f5c5SAndroid Build Coastguard Worker return size; 89*8975f5c5SAndroid Build Coastguard Worker } 90*8975f5c5SAndroid Build Coastguard Worker IsValidImageFormat(const cl_image_format * imageFormat,const rx::CLExtensions & extensions)91*8975f5c5SAndroid Build Coastguard Workerbool IsValidImageFormat(const cl_image_format *imageFormat, const rx::CLExtensions &extensions) 92*8975f5c5SAndroid Build Coastguard Worker { 93*8975f5c5SAndroid Build Coastguard Worker if (imageFormat == nullptr) 94*8975f5c5SAndroid Build Coastguard Worker { 95*8975f5c5SAndroid Build Coastguard Worker return false; 96*8975f5c5SAndroid Build Coastguard Worker } 97*8975f5c5SAndroid Build Coastguard Worker switch (imageFormat->image_channel_order) 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker case CL_R: 100*8975f5c5SAndroid Build Coastguard Worker case CL_A: 101*8975f5c5SAndroid Build Coastguard Worker case CL_LUMINANCE: 102*8975f5c5SAndroid Build Coastguard Worker case CL_INTENSITY: 103*8975f5c5SAndroid Build Coastguard Worker case CL_RG: 104*8975f5c5SAndroid Build Coastguard Worker case CL_RA: 105*8975f5c5SAndroid Build Coastguard Worker case CL_RGB: 106*8975f5c5SAndroid Build Coastguard Worker case CL_RGBA: 107*8975f5c5SAndroid Build Coastguard Worker case CL_ARGB: 108*8975f5c5SAndroid Build Coastguard Worker case CL_BGRA: 109*8975f5c5SAndroid Build Coastguard Worker break; 110*8975f5c5SAndroid Build Coastguard Worker 111*8975f5c5SAndroid Build Coastguard Worker case CL_Rx: 112*8975f5c5SAndroid Build Coastguard Worker case CL_RGx: 113*8975f5c5SAndroid Build Coastguard Worker case CL_RGBx: 114*8975f5c5SAndroid Build Coastguard Worker if (extensions.version < CL_MAKE_VERSION(1, 1, 0)) 115*8975f5c5SAndroid Build Coastguard Worker { 116*8975f5c5SAndroid Build Coastguard Worker return false; 117*8975f5c5SAndroid Build Coastguard Worker } 118*8975f5c5SAndroid Build Coastguard Worker break; 119*8975f5c5SAndroid Build Coastguard Worker 120*8975f5c5SAndroid Build Coastguard Worker case CL_ABGR: 121*8975f5c5SAndroid Build Coastguard Worker case CL_sRGB: 122*8975f5c5SAndroid Build Coastguard Worker case CL_sRGBA: 123*8975f5c5SAndroid Build Coastguard Worker case CL_sBGRA: 124*8975f5c5SAndroid Build Coastguard Worker case CL_sRGBx: 125*8975f5c5SAndroid Build Coastguard Worker if (extensions.version < CL_MAKE_VERSION(2, 0, 0)) 126*8975f5c5SAndroid Build Coastguard Worker { 127*8975f5c5SAndroid Build Coastguard Worker return false; 128*8975f5c5SAndroid Build Coastguard Worker } 129*8975f5c5SAndroid Build Coastguard Worker break; 130*8975f5c5SAndroid Build Coastguard Worker 131*8975f5c5SAndroid Build Coastguard Worker case CL_DEPTH: 132*8975f5c5SAndroid Build Coastguard Worker // CL_DEPTH can only be used if channel data type = CL_UNORM_INT16 or CL_FLOAT. 133*8975f5c5SAndroid Build Coastguard Worker if (imageFormat->image_channel_data_type != CL_UNORM_INT16 && 134*8975f5c5SAndroid Build Coastguard Worker imageFormat->image_channel_data_type != CL_FLOAT) 135*8975f5c5SAndroid Build Coastguard Worker { 136*8975f5c5SAndroid Build Coastguard Worker return false; 137*8975f5c5SAndroid Build Coastguard Worker } 138*8975f5c5SAndroid Build Coastguard Worker if (!extensions.khrDepthImages) 139*8975f5c5SAndroid Build Coastguard Worker { 140*8975f5c5SAndroid Build Coastguard Worker return false; 141*8975f5c5SAndroid Build Coastguard Worker } 142*8975f5c5SAndroid Build Coastguard Worker break; 143*8975f5c5SAndroid Build Coastguard Worker 144*8975f5c5SAndroid Build Coastguard Worker default: 145*8975f5c5SAndroid Build Coastguard Worker return false; 146*8975f5c5SAndroid Build Coastguard Worker } 147*8975f5c5SAndroid Build Coastguard Worker switch (imageFormat->image_channel_data_type) 148*8975f5c5SAndroid Build Coastguard Worker { 149*8975f5c5SAndroid Build Coastguard Worker case CL_SNORM_INT8: 150*8975f5c5SAndroid Build Coastguard Worker case CL_SNORM_INT16: 151*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT8: 152*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT16: 153*8975f5c5SAndroid Build Coastguard Worker case CL_SIGNED_INT8: 154*8975f5c5SAndroid Build Coastguard Worker case CL_SIGNED_INT16: 155*8975f5c5SAndroid Build Coastguard Worker case CL_SIGNED_INT32: 156*8975f5c5SAndroid Build Coastguard Worker case CL_UNSIGNED_INT8: 157*8975f5c5SAndroid Build Coastguard Worker case CL_UNSIGNED_INT16: 158*8975f5c5SAndroid Build Coastguard Worker case CL_UNSIGNED_INT32: 159*8975f5c5SAndroid Build Coastguard Worker case CL_HALF_FLOAT: 160*8975f5c5SAndroid Build Coastguard Worker case CL_FLOAT: 161*8975f5c5SAndroid Build Coastguard Worker break; 162*8975f5c5SAndroid Build Coastguard Worker 163*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_SHORT_565: 164*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_SHORT_555: 165*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT_101010: 166*8975f5c5SAndroid Build Coastguard Worker if (imageFormat->image_channel_order != CL_RGB && 167*8975f5c5SAndroid Build Coastguard Worker imageFormat->image_channel_order != CL_RGBx) 168*8975f5c5SAndroid Build Coastguard Worker { 169*8975f5c5SAndroid Build Coastguard Worker return false; 170*8975f5c5SAndroid Build Coastguard Worker } 171*8975f5c5SAndroid Build Coastguard Worker break; 172*8975f5c5SAndroid Build Coastguard Worker 173*8975f5c5SAndroid Build Coastguard Worker case CL_UNORM_INT_101010_2: 174*8975f5c5SAndroid Build Coastguard Worker if (extensions.version < CL_MAKE_VERSION(2, 1, 0) || 175*8975f5c5SAndroid Build Coastguard Worker imageFormat->image_channel_order != CL_RGBA) 176*8975f5c5SAndroid Build Coastguard Worker { 177*8975f5c5SAndroid Build Coastguard Worker return false; 178*8975f5c5SAndroid Build Coastguard Worker } 179*8975f5c5SAndroid Build Coastguard Worker break; 180*8975f5c5SAndroid Build Coastguard Worker 181*8975f5c5SAndroid Build Coastguard Worker default: 182*8975f5c5SAndroid Build Coastguard Worker return false; 183*8975f5c5SAndroid Build Coastguard Worker } 184*8975f5c5SAndroid Build Coastguard Worker return true; 185*8975f5c5SAndroid Build Coastguard Worker } 186*8975f5c5SAndroid Build Coastguard Worker IsImageType(cl::MemObjectType type)187*8975f5c5SAndroid Build Coastguard Workerbool IsImageType(cl::MemObjectType type) 188*8975f5c5SAndroid Build Coastguard Worker { 189*8975f5c5SAndroid Build Coastguard Worker return (type >= cl::MemObjectType::Image2D && type <= cl::MemObjectType::Image1D_Buffer); 190*8975f5c5SAndroid Build Coastguard Worker } 191*8975f5c5SAndroid Build Coastguard Worker IsBufferType(cl::MemObjectType type)192*8975f5c5SAndroid Build Coastguard Workerbool IsBufferType(cl::MemObjectType type) 193*8975f5c5SAndroid Build Coastguard Worker { 194*8975f5c5SAndroid Build Coastguard Worker return type == cl::MemObjectType::Buffer; 195*8975f5c5SAndroid Build Coastguard Worker } 196*8975f5c5SAndroid Build Coastguard Worker GetExtentFromDescriptor(cl::ImageDescriptor desc)197*8975f5c5SAndroid Build Coastguard Workercl::Extents GetExtentFromDescriptor(cl::ImageDescriptor desc) 198*8975f5c5SAndroid Build Coastguard Worker { 199*8975f5c5SAndroid Build Coastguard Worker cl::Extents extent{}; 200*8975f5c5SAndroid Build Coastguard Worker 201*8975f5c5SAndroid Build Coastguard Worker extent.width = desc.width; 202*8975f5c5SAndroid Build Coastguard Worker extent.height = desc.height; 203*8975f5c5SAndroid Build Coastguard Worker extent.depth = desc.depth; 204*8975f5c5SAndroid Build Coastguard Worker 205*8975f5c5SAndroid Build Coastguard Worker // user can supply random values for height and depth for formats that dont need them 206*8975f5c5SAndroid Build Coastguard Worker switch (desc.type) 207*8975f5c5SAndroid Build Coastguard Worker { 208*8975f5c5SAndroid Build Coastguard Worker case cl::MemObjectType::Image1D: 209*8975f5c5SAndroid Build Coastguard Worker case cl::MemObjectType::Image1D_Array: 210*8975f5c5SAndroid Build Coastguard Worker case cl::MemObjectType::Image1D_Buffer: 211*8975f5c5SAndroid Build Coastguard Worker extent.height = 1; 212*8975f5c5SAndroid Build Coastguard Worker extent.depth = 1; 213*8975f5c5SAndroid Build Coastguard Worker break; 214*8975f5c5SAndroid Build Coastguard Worker case cl::MemObjectType::Image2D: 215*8975f5c5SAndroid Build Coastguard Worker case cl::MemObjectType::Image2D_Array: 216*8975f5c5SAndroid Build Coastguard Worker extent.depth = 1; 217*8975f5c5SAndroid Build Coastguard Worker break; 218*8975f5c5SAndroid Build Coastguard Worker default: 219*8975f5c5SAndroid Build Coastguard Worker break; 220*8975f5c5SAndroid Build Coastguard Worker } 221*8975f5c5SAndroid Build Coastguard Worker return extent; 222*8975f5c5SAndroid Build Coastguard Worker } 223*8975f5c5SAndroid Build Coastguard Worker 224*8975f5c5SAndroid Build Coastguard Worker thread_local cl_int gClErrorTls; 225*8975f5c5SAndroid Build Coastguard Worker 226*8975f5c5SAndroid Build Coastguard Worker } // namespace cl 227