if (pAllocator) {
dev->alloc_callbacks = *pAllocator;
}
- loader_destroy_layer_list(inst, dev, &dev->expanded_activated_layer_list);
- loader_destroy_layer_list(inst, dev, &dev->app_activated_layer_list);
+ if (NULL != dev->expanded_activated_layer_list.list) {
+ loader_deactivate_layers(inst, dev, &dev->expanded_activated_layer_list);
+ }
+ if (NULL != dev->app_activated_layer_list.list) {
+ loader_destroy_layer_list(inst, dev, &dev->app_activated_layer_list);
+ }
loader_device_heap_free(dev, dev);
}
return ptr_instance;
}
-static loader_platform_dl_handle loader_open_layer_file(const struct loader_instance *inst, struct loader_layer_properties *prop) {
+static loader_platform_dl_handle loader_open_layer_file(const struct loader_instance *inst, const char *chain_type,
+ struct loader_layer_properties *prop) {
if ((prop->lib_handle = loader_platform_open_library(prop->lib_name)) == NULL) {
loader_handle_load_library_error(inst, prop->lib_name, &prop->lib_status);
} else {
continue;
}
- lib_handle = loader_open_layer_file(inst, layer_prop);
+ lib_handle = loader_open_layer_file(inst, "instance", layer_prop);
if (!lib_handle) {
continue;
}
chain_info.pNext = loader_create_info.pNext;
loader_create_info.pNext = &chain_info;
+ bool done = false;
+
// Create instance chain of enabled layers
for (int32_t i = dev->expanded_activated_layer_list.count - 1; i >= 0; i--) {
struct loader_layer_properties *layer_prop = &dev->expanded_activated_layer_list.list[i];
- loader_platform_dl_handle lib_handle = layer_prop->lib_handle;
+ loader_platform_dl_handle lib_handle;
+
// Skip it if a Layer with the same name has been already successfully activated
if (loader_names_array_has_layer_property(&layer_prop->info, num_activated_layers, activated_layers)) {
continue;
}
+ lib_handle = loader_open_layer_file(inst, "device", layer_prop);
+ if (!lib_handle || done) {
+ continue;
+ }
+
// The Get*ProcAddr pointers will already be filled in if they were received from either the json file or the
// version negotiation
if ((fpGIPA = layer_prop->functions.get_instance_proc_addr) == NULL) {
if (layerNextGDPA != NULL) {
*layerNextGDPA = nextGDPA;
}
+ done = true;
continue;
}