vulkan: Implement VkSurfaceKHR and use vulkanext.h

Between header version 0.183.0 and 0.184.0, a copy of vulkan.h which
includes extensions was added to the registry, called vulkanext.h. The
vulkan.h included here is actually the registry's vulkanext.h.
(In a later upstream change, the no-extensions version was removed
from the registry, and vulkanext.h was renamed vulkan.h, matching what
we're doing here.)

The version of the extensions picked up in the header file is later
than the ones used in the previous SDK, so this change also updates
our implementation to the extension versions included in the header.
The main change is replacing the VkSurfaceDescriptionKHR structure
with a VkSurfaceKHR object.

Change-Id: I18fa5a269db0fcdbdbde3e9304167bc15e456f85
(cherry picked from commit 957a59a48a8d2e81ca3bb52aacd8d08b1b43dc74)
diff --git a/vulkan/api/vulkan.api b/vulkan/api/vulkan.api
index 175e353..878cf44 100644
--- a/vulkan/api/vulkan.api
+++ b/vulkan/api/vulkan.api
@@ -45,6 +45,46 @@
 // API keyword, but needs special handling by some templates
 define NULL_HANDLE 0
 
+@extension("VK_EXT_KHR_surface") define VK_EXT_KHR_SURFACE_REVISION                     19
+@extension("VK_EXT_KHR_surface") define VK_EXT_KHR_SURFACE_EXTENSION_NUMBER             1
+@extension("VK_EXT_KHR_surface") define VK_EXT_KHR_SURFACE_EXTENSION_NAME               "VK_EXT_KHR_surface"
+
+@extension("VK_EXT_KHR_swapchain") define VK_EXT_KHR_SWAPCHAIN_REVISION                 59
+@extension("VK_EXT_KHR_swapchain") define VK_EXT_KHR_SWAPCHAIN_EXTENSION_NUMBER         2
+@extension("VK_EXT_KHR_swapchain") define VK_EXT_KHR_SWAPCHAIN_EXTENSION_NAME           "VK_EXT_KHR_swapchain"
+
+@extension("VK_EXT_KHR_display") define VK_EXT_KHR_DISPLAY_REVISION                     16
+@extension("VK_EXT_KHR_display") define VK_EXT_KHR_DISPLAY_EXTENSION_NUMBER             3
+@extension("VK_EXT_KHR_display") define VK_EXT_KHR_DISPLAY_EXTENSION_NAME               "VK_EXT_KHR_display"
+
+@extension("VK_EXT_KHR_display_swapchain") define VK_EXT_KHR_DISPLAY_REVISION           14
+@extension("VK_EXT_KHR_display_swapchain") define VK_EXT_KHR_DISPLAY_EXTENSION_NUMBER   4
+@extension("VK_EXT_KHR_display_swapchain") define VK_EXT_KHR_DISPLAY_EXTENSION_NAME     "VK_EXT_KHR_display_swapchain"
+
+@extension("VK_EXT_KHR_x11_surface") define VK_EXT_KHR_X11_SURFACE_REVISION             1
+@extension("VK_EXT_KHR_x11_surface") define VK_EXT_KHR_X11_SURFACE_NUMBER               4
+@extension("VK_EXT_KHR_x11_surface") define VK_EXT_KHR_X11_SURFACE_NAME                 "VK_EXT_KHR_x11_surface"
+
+@extension("VK_EXT_KHR_xcb_surface") define VK_EXT_KHR_XCB_SURFACE_REVISION             1
+@extension("VK_EXT_KHR_xcb_surface") define VK_EXT_KHR_XCB_SURFACE_NUMBER               6
+@extension("VK_EXT_KHR_xcb_surface") define VK_EXT_KHR_XCB_SURFACE_NAME                 "VK_EXT_KHR_xcb_surface"
+
+@extension("VK_EXT_KHR_wayland_surface") define VK_EXT_KHR_WAYLAND_SURFACE_REVISION     1
+@extension("VK_EXT_KHR_wayland_surface") define VK_EXT_KHR_WAYLAND_SURFACE_NUMBER       7
+@extension("VK_EXT_KHR_wayland_surface") define VK_EXT_KHR_WAYLAND_SURFACE_NAME         "VK_EXT_KHR_wayland_surface"
+
+@extension("VK_EXT_KHR_mir_surface") define VK_EXT_KHR_MIR_SURFACE_REVISION             1
+@extension("VK_EXT_KHR_mir_surface") define VK_EXT_KHR_MIR_SURFACE_NUMBER               8
+@extension("VK_EXT_KHR_mir_surface") define VK_EXT_KHR_MIR_SURFACE_NAME                 "VK_EXT_KHR_mir_surface"
+
+@extension("VK_EXT_KHR_android_surface") define VK_EXT_KHR_ANDROID_SURFACE_REVISION     1
+@extension("VK_EXT_KHR_android_surface") define VK_EXT_KHR_ANDROID_SURFACE_NUMBER       8
+@extension("VK_EXT_KHR_android_surface") define VK_EXT_KHR_ANDROID_SURFACE_NAME         "VK_EXT_KHR_android_surface"
+
+@extension("VK_EXT_KHR_win32_surface") define VK_EXT_KHR_WIN32_SURFACE_REVISION         1
+@extension("VK_EXT_KHR_win32_surface") define VK_EXT_KHR_WIN32_SURFACE_NUMBER           9
+@extension("VK_EXT_KHR_win32_surface") define VK_EXT_KHR_WIN32_SURFACE_NAME             "VK_EXT_KHR_win32_surface"
+
 
 /////////////
 //  Types  //
@@ -84,7 +124,13 @@
 @nonDispatchHandle type u64 VkFramebuffer
 @nonDispatchHandle type u64 VkRenderPass
 @nonDispatchHandle type u64 VkPipelineCache
-@nonDispatchHandle type u64 VkSwapchainKHR
+
+@extension("VK_EXT_KHR_surface")    @nonDispatchHandle type u64 VkSurfaceKHR
+
+@extension("VK_EXT_KHR_swapchain")  @nonDispatchHandle type u64 VkSwapchainKHR
+
+@extension("VK_EXT_KHR_display")    @nonDispatchHandle type u64 VkDisplayKHR
+@extension("VK_EXT_KHR_display")    @nonDispatchHandle type u64 VkDisplayModeKHR
 
 
 /////////////
@@ -101,6 +147,9 @@
     VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL                 = 0x00000006,   /// Optimal layout when image is used only as source of transfer operations
     VK_IMAGE_LAYOUT_TRANSFER_DESTINATION_OPTIMAL            = 0x00000007,   /// Optimal layout when image is used only as destination of transfer operations
     VK_IMAGE_LAYOUT_PREINITIALIZED                          = 0x00000008,   /// Initial layout used when the data is populated by the CPU
+
+    //@extension("VK_EXT_KHR_swapchain")
+    VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR                      = 0xc0000802,
 }
 
 enum VkAttachmentLoadOp {
@@ -568,6 +617,17 @@
     VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO                  = 45,
     VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO        = 46,
     VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO                 = 47,
+
+    //@extension("VK_EXT_KHR_swapchain")
+    VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR                 = 0xc0000801,
+
+    //@extension("VK_EXT_KHR_display")
+    VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR              = 0xc0000c00,
+    VK_STRUCTURE_TYPE_SURFACE_DESCRIPTION_DISPLAY_PLAN_KHR      = 0xc0000c01,
+
+    //@extension("VK_EXT_KHR_display_swapchain")
+    VK_STRUCTURE_TYPE_DISPLAY_SWAPCHAIN_CREATE_INFO_KHR         = 0xc0001000,
+    VK_STRUCTURE_TYPE_DISPLAY_DISPLAY_PRESENT_INFO_KHR          = 0xc0001001,
 }
 
 enum VkRenderPassContents {
@@ -586,6 +646,9 @@
     VK_EVENT_RESET                                          = 0x00000004,
     VK_INCOMPLETE                                           = 0x00000005,
 
+    //@extension("VK_EXT_KHR_swapchain")
+    VK_SUBOPTIMAL_KHR                                       = 0x40000403,
+
     // Error codes (negative values)
     VK_ERROR_OUT_OF_HOST_MEMORY                             = 0xFFFFFFFF,
     VK_ERROR_OUT_OF_DEVICE_MEMORY                           = 0xFFFFFFFE,
@@ -596,6 +659,16 @@
     VK_ERROR_EXTENSION_NOT_PRESENT                          = 0xFFFFFFF9,
     VK_ERROR_FEATURE_NOT_PRESENT                            = 0xFFFFFFF8,
     VK_ERROR_INCOMPATIBLE_DRIVER                            = 0xFFFFFFF7,
+
+    //@extension("VK_EXT_KHR_swapchain")
+    VK_ERROR_OUT_OF_DATE_KHR                                = 0xC0000804,
+
+    //@extension("VK_EXT_KHR_display_swapchain")
+    VK_ERROR_INCOMPATIBLE_DISPLAY_KHR                       = 0xC0001002,
+
+    //@extension("VK_EXT_KHR_android_surface")
+    VK_ERROR_INVALID_ANDROID_WINDOW_KHR                     = 0xC002400,
+    VK_ERROR_ANDROID_WINDOW_IN_USE_KHR                      = 0xC002401,
 }
 
 enum VkDynamicState {
@@ -610,11 +683,7 @@
     VK_DYNAMIC_STATE_STENCIL_REFERENCE                      = 0x00000008,
 }
 
