19
19
#include "icd.h"
20
20
#include "icd_dispatch.h"
21
21
#include "icd_envvars.h"
22
- #if defined(CL_ENABLE_LAYERS )
23
- #include <CL/cl_layer.h>
24
- #endif // defined(CL_ENABLE_LAYERS)
25
22
#include <stdlib.h>
26
23
#include <string.h>
27
24
28
25
KHRicdVendor * khrIcdVendors = NULL ;
26
+ static KHRicdVendor * lastVendor = NULL ;
29
27
int khrEnableTrace = 0 ;
30
28
31
29
#if defined(CL_ENABLE_LAYERS )
@@ -186,6 +184,14 @@ void khrIcdVendorAdd(const char *libraryName)
186
184
#endif
187
185
188
186
// call clGetPlatformInfo on the returned platform to get the suffix
187
+
188
+ KHR_ICD2_DISPATCH (platforms [i ])-> clGetPlatformInfo (
189
+ platforms [i ],
190
+ CL_PLATFORM_UNLOADABLE_KHR ,
191
+ sizeof (vendor -> unloadable ),
192
+ & vendor -> unloadable ,
193
+ NULL );
194
+
189
195
result = KHR_ICD2_DISPATCH (platforms [i ])-> clGetPlatformInfo (
190
196
platforms [i ],
191
197
CL_PLATFORM_ICD_SUFFIX_KHR ,
@@ -229,11 +235,13 @@ void khrIcdVendorAdd(const char *libraryName)
229
235
vendor -> suffix = suffix ;
230
236
231
237
// add this vendor to the list of vendors at the tail
232
- {
233
- KHRicdVendor * * prevNextPointer = NULL ;
234
- for (prevNextPointer = & khrIcdVendors ; * prevNextPointer ; prevNextPointer = & ( (* prevNextPointer )-> next ) );
235
- * prevNextPointer = vendor ;
238
+ if (lastVendor ) {
239
+ lastVendor -> next = vendor ;
240
+ vendor -> prev = lastVendor ;
241
+ } else {
242
+ khrIcdVendors = vendor ;
236
243
}
244
+ lastVendor = vendor ;
237
245
238
246
KHR_ICD_TRACE ("successfully added vendor %s with suffix %s\n" , libraryName , suffix );
239
247
@@ -258,6 +266,7 @@ void khrIcdLayerAdd(const char *libraryName)
258
266
cl_int result = CL_SUCCESS ;
259
267
pfn_clGetLayerInfo p_clGetLayerInfo = NULL ;
260
268
pfn_clInitLayer p_clInitLayer = NULL ;
269
+ pfn_clDeinitLayer p_clDeinitLayer = NULL ;
261
270
struct KHRLayer * layerIterator = NULL ;
262
271
struct KHRLayer * layer = NULL ;
263
272
cl_layer_api_version api_version = 0 ;
@@ -307,14 +316,21 @@ void khrIcdLayerAdd(const char *libraryName)
307
316
goto Done ;
308
317
}
309
318
319
+ p_clDeinitLayer = (pfn_clDeinitLayer )(size_t )khrIcdOsLibraryGetFunctionAddress (library , "clDeinitLayer" );
320
+ if (!p_clDeinitLayer )
321
+ {
322
+ KHR_ICD_TRACE ("failed to get function address clDeinitLayer\n" );
323
+ goto Done ;
324
+ }
325
+
310
326
result = p_clGetLayerInfo (CL_LAYER_API_VERSION , sizeof (api_version ), & api_version , NULL );
311
327
if (CL_SUCCESS != result )
312
328
{
313
329
KHR_ICD_TRACE ("failed to query layer version\n" );
314
330
goto Done ;
315
331
}
316
332
317
- if (CL_LAYER_API_VERSION_100 != api_version )
333
+ if (CL_LAYER_API_VERSION_200 != api_version )
318
334
{
319
335
KHR_ICD_TRACE ("unsupported api version\n" );
320
336
goto Done ;
@@ -337,17 +353,18 @@ void khrIcdLayerAdd(const char *libraryName)
337
353
goto Done ;
338
354
}
339
355
memcpy (layer -> libraryName , libraryName , sz_name );
340
- layer -> p_clGetLayerInfo = ( void * )( size_t ) p_clGetLayerInfo ;
356
+ layer -> p_clGetLayerInfo = p_clGetLayerInfo ;
341
357
}
342
358
#endif
359
+ layer -> p_clDeinitLayer = p_clDeinitLayer ;
343
360
344
361
if (khrFirstLayer ) {
345
362
targetDispatch = & (khrFirstLayer -> dispatch );
346
363
} else {
347
- targetDispatch = & khrMasterDispatch ;
364
+ targetDispatch = & khrMainDispatch ;
348
365
}
349
366
350
- loaderDispatchNumEntries = sizeof (khrMasterDispatch )/sizeof (void * );
367
+ loaderDispatchNumEntries = sizeof (khrMainDispatch )/sizeof (void * );
351
368
result = p_clInitLayer (
352
369
loaderDispatchNumEntries ,
353
370
targetDispatch ,
@@ -471,3 +488,43 @@ void khrIcdContextPropertiesGetPlatform(const cl_context_properties *properties,
471
488
}
472
489
}
473
490
491
+ #if defined(CL_ENABLE_LAYERS )
492
+ static struct KHRLayer deinitLayer = {0 };
493
+ #endif
494
+
495
+ void khrIcdDeinitialize (void ) {
496
+
497
+ KHR_ICD_TRACE ("ICD Loader deinitialization\n" );
498
+
499
+ #if defined(CL_ENABLE_LAYERS )
500
+ // free layers first in reverse order of their creation (front to back)
501
+ // they may still need to use vendors while terminating
502
+ KHR_ICD_TRACE ("Finalizing and unloading layers\n" );
503
+ struct KHRLayer * head = khrFirstLayer ;
504
+ deinitLayer .dispatch = khrDeinitDispatch ;
505
+ khrFirstLayer = & deinitLayer ;
506
+
507
+ while (head ) {
508
+ struct KHRLayer * cur = head ;
509
+ #ifdef CL_LAYER_INFO
510
+ free (cur -> libraryName );
511
+ #endif
512
+ cur -> p_clDeinitLayer ();
513
+ khrIcdOsLibraryUnload (cur -> library );
514
+ head = cur -> next ;
515
+ free (cur );
516
+ }
517
+ #endif // defined(CL_ENABLE_LAYERS)
518
+
519
+ // free vendor in reverse order of their creation (back to front)
520
+ KHR_ICD_TRACE ("Finalizing and unloading vendors\n" );
521
+ while (lastVendor ) {
522
+ KHRicdVendor * cur = lastVendor ;
523
+ free (cur -> suffix );
524
+ if (cur -> unloadable )
525
+ khrIcdOsLibraryUnload (cur -> library );
526
+ lastVendor = cur -> prev ;
527
+ free (cur );
528
+ }
529
+ khrIcdVendors = NULL ;
530
+ }
0 commit comments