loader: Convert ext list helper functions to generic form
This allows future changes where the device and instance ext lists are different
types.
diff --git a/loader/loader.c b/loader/loader.c
index 5fb9f85..a78ce98 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -63,9 +63,10 @@
// TLS for instance for alloc/free callbacks
THREAD_LOCAL_DECL struct loader_instance *tls_instance;
-static bool loader_init_ext_list(
+static bool loader_init_generic_list(
const struct loader_instance *inst,
- struct loader_extension_list *ext_info);
+ struct loader_generic_list *list_info,
+ size_t element_size);
static int loader_platform_combine_path(char *dest, int len, ...);
@@ -501,8 +502,10 @@
return;
for (i = 0; i < layer_list->count; i++) {
- loader_destroy_ext_list(inst, &layer_list->list[i].instance_extension_list);
- loader_destroy_ext_list(inst, &layer_list->list[i].device_extension_list);
+ loader_destroy_generic_list(inst, (struct loader_generic_list *)
+ &layer_list->list[i].instance_extension_list);
+ loader_destroy_generic_list(inst, (struct loader_generic_list *)
+ &layer_list->list[i].device_extension_list);
}
layer_list->count = 0;
@@ -577,7 +580,8 @@
VkResult res;
uint32_t i;
- if (!loader_init_ext_list(inst, ext_list)) {
+ if (!loader_init_generic_list(inst, (struct loader_generic_list *) ext_list,
+ sizeof(VkExtensionProperties))) {
return VK_ERROR_OUT_OF_HOST_MEMORY;
}
@@ -639,25 +643,26 @@
return VK_SUCCESS;
}
-static bool loader_init_ext_list(const struct loader_instance *inst,
- struct loader_extension_list *ext_info)
+static bool loader_init_generic_list(const struct loader_instance *inst,
+ struct loader_generic_list *list_info,
+ size_t element_size)
{
- ext_info->capacity = 32 * sizeof(VkExtensionProperties);
- ext_info->list = loader_heap_alloc(inst, ext_info->capacity, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
- if (ext_info->list == NULL) {
+ list_info->capacity = 32 * element_size;
+ list_info->list = loader_heap_alloc(inst, list_info->capacity, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
+ if (list_info->list == NULL) {
return false;
}
- memset(ext_info->list, 0, ext_info->capacity);
- ext_info->count = 0;
+ memset(list_info->list, 0, list_info->capacity);
+ list_info->count = 0;
return true;
}
-void loader_destroy_ext_list(const struct loader_instance *inst,
- struct loader_extension_list *ext_info)
+void loader_destroy_generic_list(const struct loader_instance *inst,
+ struct loader_generic_list *list)
{
- loader_heap_free(inst, ext_info->list);
- ext_info->count = 0;
- ext_info->capacity = 0;
+ loader_heap_free(inst, list->list);
+ list->count = 0;
+ list->capacity = 0;
}
/*
@@ -676,7 +681,8 @@
const VkExtensionProperties *cur_ext;
if (ext_list->list == NULL || ext_list->capacity == 0) {
- loader_init_ext_list(inst, ext_list);
+ loader_init_generic_list(inst, (struct loader_generic_list *) ext_list,
+ sizeof(VkExtensionProperties));
}
if (ext_list->list == NULL)
@@ -985,14 +991,15 @@
loader_log(VK_DBG_REPORT_DEBUG_BIT, 0, "Build ICD instance extension list");
// traverse scanned icd list adding non-duplicate extensions to the list
for (uint32_t i = 0; i < icd_libs->count; i++) {
- loader_init_ext_list(inst, &icd_exts);
+ loader_init_generic_list(inst, (struct loader_generic_list *) &icd_exts,
+ sizeof(VkExtensionProperties));
loader_add_global_extensions(inst, icd_libs->list[i].EnumerateInstanceExtensionProperties,
icd_libs->list[i].lib_name,
&icd_exts);
loader_add_to_ext_list(inst, inst_exts,
icd_exts.count,
icd_exts.list);
- loader_destroy_ext_list(inst, &icd_exts);
+ loader_destroy_generic_list(inst, (struct loader_generic_list *) &icd_exts);
};
// Traverse loader's extensions, adding non-duplicate extensions to the list
@@ -1667,8 +1674,8 @@
ext_item = cJSON_GetArrayItem(instance_extensions, i);
GET_JSON_ITEM(ext_item, name)
GET_JSON_ITEM(ext_item, spec_version)
- strncpy(ext_prop.extensionName, name, sizeof (ext_prop.extensionName));
- ext_prop.extensionName[sizeof (ext_prop.extensionName) - 1] = '\0';
+ strncpy(ext_prop.extensionName, name, sizeof (ext_prop.extensionName));
+ ext_prop.extensionName[sizeof (ext_prop.extensionName) - 1] = '\0';
ext_prop.specVersion = atoi(spec_version);
loader_add_to_ext_list(inst, &props->instance_extension_list, 1, &ext_prop);
}
@@ -1680,12 +1687,12 @@
ext_item = cJSON_GetArrayItem(device_extensions, i);
GET_JSON_ITEM(ext_item, name);
GET_JSON_ITEM(ext_item, spec_version);
- strncpy(ext_prop.extensionName, name, sizeof (ext_prop.extensionName));
- ext_prop.extensionName[sizeof (ext_prop.extensionName) - 1] = '\0';
+ strncpy(ext_prop.extensionName, name, sizeof (ext_prop.extensionName));
+ ext_prop.extensionName[sizeof (ext_prop.extensionName) - 1] = '\0';
ext_prop.specVersion = atoi(spec_version);
loader_add_to_ext_list(inst, &props->device_extension_list, 1, &ext_prop);
- }
- }
+ }
+ }
if (is_implicit) {
GET_JSON_OBJECT(layer_node, enable_environment)
strncpy(props->enable_env_var.name, enable_environment->child->string, sizeof (props->enable_env_var.name));
@@ -3018,9 +3025,11 @@
loader_delete_layer_properties(ptr_instance, &ptr_instance->device_layer_list);
loader_delete_layer_properties(ptr_instance, &ptr_instance->instance_layer_list);
loader_scanned_icd_clear(ptr_instance, &ptr_instance->icd_libs);
- loader_destroy_ext_list(ptr_instance, &ptr_instance->ext_list);
+ loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
+ &ptr_instance->ext_list);
for (uint32_t i = 0; i < ptr_instance->total_gpu_count; i++)
- loader_destroy_ext_list(ptr_instance, &ptr_instance->phys_devs[i].device_extension_cache);
+ loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
+ &ptr_instance->phys_devs[i].device_extension_cache);
loader_heap_free(ptr_instance, ptr_instance->phys_devs);
loader_free_dev_ext_table(ptr_instance);
}
@@ -3254,7 +3263,9 @@
/* Get the physical device extensions if they haven't been retrieved yet */
if (phys_dev->device_extension_cache.capacity == 0) {
- if (!loader_init_ext_list(inst, &phys_dev->device_extension_cache)) {
+ if (!loader_init_generic_list(inst, (struct loader_generic_list *)
+ &phys_dev->device_extension_cache,
+ sizeof(VkExtensionProperties))) {
return VK_ERROR_OUT_OF_HOST_MEMORY;
}
res = loader_add_physical_device_extensions(
@@ -3461,7 +3472,8 @@
if (pProperties == NULL) {
*pPropertyCount = global_ext_list->count;
loader_destroy_layer_list(NULL, &instance_layers);
- loader_destroy_ext_list(NULL, &icd_extensions);
+ loader_destroy_generic_list(NULL, (struct loader_generic_list *)
+ &icd_extensions);
return VK_SUCCESS;
}
@@ -3472,7 +3484,8 @@
sizeof(VkExtensionProperties));
}
*pPropertyCount = copy_size;
- loader_destroy_ext_list(NULL, &icd_extensions);
+ loader_destroy_generic_list(NULL, (struct loader_generic_list *)
+ &icd_extensions);
if (copy_size < global_ext_list->count) {
loader_destroy_layer_list(NULL, &instance_layers);
diff --git a/loader/loader.h b/loader/loader.h
index 0c70f59..6eb7327 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -63,6 +63,14 @@
VK_LAYER_TYPE_GLOBAL_IMPLICIT = 0xc, // both instance and device layer, bitwise
};
+// form of all dynamic lists/arrays
+// only the list element should be changed
+struct loader_generic_list {
+ size_t capacity;
+ uint32_t count;
+ void *list;
+};
+
struct loader_extension_list {
size_t capacity;
uint32_t count;
@@ -415,9 +423,9 @@
struct loader_extension_list *ext_list,
uint32_t prop_list_count,
const VkExtensionProperties *props);
-void loader_destroy_ext_list(
+void loader_destroy_generic_list(
const struct loader_instance *inst,
- struct loader_extension_list *ext_info);
+ struct loader_generic_list *list);
void loader_delete_layer_properties(
const struct loader_instance *inst,
struct loader_layer_list *layer_list);
diff --git a/loader/trampoline.c b/loader/trampoline.c
index b4eca0f..304860a 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -106,7 +106,8 @@
loader_delete_layer_properties(ptr_instance,
&ptr_instance->instance_layer_list);
loader_scanned_icd_clear(ptr_instance, &ptr_instance->icd_libs);
- loader_destroy_ext_list(ptr_instance, &ptr_instance->ext_list);
+ loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
+ &ptr_instance->ext_list);
loader_platform_thread_unlock_mutex(&loader_lock);
loader_heap_free(ptr_instance, ptr_instance);
return res;
@@ -123,7 +124,7 @@
&ptr_instance->instance_layer_list);
loader_scanned_icd_clear(ptr_instance,
&ptr_instance->icd_libs);
- loader_destroy_ext_list(ptr_instance,
+ loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
&ptr_instance->ext_list);
loader_platform_thread_unlock_mutex(&loader_lock);
loader_heap_free(ptr_instance, ptr_instance);
@@ -144,7 +145,7 @@
&ptr_instance->instance_layer_list);
loader_scanned_icd_clear(ptr_instance,
&ptr_instance->icd_libs);
- loader_destroy_ext_list(ptr_instance,
+ loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
&ptr_instance->ext_list);
loader.instances = ptr_instance->next;
loader_platform_thread_unlock_mutex(&loader_lock);