22CUDADeviceGraphicsInterop::CUDADeviceGraphicsInterop(CUDADeviceQueue *queue)
23 : queue_(queue), device_(static_cast<CUDADevice *>(queue->device))
27CUDADeviceGraphicsInterop::~CUDADeviceGraphicsInterop()
29 CUDAContextScope scope(device_);
35 CUDAContextScope scope(device_);
51 const CUresult
result = cuGraphicsGLRegisterBuffer(&cu_graphics_resource_,
53 CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE);
54 if (
result != CUDA_SUCCESS) {
55 LOG_ERROR <<
"Error registering OpenGL buffer: " << cuewErrorString(
result);
59 buffer_size_ = interop_buffer.
get_size();
63 CUDA_EXTERNAL_MEMORY_HANDLE_DESC external_memory_handle_desc = {};
66 vulkan_windows_handle_ = interop_buffer.
take_handle();
67 external_memory_handle_desc.type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32;
68 external_memory_handle_desc.handle.win32.handle =
reinterpret_cast<void *
>(
69 vulkan_windows_handle_);
72 external_memory_handle_desc.type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD;
73 external_memory_handle_desc.handle.fd = interop_buffer.
take_handle();
75 external_memory_handle_desc.size = interop_buffer.
get_size();
77 CUresult
result = cuImportExternalMemory(&cu_external_memory_, &external_memory_handle_desc);
78 if (
result != CUDA_SUCCESS) {
80 CloseHandle(HANDLE(vulkan_windows_handle_));
81 vulkan_windows_handle_ = 0;
83 close(external_memory_handle_desc.handle.fd);
85 LOG_ERROR <<
"Error importing Vulkan memory: " << cuewErrorString(
result);
89 buffer_size_ = interop_buffer.
get_size();
91 CUDA_EXTERNAL_MEMORY_BUFFER_DESC external_memory_buffer_desc = {};
92 external_memory_buffer_desc.size = external_memory_handle_desc.size;
93 external_memory_buffer_desc.offset = 0;
95 CUdeviceptr external_memory_device_ptr = 0;
96 result = cuExternalMemoryGetMappedBuffer(
97 &external_memory_device_ptr, cu_external_memory_, &external_memory_buffer_desc);
98 if (
result != CUDA_SUCCESS) {
99 if (external_memory_device_ptr) {
100 cuMemFree(external_memory_device_ptr);
101 external_memory_device_ptr = 0;
104 LOG_ERROR <<
"Error mapping Vulkan memory: " << cuewErrorString(
result);
108 cu_external_memory_ptr_ = external_memory_device_ptr;
119 CUdeviceptr cu_buffer = 0;
121 if (cu_graphics_resource_) {
123 CUDAContextScope scope(device_);
126 cuda_device_assert(device_,
127 cuGraphicsMapResources(1, &cu_graphics_resource_, queue_->stream()));
129 device_, cuGraphicsResourceGetMappedPointer(&cu_buffer, &bytes, cu_graphics_resource_));
133 cu_buffer = cu_external_memory_ptr_;
136 if (cu_buffer && need_zero_) {
137 cuda_device_assert(device_, cuMemsetD8Async(cu_buffer, 0, buffer_size_, queue_->stream()));
145void CUDADeviceGraphicsInterop::unmap()
147 if (cu_graphics_resource_) {
148 CUDAContextScope scope(device_);
150 cuda_device_assert(device_,
151 cuGraphicsUnmapResources(1, &cu_graphics_resource_, queue_->stream()));
155void CUDADeviceGraphicsInterop::free()
157 if (cu_graphics_resource_) {
158 cuda_device_assert(device_, cuGraphicsUnregisterResource(cu_graphics_resource_));
159 cu_graphics_resource_ =
nullptr;
162 if (cu_external_memory_ptr_) {
163 cuda_device_assert(device_, cuMemFree(cu_external_memory_ptr_));
164 cu_external_memory_ptr_ = 0;
167 if (cu_external_memory_) {
168 cuda_device_assert(device_, cuDestroyExternalMemory(cu_external_memory_));
169 cu_external_memory_ =
nullptr;
173 if (vulkan_windows_handle_) {
174 CloseHandle(HANDLE(vulkan_windows_handle_));
175 vulkan_windows_handle_ = 0;
void BLI_kdtree_nd_ free(KDTree *tree)
bool has_new_handle() const
GraphicsInteropDevice::Type get_type() const
#define CCL_NAMESPACE_END