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 )
@@ -181,6 +179,14 @@ void khrIcdVendorAdd(const char *libraryName)
181
179
#endif
182
180
183
181
// call clGetPlatformInfo on the returned platform to get the suffix
182
+
183
+ KHR_ICD2_DISPATCH (platforms [i ])-> clGetPlatformInfo (
184
+ platforms [i ],
185
+ CL_PLATFORM_UNLOADABLE_KHR ,
186
+ sizeof (vendor -> unloadable ),
187
+ & vendor -> unloadable ,
188
+ NULL );
189
+
184
190
result = KHR_ICD2_DISPATCH (platforms [i ])-> clGetPlatformInfo (
185
191
platforms [i ],
186
192
CL_PLATFORM_ICD_SUFFIX_KHR ,
@@ -224,11 +230,13 @@ void khrIcdVendorAdd(const char *libraryName)
224
230
vendor -> suffix = suffix ;
225
231
226
232
// add this vendor to the list of vendors at the tail
227
- {
228
- KHRicdVendor * * prevNextPointer = NULL ;
229
- for (prevNextPointer = & khrIcdVendors ; * prevNextPointer ; prevNextPointer = & ( (* prevNextPointer )-> next ) );
230
- * prevNextPointer = vendor ;
233
+ if (lastVendor ) {
234
+ lastVendor -> next = vendor ;
235
+ vendor -> prev = lastVendor ;
236
+ } else {
237
+ khrIcdVendors = vendor ;
231
238
}
239
+ lastVendor = vendor ;
232
240
233
241
KHR_ICD_TRACE ("successfully added vendor %s with suffix %s\n" , libraryName , suffix );
234
242
@@ -253,6 +261,7 @@ void khrIcdLayerAdd(const char *libraryName)
253
261
cl_int result = CL_SUCCESS ;
254
262
pfn_clGetLayerInfo p_clGetLayerInfo = NULL ;
255
263
pfn_clInitLayer p_clInitLayer = NULL ;
264
+ pfn_clDeinitLayer p_clDeinitLayer = NULL ;
256
265
struct KHRLayer * layerIterator = NULL ;
257
266
struct KHRLayer * layer = NULL ;
258
267
cl_layer_api_version api_version = 0 ;
@@ -302,14 +311,21 @@ void khrIcdLayerAdd(const char *libraryName)
302
311
goto Done ;
303
312
}
304
313
314
+ p_clDeinitLayer = (pfn_clDeinitLayer )(size_t )khrIcdOsLibraryGetFunctionAddress (library , "clDeinitLayer" );
315
+ if (!p_clDeinitLayer )
316
+ {
317
+ KHR_ICD_TRACE ("failed to get function address clDeinitLayer\n" );
318
+ goto Done ;
319
+ }
320
+
305
321
result = p_clGetLayerInfo (CL_LAYER_API_VERSION , sizeof (api_version ), & api_version , NULL );
306
322
if (CL_SUCCESS != result )
307
323
{
308
324
KHR_ICD_TRACE ("failed to query layer version\n" );
309
325
goto Done ;
310
326
}
311
327
312
- if (CL_LAYER_API_VERSION_100 != api_version )
328
+ if (CL_LAYER_API_VERSION_200 != api_version )
313
329
{
314
330
KHR_ICD_TRACE ("unsupported api version\n" );
315
331
goto Done ;
@@ -332,17 +348,18 @@ void khrIcdLayerAdd(const char *libraryName)
332
348
goto Done ;
333
349
}
334
350
memcpy (layer -> libraryName , libraryName , sz_name );
335
- layer -> p_clGetLayerInfo = ( void * )( size_t ) p_clGetLayerInfo ;
351
+ layer -> p_clGetLayerInfo = p_clGetLayerInfo ;
336
352
}
337
353
#endif
354
+ layer -> p_clDeinitLayer = p_clDeinitLayer ;
338
355
339
356
if (khrFirstLayer ) {
340
357
targetDispatch = & (khrFirstLayer -> dispatch );
341
358
} else {
342
- targetDispatch = & khrMasterDispatch ;
359
+ targetDispatch = & khrMainDispatch ;
343
360
}
344
361
345
- loaderDispatchNumEntries = sizeof (khrMasterDispatch )/sizeof (void * );
362
+ loaderDispatchNumEntries = sizeof (khrMainDispatch )/sizeof (void * );
346
363
result = p_clInitLayer (
347
364
loaderDispatchNumEntries ,
348
365
targetDispatch ,
@@ -466,3 +483,43 @@ void khrIcdContextPropertiesGetPlatform(const cl_context_properties *properties,
466
483
}
467
484
}
468
485
486
+ #if defined(CL_ENABLE_LAYERS )
487
+ static struct KHRLayer deinitLayer = {0 };
488
+ #endif
489
+
490
+ void khrIcdDeinitialize (void ) {
491
+
492
+ KHR_ICD_TRACE ("ICD Loader deinitialization\n" );
493
+
494
+ #if defined(CL_ENABLE_LAYERS )
495
+ // free layers first in reverse order of their creation (front to back)
496
+ // they may still need to use vendors while terminating
497
+ KHR_ICD_TRACE ("Finalizing and unloading layers\n" );
498
+ struct KHRLayer * head = khrFirstLayer ;
499
+ deinitLayer .dispatch = khrDeinitDispatch ;
500
+ khrFirstLayer = & deinitLayer ;
501
+
502
+ while (head ) {
503
+ struct KHRLayer * cur = head ;
504
+ #ifdef CL_LAYER_INFO
505
+ free (cur -> libraryName );
506
+ #endif
507
+ cur -> p_clDeinitLayer ();
508
+ khrIcdOsLibraryUnload (cur -> library );
509
+ head = cur -> next ;
510
+ free (cur );
511
+ }
512
+ #endif // defined(CL_ENABLE_LAYERS)
513
+
514
+ // free vendor in reverse order of their creation (back to front)
515
+ KHR_ICD_TRACE ("Finalizing and unloading vendors\n" );
516
+ while (lastVendor ) {
517
+ KHRicdVendor * cur = lastVendor ;
518
+ free (cur -> suffix );
519
+ if (cur -> unloadable )
520
+ khrIcdOsLibraryUnload (cur -> library );
521
+ lastVendor = cur -> prev ;
522
+ free (cur );
523
+ }
524
+ khrIcdVendors = NULL ;
525
+ }
0 commit comments