24 #include <type_traits>
46 using EnableIfOutputPointerT = std::enable_if_t<
47 std::is_pointer<T>::value>;
50 using EnableIfOutputIteratorT = std::enable_if_t<
51 !std::is_pointer<T>::value>;
55 std::unique_ptr<SYCLMemObjAllocator> Allocator)
56 : MAllocator(
std::move(Allocator)), MProps(Props), MInteropEvent(nullptr),
57 MInteropContext(nullptr), MInteropMemObject(nullptr),
58 MOpenCLInterop(false), MHostPtrReadOnly(false), MNeedWriteBack(true),
59 MSizeInBytes(SizeInBytes), MUserPtr(nullptr), MShadowCopy(nullptr),
60 MUploadDataFunctor(nullptr), MSharedPtrStorage(nullptr),
61 MHostPtrProvided(false) {}
64 std::unique_ptr<SYCLMemObjAllocator> Allocator)
68 const size_t SizeInBytes,
event AvailableEvent,
69 std::unique_ptr<SYCLMemObjAllocator> Allocator);
73 std::unique_ptr<SYCLMemObjAllocator> Allocator)
75 (size_t)0, AvailableEvent,
76 std::move(Allocator)) {}
79 bool OwmNativeHandle,
event AvailableEvent,
80 std::unique_ptr<SYCLMemObjAllocator> Allocator);
83 bool OwnNativeHandle,
event AvailableEvent,
84 std::unique_ptr<SYCLMemObjAllocator> Allocator,
94 size_t get_count()
const {
return size(); }
95 size_t size() const noexcept {
96 size_t AllocatorValueSize = MAllocator->getValueSize();
97 return (getSizeInBytes() + AllocatorValueSize - 1) / AllocatorValueSize;
101 return MProps.has_property<propertyT>();
105 return MProps.get_property<propertyT>();
109 MProps.add_or_replace_accessor_properties(PropertyList);
113 MProps.delete_accessor_property(Kind);
124 MAllocator->deallocate(Ptr, size());
127 void releaseMem(
ContextImplPtr Context,
void *MemAllocation)
override;
130 return MOpenCLInterop ?
static_cast<void *
>(MInteropMemObject) : MUserPtr;
138 MUploadDataFunctor = [
this]() {
139 if (MSharedPtrStorage.use_count() > 1) {
140 void *FinalData =
const_cast<void *
>(MSharedPtrStorage.get());
141 updateHostMemory(FinalData);
144 MHostPtrProvided =
true;
148 const std::function<
void(
const std::function<
void(
void *
const Ptr)> &)>
151 auto UpdateFunc = [
this](
void *
const Ptr) { updateHostMemory(Ptr); };
152 MUploadDataFunctor = [FinalDataFunc, UpdateFunc]() {
153 FinalDataFunc(UpdateFunc);
155 MHostPtrProvided =
true;
159 void updateHostMemory(
void *
const Ptr);
166 void updateHostMemory();
170 return has_property<property::buffer::use_host_ptr>() ||
171 has_property<property::image::use_host_ptr>();
176 (
reinterpret_cast<std::uintptr_t
>(HostPtr) % RequiredAlign) == 0;
177 return Aligned || useHostPtr();
181 MHostPtrProvided =
true;
182 if (!MHostPtrReadOnly && HostPtr) {
183 set_final_data([HostPtr](
const std::function<
void(
void *
const Ptr)> &F) {
188 if (canReuseHostPtr(HostPtr, RequiredAlign)) {
191 setAlign(RequiredAlign);
192 MShadowCopy = allocateHostMem();
193 MUserPtr = MShadowCopy;
199 MHostPtrReadOnly =
true;
200 handleHostData(
const_cast<void *
>(HostPtr), RequiredAlign);
204 const size_t RequiredAlign,
bool IsConstPtr) {
205 MHostPtrProvided =
true;
206 MSharedPtrStorage = HostPtr;
207 MHostPtrReadOnly = IsConstPtr;
209 if (!MHostPtrReadOnly)
210 set_final_data_from_storage();
212 if (canReuseHostPtr(HostPtr.get(), RequiredAlign))
213 MUserPtr = HostPtr.get();
215 setAlign(RequiredAlign);
216 MShadowCopy = allocateHostMem();
217 MUserPtr = MShadowCopy;
218 std::memcpy(MUserPtr, HostPtr.get(), MSizeInBytes);
224 const size_t RequiredAlign,
bool IsConstPtr) {
225 MHostPtrReadOnly = IsConstPtr;
226 setAlign(RequiredAlign);
229 "Buffer constructor from a pair of iterator values does not support "
230 "use_host_ptr property.",
231 PI_ERROR_INVALID_OPERATION);
233 setAlign(RequiredAlign);
234 MShadowCopy = allocateHostMem();
235 MUserPtr = MShadowCopy;
237 CopyFromInput(MUserPtr);
241 MAllocator->setAlignment(RequiredAlign);
248 void *HostPtr,
RT::PiEvent &InteropEvent)
override {
250 (void)InitFromUserData;
253 throw runtime_error(
"Not implemented", PI_ERROR_INVALID_OPERATION);
262 bool isInterop()
const;
266 void detachMemoryObject(
const std::shared_ptr<SYCLMemObjT> &Self)
const;
270 void determineHostPtr(
const ContextImplPtr &Context,
bool InitFromUserData,
271 void *&HostPtr,
bool &HostPtrReadOnly);