@@ -947,42 +947,122 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalMemoryExp(
947
947
ur_exp_external_mem_type_t memHandleType,
948
948
ur_exp_interop_mem_desc_t *pInteropMemDesc,
949
949
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;
959
1001
}
960
1002
961
1003
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalArrayExp (
962
1004
ur_context_handle_t hContext, ur_device_handle_t hDevice,
963
1005
const ur_image_format_t *pImageFormat, const ur_image_desc_t *pImageDesc,
964
1006
ur_exp_interop_mem_handle_t hInteropMem,
965
1007
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;
975
1036
}
976
1037
977
1038
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesReleaseInteropExp (
978
1039
ur_context_handle_t hContext, ur_device_handle_t hDevice,
979
1040
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;
986
1066
}
987
1067
988
1068
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalSemaphoreExp (
0 commit comments