Skip to content

Commit abab204

Browse files
committed
[L0] Support for Bindless Image Import
Signed-off-by: Neil R. Spruit <[email protected]>
1 parent 2a31795 commit abab204

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
@@ -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

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

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

9881068
UR_APIEXPORT ur_result_t UR_APICALL urBindlessImagesImportExternalSemaphoreExp(

0 commit comments

Comments
 (0)