vulkan: ignore layer libraries without instance layers

Make vkEnumerateInstanceLayerProperties and
vkEnumerateInstanceExtensionProperties mandatory for layer libraries.  If
vkEnumerateInstanceLayerProperties enumerates no instance layer, ignore
the layer library.

Change-Id: Ic67e4290f0cd5f9098bd02d9d01cc0194398424a
diff --git a/vulkan/libvulkan/layers_extensions.cpp b/vulkan/libvulkan/layers_extensions.cpp
index 4c88350..e861ffe 100644
--- a/vulkan/libvulkan/layers_extensions.cpp
+++ b/vulkan/libvulkan/layers_extensions.cpp
@@ -131,33 +131,32 @@
     PFN_vkEnumerateInstanceExtensionProperties enumerate_instance_extensions =
         reinterpret_cast<PFN_vkEnumerateInstanceExtensionProperties>(
             dlsym(dlhandle_, "vkEnumerateInstanceExtensionProperties"));
+    if (!enumerate_instance_layers || !enumerate_instance_extensions) {
+        ALOGV("layer library '%s' misses some instance enumeraion functions",
+              path_.c_str());
+        return false;
+    }
+
+    // device functions are optional
     PFN_vkEnumerateDeviceLayerProperties enumerate_device_layers =
         reinterpret_cast<PFN_vkEnumerateDeviceLayerProperties>(
             dlsym(dlhandle_, "vkEnumerateDeviceLayerProperties"));
     PFN_vkEnumerateDeviceExtensionProperties enumerate_device_extensions =
         reinterpret_cast<PFN_vkEnumerateDeviceExtensionProperties>(
             dlsym(dlhandle_, "vkEnumerateDeviceExtensionProperties"));
-    if (!((enumerate_instance_layers && enumerate_instance_extensions) ||
-          (enumerate_device_layers && enumerate_device_extensions))) {
-        ALOGV(
-            "layer library '%s' has neither instance nor device enumeraion "
-            "functions",
-            path_.c_str());
-        return false;
-    }
 
-    VkResult result;
+    // get layer counts
     uint32_t num_instance_layers = 0;
     uint32_t num_device_layers = 0;
-    if (enumerate_instance_layers) {
-        result = enumerate_instance_layers(&num_instance_layers, nullptr);
+    VkResult result = enumerate_instance_layers(&num_instance_layers, nullptr);
+    if (result != VK_SUCCESS || !num_instance_layers) {
         if (result != VK_SUCCESS) {
             ALOGW(
                 "vkEnumerateInstanceLayerProperties failed for library '%s': "
                 "%d",
                 path_.c_str(), result);
-            return false;
         }
+        return false;
     }
     if (enumerate_device_layers) {
         result = enumerate_device_layers(VK_NULL_HANDLE, &num_device_layers,
@@ -169,17 +168,15 @@
             return false;
         }
     }
+
+    // get layer properties
     VkLayerProperties* properties = static_cast<VkLayerProperties*>(alloca(
         (num_instance_layers + num_device_layers) * sizeof(VkLayerProperties)));
-    if (num_instance_layers > 0) {
-        result = enumerate_instance_layers(&num_instance_layers, properties);
-        if (result != VK_SUCCESS) {
-            ALOGW(
-                "vkEnumerateInstanceLayerProperties failed for library '%s': "
-                "%d",
-                path_.c_str(), result);
-            return false;
-        }
+    result = enumerate_instance_layers(&num_instance_layers, properties);
+    if (result != VK_SUCCESS) {
+        ALOGW("vkEnumerateInstanceLayerProperties failed for library '%s': %d",
+              path_.c_str(), result);
+        return false;
     }
     if (num_device_layers > 0) {
         result = enumerate_device_layers(VK_NULL_HANDLE, &num_device_layers,
@@ -192,6 +189,7 @@
         }
     }
 
+    // append layers to instance_layers/device_layers
     size_t prev_num_instance_layers = instance_layers.size();
     size_t prev_num_device_layers = device_layers.size();
     instance_layers.reserve(prev_num_instance_layers + num_instance_layers);
@@ -203,29 +201,27 @@
         layer.properties = props;
         layer.library_idx = library_idx;
 
-        if (enumerate_instance_extensions) {
-            uint32_t count = 0;
-            result =
-                enumerate_instance_extensions(props.layerName, &count, nullptr);
-            if (result != VK_SUCCESS) {
-                ALOGW(
-                    "vkEnumerateInstanceExtensionProperties(%s) failed for "
-                    "library '%s': %d",
-                    props.layerName, path_.c_str(), result);
-                instance_layers.resize(prev_num_instance_layers);
-                return false;
-            }
-            layer.extensions.resize(count);
-            result = enumerate_instance_extensions(props.layerName, &count,
-                                                   layer.extensions.data());
-            if (result != VK_SUCCESS) {
-                ALOGW(
-                    "vkEnumerateInstanceExtensionProperties(%s) failed for "
-                    "library '%s': %d",
-                    props.layerName, path_.c_str(), result);
-                instance_layers.resize(prev_num_instance_layers);
-                return false;
-            }
+        uint32_t count = 0;
+        result =
+            enumerate_instance_extensions(props.layerName, &count, nullptr);
+        if (result != VK_SUCCESS) {
+            ALOGW(
+                "vkEnumerateInstanceExtensionProperties(%s) failed for library "
+                "'%s': %d",
+                props.layerName, path_.c_str(), result);
+            instance_layers.resize(prev_num_instance_layers);
+            return false;
+        }
+        layer.extensions.resize(count);
+        result = enumerate_instance_extensions(props.layerName, &count,
+                                               layer.extensions.data());
+        if (result != VK_SUCCESS) {
+            ALOGW(
+                "vkEnumerateInstanceExtensionProperties(%s) failed for library "
+                "'%s': %d",
+                props.layerName, path_.c_str(), result);
+            instance_layers.resize(prev_num_instance_layers);
+            return false;
         }
 
         instance_layers.push_back(layer);