5#if defined(WITH_ONEAPI) && defined(SYCL_LINEAR_MEMORY_INTEROP_AVAILABLE)
23OneapiDeviceGraphicsInterop::OneapiDeviceGraphicsInterop(OneapiDeviceQueue *queue)
24 : queue_(queue), device_(static_cast<OneapiDevice *>(queue->device))
28OneapiDeviceGraphicsInterop::~OneapiDeviceGraphicsInterop()
51 <<
"oneAPI interop set_buffer called for invalid graphics API. Only Vulkan is supported.";
57 vulkan_windows_handle_ =
reinterpret_cast<void *
>(interop_buffer.
take_handle());
58 auto sycl_mem_handle_type =
59 sycl::ext::oneapi::experimental::external_mem_handle_type::win32_nt_handle;
60 sycl::ext::oneapi::experimental::external_mem_descriptor<
61 sycl::ext::oneapi::experimental::resource_win32_handle>
62 sycl_external_mem_descriptor{vulkan_windows_handle_, sycl_mem_handle_type};
65 auto sycl_mem_handle_type = sycl::ext::oneapi::experimental::external_mem_handle_type::opaque_fd;
66 sycl::ext::oneapi::experimental::external_mem_descriptor<
67 sycl::ext::oneapi::experimental::resource_fd>
68 sycl_external_mem_descriptor{
static_cast<int>(interop_buffer.
take_handle()),
69 sycl_mem_handle_type};
72 sycl::queue *sycl_queue =
reinterpret_cast<sycl::queue *
>(device_->sycl_queue());
74 sycl_external_memory_ = sycl::ext::oneapi::experimental::import_external_memory(
75 sycl_external_mem_descriptor, *sycl_queue);
77 catch (sycl::exception &
e) {
79 CloseHandle(HANDLE(vulkan_windows_handle_));
80 vulkan_windows_handle_ =
nullptr;
82 close(sycl_external_mem_descriptor.external_resource.file_descriptor);
84 LOG_ERROR <<
"Error importing Vulkan memory: " <<
e.what();
88 buffer_size_ = interop_buffer.
get_size();
92 sycl_memory_ptr_ = sycl::ext::oneapi::experimental::map_external_linear_memory(
93 sycl_external_memory_, 0, buffer_size_, *sycl_queue);
95 catch (sycl::exception &
e) {
97 sycl::ext::oneapi::experimental::release_external_memory(sycl_external_memory_, *sycl_queue);
99 catch (sycl::exception &
e) {
100 LOG_ERROR <<
"Could not release external Vulkan memory: " <<
e.what();
102 sycl_external_memory_ = {};
106 CloseHandle(HANDLE(vulkan_windows_handle_));
107 vulkan_windows_handle_ =
nullptr;
109 LOG_ERROR <<
"Error mapping external Vulkan memory: " <<
e.what();
116 if (sycl_memory_ptr_ && need_zero_) {
119 sycl::queue *sycl_queue =
reinterpret_cast<sycl::queue *
>(device_->sycl_queue());
120 sycl_queue->memset(sycl_memory_ptr_, 0, buffer_size_);
122 catch (sycl::exception &
e) {
123 LOG_ERROR <<
"Error clearing external Vulkan memory: " <<
e.what();
129 return reinterpret_cast<device_ptr>(sycl_memory_ptr_);
132void OneapiDeviceGraphicsInterop::unmap() {}
134void OneapiDeviceGraphicsInterop::free()
136 if (sycl_external_memory_.raw_handle) {
137 sycl::queue *sycl_queue =
reinterpret_cast<sycl::queue *
>(device_->sycl_queue());
139 sycl::ext::oneapi::experimental::unmap_external_linear_memory(sycl_memory_ptr_, *sycl_queue);
141 catch (sycl::exception &
e) {
142 LOG_ERROR <<
"Could not unmap external Vulkan memory: " <<
e.what();
145 sycl::ext::oneapi::experimental::release_external_memory(sycl_external_memory_, *sycl_queue);
147 catch (sycl::exception &
e) {
148 LOG_ERROR <<
"Could not release external Vulkan memory: " <<
e.what();
150 sycl_memory_ptr_ = {};
151 sycl_external_memory_ = {};
155 if (vulkan_windows_handle_) {
156 CloseHandle(HANDLE(vulkan_windows_handle_));
157 vulkan_windows_handle_ =
nullptr;
void BLI_kdtree_nd_ free(KDTree *tree)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
bool has_new_handle() const
GraphicsInteropDevice::Type get_type() const
#define CCL_NAMESPACE_END