drawstate: Update extension and layer support
diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt
index 4823124..2d778ad 100644
--- a/layers/CMakeLists.txt
+++ b/layers/CMakeLists.txt
@@ -97,7 +97,7 @@
 
 add_vk_layer(Basic basic.cpp vk_layer_table.cpp)
 add_vk_layer(Multi multi.cpp)
-#add_vk_layer(DrawState draw_state.cpp vk_layer_debug_marker_table.cpp vk_layer_table.cpp)
+add_vk_layer(DrawState draw_state.cpp vk_layer_debug_marker_table.cpp vk_layer_table.cpp)
 add_vk_layer(MemTracker mem_tracker.cpp vk_layer_table.cpp)
 #add_vk_layer(ShaderChecker shader_checker.cpp vk_layer_table.cpp)
 #add_vk_layer(Image image.cpp vk_layer_table.cpp)
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index b11877c..41a3450 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -49,6 +49,7 @@
 #include "vk_layer_debug_marker_table.h"
 #include "vk_layer_data.h"
 #include "vk_layer_logging.h"
+#include "vk_layer_extension_utils.h"
 
 typedef struct _layer_data {
     debug_report_data *report_data;
@@ -1536,7 +1537,7 @@
                                    pTable,
                                    *pInstance,
                                    pCreateInfo->extensionCount,
-                                   pCreateInfo->pEnabledExtensions);
+                                   pCreateInfo->ppEnabledExtensionNames);
 
         init_draw_state(my_data);
     }
@@ -1570,7 +1571,7 @@
     deviceExtMap[pDisp].debug_marker_enabled = false;
 
     for (i = 0; i < pCreateInfo->extensionCount; i++) {
-        if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], DEBUG_MARKER_EXTENSION_NAME) == 0) {
             /* Found a matching extension name, mark it enabled and init dispatch table*/
             initDebugMarkerTable(device);
             deviceExtMap[pDisp].debug_marker_enabled = true;
@@ -1616,86 +1617,69 @@
     return result;
 }
 
-struct extProps {
-    uint32_t version;
-    const char * const name;
-};
-#define DRAW_STATE_LAYER_DEV_EXT_ARRAY_SIZE 3
-static const VkExtensionProperties dsDevExts[DRAW_STATE_LAYER_DEV_EXT_ARRAY_SIZE] = {
+static const VkLayerProperties ds_global_layers[] = {
     {
-        VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
         "DrawState",
-        0x10,
-        "Sample layer: DrawState",
-    },
-    {
-        VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
-        "Validation",
-        0x10,
-        "Sample layer: DrawState",
-    },
-    {
-        VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
-        DEBUG_MARKER_EXTENSION_NAME,
-        0x10,
-        "Sample layer: DrawState",
+        VK_API_VERSION,
+        VK_MAKE_VERSION(0, 1, 0),
+        "Validation layer: DrawState",
     }
 };
 
-//TODO add DEBUG_MARKER to device extension list
-VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionCount(
-                                               VkPhysicalDevice gpu,
-                                               uint32_t* pCount)
-{
-    *pCount = DRAW_STATE_LAYER_DEV_EXT_ARRAY_SIZE;
-    return VK_SUCCESS;
-}
-
-VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionProperties(
-                                               VkPhysicalDevice gpu,
-                                               uint32_t extensionIndex,
-                                               VkExtensionProperties* pProperties)
-{
-    if (extensionIndex >= DRAW_STATE_LAYER_DEV_EXT_ARRAY_SIZE)
-        return VK_ERROR_INVALID_VALUE;
-    memcpy(pProperties, &dsDevExts[extensionIndex], sizeof(VkExtensionProperties));
-
-    return VK_SUCCESS;
-}
-
-#define DRAW_STATE_LAYER_EXT_ARRAY_SIZE 2
-static const VkExtensionProperties dsExts[DRAW_STATE_LAYER_EXT_ARRAY_SIZE] = {
-    {
-        VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
-        "DrawState",
-        0x10,
-        "Sample layer: DrawState",
-    },
-    {
-        VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
-        "Validation",
-        0x10,
-        "Sample layer: DrawState",
-    }
-};
-VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionCount(
-        uint32_t*    pCount)
-{
-    *pCount = DRAW_STATE_LAYER_EXT_ARRAY_SIZE;
-    return VK_SUCCESS;
-}
-
 VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionProperties(
-        uint32_t extensionIndex,
-        VkExtensionProperties*    pProperties)
+        const char *pLayerName,
+        uint32_t *pCount,
+        VkExtensionProperties* pProperties)
 {
-    /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */
-    if (extensionIndex >= DRAW_STATE_LAYER_EXT_ARRAY_SIZE)
-        return VK_ERROR_INVALID_VALUE;
+    /* DrawState does not have any global extensions */
+    return util_GetExtensionProperties(0, NULL, pCount, pProperties);
+}
 
