aboutsummaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2016-02-04 14:11:25 -0700
committerJon Ashburn <jon@lunarg.com>2016-02-04 14:42:07 -0700
commit39afaad5f2613b262640b22b221decdfdc4125d9 (patch)
treeb5b16eadf8920dec51491bda6fb57c1bbfbe18f1 /loader
parent64d58c5aac5b1a161ab0ab7fb7d2234edcedaa32 (diff)
downloadusermoji-39afaad5f2613b262640b22b221decdfdc4125d9.tar.xz
loader: filter device extensions in the terminator instead of trampoline
Diffstat (limited to 'loader')
-rw-r--r--loader/loader.c67
1 files changed, 27 insertions, 40 deletions
diff --git a/loader/loader.c b/loader/loader.c
index 5ce7f9d5..5c38e025 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -3050,10 +3050,36 @@ loader_create_device_terminator(VkPhysicalDevice physicalDevice,
VkDeviceCreateInfo localCreateInfo;
memcpy(&localCreateInfo, pCreateInfo, sizeof(localCreateInfo));
localCreateInfo.pNext = loader_strip_create_extensions(pCreateInfo->pNext);
- // ICDs do not support layers
+
+ /*
+ * NOTE: Need to filter the extensions to only those
+ * supported by the ICD.
+ * No ICD will advertise support for layers. An ICD
+ * library could support a layer, but it would be
+ * independent of the actual ICD, just in the same library.
+ */
+ char **filtered_extension_names = NULL;
+ filtered_extension_names = loader_stack_alloc(pCreateInfo->enabledExtensionCount * sizeof(char *));
+ if (!filtered_extension_names) {
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+ }
+
localCreateInfo.enabledLayerCount = 0;
localCreateInfo.ppEnabledLayerNames = NULL;
+ localCreateInfo.enabledExtensionCount = 0;
+ localCreateInfo.ppEnabledExtensionNames = (const char * const *) filtered_extension_names;
+
+ for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
+ const char *extension_name = pCreateInfo->ppEnabledExtensionNames[i];
+ VkExtensionProperties *prop = get_extension_property(extension_name,
+ &phys_dev->device_extension_cache);
+ if (prop) {
+ filtered_extension_names[localCreateInfo.enabledExtensionCount] = (char *) extension_name;
+ localCreateInfo.enabledExtensionCount++;
+ }
+ }
+
VkDevice localDevice;
// TODO: Why does fpCreateDevice behave differently than
// this_icd->CreateDevice?
@@ -3671,8 +3697,6 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice,
struct loader_device *dev;
struct loader_instance *inst;
struct loader_layer_list activated_layer_list = {0};
- VkDeviceCreateInfo device_create_info;
- char **filtered_extension_names = NULL;
VkResult res;
assert(pCreateInfo->queueCreateInfoCount >= 1);
@@ -3735,43 +3759,6 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice,
return res;
}
- /*
- * NOTE: Need to filter the extensions to only those
- * supported by the ICD.
- * No ICD will advertise support for layers. An ICD
- * library could support a layer, but it would be
- * independent of the actual ICD, just in the same library.
- */
- filtered_extension_names =
- loader_stack_alloc(pCreateInfo->enabledExtensionCount * sizeof(char *));
- if (!filtered_extension_names) {
- loader_destroy_generic_list(
- inst, (struct loader_generic_list *)&activated_layer_list);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
- }
-
- /* Copy user's data */
- memcpy(&device_create_info, pCreateInfo, sizeof(VkDeviceCreateInfo));
-
- /* ICD's do not use layers */
- device_create_info.enabledLayerCount = 0;
- device_create_info.ppEnabledLayerNames = NULL;
-
- device_create_info.enabledExtensionCount = 0;
- device_create_info.ppEnabledExtensionNames =
- (const char *const *)filtered_extension_names;
-
- for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
- const char *extension_name = pCreateInfo->ppEnabledExtensionNames[i];
- VkExtensionProperties *prop = get_extension_property(
- extension_name, &phys_dev->device_extension_cache);
- if (prop) {
- filtered_extension_names[device_create_info.enabledExtensionCount] =
- (char *)extension_name;
- device_create_info.enabledExtensionCount++;
- }
- }
-
dev = loader_add_logical_device(inst, &icd->logical_device_list);
if (dev == NULL) {
loader_destroy_generic_list(