@@ -964,42 +964,122 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalMemoryExp(
964964 ur_exp_external_mem_type_t memHandleType,
965965 ur_exp_interop_mem_desc_t *pInteropMemDesc,
966966 ur_exp_interop_mem_handle_t *phInteropMem) {
967- std::ignore = hContext;
968- std::ignore = hDevice;
969- std::ignore = size;
970- std::ignore = memHandleType;
971- std::ignore = pInteropMemDesc;
972- std::ignore = phInteropMem;
973- logger::error (logger::LegacyMessage (" [UR][L0] {} function not implemented!" ),
974- " {} function not implemented!" , __FUNCTION__);
975- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
967+
968+ UR_ASSERT (hContext && hDevice, UR_RESULT_ERROR_INVALID_NULL_HANDLE);
969+ UR_ASSERT (pInteropMemDesc && phInteropMem,
970+ UR_RESULT_ERROR_INVALID_NULL_POINTER);
971+
972+ struct ur_ze_external_memory_data *externalMemoryData =
973+ new struct ur_ze_external_memory_data ;
974+
975+ void *pNext = const_cast <void *>(pInteropMemDesc->pNext );
976+ while (pNext != nullptr ) {
977+ const ur_base_desc_t *BaseDesc = static_cast <const ur_base_desc_t *>(pNext);
978+ if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_FILE_DESCRIPTOR) {
979+ ze_external_memory_import_fd_t *importFd =
980+ new ze_external_memory_import_fd_t ;
981+ importFd->stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_FD;
982+ importFd->pNext = nullptr ;
983+ auto FileDescriptor =
984+ static_cast <const ur_exp_file_descriptor_t *>(pNext);
985+ importFd->fd = FileDescriptor->fd ;
986+ importFd->flags = ZE_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD;
987+ externalMemoryData->importExtensionDesc = importFd;
988+ externalMemoryData->type = UR_ZE_EXTERNAL_OPAQUE_FD;
989+ } else if (BaseDesc->stype == UR_STRUCTURE_TYPE_EXP_WIN32_HANDLE) {
990+ ze_external_memory_import_win32_handle_t *importWin32 =
991+ new ze_external_memory_import_win32_handle_t ;
992+ importWin32->stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32;
993+ importWin32->pNext = nullptr ;
994+ auto Win32Handle = static_cast <const ur_exp_win32_handle_t *>(pNext);
995+
996+ switch (memHandleType) {
997+ case UR_EXP_EXTERNAL_MEM_TYPE_WIN32_NT:
998+ importWin32->flags = ZE_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32;
999+ break ;
1000+ case UR_EXP_EXTERNAL_MEM_TYPE_WIN32_NT_DX12_RESOURCE:
1001+ importWin32->flags = ZE_EXTERNAL_MEMORY_TYPE_FLAG_D3D12_RESOURCE;
1002+ break ;
1003+ case UR_EXP_EXTERNAL_MEM_TYPE_OPAQUE_FD:
1004+ default :
1005+ return UR_RESULT_ERROR_INVALID_VALUE;
1006+ }
1007+ importWin32->handle = Win32Handle->handle ;
1008+ externalMemoryData->importExtensionDesc = importWin32;
1009+ externalMemoryData->type = UR_ZE_EXTERNAL_WIN32;
1010+ }
1011+ pNext = const_cast <void *>(BaseDesc->pNext );
1012+ }
1013+ externalMemoryData->size = size;
1014+
1015+ *phInteropMem =
1016+ reinterpret_cast <ur_exp_interop_mem_handle_t >(externalMemoryData);
1017+ return UR_RESULT_SUCCESS;
9761018}
9771019
9781020UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalArrayExp (
9791021 ur_context_handle_t hContext, ur_device_handle_t hDevice,
9801022 const ur_image_format_t *pImageFormat, const ur_image_desc_t *pImageDesc,
9811023 ur_exp_interop_mem_handle_t hInteropMem,
9821024 ur_exp_image_mem_handle_t *phImageMem) {
983- std::ignore = hContext;
984- std::ignore = hDevice;
985- std::ignore = pImageFormat;
986- std::ignore = pImageDesc;
987- std::ignore = hInteropMem;
988- std::ignore = phImageMem;
989- logger::error (logger::LegacyMessage (" [UR][L0] {} function not implemented!" ),
990- " {} function not implemented!" , __FUNCTION__);
991- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
1025+
1026+ UR_ASSERT (hContext && hDevice && hInteropMem,
1027+ UR_RESULT_ERROR_INVALID_NULL_HANDLE);
1028+ UR_ASSERT (pImageFormat && pImageDesc, UR_RESULT_ERROR_INVALID_NULL_POINTER);
1029+
1030+ struct ur_ze_external_memory_data *externalMemoryData =
1031+ reinterpret_cast <ur_ze_external_memory_data *>(hInteropMem);
1032+
1033+ ze_image_bindless_exp_desc_t ZeImageBindlessDesc = {};
1034+ ZeImageBindlessDesc.stype = ZE_STRUCTURE_TYPE_BINDLESS_IMAGE_EXP_DESC;
1035+
1036+ ZeStruct<ze_image_desc_t > ZeImageDesc;
1037+ UR_CALL (ur2zeImageDesc (pImageFormat, pImageDesc, ZeImageDesc));
1038+
1039+ ZeImageBindlessDesc.pNext = externalMemoryData->importExtensionDesc ;
1040+ ZeImageBindlessDesc.flags = ZE_IMAGE_BINDLESS_EXP_FLAG_BINDLESS;
1041+ ZeImageDesc.pNext = &ZeImageBindlessDesc;
1042+
1043+ ze_image_handle_t ZeImage;
1044+ ZE2UR_CALL (zeImageCreate,
1045+ (hContext->ZeContext , hDevice->ZeDevice , &ZeImageDesc, &ZeImage));
1046+ ZE2UR_CALL (zeContextMakeImageResident,
1047+ (hContext->ZeContext , hDevice->ZeDevice , ZeImage));
1048+ UR_CALL (createUrMemFromZeImage (hContext, ZeImage, /* OwnZeMemHandle*/ true ,
1049+ ZeImageDesc, phImageMem));
1050+ externalMemoryData->urMemoryHandle =
1051+ reinterpret_cast <ur_mem_handle_t >(*phImageMem);
1052+ return UR_RESULT_SUCCESS;
9921053}
9931054
9941055UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesReleaseInteropExp (
9951056 ur_context_handle_t hContext, ur_device_handle_t hDevice,
9961057 ur_exp_interop_mem_handle_t hInteropMem) {
997- std::ignore = hContext;
998- std::ignore = hDevice;
999- std::ignore = hInteropMem;
1000- logger::error (logger::LegacyMessage (" [UR][L0] {} function not implemented!" ),
1001- " {} function not implemented!" , __FUNCTION__);
1002- return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
1058+
1059+ UR_ASSERT (hContext && hDevice && hInteropMem,
1060+ UR_RESULT_ERROR_INVALID_NULL_HANDLE);
1061+
1062+ struct ur_ze_external_memory_data *externalMemoryData =
1063+ reinterpret_cast <ur_ze_external_memory_data *>(hInteropMem);
1064+
1065+ UR_CALL (urMemRelease (externalMemoryData->urMemoryHandle ));
1066+
1067+ switch (externalMemoryData->type ) {
1068+ case UR_ZE_EXTERNAL_OPAQUE_FD:
1069+ delete (reinterpret_cast <ze_external_memory_import_fd_t *>(
1070+ externalMemoryData->importExtensionDesc ));
1071+ break ;
1072+ case UR_ZE_EXTERNAL_WIN32:
1073+ delete (reinterpret_cast <ze_external_memory_import_win32_handle_t *>(
1074+ externalMemoryData->importExtensionDesc ));
1075+ break ;
1076+ default :
1077+ return UR_RESULT_ERROR_INVALID_VALUE;
1078+ }
1079+
1080+ delete (externalMemoryData);
1081+
1082+ return UR_RESULT_SUCCESS;
10031083}
10041084
10051085UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalSemaphoreExp (
0 commit comments