-//////////////////
-//  Extensions  //
-//////////////////
-
-@extension("VK_EXT_KHR_swapchain")
+@extension("VK_EXT_KHR_surface")
 enum VkSurfaceTransformKHR {
     VK_SURFACE_TRANSFORM_NONE_KHR                           = 0x00000000,
     VK_SURFACE_TRANSFORM_ROT90_KHR                          = 0x00000001,
@@ -628,23 +697,13 @@
 }
 
 @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")
+@extension("VK_EXT_KHR_swapchain")
 enum VkColorSpaceKHR {
     VK_COLORSPACE_SRGB_NONLINEAR_KHR                        = 0x00000000,
 }
@@ -941,10 +1000,6 @@
     VK_STENCIL_FACE_BACK_BIT                                = 0x00000002,   /// Back face
 }
 
-//////////////////
-//  Extensions  //
-//////////////////
-
 @extension("VK_EXT_KHR_swapchain")
 bitfield VkSurfaceTransformFlagsKHR {
     VK_SURFACE_TRANSFORM_NONE_BIT_KHR                       = 0x00000001,
@@ -958,6 +1013,14 @@
     VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR                    = 0x00000100,
 }
 
+@extension("VK_EXT_KHR_display")
+bitfield VkDisplayPlaneAlphaFlagsKHR {
+    VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR                   = 0x00000001,
+    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR                = 0x00000002,
+    VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR  = 0x00000004,
+}
+
+
 //////////////////
 //  Structures  //
 //////////////////
