29 #ifdef __SYCL_DEVICE_ONLY__
37 inline namespace _V1 {
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 = sycl::detail::ConvertToOpenCLType_t<R>; \
50 return sycl::detail::convertFromOpenCLTypeFor<R>( \
51 __spirv_##call<Ret, T1>(ParT1)); \
56 __SYCL_INVOKE_SPIRV_CALL_ARG1(ImageQuerySize)
57 __SYCL_INVOKE_SPIRV_CALL_ARG1(ImageQueryFormat)
58 __SYCL_INVOKE_SPIRV_CALL_ARG1(ImageQueryOrder)
60 template <
typename ImageT,
typename CoordT,
typename ValT>
61 static void __invoke__ImageWrite(ImageT Img, CoordT Coords, ValT Val) {
67 __spirv_ImageWrite<ImageT, decltype(TmpCoords), decltype(TmpVal)>(
68 Img, TmpCoords, TmpVal);
71 template <
typename RetType,
typename ImageT,
typename CoordT>
72 static RetType __invoke__ImageRead(ImageT Img, CoordT Coords) {
75 using TempRetT = sycl::detail::ConvertToOpenCLType_t<RetType>;
78 return sycl::detail::convertFromOpenCLTypeFor<RetType>(
79 __spirv_ImageRead<TempRetT, ImageT, decltype(TmpCoords)>(Img, TmpCoords));
82 template <
typename RetType,
typename ImageT,
typename CoordT>
83 static RetType __invoke__ImageArrayFetch(ImageT Img, CoordT Coords,
87 using TempRetT = sycl::detail::ConvertToOpenCLType_t<RetType>;
90 return sycl::detail::convertFromOpenCLTypeFor<RetType>(
91 __spirv_ImageArrayFetch<TempRetT, ImageT, decltype(TmpCoords)>(
92 Img, TmpCoords, ArrayLayer));
95 template <
typename ImageT,
typename CoordT,
typename ValT>
96 static void __invoke__ImageArrayWrite(ImageT Img, CoordT Coords,
int ArrayLayer,
103 __spirv_ImageArrayWrite<ImageT, decltype(TmpCoords), decltype(TmpVal)>(
104 Img, TmpCoords, ArrayLayer, TmpVal);
107 template <
typename RetType,
typename SmpImageT,
typename DirVecT>
108 static RetType __invoke__ImageReadCubemap(SmpImageT SmpImg, DirVecT DirVec) {
111 using TempRetT = sycl::detail::ConvertToOpenCLType_t<RetType>;
114 return sycl::detail::convertFromOpenCLTypeFor<RetType>(
115 __spirv_ImageSampleCubemap<SmpImageT, TempRetT, decltype(TmpDirVec)>(
119 template <
typename RetType,
typename SmpImageT,
typename CoordT>
120 static RetType __invoke__ImageReadLod(SmpImageT SmpImg, CoordT Coords,
124 using TempRetT = sycl::detail::ConvertToOpenCLType_t<RetType>;
127 enum ImageOperands { Lod = 0x2 };
135 return sycl::detail::convertFromOpenCLTypeFor<RetType>(
136 __spirv_ImageSampleExplicitLod<SmpImageT, TempRetT, decltype(TmpCoords)>(
137 SmpImg, TmpCoords, ImageOperands::Lod, Level));
140 template <
typename RetType,
typename SmpImageT,
typename CoordT>
141 static RetType __invoke__ImageReadGrad(SmpImageT SmpImg, CoordT Coords,
142 CoordT Dx, CoordT Dy) {
145 using TempRetT = sycl::detail::ConvertToOpenCLType_t<RetType>;
150 enum ImageOperands { Grad = 0x4 };
158 return sycl::detail::convertFromOpenCLTypeFor<RetType>(
159 __spirv_ImageSampleExplicitLod<SmpImageT, TempRetT, decltype(TmpCoords)>(
160 SmpImg, TmpCoords, ImageOperands::Grad, TmpGraddX, TmpGraddY));
163 template <
typename RetType,
typename ImageT,
typename CoordT>
164 static RetType __invoke__ImageReadSampler(ImageT Img, CoordT Coords,
168 using TempRetT = sycl::detail::ConvertToOpenCLType_t<RetType>;
170 typename sycl::detail::sampled_opencl_image_type<ImageT>::type;
182 enum ImageOperands { Lod = 0x2 };
185 return sycl::detail::convertFromOpenCLTypeFor<RetType>(
186 __spirv_ImageSampleExplicitLod<SampledT, TempRetT, decltype(TmpCoords)>(
187 __spirv_SampledImage<ImageT, SampledT>(Img, Smpl), TmpCoords,
188 ImageOperands::Lod, 0.0f));
192 inline namespace _V1 {
199 inline int getSPIRVNumChannels(
int ImageChannelOrder) {
200 switch (ImageChannelOrder) {
236 inline int getSPIRVElementSize(
int ImageChannelType,
int ImageChannelOrder) {
237 int NumChannels = getSPIRVNumChannels(ImageChannelOrder);
238 switch (ImageChannelType) {
249 return 2 * NumChannels;
258 return 4 * NumChannels;
268 template <
int Dimensions, access::mode AccessMode, access::target AccessTarget>
269 struct opencl_image_type;
274 template <
int Dimensions, access::mode AccessMode>
277 opencl_image_type<Dimensions, AccessMode, access::target::host_image> *;
279 template <
typename T>
struct sampled_opencl_image_type<T *> {
283 #define __SYCL_IMAGETY_DEFINE(Dim, AccessMode, AMSuffix, Target, Ifarray_) \
285 struct opencl_image_type<Dim, access::mode::AccessMode, \
286 access::target::Target> { \
287 using type = __ocl_image##Dim##d_##Ifarray_##AMSuffix##_t; \
289 #define __SYCL_SAMPLED_AND_IMAGETY_DEFINE(Dim, AccessMode, AMSuffix, Target, \
291 __SYCL_IMAGETY_DEFINE(Dim, AccessMode, AMSuffix, Target, Ifarray_) \
293 struct sampled_opencl_image_type<typename opencl_image_type< \
294 Dim, access::mode::AccessMode, access::target::Target>::type> { \
295 using type = __ocl_sampled_image##Dim##d_##Ifarray_##AMSuffix##_t; \
298 #define __SYCL_IMAGETY_READ_3_DIM_IMAGE \
299 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(1, read, ro, image, ) \
300 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(2, read, ro, image, ) \
301 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(3, read, ro, image, )
303 #define __SYCL_IMAGETY_WRITE_3_DIM_IMAGE \
304 __SYCL_IMAGETY_DEFINE(1, write, wo, image, ) \
305 __SYCL_IMAGETY_DEFINE(2, write, wo, image, ) \
306 __SYCL_IMAGETY_DEFINE(3, write, wo, image, )
308 #define __SYCL_IMAGETY_DISCARD_WRITE_3_DIM_IMAGE \
309 __SYCL_IMAGETY_DEFINE(1, discard_write, wo, image, ) \
310 __SYCL_IMAGETY_DEFINE(2, discard_write, wo, image, ) \
311 __SYCL_IMAGETY_DEFINE(3, discard_write, wo, image, )
313 #define __SYCL_IMAGETY_READ_2_DIM_IARRAY \
314 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(1, read, ro, image_array, array_) \
315 __SYCL_SAMPLED_AND_IMAGETY_DEFINE(2, read, ro, image_array, array_)
317 #define __SYCL_IMAGETY_WRITE_2_DIM_IARRAY \
318 __SYCL_IMAGETY_DEFINE(1, write, wo, image_array, array_) \
319 __SYCL_IMAGETY_DEFINE(2, write, wo, image_array, array_)
321 #define __SYCL_IMAGETY_DISCARD_WRITE_2_DIM_IARRAY \
322 __SYCL_IMAGETY_DEFINE(1, discard_write, wo, image_array, array_) \
323 __SYCL_IMAGETY_DEFINE(2, discard_write, wo, image_array, array_)
325 __SYCL_IMAGETY_READ_3_DIM_IMAGE
326 __SYCL_IMAGETY_WRITE_3_DIM_IMAGE
327 __SYCL_IMAGETY_DISCARD_WRITE_3_DIM_IMAGE
329 __SYCL_IMAGETY_READ_2_DIM_IARRAY
330 __SYCL_IMAGETY_WRITE_2_DIM_IARRAY
331 __SYCL_IMAGETY_DISCARD_WRITE_2_DIM_IARRAY
337 #undef __SYCL_SAMPLED_AND_IMAGETY_DEFINE
338 #undef __SYCL_INVOKE_SPIRV_CALL_ARG1
339 #undef __SYCL_IMAGETY_DEFINE
340 #undef __SYCL_IMAGETY_DISCARD_WRITE_3_DIM_IMAGE
341 #undef __SYCL_IMAGETY_READ_3_DIM_IMAGE
342 #undef __SYCL_IMAGETY_WRITE_3_DIM_IMAGE
343 #undef __SYCL_IMAGETY_DISCARD_WRITE_2_DIM_IARRAY
344 #undef __SYCL_IMAGETY_READ_2_DIM_IARRAY
345 #undef __SYCL_IMAGETY_WRITE_2_DIM_IARRAY
auto convertToOpenCLType(T &&x)
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor class __SYCL_EBO __SYCL_SPECIAL_CLASS Dimensions
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor class __SYCL_EBO __SYCL_SPECIAL_CLASS AccessMode