Add WSI functions to the loader.

Modify vulkan.api to include the WSI functions.
Add new wsi functions to generation in get_proc_addr.cpp.tmpl
Add bottom entry points because the WSI functions are not exposed in the
driver.

Change-Id: I63c3a099a489496205b0a9eb82c005a5a48642a1
(cherry picked from commit 23b68ac9fcd2df06ffcc25cf8c4f794dd447bbd1)
diff --git a/vulkan/api/vulkan.api b/vulkan/api/vulkan.api
index 9ea1ee4..23d9951 100644
--- a/vulkan/api/vulkan.api
+++ b/vulkan/api/vulkan.api
@@ -84,6 +84,7 @@
 @nonDispatchHandle type u64 VkFramebuffer
 @nonDispatchHandle type u64 VkRenderPass
 @nonDispatchHandle type u64 VkPipelineCache
+@nonDispatchHandle type u64 VkSwapchainKHR
 
 
 /////////////
@@ -635,6 +636,44 @@
     VK_DYNAMIC_STATE_STENCIL_REFERENCE                      = 0x00000008,
 }
 
+//////////////////
+//  Extensions  //
+//////////////////
+
+@extension("VK_EXT_KHR_swapchain")
+enum VkSurfaceTransformKHR {
+    VK_SURFACE_TRANSFORM_NONE_KHR                           = 0x00000000,
+    VK_SURFACE_TRANSFORM_ROT90_KHR                          = 0x00000001,
+    VK_SURFACE_TRANSFORM_ROT180_KHR                         = 0x00000002,
+    VK_SURFACE_TRANSFORM_ROT270_KHR                         = 0x00000003,
+    VK_SURFACE_TRANSFORM_HMIRROR_KHR                        = 0x00000004,
+    VK_SURFACE_TRANSFORM_HMIRROR_ROT90_KHR                  = 0x00000005,
+    VK_SURFACE_TRANSFORM_HMIRROR_ROT180_KHR                 = 0x00000006,
+    VK_SURFACE_TRANSFORM_HMIRROR_ROT270_KHR                 = 0x00000007,
+    VK_SURFACE_TRANSFORM_INHERIT_KHR                        = 0x00000008,
+}
+
+@extension("VK_EXT_KHR_swapchain")
+enum VkPlatformKHR {
+    VK_PLATFORM_WIN32_KHR                                   = 0x00000000,
+    VK_PLATFORM_X11_KHR                                     = 0x00000001,
+    VK_PLATFORM_XCB_KHR                                     = 0x00000002,
+    VK_PLATFORM_ANDROID_KHR                                 = 0x00000003,
+    VK_PLATFORM_WAYLAND_KHR                                 = 0x00000004,
+    VK_PLATFORM_MIR_KHR                                     = 0x00000005,
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+enum VkPresentModeKHR {
+    VK_PRESENT_MODE_IMMEDIATE_KHR                           = 0x00000000,
+    VK_PRESENT_MODE_MAILBOX_KHR                             = 0x00000001,
+    VK_PRESENT_MODE_FIFO_KHR                                = 0x00000002,
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+enum VkColorSpaceKHR {
+    VK_COLORSPACE_SRGB_NONLINEAR_KHR                        = 0x00000000,
+}
 
 /////////////////
 //  Bitfields  //
@@ -927,6 +966,22 @@
     VK_STENCIL_FACE_BACK_BIT                                = 0x00000002,   /// Back face
 }
 
+//////////////////
+//  Extensions  //
+//////////////////
+
+@extension("VK_EXT_KHR_swapchain")
+bitfield VkSurfaceTransformFlagsKHR {
+    VK_SURFACE_TRANSFORM_NONE_BIT_KHR                       = 0x00000001,
+    VK_SURFACE_TRANSFORM_ROT90_BIT_KHR                      = 0x00000002,
+    VK_SURFACE_TRANSFORM_ROT180_BIT_KHR                     = 0x00000004,
+    VK_SURFACE_TRANSFORM_ROT270_BIT_KHR                     = 0x00000008,
+    VK_SURFACE_TRANSFORM_HMIRROR_BIT_KHR                    = 0x00000010,
+    VK_SURFACE_TRANSFORM_HMIRROR_ROT90_BIT_KHR              = 0x00000020,
+    VK_SURFACE_TRANSFORM_HMIRROR_ROT180_BIT_KHR             = 0x00000040,
+    VK_SURFACE_TRANSFORM_HMIRROR_ROT270_BIT_KHR             = 0x00000080,
+    VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR                    = 0x00000100,
+}
 
 //////////////////
 //  Structures  //
@@ -1937,6 +1992,72 @@
     u32                                         z
 }
 
