@@ -37,6 +37,38 @@ ur_result_t setupContext(ur_context_handle_t Context, uint32_t numDevices,
37
37
38
38
} // namespace
39
39
40
+ // /////////////////////////////////////////////////////////////////////////////
41
+ // / @brief Intercept function for urAdapterGet
42
+ __urdlllocal ur_result_t UR_APICALL urAdapterGet (
43
+ uint32_t
44
+ NumEntries, // /< [in] the number of adapters to be added to phAdapters.
45
+ // /< If phAdapters is not NULL, then NumEntries should be greater than
46
+ // /< zero, otherwise ::UR_RESULT_ERROR_INVALID_SIZE,
47
+ // /< will be returned.
48
+ ur_adapter_handle_t *
49
+ phAdapters, // /< [out][optional][range(0, NumEntries)] array of handle of adapters.
50
+ // /< If NumEntries is less than the number of adapters available, then
51
+ // /< ::urAdapterGet shall only retrieve that number of platforms.
52
+ uint32_t *
53
+ pNumAdapters // /< [out][optional] returns the total number of adapters available.
54
+ ) {
55
+ auto pfnAdapterGet = getContext ()->urDdiTable .Global .pfnAdapterGet ;
56
+
57
+ if (nullptr == pfnAdapterGet) {
58
+ return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
59
+ }
60
+
61
+ ur_result_t result = pfnAdapterGet (NumEntries, phAdapters, pNumAdapters);
62
+ if (result == UR_RESULT_SUCCESS) {
63
+ const uint32_t NumAdapters = pNumAdapters ? *pNumAdapters : NumEntries;
64
+ for (uint32_t i = 0 ; i < NumAdapters; ++i) {
65
+ getContext ()->interceptor ->holdAdapter (phAdapters[i]);
66
+ }
67
+ }
68
+
69
+ return result;
70
+ }
71
+
40
72
// /////////////////////////////////////////////////////////////////////////////
41
73
// / @brief Intercept function for urUSMHostAlloc
42
74
__urdlllocal ur_result_t UR_APICALL urUSMHostAlloc (
@@ -1274,6 +1306,38 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgLocal(
1274
1306
return result;
1275
1307
}
1276
1308
1309
+ // /////////////////////////////////////////////////////////////////////////////
1310
+ // / @brief Exported function for filling application's Global table
1311
+ // / with current process' addresses
1312
+ // /
1313
+ // / @returns
1314
+ // / - ::UR_RESULT_SUCCESS
1315
+ // / - ::UR_RESULT_ERROR_INVALID_NULL_POINTER
1316
+ // / - ::UR_RESULT_ERROR_UNSUPPORTED_VERSION
1317
+ __urdlllocal ur_result_t UR_APICALL urGetGlobalProcAddrTable (
1318
+ ur_api_version_t version, // /< [in] API version requested
1319
+ ur_global_dditable_t
1320
+ *pDdiTable // /< [in,out] pointer to table of DDI function pointers
1321
+ ) {
1322
+ auto &dditable = ur_sanitizer_layer::getContext ()->urDdiTable .Global ;
1323
+
1324
+ if (nullptr == pDdiTable) {
1325
+ return UR_RESULT_ERROR_INVALID_NULL_POINTER;
1326
+ }
1327
+
1328
+ if (UR_MAJOR_VERSION (ur_sanitizer_layer::getContext ()->version ) !=
1329
+ UR_MAJOR_VERSION (version) ||
1330
+ UR_MINOR_VERSION (ur_sanitizer_layer::getContext ()->version ) >
1331
+ UR_MINOR_VERSION (version)) {
1332
+ return UR_RESULT_ERROR_UNSUPPORTED_VERSION;
1333
+ }
1334
+
1335
+ ur_result_t result = UR_RESULT_SUCCESS;
1336
+
1337
+ pDdiTable->pfnAdapterGet = ur_sanitizer_layer::urAdapterGet;
1338
+
1339
+ return result;
1340
+ }
1277
1341
// /////////////////////////////////////////////////////////////////////////////
1278
1342
// / @brief Exported function for filling application's Context table
1279
1343
// / with current process' addresses
@@ -1545,6 +1609,11 @@ ur_result_t context_t::init(ur_dditable_t *dditable,
1545
1609
1546
1610
urDdiTable = *dditable;
1547
1611
1612
+ if (UR_RESULT_SUCCESS == result) {
1613
+ result = ur_sanitizer_layer::urGetGlobalProcAddrTable (
1614
+ UR_API_VERSION_CURRENT, &dditable->Global );
1615
+ }
1616
+
1548
1617
if (UR_RESULT_SUCCESS == result) {
1549
1618
result = ur_sanitizer_layer::urGetContextProcAddrTable (
1550
1619
UR_API_VERSION_CURRENT, &dditable->Context );
0 commit comments