@@ -964,42 +964,122 @@ UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalMemoryExp(
964
964
ur_exp_external_mem_type_t memHandleType,
965
965
ur_exp_interop_mem_desc_t *pInteropMemDesc,
966
966
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;
976
1018
}
977
1019
978
1020
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesMapExternalArrayExp (
979
1021
ur_context_handle_t hContext, ur_device_handle_t hDevice,
980
1022
const ur_image_format_t *pImageFormat, const ur_image_desc_t *pImageDesc,
981
1023
ur_exp_interop_mem_handle_t hInteropMem,
982
1024
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;
992
1053
}
993
1054
994
1055
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesReleaseInteropExp (
995
1056
ur_context_handle_t hContext, ur_device_handle_t hDevice,
996
1057
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;
1003
1083
}
1004
1084
1005
1085
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalSemaphoreExp (
0 commit comments