loader: bug 12992: extension and layer support

Much of layers and loader updated to work with
final extension and layer mechanism.
Not everything is working here.
diff --git a/icd/intel/instance.c b/icd/intel/instance.c
index 1813ffc..f8e855a 100644
--- a/icd/intel/instance.c
+++ b/icd/intel/instance.c
@@ -169,7 +169,7 @@
     instance->icd = icd;
 
     for (i = 0; i < info->extensionCount; i++) {
-        const enum intel_global_ext_type ext = intel_gpu_lookup_global_extension(&info->pEnabledExtensions[i]);
+        const enum intel_global_ext_type ext = intel_gpu_lookup_global_extension(info->ppEnabledExtensionNames[i]);
 
         if (ext != INTEL_GLOBAL_EXT_INVALID) {
             instance->global_exts[ext] = true;
@@ -185,12 +185,12 @@
 }
 
 enum intel_global_ext_type intel_gpu_lookup_global_extension(
-        const VkExtensionProperties *ext)
+        const char *extName)
 {
     enum intel_global_ext_type type;
 
     for (type = 0; type < ARRAY_SIZE(intel_global_exts); type++) {
-        if (compare_vk_extension_properties(&intel_global_exts[type], ext))
+        if (compare_vk_extension_properties(&intel_global_exts[type], extName))
             break;
     }
 
@@ -224,28 +224,48 @@
     return VK_SUCCESS;
 }
 
-ICD_EXPORT VkResult VKAPI vkGetGlobalExtensionCount(
-    uint32_t*                                  pCount)
+ICD_EXPORT VkResult VKAPI vkGetGlobalExtensionProperties(
+        const char*                                 pLayerName,
+        uint32_t*                                   pCount,
+        VkExtensionProperties*                      pProperties)
 {
-    *pCount = INTEL_GLOBAL_EXT_COUNT;
+    uint32_t copy_size;
+
+    if (pCount == NULL) {
+        return VK_ERROR_INVALID_POINTER;
+    }
+
+    if (pProperties == NULL) {
+        *pCount = INTEL_GLOBAL_EXT_COUNT;
+        return VK_SUCCESS;
+    }
+
+    copy_size = *pCount < INTEL_GLOBAL_EXT_COUNT ? *pCount : INTEL_GLOBAL_EXT_COUNT;
+    memcpy(pProperties, intel_global_exts, copy_size * sizeof(VkExtensionProperties));
+    *pCount = copy_size;
+    if (copy_size < INTEL_GLOBAL_EXT_COUNT) {
+        return VK_INCOMPLETE;
+    }
+
     return VK_SUCCESS;
 }
 
-ICD_EXPORT VkResult VKAPI vkGetGlobalExtensionProperties(
-        uint32_t extensionIndex,
-        VkExtensionProperties*    pProperties)
+ICD_EXPORT VkResult VKAPI vkGetGlobalLayerProperties(
+        uint32_t*                                   pCount,
+        VkLayerProperties*                          pProperties)
 {
-    if (extensionIndex >= INTEL_GLOBAL_EXT_COUNT)
-        return VK_ERROR_INVALID_VALUE;
-    memcpy(pProperties, &intel_global_exts[extensionIndex], sizeof(VkExtensionProperties));
+    if (pCount == NULL) {
+        return VK_ERROR_INVALID_POINTER;
+    }
 
+    *pCount = 0;
     return VK_SUCCESS;
 }
 
 ICD_EXPORT VkResult VKAPI vkEnumeratePhysicalDevices(
-    VkInstance                                instance_,
-    uint32_t*                                 pPhysicalDeviceCount,
-    VkPhysicalDevice*                            pPhysicalDevices)
+    VkInstance                  instance_,
+    uint32_t*                   pPhysicalDeviceCount,
+    VkPhysicalDevice*           pPhysicalDevices)
 {
     struct intel_instance *instance = intel_instance(instance_);
     struct icd_drm_device *devices, *dev;