@@ -947,42 +947,122 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalMemoryExp(
947947 ur_exp_external_mem_type_t memHandleType,
948948 ur_exp_interop_mem_desc_t *pInteropMemDesc,
949949 ur_exp_interop_mem_handle_t *phInteropMem) {
950- std::ignore = hContext;
951- std::ignore = hDevice;
952- std::ignore = size;
953- std::ignore = memHandleType;
954- std::ignore = pInteropMemDesc;
955- std::ignore = phInteropMem;
956- logger::error (logger::LegacyMessage (" [UR][L0] {} function not implemented!" ),
957- " {} function not implemented!" , __FUNCTION__);
958- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
950+
951+ UR_ASSERT (hContext && hDevice, UR_RESULT_ERROR_INVALID_NULL_HANDLE);
952+ UR_ASSERT (pInteropMemDesc && phInteropMem,
953+ UR_RESULT_ERROR_INVALID_NULL_POINTER);
954+
955+ struct ur_ze_external_memory_data *externalMemoryData =
956+ new struct ur_ze_external_memory_data ;
957+
958+ void *pNext = const_cast <void *>(pInteropMemDesc->pNext );
959+ while (pNext != nullptr ) {
960+ const ur_base_desc_t *BaseDesc = static_cast <const ur_base_desc_t *>(pNext);
961+ if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_FILE_DESCRIPTOR) {
962+ ze_external_memory_import_fd_t *importFd =
963+ new ze_external_memory_import_fd_t ;
964+ importFd->stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_FD;
965+ importFd->pNext = nullptr ;
966+ auto FileDescriptor =
967+ static_cast <const ur_exp_file_descriptor_t *>(pNext);
968+ importFd->fd = FileDescriptor->fd ;
969+ importFd->flags = ZE_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD;
970+ externalMemoryData->importExtensionDesc = importFd;
971+ externalMemoryData->type = UR_ZE_EXTERNAL_OPAQUE_FD;
972+ } else if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_WIN32_HANDLE) {
973+ ze_external_memory_import_win32_handle_t *importWin32 =
974+ new ze_external_memory_import_win32_handle_t ;
975+ importWin32->stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32;
976+ importWin32->pNext = nullptr ;
977+ auto Win32Handle = static_cast <const ur_exp_win32_handle_t *>(pNext);
978+
979+ switch (memHandleType) {
980+ case UR_EXP_EXTERNAL_MEM_TYPE_WIN32_NT:
981+ importWin32->flags = ZE_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32;
982+ break ;
983+ case UR_EXP_EXTERNAL_MEM_TYPE_WIN32_NT_DX12_RESOURCE:
984+ importWin32->flags = ZE_EXTERNAL_MEMORY_TYPE_FLAG_D3D12_RESOURCE;
985+ break ;
986+ case UR_EXP_EXTERNAL_MEM_TYPE_OPAQUE_FD:
987+ default :
988+ return UR_RESULT_ERROR_INVALID_VALUE;
989+ }
990+ importWin32->handle = Win32Handle->handle ;
991+ externalMemoryData->importExtensionDesc = importWin32;
992+ externalMemoryData->type = UR_ZE_EXTERNAL_WIN32;
993+ }
994+ pNext = const_cast <void *>(BaseDesc->pNext );
995+ }
996+ externalMemoryData->size = size;
997+
998+ *phInteropMem =
999+ reinterpret_cast <ur_exp_interop_mem_handle_t >(externalMemoryData);
1000+ return UR_RESULT_SUCCESS;
9591001}
9601002
9611003UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalArrayExp (
9621004 ur_context_handle_t hContext, ur_device_handle_t hDevice,
9631005 const ur_image_format_t *pImageFormat, const ur_image_desc_t *pImageDesc,
9641006 ur_exp_interop_mem_handle_t hInteropMem,
9651007 ur_exp_image_mem_handle_t *phImageMem) {
966- std::ignore = hContext;
967- std::ignore = hDevice;
968- std::ignore = pImageFormat;
969- std::ignore = pImageDesc;
970- std::ignore = hInteropMem;
971- std::ignore = phImageMem;
972- logger::error (logger::LegacyMessage (" [UR][L0] {} function not implemented!" ),
973- " {} function not implemented!" , __FUNCTION__);
974- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
1008+
1009+ UR_ASSERT (hContext && hDevice && hInteropMem,
1010+ UR_RESULT_ERROR_INVALID_NULL_HANDLE);
1011+ UR_ASSERT (pImageFormat && pImageDesc, UR_RESULT_ERROR_INVALID_NULL_POINTER);
1012+
1013+ struct ur_ze_external_memory_data *externalMemoryData =
1014+ reinterpret_cast <ur_ze_external_memory_data *>(hInteropMem);
1015+
1016+ ze_image_bindless_exp_desc_t ZeImageBindlessDesc = {};
1017+ ZeImageBindlessDesc.stype = ZE_STRUCTURE_TYPE_BINDLESS_IMAGE_EXP_DESC;
1018+
1019+ ZeStruct<ze_image_desc_t > ZeImageDesc;
1020+ UR_CALL (ur2zeImageDesc (pImageFormat, pImageDesc, ZeImageDesc));
1021+
1022+ ZeImageBindlessDesc.pNext = externalMemoryData->importExtensionDesc ;
1023+ ZeImageBindlessDesc.flags = ZE_IMAGE_BINDLESS_EXP_FLAG_BINDLESS;
1024+ ZeImageDesc.pNext = &ZeImageBindlessDesc;
1025+
1026+ ze_image_handle_t ZeImage;
1027+ ZE2UR_CALL (zeImageCreate,
1028+ (hContext->ZeContext , hDevice->ZeDevice , &ZeImageDesc, &ZeImage));
1029+ ZE2UR_CALL (zeContextMakeImageResident,
1030+ (hContext->ZeContext , hDevice->ZeDevice , ZeImage));
1031+ UR_CALL (createUrMemFromZeImage (hContext, ZeImage, /* OwnZeMemHandle*/ true ,
1032+ ZeImageDesc, phImageMem));
1033+ externalMemoryData->urMemoryHandle =
1034+ reinterpret_cast <ur_mem_handle_t >(*phImageMem);
1035+ return UR_RESULT_SUCCESS;
9751036}
9761037
9771038UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesReleaseInteropExp (
9781039 ur_context_handle_t hContext, ur_device_handle_t hDevice,
9791040 ur_exp_interop_mem_handle_t hInteropMem) {
980- std::ignore = hContext;
981- std::ignore = hDevice;
982- std::ignore = hInteropMem;
983- logger::error (logger::LegacyMessage (" [UR][L0] {} function not implemented!" ),
984- " {} function not implemented!" , __FUNCTION__);
985- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
1041+
1042+ UR_ASSERT (hContext && hDevice && hInteropMem,
1043+ UR_RESULT_ERROR_INVALID_NULL_HANDLE);
1044+
1045+ struct ur_ze_external_memory_data *externalMemoryData =
1046+ reinterpret_cast <ur_ze_external_memory_data *>(hInteropMem);
1047+
1048+ UR_CALL (urMemRelease (externalMemoryData->urMemoryHandle ));
1049+
1050+ switch (externalMemoryData->type ) {
1051+ case UR_ZE_EXTERNAL_OPAQUE_FD:
1052+ delete (reinterpret_cast <ze_external_memory_import_fd_t *>(
1053+ externalMemoryData->importExtensionDesc ));
1054+ break ;
1055+ case UR_ZE_EXTERNAL_WIN32:
1056+ delete (reinterpret_cast <ze_external_memory_import_win32_handle_t *>(
1057+ externalMemoryData->importExtensionDesc ));
1058+ break ;
1059+ default :
1060+ return UR_RESULT_ERROR_INVALID_VALUE;
1061+ }
1062+
1063+ delete (externalMemoryData);
1064+
1065+ return UR_RESULT_SUCCESS;
9861066}
9871067
9881068UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalSemaphoreExp (
0 commit comments