vulkan: Enumerate device layer extensions

Change-Id: I453d815ffd910fd56103f1c624cca63ac2014df8
(cherry picked from commit 82a2b6626286610f417df3d48b8e9a56e3726f38)
diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
index 00eb9b1..985b7e4 100644
--- a/vulkan/libvulkan/loader.cpp
+++ b/vulkan/libvulkan/loader.cpp
@@ -687,12 +687,22 @@
 VKAPI_ATTR
 VkResult EnumerateDeviceExtensionProperties_Bottom(
     VkPhysicalDevice /*pdev*/,
-    const char* /*layer_name*/,
+    const char* layer_name,
     uint32_t* properties_count,
-    VkExtensionProperties* /*properties*/) {
-    // TODO(jessehall): Implement me...
-    *properties_count = 0;
-    return VK_SUCCESS;
+    VkExtensionProperties* properties) {
+    const VkExtensionProperties* extensions = nullptr;
+    uint32_t num_extensions = 0;
+    if (layer_name) {
+        GetDeviceLayerExtensions(layer_name, &extensions, &num_extensions);
+    } else {
+        // TODO(jessehall)
+    }
+
+    if (!properties || *properties_count > num_extensions)
+        *properties_count = num_extensions;
+    if (properties)
+        std::copy(extensions, extensions + *properties_count, properties);
+    return *properties_count < num_extensions ? VK_INCOMPLETE : VK_SUCCESS;
 }
 
 VKAPI_ATTR
diff --git a/vulkan/nulldrv/null_driver.cpp b/vulkan/nulldrv/null_driver.cpp
index 1b19d9a..c66ec95 100644
--- a/vulkan/nulldrv/null_driver.cpp
+++ b/vulkan/nulldrv/null_driver.cpp
@@ -295,6 +295,40 @@
     return VK_SUCCESS;
 }
 
+VkResult EnumerateDeviceLayerProperties(VkPhysicalDevice /*gpu*/,
+                                        uint32_t* count,
+                                        VkLayerProperties* /*properties*/) {
+    ALOGW("Driver vkEnumerateDeviceLayerProperties shouldn't be called");
+    *count = 0;
+    return VK_SUCCESS;
+}
+
+VkResult EnumerateDeviceExtensionProperties(VkPhysicalDevice /*gpu*/,
+                                            const char* layer_name,
+                                            uint32_t* count,
+                                            VkExtensionProperties* properties) {
+    if (layer_name) {
+        ALOGW(
+            "Driver vkEnumerateDeviceExtensionProperties shouldn't be called "
+            "with a layer name ('%s')",
+            layer_name);
+        *count = 0;
+        return VK_SUCCESS;
+    }
+
+    const VkExtensionProperties kExtensions[] = {
+        {VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME,
+         VK_ANDROID_NATIVE_BUFFER_SPEC_VERSION}};
+    const uint32_t kExtensionsCount =
+        sizeof(kExtensions) / sizeof(kExtensions[0]);
+
+    if (!properties || *count > kExtensionsCount)
+        *count = kExtensionsCount;
+    if (properties)
+        std::copy(kExtensions, kExtensions + *count, properties);
+    return *count < kExtensionsCount ? VK_INCOMPLETE : VK_SUCCESS;
+}
+
 void GetPhysicalDeviceProperties(VkPhysicalDevice,
                                  VkPhysicalDeviceProperties* properties) {
     properties->apiVersion = VK_API_VERSION;
@@ -603,6 +637,33 @@
     allocator->pfnFree(allocator->pUserData, image);
 }
 
+VkResult GetSwapchainGrallocUsageANDROID(VkDevice,
+                                         VkFormat,
+                                         VkImageUsageFlags,
+                                         int* grallocUsage) {
+    // The null driver never reads or writes the gralloc buffer
+    *grallocUsage = 0;
+    return VK_SUCCESS;
+}
+
+VkResult AcquireImageANDROID(VkDevice,
+                             VkImage,
+                             int fence,
+                             VkSemaphore,
+                             VkFence) {
+    close(fence);
+    return VK_SUCCESS;
+}
+
+VkResult QueueSignalReleaseImageANDROID(VkQueue,
+                                        uint32_t,
+                                        const VkSemaphore*,
+                                        VkImage,
+                                        int* fence) {
+    *fence = -1;
+    return VK_SUCCESS;
+}
+
 // -----------------------------------------------------------------------------
 // No-op types
 
@@ -760,33 +821,6 @@
     return VK_SUCCESS;
 }
 
-VkResult GetSwapchainGrallocUsageANDROID(VkDevice,
-                                         VkFormat,
-                                         VkImageUsageFlags,
-                                         int* grallocUsage) {
-    // The null driver never reads or writes the gralloc buffer
-    *grallocUsage = 0;
-    return VK_SUCCESS;
-}
-
-VkResult AcquireImageANDROID(VkDevice,
-                             VkImage,
-                             int fence,
-                             VkSemaphore,
-                             VkFence) {
-    close(fence);
-    return VK_SUCCESS;
-}
-
-VkResult QueueSignalReleaseImageANDROID(VkQueue,
-                                        uint32_t,
-                                        const VkSemaphore*,
-                                        VkImage,
-                                        int* fence) {
-    *fence = -1;
-    return VK_SUCCESS;
-}
-
 // -----------------------------------------------------------------------------
 // No-op entrypoints
 
@@ -812,16 +846,6 @@
     return VK_SUCCESS;
 }
 
-VkResult EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties) {
-    ALOGV("TODO: vk%s", __FUNCTION__);
-    return VK_SUCCESS;
-}
-
-VkResult EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
-    ALOGV("TODO: vk%s", __FUNCTION__);
-    return VK_SUCCESS;
-}
-
 VkResult QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmitInfo, VkFence fence) {
     return VK_SUCCESS;
 }