-    memcpy(pProperties, &dsExts[extensionIndex], sizeof(VkExtensionProperties));
+VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalLayerProperties(
+        uint32_t *pCount,
+        VkLayerProperties*    pProperties)
+{
+    return util_GetLayerProperties(ARRAY_SIZE(ds_global_layers),
+                                   ds_global_layers,
+                                   pCount, pProperties);
+}
 
-    return VK_SUCCESS;
+static const VkExtensionProperties ds_device_extensions[] = {
+    {
+        DEBUG_MARKER_EXTENSION_NAME,
+        VK_MAKE_VERSION(0, 1, 0),
+        VK_API_VERSION
+    }
+};
+
+static const VkLayerProperties ds_device_layers[] = {
+    {
+        "DrawState",
+        VK_API_VERSION,
+        VK_MAKE_VERSION(0, 1, 0),
+        "Validation layer: DrawState",
+    }
+};
+
+VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionProperties(
+        VkPhysicalDevice                            physicalDevice,
+        const char*                                 pLayerName,
+        uint32_t*                                   pCount,
+        VkExtensionProperties*                      pProperties)
+{
+    /* Mem tracker does not have any physical device extensions */
+    return util_GetExtensionProperties(ARRAY_SIZE(ds_device_extensions), ds_device_extensions,
+                                       pCount, pProperties);
+}
+
+VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceLayerProperties(
+        VkPhysicalDevice                            physicalDevice,
+        uint32_t*                                   pCount,
+        VkLayerProperties*                          pProperties)
+{
+    /* Mem tracker's physical device layers are the same as global */
+    return util_GetLayerProperties(ARRAY_SIZE(ds_device_layers), ds_device_layers,
+                                   pCount, pProperties);
 }
 
 VK_LAYER_EXPORT VkResult VKAPI vkQueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence)
@@ -2916,10 +2900,6 @@
         return (void*) vkEndCommandBuffer;
     if (!strcmp(funcName, "vkResetCommandBuffer"))
         return (void*) vkResetCommandBuffer;
-    if (!strcmp(funcName, "vkGetGlobalExtensionCount"))
-        return (void*) vkGetGlobalExtensionCount;
-    if (!strcmp(funcName, "vkGetGlobalExtensionProperties"))
-        return (void*) vkGetGlobalExtensionProperties;
     if (!strcmp(funcName, "vkCmdBindPipeline"))
         return (void*) vkCmdBindPipeline;
     if (!strcmp(funcName, "vkCmdBindDynamicStateObject"))
@@ -3027,8 +3007,12 @@
         return (void *) vkCreateInstance;
     if (!strcmp(funcName, "vkDestroyInstance"))
         return (void *) vkDestroyInstance;
-    if (!strcmp(funcName, "vkGetPhysicalDeviceExtensionCount"))
-        return (void*) vkGetPhysicalDeviceExtensionCount;
+    if (!strcmp(funcName, "vkGetGlobalLayerProperties"))
+        return (void*) vkGetGlobalLayerProperties;
+    if (!strcmp(funcName, "vkGetGlobalExtensionProperties"))
+        return (void*) vkGetGlobalExtensionProperties;
+    if (!strcmp(funcName, "vkGetPhysicalDeviceLayerProperties"))
+        return (void*) vkGetPhysicalDeviceLayerProperties;
     if (!strcmp(funcName, "vkGetPhysicalDeviceExtensionProperties"))
         return (void*) vkGetPhysicalDeviceExtensionProperties;