diff --git a/unified-runtime/source/adapters/offload/context.cpp b/unified-runtime/source/adapters/offload/context.cpp index 2dcbcd4da82f5..f8772de801080 100644 --- a/unified-runtime/source/adapters/offload/context.cpp +++ b/unified-runtime/source/adapters/offload/context.cpp @@ -59,6 +59,7 @@ urContextRelease(ur_context_handle_t hContext) { return UR_RESULT_SUCCESS; } +// Offload currently doesn't have an equivalent to context handles UR_APIEXPORT ur_result_t UR_APICALL urContextGetNativeHandle(ur_context_handle_t, ur_native_handle_t *) { return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; diff --git a/unified-runtime/source/adapters/offload/device.cpp b/unified-runtime/source/adapters/offload/device.cpp index fb18073da4fe2..4c71f62a1ee77 100644 --- a/unified-runtime/source/adapters/offload/device.cpp +++ b/unified-runtime/source/adapters/offload/device.cpp @@ -12,6 +12,7 @@ #include #include +#include "adapters/offload/adapter.hpp" #include "device.hpp" #include "platform.hpp" #include "ur2offload.hpp" @@ -207,14 +208,32 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceSelectBinary( return UR_RESULT_ERROR_INVALID_BINARY; } -UR_APIEXPORT ur_result_t UR_APICALL -urDeviceGetNativeHandle(ur_device_handle_t, ur_native_handle_t *) { - return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; +UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetNativeHandle( + ur_device_handle_t UrDevice, ur_native_handle_t *Handle) { + *Handle = reinterpret_cast(UrDevice->OffloadDevice); + return UR_RESULT_SUCCESS; } UR_APIEXPORT ur_result_t UR_APICALL urDeviceCreateWithNativeHandle( - ur_native_handle_t, ur_adapter_handle_t, - const ur_device_native_properties_t *, ur_device_handle_t *) { + ur_native_handle_t hNativeDevice, ur_adapter_handle_t hAdapter, + const ur_device_native_properties_t *, ur_device_handle_t *phDevice) { + ol_device_handle_t OlDevice = + reinterpret_cast(hNativeDevice); + + // Currently, all devices are found at initialization, there is no way to + // create sub devices yet + for (auto &P : hAdapter->Platforms) { + auto Found = + std::find_if(P->Devices.begin(), P->Devices.end(), + [&](std::unique_ptr &PDevice) { + return PDevice->OffloadDevice == OlDevice; + }); + if (Found != P->Devices.end()) { + *phDevice = Found->get(); + return UR_RESULT_SUCCESS; + } + } + return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; } diff --git a/unified-runtime/source/adapters/offload/platform.cpp b/unified-runtime/source/adapters/offload/platform.cpp index 671dd98fbef68..8558f19585502 100644 --- a/unified-runtime/source/adapters/offload/platform.cpp +++ b/unified-runtime/source/adapters/offload/platform.cpp @@ -95,14 +95,27 @@ urPlatformGetBackendOption(ur_platform_handle_t, const char *pFrontendOption, return UR_RESULT_ERROR_INVALID_VALUE; } -UR_APIEXPORT ur_result_t UR_APICALL -urPlatformGetNativeHandle(ur_platform_handle_t, ur_native_handle_t *) { - return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; +UR_APIEXPORT ur_result_t UR_APICALL urPlatformGetNativeHandle( + ur_platform_handle_t hAdapter, ur_native_handle_t *phNativePlatform) { + *phNativePlatform = + reinterpret_cast(hAdapter->OffloadPlatform); + return UR_RESULT_SUCCESS; } UR_APIEXPORT ur_result_t UR_APICALL urPlatformCreateWithNativeHandle( - ur_native_handle_t, ur_adapter_handle_t, - const ur_platform_native_properties_t *, ur_platform_handle_t *) { + ur_native_handle_t hNativePlatform, ur_adapter_handle_t hAdapter, + const ur_platform_native_properties_t *, ur_platform_handle_t *phPlatform) { + + auto Found = std::find_if( + hAdapter->Platforms.begin(), hAdapter->Platforms.end(), [&](auto &P) { + return P->OffloadPlatform == + reinterpret_cast(hNativePlatform); + }); + if (Found != hAdapter->Platforms.end()) { + *phPlatform = Found->get(); + return UR_RESULT_SUCCESS; + } + return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; }