30 template <
int D,
typename A>
class image;
33 template <backend Backend,
int D,
typename A>
34 std::enable_if_t<Backend == backend::ext_oneapi_level_zero, image<D, A>>
36 const context &TargetContext,
event AvailableEvent = {});
89 using byte =
unsigned char;
103 template <
typename DataT>
105 typename std::enable_if_t<is_validImageDataT<DataT>::value, DataT>;
109 case image_format::r8g8b8a8_unorm:
110 case image_format::b8g8r8a8_unorm:
111 return image_channel_type::unorm_int8;
112 case image_format::r16g16b16a16_unorm:
113 return image_channel_type::unorm_int16;
114 case image_format::r8g8b8a8_sint:
115 return image_channel_type::signed_int8;
116 case image_format::r16g16b16a16_sint:
117 return image_channel_type::signed_int16;
118 case image_format::r32b32g32a32_sint:
119 return image_channel_type::signed_int32;
120 case image_format::r8g8b8a8_uint:
121 return image_channel_type::unsigned_int8;
122 case image_format::r16g16b16a16_uint:
123 return image_channel_type::unsigned_int16;
124 case image_format::r32b32g32a32_uint:
125 return image_channel_type::unsigned_int32;
126 case image_format::r16b16g16a16_sfloat:
127 return image_channel_type::fp16;
128 case image_format::r32g32b32a32_sfloat:
129 return image_channel_type::fp32;
132 "Unrecognized channel type.");
137 case image_format::r8g8b8a8_unorm:
138 case image_format::r16g16b16a16_unorm:
139 case image_format::r8g8b8a8_sint:
140 case image_format::r16g16b16a16_sint:
141 case image_format::r32b32g32a32_sint:
142 case image_format::r8g8b8a8_uint:
143 case image_format::r16g16b16a16_uint:
144 case image_format::r32b32g32a32_uint:
145 case image_format::r16b16g16a16_sfloat:
146 case image_format::r32g32b32a32_sfloat:
147 return image_channel_order::rgba;
148 case image_format::b8g8r8a8_unorm:
149 return image_channel_order::bgra;
152 "Unrecognized channel order.");
158 image_plain(
const std::shared_ptr<detail::image_impl> &Impl) : impl{Impl} {}
162 std::unique_ptr<SYCLMemObjAllocator> Allocator,
167 std::unique_ptr<SYCLMemObjAllocator> Allocator,
172 std::unique_ptr<SYCLMemObjAllocator> Allocator,
177 std::unique_ptr<SYCLMemObjAllocator> Allocator,
183 std::unique_ptr<SYCLMemObjAllocator> Allocator,
186 image_plain(
const std::shared_ptr<const void> &HostPointer,
189 std::unique_ptr<SYCLMemObjAllocator> Allocator,
193 image_plain(
const std::shared_ptr<const void> &HostPointer,
196 std::unique_ptr<SYCLMemObjAllocator> Allocator,
203 std::unique_ptr<SYCLMemObjAllocator> Allocator,
209 std::unique_ptr<SYCLMemObjAllocator> Allocator,
212 image_plain(
const std::shared_ptr<const void> &HostPointer,
215 std::unique_ptr<SYCLMemObjAllocator> Allocator,
218 image_plain(
const std::shared_ptr<const void> &HostPointer,
222 std::unique_ptr<SYCLMemObjAllocator> Allocator,
225 #ifdef __SYCL_INTERNAL_API
226 image_plain(cl_mem ClMemObject,
const context &SyclContext,
227 event AvailableEvent,
228 std::unique_ptr<SYCLMemObjAllocator> Allocator,
233 event AvailableEvent,
234 std::unique_ptr<SYCLMemObjAllocator> Allocator,
239 template <
typename propertyT>
bool has_property() const noexcept;
241 template <typename propertyT> propertyT
get_property() const;
243 range<3> get_range() const;
245 range<2> get_pitch() const;
247 size_t get_size() const noexcept;
249 size_t get_count() const noexcept;
251 void set_final_data_internal();
253 void set_final_data_internal(
254 const
std::function<
void(const
std::function<
void(
void *const Ptr)> &)>
257 void set_write_back(
bool flag);
259 const
std::unique_ptr<SYCLMemObjAllocator> &get_allocator_internal() const;
261 size_t getElementSize() const;
263 size_t getRowPitch() const;
265 size_t getSlicePitch() const;
277 template <
int Dimensions, typename AllocatorT>
281 using image_plain::image_plain;
286 return image_plain::template has_property<propertyT>();
290 return image_plain::get_property<propertyT>();
294 return detail::convertToArrayOfN<Dimensions, 0>(image_plain::get_range());
298 template <
bool IsMultiDim = (Dimensions > 1)>
302 image_plain::get_pitch());
305 size_t size() const noexcept {
return image_plain::get_count(); }
309 return image_plain::get_allocator_internal()
310 ->template getAllocator<AllocatorT>();
315 template <
int Dimensions,
typename AllocatorT>
322 using common_base::image_common;
325 template <
typename Destination = std::
nullptr_t>
327 this->set_final_data_internal(finalData);
333 void set_final_data_internal(std::nullptr_t) {
334 common_base::set_final_data_internal();
337 template <
template <
typename WeakT>
class WeakPtrT,
typename WeakT>
339 std::is_convertible<WeakPtrT<WeakT>, std::weak_ptr<WeakT>>::value>
340 set_final_data_internal(WeakPtrT<WeakT> FinalData) {
341 std::weak_ptr<WeakT> TempFinalData(FinalData);
342 this->set_final_data_internal(TempFinalData);
345 template <
typename WeakT>
346 void set_final_data_internal(std::weak_ptr<WeakT> FinalData) {
347 common_base::set_final_data_internal(
348 [FinalData](
const std::function<
void(
void *
const Ptr)> &F) {
349 if (std::shared_ptr<WeakT> LockedFinalData = FinalData.lock())
350 F(LockedFinalData.get());
354 template <
typename Destination>
355 detail::EnableIfOutputPointerT<Destination>
356 set_final_data_internal(Destination FinalData) {
358 common_base::set_final_data_internal();
360 common_base::set_final_data_internal(
361 [FinalData](
const std::function<
void(
void *
const Ptr)> &F) {
366 template <
typename Destination>
367 detail::EnableIfOutputIteratorT<Destination>
368 set_final_data_internal(Destination FinalData) {
369 const size_t Size = common_base::size();
370 common_base::set_final_data_internal(
371 [FinalData, Size](
const std::function<
void(
void *
const Ptr)> &F) {
372 using DestinationValueT = detail::iterator_value_type_t<Destination>;
376 std::unique_ptr<DestinationValueT[]> ContiguousStorage(
377 new DestinationValueT[Size]);
378 F(ContiguousStorage.get());
379 std::copy(ContiguousStorage.get(), ContiguousStorage.get() + Size,
385 template <
typename DataT,
int Dims,
access::mode AccMode,
387 class image_accessor;
393 class unsampled_image_accessor;
395 template <
typename DataT,
int Dimensions, access_mode AccessMode>
396 class host_unsampled_image_accessor;
398 template <
typename DataT,
int Dimensions, image_target AccessTarget>
399 class sampled_image_accessor;
401 template <
typename DataT,
int Dimensions>
class host_sampled_image_accessor;
412 template <
int Dimensions = 1,
typename AllocatorT = sycl::image_allocator>
413 class image :
public detail::unsampled_image_common<Dimensions, AllocatorT> {
416 typename detail::unsampled_image_common<Dimensions, AllocatorT>;
421 : common_base(Order, Type, detail::convertToArrayOfN<3, 1>(Range),
430 Order, Type, detail::convertToArrayOfN<3, 1>(Range),
436 template <
bool B = (Dimensions > 1)>
441 : common_base(Order, Type, detail::convertToArrayOfN<3, 1>(Range),
442 detail::convertToArrayOfN<2, 0>(Pitch),
448 template <
bool B = (Dimensions > 1)>
454 Order, Type, detail::convertToArrayOfN<3, 1>(Range),
455 detail::convertToArrayOfN<2, 0>(Pitch),
462 : common_base(HostPointer, Order, Type,
463 detail::convertToArrayOfN<3, 1>(Range),
472 HostPointer, Order, Type, detail::convertToArrayOfN<3, 1>(Range),
480 : common_base(HostPointer, Order, Type,
481 detail::convertToArrayOfN<3, 1>(Range),
490 HostPointer, Order, Type, detail::convertToArrayOfN<3, 1>(Range),
496 template <
bool B = (Dimensions > 1)>
501 : common_base(HostPointer, Order, Type,
502 detail::convertToArrayOfN<3, 1>(Range),
503 detail::convertToArrayOfN<2, 0>(Pitch),
509 template <
bool B = (Dimensions > 1)>
515 HostPointer, Order, Type, detail::convertToArrayOfN<3, 1>(Range),
516 detail::convertToArrayOfN<2, 0>(Pitch),
524 : common_base(HostPointer, Order, Type,
525 detail::convertToArrayOfN<3, 1>(Range),
534 HostPointer, Order, Type, detail::convertToArrayOfN<3, 1>(Range),
540 template <
bool B = (Dimensions > 1)>
545 : common_base(HostPointer, Order, Type,
546 detail::convertToArrayOfN<3, 1>(Range),
547 detail::convertToArrayOfN<2, 0>(Pitch),
553 template <
bool B = (Dimensions > 1)>
559 HostPointer, Order, Type, detail::convertToArrayOfN<3, 1>(Range),
560 detail::convertToArrayOfN<2, 0>(Pitch),
565 #ifdef __SYCL_INTERNAL_API
566 image(cl_mem ClMemObject,
const context &SyclContext,
567 event AvailableEvent = {})
568 : common_base(ClMemObject, SyclContext, AvailableEvent,
570 detail::SYCLMemObjAllocatorHolder<AllocatorT, byte>>(),
576 image(
const image &rhs) =
default;
578 image(image &&rhs) =
default;
592 return common_base::template has_property<propertyT>();
596 return common_base::template get_property<propertyT>();
600 return detail::convertToArrayOfN<Dimensions, 0>(common_base::get_range());
604 template <
bool B = (Dimensions > 1)>
607 common_base::get_pitch());
611 size_t get_size()
const {
return common_base::get_size(); }
615 size_t get_count()
const {
return common_base::size(); }
617 template <
typename DataT, access::mode AccessMode>
619 access::target::image, access::placeholder::false_t,
623 access::placeholder::false_t,
625 commandGroupHandler);
628 template <
typename DataT, access::mode AccessMode>
630 access::target::host_image, access::placeholder::false_t,
634 access::placeholder::false_t,
642 : common_base(MemObject, SyclContext, AvailableEvent,
644 detail::SYCLMemObjAllocatorHolder<AllocatorT,
byte>>(),
651 size_t getElementSize()
const {
return common_base::getElementSize(); }
653 size_t getRowPitch()
const {
return common_base::getRowPitch(); }
655 size_t getSlicePitch()
const {
return common_base::getSlicePitch(); }
658 return common_base::getChannelOrder();
662 return common_base::getChannelType();
666 template <backend Backend,
int D,
typename A>
667 friend std::enable_if_t<
668 detail::InteropFeatureSupportMap<Backend>::MakeImage ==
true &&
669 Backend != backend::ext_oneapi_level_zero,
672 const typename backend_traits<Backend>::template input_type<image<D, A>>
674 const context &TargetContext, event AvailableEvent);
676 template <backend Backend,
int D,
typename A>
677 friend std::enable_if_t<Backend == backend::ext_oneapi_level_zero,
680 const context &TargetContext, event AvailableEvent);
685 template <
typename DataT,
int Dims,
access::mode AccMode,
687 typename PropertyListT>
690 template <
typename DataT,
int Dims,
access::mode AccMode,
695 template <
int Dimensions = 1,
typename AllocatorT = sycl::image_allocator>
704 : common_base{Impl} {}
711 detail::convertToArrayOfN<3, 1>(Range),
721 detail::convertToArrayOfN<3, 1>(Range),
726 template <
bool IsMultiDim = (Dimensions > 1),
727 typename = std::enable_if_t<IsMultiDim>>
733 detail::convertToArrayOfN<3, 1>(Range),
734 detail::convertToArrayOfN<2, 0>(Pitch),
739 template <
bool IsMultiDim = (Dimensions > 1),
740 typename = std::enable_if_t<IsMultiDim>>
747 detail::convertToArrayOfN<3, 1>(Range),
748 detail::convertToArrayOfN<2, 0>(Pitch),
758 detail::convertToArrayOfN<3, 1>(Range),
769 detail::convertToArrayOfN<3, 1>(Range),
774 template <
bool IsMultiDim = (Dimensions > 1),
775 typename = std::enable_if_t<IsMultiDim>>
782 detail::convertToArrayOfN<3, 1>(Range),
783 detail::convertToArrayOfN<2, 0>(Pitch),
788 template <
bool IsMultiDim = (Dimensions > 1),
789 typename = std::enable_if_t<IsMultiDim>>
797 detail::convertToArrayOfN<3, 1>(Range),
798 detail::convertToArrayOfN<2, 0>(Pitch),
808 detail::convertToArrayOfN<3, 1>(Range),
819 detail::convertToArrayOfN<3, 1>(Range),
824 template <
bool IsMultiDim = (Dimensions > 1),
825 typename = std::enable_if_t<IsMultiDim>>
832 detail::convertToArrayOfN<3, 1>(Range),
833 detail::convertToArrayOfN<2, 0>(Pitch),
838 template <
bool IsMultiDim = (Dimensions > 1),
839 typename = std::enable_if_t<IsMultiDim>>
847 detail::convertToArrayOfN<3, 1>(Range),
848 detail::convertToArrayOfN<2, 0>(Pitch),
855 unsampled_image(
const unsampled_image &rhs) =
default;
857 unsampled_image(unsampled_image &&rhs) =
default;
859 unsampled_image &
operator=(
const unsampled_image &rhs) =
default;
861 unsampled_image &
operator=(unsampled_image &&rhs) =
default;
863 ~unsampled_image() =
default;
866 return this->impl == rhs.
impl;
871 size_t byte_size() const noexcept {
return common_base::get_size(); }
873 using common_base::size;
875 template <
typename DataT,
883 return {*
this, CommandGroupHandlerRef, PropList};
886 template <
typename DataT,
890 host_unsampled_image_accessor<DataT, Dimensions, AccessMode>
892 return {*
this, PropList};
902 template <
typename DataT,
int Dims, access_mode AccessMode>
910 template <
int Dimensions = 1,
typename AllocatorT = sycl::image_allocator>
917 sampled_image(
const std::shared_ptr<detail::image_impl> &Impl)
918 : common_base{Impl} {}
926 detail::convertToArrayOfN<3, 1>(Range),
931 template <
bool IsMultiDim = (Dimensions > 1),
932 typename = std::enable_if_t<IsMultiDim>>
939 detail::convertToArrayOfN<3, 1>(Range),
940 detail::convertToArrayOfN<2, 0>(Pitch),
950 detail::convertToArrayOfN<3, 1>(Range),
955 template <
bool IsMultiDim = (Dimensions > 1),
956 typename = std::enable_if_t<IsMultiDim>>
963 detail::convertToArrayOfN<3, 1>(Range),
964 detail::convertToArrayOfN<2, 0>(Pitch),
971 sampled_image(
const sampled_image &rhs) =
default;
973 sampled_image(sampled_image &&rhs) =
default;
975 sampled_image &
operator=(
const sampled_image &rhs) =
default;
977 sampled_image &
operator=(sampled_image &&rhs) =
default;
979 ~sampled_image() =
default;
982 return this->impl == rhs.
impl;
987 size_t byte_size() const noexcept {
return common_base::get_size(); }
989 template <
typename DataT, image_target AccessTarget = image_target::device>
993 return {*
this, CommandGroupHandlerRef, PropList};
996 template <
typename DataT>
997 host_sampled_image_accessor<DataT, Dimensions>
999 return {*
this, PropList};
1003 template <
class Obj>
1011 template <
typename DataT,
int Dims, image_target AccessTarget>
1019 template <
int Dimensions,
typename AllocatorT>
1020 struct hash<
sycl::image<Dimensions, AllocatorT>> {
1021 size_t operator()(
const sycl::image<Dimensions, AllocatorT> &I)
const {
1022 return hash<std::shared_ptr<sycl::detail::image_impl>>()(
1027 template <
int Dimensions,
typename AllocatorT>
1028 struct hash<
sycl::unsampled_image<Dimensions, AllocatorT>> {
1030 operator()(
const sycl::unsampled_image<Dimensions, AllocatorT> &I)
const {
1031 return hash<std::shared_ptr<sycl::detail::image_impl>>()(
1036 template <
int Dimensions,
typename AllocatorT>
1037 struct hash<
sycl::sampled_image<Dimensions, AllocatorT>> {
1039 operator()(
const sycl::sampled_image<Dimensions, AllocatorT> &I)
const {
1040 return hash<std::shared_ptr<sycl::detail::image_impl>>()(