29 #ifdef __SYCL_DEVICE_ONLY__
41 template <
typename ImageType>
struct sampled_opencl_image_type;
47 #define __SYCL_INVOKE_SPIRV_CALL_ARG1(call) \
48 template <typename R, typename T1> inline R __invoke_##call(T1 ParT1) { \
49 using Ret = cl::sycl::detail::ConvertToOpenCLType_t<R>; \
51 Ret RetVar = __spirv_##call<Ret, T1>(Arg1); \
52 return cl::sycl::detail::convertDataToType<Ret, R>(RetVar); \
57 __SYCL_INVOKE_SPIRV_CALL_ARG1(ImageQuerySize)
58 __SYCL_INVOKE_SPIRV_CALL_ARG1(ImageQueryFormat)
59 __SYCL_INVOKE_SPIRV_CALL_ARG1(ImageQueryOrder)
61 template <
typename ImageT,
typename CoordT,
typename ValT>
62 static void __invoke__ImageWrite(ImageT Img, CoordT Coords, ValT Val) {
69 cl::sycl::detail::convertDataToType<CoordT, TmpCoordT>(Coords);
70 TmpValT TmpVal = cl::sycl::detail::convertDataToType<ValT, TmpValT>(Val);
71 __spirv_ImageWrite<ImageT, TmpCoordT, TmpValT>(Img, TmpCoord, TmpVal);
74 template <
typename RetType,
typename ImageT,
typename CoordT>
75 static RetType __invoke__ImageRead(ImageT Img, CoordT Coords) {
81 TempArgT Arg = cl::sycl::detail::convertDataToType<CoordT, TempArgT>(Coords);
82 TempRetT Ret = __spirv_ImageRead<TempRetT, ImageT, TempArgT>(Img, Arg);
83 return cl::sycl::detail::convertDataToType<TempRetT, RetType>(Ret);
86 template <
typename RetType,
typename ImageT,
typename CoordT>
87 static RetType __invoke__ImageReadSampler(ImageT Img, CoordT Coords,
94 typename cl::sycl::detail::sampled_opencl_image_type<ImageT>::type;
97 cl::sycl::detail::convertDataToType<CoordT, TempArgT>(Coords);
107 enum ImageOperands { Lod = 0x2 };
110 TempRetT Ret = __spirv_ImageSampleExplicitLod<SampledT, TempRetT, TempArgT>(
111 __spirv_SampledImage<ImageT, SampledT>(Img, Smpl), TmpCoords,
112 ImageOperands::Lod, 0.0f);
113 return cl::sycl::detail::convertDataToType<TempRetT, RetType>(Ret);
124 inline int getSPIRVNumChannels(
int ImageChannelOrder) {
125 switch (ImageChannelOrder) {
161 inline int getSPIRVElementSize(
int ImageChannelType,
int ImageChannelOrder) {
162 int NumChannels = getSPIRVNumChannels(ImageChannelOrder);
163 switch (ImageChannelType) {
174 return 2 * NumChannels;
183 return 4 * NumChannels;
193 template <
int Dimensions, access::mode AccessMode, access::target AccessTarget>
194 struct opencl_image_type;
199 template <
int Dimensions, access::mode AccessMode>
200 struct opencl_image_type<
Dimensions, AccessMode, access::target::host_image> {
202 opencl_image_type<Dimensions, AccessMode, access::target::host_image> *;
204 template <
typename T>
struct sampled_opencl_image_type<
T *> {
208 #define __SYCL_IMAGETY_DEFINE(Dim, AccessMode, AMSuffix, Target, Ifarray_) \
210 struct opencl_image_type<Dim, access::mode::AccessMode, \
211 access::target::Target> { \
212 using type = __ocl_image##Dim##d_##Ifarray_##AMSuffix##_t; \
214 #define __SYCL_SAMPLED_AND_IMAGETY_DEFINE(Dim, AccessMode, AMSuffix, Target, \
216 __SYCL_IMAGETY_DEFINE(Dim, AccessMode, AMSuffix, Target, Ifarray_) \
218 struct sampled_opencl_image_type<typename opencl_image_type< \
219 Dim, access::mode::AccessMode, access::target::Target>::type> { \
220 using type = __ocl_sampled_image##Dim##d_##Ifarray_##AMSuffix##_t; \
223 #define __SYCL_IMAGETY_READ_3_DIM_IMAGE \
224 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(1, read, ro, image, ) \
225 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(2, read, ro, image, ) \
226 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(3, read, ro, image, )
228 #define __SYCL_IMAGETY_WRITE_3_DIM_IMAGE \
229 __SYCL_IMAGETY_DEFINE(1, write, wo, image, ) \
230 __SYCL_IMAGETY_DEFINE(2, write, wo, image, ) \
231 __SYCL_IMAGETY_DEFINE(3, write, wo, image, )
233 #define __SYCL_IMAGETY_DISCARD_WRITE_3_DIM_IMAGE \
234 __SYCL_IMAGETY_DEFINE(1, discard_write, wo, image, ) \
235 __SYCL_IMAGETY_DEFINE(2, discard_write, wo, image, ) \
236 __SYCL_IMAGETY_DEFINE(3, discard_write, wo, image, )
238 #define __SYCL_IMAGETY_READ_2_DIM_IARRAY \
239 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(1, read, ro, image_array, array_) \
240 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(2, read, ro, image_array, array_)
242 #define __SYCL_IMAGETY_WRITE_2_DIM_IARRAY \
243 __SYCL_IMAGETY_DEFINE(1, write, wo, image_array, array_) \
244 __SYCL_IMAGETY_DEFINE(2, write, wo, image_array, array_)
246 #define __SYCL_IMAGETY_DISCARD_WRITE_2_DIM_IARRAY \
247 __SYCL_IMAGETY_DEFINE(1, discard_write, wo, image_array, array_) \
248 __SYCL_IMAGETY_DEFINE(2, discard_write, wo, image_array, array_)
250 __SYCL_IMAGETY_READ_3_DIM_IMAGE
251 __SYCL_IMAGETY_WRITE_3_DIM_IMAGE
252 __SYCL_IMAGETY_DISCARD_WRITE_3_DIM_IMAGE
254 __SYCL_IMAGETY_READ_2_DIM_IARRAY
255 __SYCL_IMAGETY_WRITE_2_DIM_IARRAY
256 __SYCL_IMAGETY_DISCARD_WRITE_2_DIM_IARRAY
262 #undef __SYCL_SAMPLED_AND_IMAGETY_DEFINE
263 #undef __SYCL_INVOKE_SPIRV_CALL_ARG1
264 #undef __SYCL_IMAGETY_DEFINE
265 #undef __SYCL_IMAGETY_DISCARD_WRITE_3_DIM_IMAGE
266 #undef __SYCL_IMAGETY_READ_3_DIM_IMAGE
267 #undef __SYCL_IMAGETY_WRITE_3_DIM_IMAGE
268 #undef __SYCL_IMAGETY_DISCARD_WRITE_2_DIM_IARRAY
269 #undef __SYCL_IMAGETY_READ_2_DIM_IARRAY
270 #undef __SYCL_IMAGETY_WRITE_2_DIM_IARRAY
271 #endif //#ifdef __SYCL_DEVICE_ONLY__