DPC++ Runtime
Runtime libraries for oneAPI DPC++
buffer.cpp
Go to the documentation of this file.
1 #include <detail/buffer_impl.hpp>
2 #include <sycl/buffer.hpp>
5 #include <sycl/property_list.hpp>
6 #include <sycl/range.hpp>
7 
8 #include <memory>
9 
10 namespace sycl {
11 inline namespace _V1 {
12 namespace detail {
13 
15  size_t SizeInBytes, size_t RequiredAlign, const property_list &Props,
16  std::unique_ptr<detail::SYCLMemObjAllocator> Allocator) {
17 
18  impl = std::make_shared<detail::buffer_impl>(SizeInBytes, RequiredAlign,
19  Props, std::move(Allocator));
20 }
21 
23  void *HostData, size_t SizeInBytes, size_t RequiredAlign,
24  const sycl::property_list &Props,
25  std::unique_ptr<sycl::detail::SYCLMemObjAllocator> Allocator) {
26  impl = std::make_shared<detail::buffer_impl>(
27  HostData, SizeInBytes, RequiredAlign, Props, std::move(Allocator));
28 }
29 
31  const void *HostData, size_t SizeInBytes, size_t RequiredAlign,
32  const property_list &Props,
33  std::unique_ptr<detail::SYCLMemObjAllocator> Allocator) {
34  impl = std::make_shared<detail::buffer_impl>(
35  HostData, SizeInBytes, RequiredAlign, Props, std::move(Allocator));
36 }
37 
39  const std::shared_ptr<const void> &HostData, const size_t SizeInBytes,
40  size_t RequiredAlign, const property_list &Props,
41  std::unique_ptr<detail::SYCLMemObjAllocator> Allocator, bool IsConstPtr) {
42  impl = std::make_shared<detail::buffer_impl>(
43  HostData, SizeInBytes, RequiredAlign, Props, std::move(Allocator),
44  IsConstPtr);
45 }
46 
48  const std::function<void(void *)> &CopyFromInput, const size_t SizeInBytes,
49  size_t RequiredAlign, const property_list &Props,
50  std::unique_ptr<detail::SYCLMemObjAllocator> Allocator, bool IsConstPtr) {
51  impl = std::make_shared<detail::buffer_impl>(
52  CopyFromInput, SizeInBytes, RequiredAlign, Props, std::move(Allocator),
53  IsConstPtr);
54 }
55 
57  pi_native_handle MemObject, context SyclContext,
58  std::unique_ptr<detail::SYCLMemObjAllocator> Allocator,
59  bool OwnNativeHandle, event AvailableEvent) {
60  impl = std::make_shared<detail::buffer_impl>(
61  MemObject, std::move(SyclContext), std::move(Allocator), OwnNativeHandle,
62  std::move(AvailableEvent));
63 }
64 
65 void buffer_plain::set_final_data_internal() { impl->set_final_data(nullptr); }
66 
68  const std::function<void(const std::function<void(void *const Ptr)> &)>
69  &FinalDataFunc) {
70  impl->set_final_data(FinalDataFunc);
71 }
72 
74  void *UserObj, const void *HostObj,
75  const void *Type, uint32_t Dim,
76  uint32_t ElemType, size_t Range[3]) {
77  impl->constructorNotification(CodeLoc, UserObj, HostObj, Type, Dim, ElemType,
78  Range);
79 }
80 
81 void buffer_plain::set_write_back(bool NeedWriteBack) {
82  impl->set_write_back(NeedWriteBack);
83 }
84 
85 #define __SYCL_PARAM_TRAITS_SPEC(param_type) \
86  template <> \
87  __SYCL_EXPORT bool buffer_plain::has_property<param_type>() const noexcept { \
88  return impl->has_property<param_type>(); \
89  }
90 #include <sycl/detail/properties_traits.def>
91 
92 #undef __SYCL_PARAM_TRAITS_SPEC
93 
94 #define __SYCL_PARAM_TRAITS_SPEC(param_type) \
95  template <> \
96  __SYCL_EXPORT param_type buffer_plain::get_property<param_type>() const { \
97  return impl->get_property<param_type>(); \
98  }
99 #include <sycl/detail/properties_traits.def>
100 
101 #undef __SYCL_PARAM_TRAITS_SPEC
102 
103 std::vector<pi_native_handle>
105  return impl->getNativeVector(BackendName);
106 }
107 
108 const std::unique_ptr<SYCLMemObjAllocator> &
110  return impl->get_allocator_internal();
111 }
112 
114  impl->deleteAccessorProperty(Kind);
115 }
116 
118  const property_list &PropertyList) {
119  impl->addOrReplaceAccessorProperties(PropertyList);
120 }
121 
122 size_t buffer_plain::getSize() const { return impl->getSizeInBytes(); }
123 
125  // Try to detach memory object only if impl is going to be released.
126  // Buffer copy will have pointer to the same impl.
127  if (impl.use_count() == 1)
128  impl->detachMemoryObject(impl);
129 }
130 
131 } // namespace detail
132 } // namespace _V1
133 } // namespace sycl
The context class represents a SYCL context on which kernel functions may be executed.
Definition: context.hpp:51
buffer_plain(size_t SizeInBytes, size_t, const property_list &Props, std::unique_ptr< detail::SYCLMemObjAllocator > Allocator)
Definition: buffer.cpp:14
void deleteAccProps(const sycl::detail::PropWithDataKind &Kind)
Definition: buffer.cpp:113
std::vector< pi_native_handle > getNativeVector(backend BackendName) const
Definition: buffer.cpp:104
std::shared_ptr< detail::buffer_impl > impl
Definition: buffer.hpp:151
void constructorNotification(const detail::code_location &CodeLoc, void *UserObj, const void *HostObj, const void *Type, uint32_t Dim, uint32_t ElemType, size_t Range[3])
Definition: buffer.cpp:73
const std::unique_ptr< SYCLMemObjAllocator > & get_allocator_internal() const
Definition: buffer.cpp:109
void set_write_back(bool NeedWriteBack)
Definition: buffer.cpp:81
void addOrReplaceAccessorProperties(const property_list &PropertyList)
Definition: buffer.cpp:117
An event object can be used to synchronize memory transfers, enqueues of kernels and signaling barrie...
Definition: event.hpp:44
Objects of the property_list class are containers for the SYCL properties.
Definition: access.hpp:18
uintptr_t pi_native_handle
Definition: pi.h:209