@@ -1995,73 +2058,136 @@
     u32                                         z
 }
 
-//////////////////
-//  Extensions  //
-//////////////////
-
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 class VkSurfacePropertiesKHR {
-    u32                                     minImageCount
-    u32                                     maxImageCount
-    VkExtent2D                              currentExtent
-    VkExtent2D                              minImageExtent
-    VkExtent2D                              maxImageExtent
-    VkSurfaceTransformFlagsKHR              supportedTransforms
-    VkSurfaceTransformKHR                   currentTransform
-    u32                                     maxImageArraySize
-    VkImageUsageFlags                       supportedUsageFlags
+    u32                                         minImageCount
+    u32                                         maxImageCount
+    VkExtent2D                                  currentExtent
+    VkExtent2D                                  minImageExtent
+    VkExtent2D                                  maxImageExtent
+    VkSurfaceTransformFlagsKHR                  supportedTransforms
+    VkSurfaceTransformKHR                       currentTransform
+    u32                                         maxImageArraySize
+    VkImageUsageFlags                           supportedUsageFlags
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 class VkSurfaceFormatKHR {
-    VkFormat                                format
-    VkColorSpaceKHR                         colorSpace
+    VkFormat                                    format
+    VkColorSpaceKHR                             colorSpace
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_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
+    VkStructureType                             sType
+    const void*                                 pNext
+    VkSurfaceKHR                                surface
+    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")
+@extension("VK_EXT_KHR_swapchain")
 class VkPresentInfoKHR {
-    VkStructureType                          sType
-    const void*                              pNext
-    u32                                      swapchainCount
-    const VkSwapchainKHR*                    swapchains
-    const u32*                               imageIndices
+    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_display")
+class VkDisplayPropertiesKHR {
+    VkDisplayKHR                                display
+    const char*                                 displayName
+    VkExtent2D                                  physicalDimensions
+    VkExtent2D                                  physicalResolution
+    VkSurfaceTransformFlagsKHR                  supportedTransforms
+    u32                                         planeCount
+    VkBool32                                    planeReorderPossible
 }
 
-@extension("VK_EXT_KHR_swapchain")
-class VkSurfaceDescriptionWindowKHR {
-    VkStructureType                         sType
-    const void*                             pNext
-    VkPlatformKHR                           platform
-    void*                                   pPlatformHandle
-    void*                                   pPlatformWindow
+@extension("VK_EXT_KHR_display")
+class VkDisplayTimingKHR {
+    u32                                         pixelClock
+    VkExtent2D                                  visibleRegion
+    VkExtent2D                                  totalRegion
+    VkExtent2D                                  physicalDimensions
+    u32                                         hSyncStart
+    u32                                         hSyncEnd
+    u32                                         vSyncStart
+    u32                                         vSyncEnd
+    VkBool32                                    interlaced
+    VkBool32                                    doublescan
+    VkBool32                                    hSyncPos
+    VkBool32                                    vSyncPos
 }
 
+@extension("VK_EXT_KHR_display")
+class VkDisplayModePropertiesKHR {
+    VkDisplayModeKHR                            displayMode
+    VkDisplayTimingKHR                          timing
+}
+
+@extension("VK_EXT_KHR_display")
+class VkDisplayModeCreateInfoKHR {
+    VkStructureType                             sType
+    const void*                                 pNext
+    VkDisplayTimingKHR                          timing
+}
+
+@extension("VK_EXT_KHR_display")
+class VkDisplayPlanePropertiesKHR {
+    VkDisplayPlaneAlphaFlagsKHR                 supportedAlpha
+    VkOffset2D                                  minSrcPosition
+    VkOffset2D                                  maxSrcPosition
+    VkExtent2D                                  minSrcExtent
+    VkExtent2D                                  maxSrcExtent
+    VkOffset2D                                  minDstPosition
+    VkOffset2D                                  maxDstPosition
+    VkExtent2D                                  minDstExtent
+    VkExtent2D                                  maxDstExtent
+}
+
+@extension("VK_EXT_KHR_display")
+class VkSurfaceDescriptionDisplayPlaneKHR {
+    VkStructureType                             sType
+    const void*                                 pNext
+    VkDisplayModeKHR                            displayMode
+    u32                                         planeIndex
+    u32                                         planeStackIndex
+    VkSurfaceTransformKHR                       transform
+    f32                                         globalAlpha
+    VkDisplayPlaneAlphaFlagsKHR                 alphaMode
+    VkExtent2D                                  imageSize
+}
+
+@extension("VK_EXT_KHR_display_swapchain")
+class VkDisplaySwapchainCreateInfoKHR {
+    VkStructureType                             sType
+    const void*                                 pNext
+    const VkSwapchainCreateInfoKHR*             pNextSwapchainCreateInfo
+}
+
+@extension("VK_EXT_KHR_display_swapchain")
+class VkDisplayPresentInfoKHR {
+    VkStructureType                             sType
+    const void*                                 pNext
+    VkRect2D                                    srcRect
+    VkRect2D                                    dstRect
+}
+
+
 ////////////////
 //  Commands  //
 ////////////////
@@ -4296,29 +4422,34 @@
     }
 }
 
-////////////////
-// Extensions //
-////////////////
+@extension("VK_EXT_KHR_surface")
+cmd void vkDestroySurfaceKHR(
+        VkInstance                                  instance,
+        VkSurfaceKHR                                surface) {
+    instanceObject := GetInstance(instance)
+    surfaceObject := GetSurface(surface)
+    assert(surfaceObject.instance == instance)
 
-@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 ?
+    State.Surfaces[surface] = null
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_surface")
+cmd VkBool32 vkGetPhysicalDeviceSurfaceSupportKHR(
+        VkPhysicalDevice                            physicalDevice,
+        u32                                         queueFamilyIndex,
+        VkSurfaceKHR                                surface) {
+    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+
+    //supported := ?
+
+    return ?//supported
+}
+
+@extension("VK_EXT_KHR_swapchain")
 cmd VkResult vkGetSurfacePropertiesKHR(
-        VkDevice                                 device,
-        const VkSurfaceDescriptionKHR*           pSurfaceDescription,
-        VkSurfacePropertiesKHR*                  pSurfaceProperties) {
+        VkDevice                                    device,
+        VkSurfaceKHR                                surface,
+        VkSurfacePropertiesKHR*                     pSurfaceProperties) {
     deviceObject := GetDevice(device)
 
     surfaceProperties := ?
@@ -4327,12 +4458,12 @@
     return ?
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 cmd VkResult vkGetSurfaceFormatsKHR(
-        VkDevice                                 device,
-        const VkSurfaceDescriptionKHR*           pSurfaceDescription,
-        u32*                                     pCount,
-        VkSurfaceFormatKHR*                      pSurfaceFormats) {
+        VkDevice                                    device,
+        VkSurfaceKHR                                surface,
+        u32*                                        pCount,
+        VkSurfaceFormatKHR*                         pSurfaceFormats) {
     deviceObject := GetDevice(device)
 
     count := as!u32(?)
@@ -4347,12 +4478,12 @@
     return ?
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 cmd VkResult vkGetSurfacePresentModesKHR(
-        VkDevice                                 device,
-        const VkSurfaceDescriptionKHR*           pSurfaceDescription,
-        u32*                                     pCount,
-        VkPresentModeKHR*                        pPresentModes) {
+        VkDevice                                    device,
+        VkSurfaceKHR                                surface,
+        u32*                                        pCount,
+        VkPresentModeKHR*                           pPresentModes) {
     deviceObject := GetDevice(device)
 
     count := as!u32(?)
@@ -4367,12 +4498,12 @@
     return ?
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 cmd VkResult vkCreateSwapchainKHR(
         VkDevice                                 device,
         const VkSwapchainCreateInfoKHR*          pCreateInfo,
         VkSwapchainKHR*                          pSwapchain) {
-    //assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR)
+    assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR)
     deviceObject := GetDevice(device)
 
     swapchain := ?
@@ -4382,8 +4513,8 @@
     return ?
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
-cmd VkResult vkDestroySwapchainKHR(
+@extension("VK_EXT_KHR_swapchain")
+cmd void vkDestroySwapchainKHR(
         VkDevice                                 device,
         VkSwapchainKHR                           swapchain) {
     deviceObject := GetDevice(device)
@@ -4391,11 +4522,9 @@
     assert(swapchainObject.device == device)
 
     State.Swapchains[swapchain] = null
-
-    return ?
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 cmd VkResult vkGetSwapchainImagesKHR(
         VkDevice                                 device,
         VkSwapchainKHR                           swapchain,
@@ -4410,20 +4539,19 @@
     for i in (0 .. count) {
         swapchainImage := ?
         swapchainImages[i] = swapchainImage
-        if !(swapchainImage in State.Images) {
-            State.Images[swapchainImage] = new!ImageObject(device: device)
-        }
+        State.Images[swapchainImage] = new!ImageObject(device: device)
     }
 
     return ?
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 cmd VkResult vkAcquireNextImageKHR(
         VkDevice                                 device,
         VkSwapchainKHR                           swapchain,
         u64                                      timeout,
         VkSemaphore                              semaphore,
+        VkFence                                  fence,
         u32*                                     pImageIndex) {
     deviceObject := GetDevice(device)
     swapchainObject := GetSwapchain(swapchain)
@@ -4434,7 +4562,7 @@
     return ?
 }
 
-@extension("VK_EXT_KHR_device_swapchain")
+@extension("VK_EXT_KHR_swapchain")
 cmd VkResult vkQueuePresentKHR(
         VkQueue                                  queue,
         VkPresentInfoKHR*                        pPresentInfo) {
@@ -4446,6 +4574,107 @@
     return ?
 }
 
+@extension("VK_EXT_KHR_display")
+cmd VkResult vkGetPhysicalDeviceDisplayPropertiesKHR(
+        VkPhysicalDevice                        physicalDevice,
+        u32*                                    count,
+        VkDisplayPropertiesKHR*                 pProperties) {
+    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+    return ?
+}
+
+@extension("VK_EXT_KHR_display")
+cmd VkResult vkGetDisplayModePropertiesKHR(
+        VkPhysicalDevice                        physicalDevice,
+        VkDisplayKHR                            display,
+        u32*                                    pCount,
+        VkDisplayModePropertiesKHR*             pModeProperties) {
+    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+    return ?
+}
+
+@extension("VK_EXT_KHR_display")
+cmd VkResult vkCreateDisplayModeKHR(
+        VkPhysicalDevice                        physicalDevice,
+        VkDisplayKHR                            display,
+        const VkDisplayModeCreateInfoKHR*       pCreateInfo,
+        VkDisplayModeKHR*                       pMode) {
+    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+    return ?
+}
+
+@extension("VK_EXT_KHR_display")
+cmd VkResult vkGetDisplayPlanePropertiesKHR(
+        VkPhysicalDevice                        physicalDevice,
+        VkDisplayKHR                            display,
+        VkDisplayModeKHR                        mode,
+        u32                                     planeIndex,
+        VkDisplayPlanePropertiesKHR*            pProperties) {
+    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+    return ?
+}
+
+@extension("VK_EXT_KHR_x11_surface")
+cmd VkResult vkCreateX11SurfaceKHR(
+        VkInstance                              instance,
+        platform.Display*                       dpy,
+        platform.Window                         root,
+        platform.Window                         window,
+        VkSurfaceKHR*                           pSurface) {
+    instanceObject := GetInstance(instance)
+    return ?
+}
+
+@extension("VK_EXT_KHR_xcb_surface")
+cmd VkResult vkCreateXCBSurfaceKHR(
+        VkInstance                              instance,
+        platform.xcb_connection_t*              connection,
+        platform.xcb_window_t                   root,
+        platform.xcb_window_t                   window,
+        VkSurfaceKHR*                           pSurface) {
+    instanceObject := GetInstance(instance)
+    return ?
+}
+
+@extension("VK_EXT_KHR_wayland_surface")
+cmd VkResult vkCreateWaylandSurfaceKHR(
+        VkInstance                              instance,
+        platform.wl_display*                    display,
+        platform.wl_surface*                    surface,
+        VkSurfaceKHR*                           pSurface) {
+    instanceObject := GetInstance(instance)
+    return ?
+}
+
+@extension("VK_EXT_KHR_mir_surface")
+cmd VkResult vkCreateMirSurfaceKHR(
+        VkInstance                              instance,
+        platform.MirConnection*                 connection,
+        platform.MirSurface*                    mirSurface,
+        VkSurfaceKHR*                           pSurface) {
+    instanceObject := GetInstance(instance)
+    return ?
+}
+
+@extension("VK_EXT_KHR_android_surface")
+cmd VkResult vkCreateAndroidSurfaceKHR(
+        VkInstance                              instance,
+        platform.ANativeWindow*                 window
+        VkSurfaceKHR*                           pSurface) {
+    instanceObject := GetInstance(instance)
+    return ?
+}
+
+@extension("VK_EXT_KHR_win32_surface")
+cmd VkResult vkCreateWin32SurfaceKHR(
+        VkInstance                              instance,
+        platform.HINSTANCE                      hinstance,
+        platform.HWND                           hwnd,
+        VkSurfaceKHR*                           pSurface) {
+    instanceObject := GetInstance(instance)
+    return ?
+}
+
 
 ////////////////
 // Validation //
@@ -4490,6 +4719,7 @@
     map!(VkRenderPass,               ref!RenderPassObject)               RenderPasses
     map!(VkPipelineCache,            ref!PipelineCacheObject)            PipelineCaches
     map!(VkCmdPool,                  ref!CmdPoolObject)                  CmdPools
+    map!(VkSurfaceKHR,               ref!SurfaceObject)                  Surfaces
     map!(VkSwapchainKHR,             ref!SwapchainObject)                Swapchains
 }
 
@@ -4609,6 +4839,10 @@
     VkDevice      device
 }
 
+@internal class SurfaceObject {
+    VkInstance    instance
+}
+
 @internal class SwapchainObject {
     VkDevice      device
 }
@@ -4743,6 +4977,11 @@
     return State.CmdPools[cmdPool]
 }
 
+macro ref!SurfaceObject GetSurface(VkSurfaceKHR surface) {
+    assert(surface in State.Surfaces)
+    return State.Surfaces[surface]
+}
+
 macro ref!SwapchainObject GetSwapchain(VkSwapchainKHR swapchain) {
     assert(swapchain in State.Swapchains)
     return State.Swapchains[swapchain]