diff --git a/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp b/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp index 22ebb8ee97109..9fefa9392deaa 100644 --- a/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp +++ b/sycl/include/CL/sycl/detail/sycl_mem_obj_t.hpp @@ -20,6 +20,7 @@ #include #include +#include #include __SYCL_INLINE_NAMESPACE(cl) { @@ -51,7 +52,13 @@ class __SYCL_EXPORT SYCLMemObjT : public SYCLMemObjI { template using EnableIfOutputIteratorT = enable_if_t< - /*is_output_iterator::value &&*/ !std::is_pointer::value>; + /*is_output_iterator::value &&*/ !std::is_pointer::value && + !std::is_same::value>; + + template + using EnableIfOutputIteratorBool = + enable_if_t::value && + std::is_same::value>; template using EnableIfDefaultAllocator = @@ -184,6 +191,22 @@ class __SYCL_EXPORT SYCLMemObjT : public SYCLMemObjI { }; } + template + __SYCL_DLL_LOCAL EnableIfOutputIteratorBool + set_final_data(Destination FinalData) { + MUploadDataFunctor = [this, FinalData]() { + using DestinationValueT = iterator_value_type_t; + // TODO if Destination is ContiguousIterator then don't create + // ContiguousStorage. updateHostMemory works only with pointer to + // continuous data. + const size_t Size = MSizeInBytes / sizeof(DestinationValueT); + std::unique_ptr ContiguousStorage(new bool[Size]); + updateHostMemory(ContiguousStorage.get()); + std::copy(ContiguousStorage.get(), ContiguousStorage.get() + Size, + FinalData); + }; + } + protected: void updateHostMemory(void *const Ptr);