Skip to content

Commit 00ca0da

Browse files
authored
Merge pull request #1696 from nrspruit/l0_windows_interop
[L0] Support for Bindless Image Import
2 parents 7b64045 + abab204 commit 00ca0da

File tree

2 files changed

+116
-24
lines changed

2 files changed

+116
-24
lines changed

source/adapters/level_zero/device.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ struct ze_global_memsize {
4444
uint64_t value;
4545
};
4646

47+
enum ur_ze_external_memory_desc_type {
48+
UR_ZE_EXTERNAL_OPAQUE_FD,
49+
UR_ZE_EXTERNAL_WIN32,
50+
};
51+
52+
struct ur_ze_external_memory_data {
53+
void *importExtensionDesc;
54+
ur_mem_handle_t urMemoryHandle;
55+
enum ur_ze_external_memory_desc_type type;
56+
size_t size;
57+
};
58+
4759
struct ur_device_handle_t_ : _ur_object {
4860
ur_device_handle_t_(ze_device_handle_t Device, ur_platform_handle_t Plt,
4961
ur_device_handle_t ParentDevice = nullptr)

source/adapters/level_zero/image.cpp

Lines changed: 104 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

9781020
UR_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

9941055
UR_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

10051085
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalSemaphoreExp(

0 commit comments

Comments
 (0)