Add support for longer than 12 character layers.

Change-Id: Ic2bf1c21a962e0921a68ec58946817518468c8b0
(cherry picked from commit 17d4cf3b87c688ec35320d3061e26862a891233b)
diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
index ae36ac9..be39b24 100644
--- a/vulkan/libvulkan/loader.cpp
+++ b/vulkan/libvulkan/loader.cpp
@@ -355,28 +355,34 @@
     pthread_mutex_unlock(&instance->layer_lock);
 }
 
-struct InstanceDevicePair {
+struct InstanceNamesPair {
     Instance* instance;
-    Device* device;
+    Vector<String>* layer_names;
 };
 
-void ActivateLayerFromProperty(const char* name,
+void SetLayerNamesFromProperty(const char* name,
                                const char* value,
                                void* data) {
     const char prefix[] = "debug.vulkan.layer.";
     const size_t prefixlen = sizeof(prefix) - 1;
     if (value[0] == '\0' || strncmp(name, prefix, prefixlen) != 0)
         return;
-    auto instance_device_pair = static_cast<InstanceDevicePair*>(data);
-    Instance* instance = instance_device_pair->instance;
-    Device* device = instance_device_pair->device;
-    String layer_name_str(name + prefixlen,
-                          CallbackAllocator<char>(instance->alloc));
-    if (device) {
-        ActivateLayer(device, instance, layer_name_str);
-    } else {
-        ActivateLayer(instance, instance, layer_name_str);
+    const char* number_str = name + prefixlen;
+    long layer_number = strtol(number_str, nullptr, 10);
+    if (layer_number <= 0 || layer_number == LONG_MAX) {
+        ALOGW("Cannot use a layer at number %ld from string %s", layer_number,
+              number_str);
+        return;
     }
+    auto instance_names_pair = static_cast<InstanceNamesPair*>(data);
+    Vector<String>* layer_names = instance_names_pair->layer_names;
+    Instance* instance = instance_names_pair->instance;
+    size_t layer_size = static_cast<size_t>(layer_number);
+    if (layer_size > layer_names->size()) {
+        layer_names->resize(layer_size,
+                            String(CallbackAllocator<char>(instance->alloc)));
+    }
+    (*layer_names)[layer_size - 1] = value;
 }
 
 template <class TInfo, class TObject>
@@ -400,13 +406,14 @@
             }
             start = end + 1;
         }
-        InstanceDevicePair instance_device_pair = {.instance = instance,
-                                                   .device = 0};
-        if (create_info->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO) {
-            instance_device_pair.device = reinterpret_cast<Device*>(object);
+        Vector<String> layer_names(CallbackAllocator<String>(instance->alloc));
+        InstanceNamesPair instance_names_pair = {.instance = instance,
+                                                 .layer_names = &layer_names};
+        property_list(SetLayerNamesFromProperty,
+                      static_cast<void*>(&instance_names_pair));
+        for (auto layer_name_element : layer_names) {
+            ActivateLayer(object, instance, layer_name_element);
         }
-        property_list(ActivateLayerFromProperty,
-                      static_cast<void*>(&instance_device_pair));
     }
     // Load app layers
     for (uint32_t i = 0; i < create_info->layerCount; ++i) {