xref: /aosp_15_r20/external/angle/src/libANGLE/cl_utils.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 Worker size_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 Worker size_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 Worker bool 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 Worker bool 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 Worker bool 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 Worker cl::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