+//////////////////
+//  Extensions  //
+//////////////////
+
+@extension("VK_EXT_KHR_device_swapchain")
+class VkSurfacePropertiesKHR {
+    u32                                     minImageCount
+    u32                                     maxImageCount
+    VkExtent2D                              currentExtent
+    VkExtent2D                              minImageExtent
+    VkExtent2D                              maxImageExtent
+    VkSurfaceTransformFlagsKHR              supportedTransforms
+    VkSurfaceTransformKHR                   currentTransform
+    u32                                     maxImageArraySize
+    VkImageUsageFlags                       supportedUsageFlags
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+class VkSurfaceFormatKHR {
+    VkFormat                                format
+    VkColorSpaceKHR                         colorSpace
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+class VkSwapchainCreateInfoKHR {
+    VkStructureType                          sType
+    const void*                              pNext
+    const VkSurfaceDescriptionKHR*           pSurfaceDescription
+    u32                                      minImageCount
+    VkFormat                                 imageFormat
+    VkColorSpaceKHR                          imageColorSpace
+    VkExtent2D                               imageExtent
+    VkImageUsageFlags                        imageUsageFlags
+    VkSurfaceTransformKHR                    preTransform
+    u32                                      imageArraySize
+    VkSharingMode                            sharingMode
+    u32                                      queueFamilyCount
+    const u32*                               pQueueFamilyIndices
+    VkPresentModeKHR                         presentMode
+    VkSwapchainKHR                           oldSwapchain
+    VkBool32                                 clipped
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+class VkPresentInfoKHR {
+    VkStructureType                          sType
+    const void*                              pNext
+    u32                                      swapchainCount
+    const VkSwapchainKHR*                    swapchains
+    const u32*                               imageIndices
+}
+
+@extension("VK_EXT_KHR_swapchain")
+class VkSurfaceDescriptionKHR {
+    VkStructureType                          sType
+    const void*                              pNext
+}
+
+@extension("VK_EXT_KHR_swapchain")
+class VkSurfaceDescriptionWindowKHR {
+    VkStructureType                         sType
+    const void*                             pNext
+    VkPlatformKHR                           platform
+    void*                                   pPlatformHandle
+    void*                                   pPlatformWindow
+}
 
 ////////////////
 //  Commands  //
@@ -4210,6 +4331,155 @@
     }
 }
 
+////////////////
+// Extensions //
+////////////////
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkGetSurfacePropertiesKHR(
+        VkDevice                                 device,
+        const VkSurfaceDescriptionKHR*           pSurfaceDescription,
+        VkSurfacePropertiesKHR*                  pSurfaceProperties) {
+    deviceObject := GetDevice(device)
+
+    surfaceProperties := ?
+    pSurfaceProperties[0] = surfaceProperties
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkGetSurfaceFormatsKHR(
+        VkDevice                                 device,
+        const VkSurfaceDescriptionKHR*           pSurfaceDescription,
+        u32*                                     pCount,
+        VkSurfaceFormatKHR*                      pSurfaceFormats) {
+    deviceObject := GetDevice(device)
+
+    count := as!u32(?)
+    pCount[0] = count
+    surfaceFormats := pSurfaceFormats[0:count]
+
+    for i in (0 .. count) {
+        surfaceFormat := ?
+        surfaceFormats[i] = surfaceFormat
+    }
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkGetSurfacePresentModesKHR(
+        VkDevice                                 device,
+        const VkSurfaceDescriptionKHR*           pSurfaceDescription,
+        u32*                                     pCount,
+        VkPresentModeKHR*                        pPresentModes) {
+    deviceObject := GetDevice(device)
+
+    count := as!u32(?)
+    pCount[0] = count
+    presentModes := pPresentModes[0:count]
+
+    for i in (0 .. count) {
+        presentMode := ?
+        presentModes[i] = presentMode
+    }
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkCreateSwapchainKHR(
+        VkDevice                                 device,
+        const VkSwapchainCreateInfoKHR*          pCreateInfo,
+        VkSwapchainKHR*                          pSwapchain) {
+    //assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR)
+    deviceObject := GetDevice(device)
+
+    swapchain := ?
+    pSwapchain[0] = swapchain
+    State.Swapchains[swapchain] = new!SwapchainObject(device: device)
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkDestroySwapchainKHR(
+        VkDevice                                 device,
+        VkSwapchainKHR                           swapchain) {
+    deviceObject := GetDevice(device)
+    swapchainObject := GetSwapchain(swapchain)
+    assert(swapchainObject.device == device)
+
+    State.Swapchains[swapchain] = null
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkGetSwapchainImagesKHR(
+        VkDevice                                 device,
+        VkSwapchainKHR                           swapchain,
+        u32*                                     pCount,
+        VkImage*                                 pSwapchainImages) {
+    deviceObject := GetDevice(device)
+
+    count := as!u32(?)
+    pCount[0] = count
+    swapchainImages := pSwapchainImages[0:count]
+
+    for i in (0 .. count) {
+        swapchainImage := ?
+        swapchainImages[i] = swapchainImage
+        if !(swapchainImage in State.Images) {
+            State.Images[swapchainImage] = new!ImageObject(device: device)
+        }
+    }
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkAcquireNextImageKHR(
+        VkDevice                                 device,
+        VkSwapchainKHR                           swapchain,
+        u64                                      timeout,
+        VkSemaphore                              semaphore,
+        u32*                                     pImageIndex) {
+    deviceObject := GetDevice(device)
+    swapchainObject := GetSwapchain(swapchain)
+
+    imageIndex := ?
+    pImageIndex[0] = imageIndex
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_device_swapchain")
+cmd VkResult vkQueuePresentKHR(
+        VkQueue                                  queue,
+        VkPresentInfoKHR*                        pPresentInfo) {
+    queueObject := GetQueue(queue)
+
+    presentInfo := ?
+    pPresentInfo[0] = presentInfo
+
+    return ?
+}
+
+@extension("VK_EXT_KHR_swapchain")
+cmd VkResult vkGetPhysicalDeviceSurfaceSupportKHR(
+        VkPhysicalDevice                        physicalDevice,
+        u32                                     queueFamilyIndex,
+        const VkSurfaceDescriptionKHR*          pSurfaceDescription,
+        VkBool32*                               pSupported) {
+    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+
+    supported := ?
+    pSupported[0] = supported
+
+    return ?
+}
 
 ////////////////
 // Validation //
@@ -4254,6 +4524,7 @@
     map!(VkRenderPass,               ref!RenderPassObject)               RenderPasses
     map!(VkPipelineCache,            ref!PipelineCacheObject)            PipelineCaches
     map!(VkCmdPool,                  ref!CmdPoolObject)                  CmdPools
+    map!(VkSwapchainKHR,             ref!SwapchainObject)                Swapchains
 }
 
 @internal class InstanceObject {
@@ -4372,6 +4643,10 @@
     VkDevice      device
 }
 
+@internal class SwapchainObject {
+    VkDevice      device
+}
+
 macro ref!InstanceObject GetInstance(VkInstance instance) {
     assert(instance in State.Instances)
     return State.Instances[instance]
@@ -4501,3 +4776,8 @@
     assert(cmdPool in State.CmdPools)
     return State.CmdPools[cmdPool]
 }
+
+macro ref!SwapchainObject GetSwapchain(VkSwapchainKHR swapchain) {
+    assert(swapchain in State.Swapchains)
+    return State.Swapchains[swapchain]
+}