extensions: begin changes for extension support

This patch starts restructuring the various components
(loader, driver, layers, etc.) to support global and
device extensions. Require GetProcAddr to access the
extension functions and related support.
diff --git a/include/vulkan.h b/include/vulkan.h
index 89431af..dbc6f86 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -835,18 +835,17 @@
     VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO                 = 38,
     VK_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO        = 39,
     VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO               = 40,
-    VK_STRUCTURE_TYPE_LAYER_CREATE_INFO                     = 41,
-    VK_STRUCTURE_TYPE_MEMORY_BARRIER                        = 42,
-    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER                 = 43,
-    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER                  = 44,
-    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO           = 45,
+    VK_STRUCTURE_TYPE_MEMORY_BARRIER                        = 41,
+    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER                 = 42,
+    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER                  = 43,
+    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO           = 44,
     VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET                  = 46,
     VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET                   = 47,
     VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO                  = 48,
     VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO           = 49,
-    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE                   = 50,
+    VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES                  = 50,
 
-    VK_ENUM_RANGE(STRUCTURE_TYPE, APPLICATION_INFO, MAPPED_MEMORY_RANGE)
+    VK_ENUM_RANGE(STRUCTURE_TYPE, APPLICATION_INFO, EXTENSION_PROPERTIES)
 } VkStructureType;
 
 // Object type enumerant
@@ -936,6 +935,7 @@
     VK_ERROR_MEMORY_NOT_BOUND                               = -(0x0000001F),
     VK_ERROR_INCOMPATIBLE_QUEUE                             = -(0x00000020),
     VK_ERROR_NOT_SHAREABLE                                  = -(0x00000021),
+    VK_ERROR_MISSING_EXTENSION_DEPENDENCY                   = -(0x00000022),
 
     VK_MAX_ENUM(RESULT)
 } VkResult;
@@ -1279,8 +1279,10 @@
 
 typedef struct VkExtensionProperties_
 {
-    char                                        extName[VK_MAX_EXTENSION_NAME];     // extension name
+    VkStructureType                             sType;                              // Type of structure. Should be VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES
+    char                                        name[VK_MAX_EXTENSION_NAME];        // extension name
     uint32_t                                    version;                            // version of the extension specification
+    char                                        description[VK_MAX_EXTENSION_NAME]; // Name of library implementing this extension
 } VkExtensionProperties;
 
 typedef struct VkApplicationInfo_
@@ -1324,7 +1326,7 @@
     uint32_t                                    queueRecordCount;
     const VkDeviceQueueCreateInfo*              pRequestedQueues;
     uint32_t                                    extensionCount;
-    const char*const*                           ppEnabledExtensionNames;
+    const VkExtensionProperties*                pEnabledExtensions;         // Indicate extensions to enable by index value
     VkDeviceCreateFlags                         flags;                      // Device creation flags
 } VkDeviceCreateInfo;
 
@@ -1335,18 +1337,9 @@
     const VkApplicationInfo*                    pAppInfo;
     const VkAllocCallbacks*                     pAllocCb;
     uint32_t                                    extensionCount;
-    const char*const*                           ppEnabledExtensionNames;    // layer or extension name to be enabled
+    const VkExtensionProperties*                pEnabledExtensions;         // Indicate extensions to enable by index value
 } VkInstanceCreateInfo;
 
-// can be added to VkDeviceCreateInfo via pNext
-typedef struct VkLayerCreateInfo_
-{
-    VkStructureType                             sType;                      // Should be VK_STRUCTURE_TYPE_LAYER_CREATE_INFO
-    const void*                                 pNext;                      // Pointer to next structure
-    uint32_t                                    layerCount;
-    const char *const*                          ppActiveLayerNames;         // layer name from the layer's vkEnumerateLayers())
-} VkLayerCreateInfo;
-
 typedef struct VkPhysicalDeviceQueueProperties_
 {
     VkQueueFlags                                queueFlags;                 // Queue flags
@@ -2093,7 +2086,6 @@
 typedef VkResult (VKAPI *PFN_vkDestroyDevice)(VkDevice device);
 typedef VkResult (VKAPI *PFN_vkGetGlobalExtensionInfo)(VkExtensionInfoType infoType, uint32_t extensionIndex, size_t* pDataSize, void* pData);
 typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceExtensionInfo)(VkPhysicalDevice physicalDevice, VkExtensionInfoType infoType, uint32_t extensionIndex, size_t* pDataSize, void* pData);
-typedef VkResult (VKAPI *PFN_vkEnumerateLayers)(VkPhysicalDevice physicalDevice, size_t maxStringSize, size_t* pLayerCount, char* const* pOutLayers, void* pReserved);
 typedef VkResult (VKAPI *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue);
 typedef VkResult (VKAPI *PFN_vkQueueSubmit)(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence);
 typedef VkResult (VKAPI *PFN_vkQueueWaitIdle)(VkQueue queue);
@@ -2252,15 +2244,6 @@
     size_t*                                     pDataSize,
     void*                                       pData);
 
-// Layer discovery functions
-
-VkResult VKAPI vkEnumerateLayers(
-    VkPhysicalDevice                            physicalDevice,
-    size_t                                      maxStringSize,
-    size_t*                                     pLayerCount,
-    char* const*                                pOutLayers,
-    void*                                       pReserved);
-
 // Queue functions
 
 VkResult VKAPI vkGetDeviceQueue(