vulkan: Add sdk-0.9 virtual branch

Change-Id: If339b10e9a0cb07cf4bcdeedceaf71b5f609da15
(cherry picked from commit d202e3c7049df2df60828aedaeeb99eae762df58)
diff --git a/vulkan/patches/README b/vulkan/patches/README
index 64ccf5d..7e0376a 100644
--- a/vulkan/patches/README
+++ b/vulkan/patches/README
@@ -17,3 +17,11 @@
 activity's native library directory. The loader will search this
 directory for layer libraries. Without this change, layers will only
 be loaded from a global location under /data.
+
+
+sdk-0.9
+-------
+This branch contains experimental support for the sdk-0.9. Changes to
+the core API up to version 0.170.2 are complete, but not tested much
+yet. These patches are probably missing changes to the swapchain
+extensions.
diff --git a/vulkan/patches/sdk-0.9/0001-vulkan-Update-from-header-0.138.2-to-0.170.2.patch b/vulkan/patches/sdk-0.9/0001-vulkan-Update-from-header-0.138.2-to-0.170.2.patch
new file mode 100644
index 0000000..e88258d
--- /dev/null
+++ b/vulkan/patches/sdk-0.9/0001-vulkan-Update-from-header-0.138.2-to-0.170.2.patch
@@ -0,0 +1,6298 @@
+From dc816657910a33b838074dca34c4a2f5739f1b6f Mon Sep 17 00:00:00 2001
+From: Jesse Hall <jessehall@google.com>
+Date: Thu, 8 Oct 2015 14:00:22 -0700
+Subject: [PATCH] vulkan: Update from header 0.138.2 to 0.170.2
+
+Change-Id: I011e1f27d025730d448ee5cfefc6701300b455c2
+---
+ vulkan/api/platform.api                 |    6 -
+ vulkan/api/templates/vk_xml.tmpl        |   33 +-
+ vulkan/api/templates/vulkan_common.tmpl |    2 +-
+ vulkan/api/templates/vulkan_h.tmpl      |   27 +-
+ vulkan/api/vulkan.api                   | 1144 +++++++++++++------------------
+ vulkan/include/hardware/hwvulkan.h      |    3 +-
+ vulkan/include/vulkan/vk_platform.h     |   16 -
+ vulkan/include/vulkan/vulkan.h          |  924 ++++++++++++-------------
+ vulkan/libvulkan/entry.cpp              |  249 +++----
+ vulkan/libvulkan/get_proc_addr.cpp      |  190 ++---
+ vulkan/libvulkan/loader.cpp             |   85 +--
+ vulkan/libvulkan/loader.h               |   42 +-
+ vulkan/libvulkan/swapchain.cpp          |   44 +-
+ vulkan/nulldrv/null_driver.cpp          |  139 ++--
+ vulkan/nulldrv/null_driver.h            |   40 +-
+ vulkan/nulldrv/null_driver_gen.cpp      |   31 +-
+ vulkan/tools/Android.mk                 |    1 +
+ vulkan/tools/vkinfo.cpp                 |   82 ++-
+ 18 files changed, 1338 insertions(+), 1720 deletions(-)
+
+diff --git a/vulkan/api/platform.api b/vulkan/api/platform.api
+index 3da6fed..23f649d 100644
+--- a/vulkan/api/platform.api
++++ b/vulkan/api/platform.api
+@@ -22,9 +22,3 @@
+ // Platform types, as defined or included in vk_platform.h
+ 
+ type u64 size_t
+-
+-type u64 VkDeviceSize
+-type u32 VkBool32
+-
+-type u32 VkSampleMask
+-type u32 VkFlags
+diff --git a/vulkan/api/templates/vk_xml.tmpl b/vulkan/api/templates/vk_xml.tmpl
+index c040938..893bde7 100644
+--- a/vulkan/api/templates/vk_xml.tmpl
++++ b/vulkan/api/templates/vk_xml.tmpl
+@@ -68,13 +68,18 @@ This file, vk.xml, is the Vulkan API Registry.»
+         // the object handle as a bool in expressions like:
+         //     if (obj) vkDestroy(obj);
+         #define VK_NONDISP_HANDLE_OPERATOR_BOOL() explicit operator bool() const { return handle != 0; }
++        #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
++            explicit obj(uint64_t x) : handle(x) { } \
++            obj(decltype(nullptr)) : handle(0) { }
+     «#else»
+         #define VK_NONDISP_HANDLE_OPERATOR_BOOL()
++        #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
++            obj(uint64_t x) : handle(x) { }
+     «#endif
+     #define <name>VK_DEFINE_NONDISP_HANDLE</name>(obj) \»
+         struct obj { \
+             obj() { } \
+-            obj(uint64_t x) { handle = x; } \
++            VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
+             obj&amp; operator =(uint64_t x) { handle = x; return *this; } \
+             bool operator==(const obj&amp; other) const { return handle == other.handle; } \
+             bool operator!=(const obj&amp; other) const { return handle != other.handle; } \
+@@ -87,6 +92,14 @@ This file, vk.xml, is the Vulkan API Registry.»
+ #endif
+         »»</type>
+ ¶
++        <type category="define">
++#if defined(__cplusplus) &amp;&amp; ((defined(_MSC_VER) &amp;&amp; _MSC_VER &gt;= 1800) || __cplusplus &gt;= 201103L)
++    »#define <name>VK_NULL_HANDLE</name> nullptr
++«#else
++    »#define VK_NULL_HANDLE 0
++«#endif
++        »»</type>
++¶
+         <type requires="vk_platform" name="VkDeviceSize"/>
+         <type requires="vk_platform" name="VkSampleMask"/>
+         <type requires="vk_platform" name="VkFlags"/>
+@@ -170,12 +183,13 @@ This file, vk.xml, is the Vulkan API Registry.»
+         <enum value="{{$d.Expression}}"        name="{{$d.Name}}"/>{{Macro "XML.Docs" $d.Docs}}
+         {{end}}
+       {{end}}
+-        <enum value="MAX_FLOAT"  name="VK_LOD_CLAMP_NONE"/>
+-        <enum value="UINT32_MAX" name="VK_LAST_MIP_LEVEL"/>
+-        <enum value="UINT32_MAX" name="VK_LAST_ARRAY_SLICE"/>
+-        <enum value="UINT64_MAX" name="VK_WHOLE_SIZE"/>
+-        <enum value="UINT32_MAX" name="VK_ATTACHMENT_UNUSED"/>
+-        <enum value="UINT32_MAX" name="VK_QUEUE_FAMILY_IGNORED"/>
++        <enum value="1000.0f"  name="VK_LOD_CLAMP_NONE"/>
++        <enum value="(-0U)" name="VK_REMAINING_MIP_LEVELS"/>
++        <enum value="(~0U)" name="VK_REMAINING_ARRAY_LAYERS"/>
++        <enum value="(_0ULL)" name="VK_WHOLE_SIZE"/>
++        <enum value="(~0U)" name="VK_ATTACHMENT_UNUSED"/>
++        <enum value="(~0U)" name="VK_QUEUE_FAMILY_IGNORED"/>
++        <enum value="(~0U)" name="VK_SUBPASS_EXTERNAL"/>
+     «</enums>
+ ¶
+     <!-- Unlike OpenGL, most tokens in Vulkan are actual typed enumerants in»
+@@ -217,13 +231,12 @@ This file, vk.xml, is the Vulkan API Registry.»
+         «</require>
+         <require comment="API constants">»
+             <enum name="VK_LOD_CLAMP_NONE"/>
+-            <enum name="VK_LAST_MIP_LEVEL"/>
+-            <enum name="VK_LAST_ARRAY_SLICE"/>
++            <enum name="VK_REMAINING_MIP_LEVELS"/>
++            <enum name="VK_REMAINING_ARRAY_LAYERS"/>
+             <enum name="VK_WHOLE_SIZE"/>
+             <enum name="VK_ATTACHMENT_UNUSED"/>
+             <enum name="VK_TRUE"/>
+             <enum name="VK_FALSE"/>
+-            <enum name="VK_NULL_HANDLE"/>
+         «</require>
+         <require comment="All functions (TODO: split by type)">»
+         {{range $f := AllCommands $}}
+diff --git a/vulkan/api/templates/vulkan_common.tmpl b/vulkan/api/templates/vulkan_common.tmpl
+index 135c835..12d5788 100644
+--- a/vulkan/api/templates/vulkan_common.tmpl
++++ b/vulkan/api/templates/vulkan_common.tmpl
+@@ -137,7 +137,7 @@
+ {{define "Parameter"}}
+   {{AssertType $ "Parameter"}}
+ 
+-  {{Macro "ParameterType" $}} {{$.Name}}{{Macro "ArrayPostfix" $}}
++  {{if GetAnnotation $ "readonly"}}const {{end}}{{Macro "ParameterType" $}} {{$.Name}}{{Macro "ArrayPostfix" $}}
+ {{end}}
+ 
+ 
+diff --git a/vulkan/api/templates/vulkan_h.tmpl b/vulkan/api/templates/vulkan_h.tmpl
+index 6747147..2dee541 100644
+--- a/vulkan/api/templates/vulkan_h.tmpl
++++ b/vulkan/api/templates/vulkan_h.tmpl
+@@ -53,10 +53,16 @@ extern "C" {
+ #define VK_API_VERSION \
+     VK_MAKE_VERSION({{Global "VERSION_MAJOR"}}, {{Global "VERSION_MINOR"}}, {{Global "VERSION_PATCH"}})
+ ¶
++#if defined(__cplusplus) && (_MSC_VER >= 1800 || __cplusplus >= 201103L)
++    #define VK_NULL_HANDLE nullptr
++#else
++    #define VK_NULL_HANDLE 0
++#endif
++¶
+ #define VK_DEFINE_HANDLE(obj) typedef struct obj##_T* obj;
+ ¶
+ #if defined(__cplusplus)
+-#if (_MSC_VER >= 1800 || __cplusplus >= 201103L)
++#if ((defined(_MSC_VER) && _MSC_VER >= 1800 || __cplusplus >= 201103L)
+ // The bool operator only works if there are no implicit conversions from an obj to
+ // a bool-compatible type, which can then be used to unintentionally violate type safety.
+ // C++11 and above supports the "explicit" keyword on conversion operators to stop this
+@@ -65,13 +71,18 @@ extern "C" {
+ //     if (obj) vkDestroy(obj);
+ #define VK_NONDISP_HANDLE_OPERATOR_BOOL() \
+     explicit operator bool() const { return handle != 0; }
++#define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
++    explicit obj(uint64_t x) : handle(x) { } \
++    obj(decltype(nullptr)) : handle(0) { }
+ #else
+ #define VK_NONDISP_HANDLE_OPERATOR_BOOL()
++#define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
++    obj(uint64_t x) : handle(x) { }
+ #endif
+ #define VK_DEFINE_NONDISP_HANDLE(obj)                                              \
+     struct obj {                                                                   \
+         obj() : handle(0) { }                                                      \
+-        obj(uint64_t x) : handle(x) { }                                            \
++        VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj)                             \
+         obj& operator=(uint64_t x) {                                               \
+             handle = x;                                                            \
+             return *this;                                                          \
+@@ -87,11 +98,13 @@ extern "C" {
+     typedef struct obj##_T { uint64_t handle; } obj;
+ #endif
+ ¶
+-#define VK_LOD_CLAMP_NONE       MAX_FLOAT
+-#define VK_LAST_MIP_LEVEL       UINT32_MAX
+-#define VK_LAST_ARRAY_SLICE     UINT32_MAX
+-#define VK_WHOLE_SIZE           UINT64_MAX
+-#define VK_ATTACHMENT_UNUSED    UINT32_MAX
++#define VK_LOD_CLAMP_NONE         1000.0f
++#define VK_REMAINING_MIP_LEVELS   (~0U)
++#define VK_REMAINING_ARRAY_LAYERS (~0U)
++#define VK_WHOLE_SIZE             (~0ULL)
++#define VK_ATTACHMENT_UNUSED      (~0U)
++define VK_QUEUE_FAMILY_IGNORED    (~0U)
++define VK_SUBPASS_EXTERNAL        (~0U)
+ {{range $d := $.Definitions}}
+   {{if HasPrefix $d.Name "VK_"}}#define {{$d.Name}}  {{$d.Expression}}{{end}}
+ {{end}}
+diff --git a/vulkan/api/vulkan.api b/vulkan/api/vulkan.api
+index c014454..9ea1ee4 100644
+--- a/vulkan/api/vulkan.api
++++ b/vulkan/api/vulkan.api
+@@ -27,7 +27,7 @@ import platform "platform.api"
+ 
+ // API version (major.minor.patch)
+ define VERSION_MAJOR 0
+-define VERSION_MINOR 138
++define VERSION_MINOR 170
+ define VERSION_PATCH 2
+ 
+ // API limits
+@@ -41,13 +41,20 @@ define VK_MAX_MEMORY_HEAPS         16    /// The maximum number of unique memory
+ // API keywords
+ define VK_TRUE        1
+ define VK_FALSE       0
+-define VK_NULL_HANDLE 0
++
++// API keyword, but needs special handling by some templates
++define NULL_HANDLE 0
+ 
+ 
+ /////////////
+ //  Types  //
+ /////////////
+ 
++type u32 VkBool32
++type u32 VkFlags
++type u64 VkDeviceSize
++type u32 VkSampleMask
++
+ /// Dispatchable handle types.
+ @dispatchHandle type u64 VkInstance
+ @dispatchHandle type u64 VkPhysicalDevice
+@@ -62,7 +69,6 @@ define VK_NULL_HANDLE 0
+ @nonDispatchHandle type u64 VkBufferView
+ @nonDispatchHandle type u64 VkImage
+ @nonDispatchHandle type u64 VkImageView
+-@nonDispatchHandle type u64 VkAttachmentView
+ @nonDispatchHandle type u64 VkShaderModule
+ @nonDispatchHandle type u64 VkShader
+ @nonDispatchHandle type u64 VkPipeline
+@@ -71,10 +77,6 @@ define VK_NULL_HANDLE 0
+ @nonDispatchHandle type u64 VkDescriptorSet
+ @nonDispatchHandle type u64 VkDescriptorSetLayout
+ @nonDispatchHandle type u64 VkDescriptorPool
+-@nonDispatchHandle type u64 VkDynamicViewportState
+-@nonDispatchHandle type u64 VkDynamicRasterState
+-@nonDispatchHandle type u64 VkDynamicColorBlendState
+-@nonDispatchHandle type u64 VkDynamicDepthStencilState
+ @nonDispatchHandle type u64 VkFence
+ @nonDispatchHandle type u64 VkSemaphore
+ @nonDispatchHandle type u64 VkEvent
+@@ -97,6 +99,7 @@ enum VkImageLayout {
+     VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL                = 0x00000005,   /// Optimal layout when image is used for read only shader access
+     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
+ }
+ 
+ enum VkAttachmentLoadOp {
+@@ -138,11 +141,6 @@ enum VkImageAspect {
+     VK_IMAGE_ASPECT_METADATA                                = 0x00000003,
+ }
+ 
+-enum VkBufferViewType {
+-    VK_BUFFER_VIEW_TYPE_RAW                                 = 0x00000000,   /// Raw buffer without special structure (UBO, SSBO)
+-    VK_BUFFER_VIEW_TYPE_FORMATTED                           = 0x00000001,   /// Buffer with format (TBO, IBO)
+-}
+-
+ enum VkCmdBufferLevel {
+     VK_CMD_BUFFER_LEVEL_PRIMARY                             = 0x00000000,
+     VK_CMD_BUFFER_LEVEL_SECONDARY                           = 0x00000001,
+@@ -240,12 +238,12 @@ enum VkTexMipmapMode {
+     VK_TEX_MIPMAP_MODE_LINEAR                               = 0x00000002,   /// Linear filter between mip levels
+ }
+ 
+-enum VkTexAddress {
+-    VK_TEX_ADDRESS_WRAP                                     = 0x00000000,
+-    VK_TEX_ADDRESS_MIRROR                                   = 0x00000001,
+-    VK_TEX_ADDRESS_CLAMP                                    = 0x00000002,
+-    VK_TEX_ADDRESS_MIRROR_ONCE                              = 0x00000003,
+-    VK_TEX_ADDRESS_CLAMP_BORDER                             = 0x00000004,
++enum VkTexAddressMode {
++    VK_TEX_ADDRESS_MODE_WRAP                                = 0x00000000,
++    VK_TEX_ADDRESS_MODE_MIRROR                              = 0x00000001,
++    VK_TEX_ADDRESS_MODE_CLAMP                               = 0x00000002,
++    VK_TEX_ADDRESS_MODE_MIRROR_ONCE                         = 0x00000003,
++    VK_TEX_ADDRESS_MODE_CLAMP_BORDER                        = 0x00000004,
+ }
+ 
+ enum VkCompareOp {
+@@ -450,7 +448,7 @@ enum VkFormat {
+     VK_FORMAT_R11G11B10_UFLOAT                              = 0x00000057,
+     VK_FORMAT_R9G9B9E5_UFLOAT                               = 0x00000058,
+     VK_FORMAT_D16_UNORM                                     = 0x00000059,
+-    VK_FORMAT_D24_UNORM                                     = 0x0000005A,
++    VK_FORMAT_D24_UNORM_X8                                  = 0x0000005A,
+     VK_FORMAT_D32_SFLOAT                                    = 0x0000005B,
+     VK_FORMAT_S8_UINT                                       = 0x0000005C,
+     VK_FORMAT_D16_UNORM_S8_UINT                             = 0x0000005D,
+@@ -552,52 +550,49 @@ enum VkStructureType {
+     VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO                        = 1,
+     VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO                         = 2,
+     VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO                    = 3,
+-    VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO               = 4,
+-    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO                 = 5,
+-    VK_STRUCTURE_TYPE_SHADER_CREATE_INFO                        = 6,
+-    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO              = 7,
+-    VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO                       = 8,
+-    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO         = 9,
+-    VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO        = 10,
+-    VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO          = 11,
+-    VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO     = 12,
+-    VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO   = 13,
+-    VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO                    = 14,
+-    VK_STRUCTURE_TYPE_EVENT_CREATE_INFO                         = 15,
+-    VK_STRUCTURE_TYPE_FENCE_CREATE_INFO                         = 16,
+-    VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO                     = 17,
+-    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO                    = 18,
+-    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO         = 19,
+-    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO             = 20,
+-    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO   = 21,
+-    VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 22,
+-    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO   = 23,
+-    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO       = 24,
+-    VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO         = 25,
+-    VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO    = 26,
+-    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO    = 27,
+-    VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO  = 28,
+-    VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO                         = 29,
+-    VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO                        = 30,
+-    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO                   = 31,
+-    VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO                   = 32,
+-    VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO                     = 33,
+-    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO                   = 34,
+-    VK_STRUCTURE_TYPE_MEMORY_BARRIER                            = 35,
+-    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER                     = 36,
+-    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER                      = 37,
+-    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO               = 38,
+-    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET                      = 39,
+-    VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET                       = 40,
+-    VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO                      = 41,
+-    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO               = 42,
+-    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE                       = 43,
+-    VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO                = 44,
+-    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION                    = 45,
+-    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION                       = 46,
+-    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY                        = 47,
+-    VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO                    = 48,
+-    VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO                      = 49,
++    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO                 = 4,
++    VK_STRUCTURE_TYPE_SHADER_CREATE_INFO                        = 5,
++    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO              = 6,
++    VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO                       = 7,
++    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO         = 8,
++    VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO                    = 9,
++    VK_STRUCTURE_TYPE_EVENT_CREATE_INFO                         = 10,
++    VK_STRUCTURE_TYPE_FENCE_CREATE_INFO                         = 11,
++    VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO                     = 12,
++    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO                    = 13,
++    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO         = 14,
++    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO             = 15,
++    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO   = 16,
++    VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 17,
++    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO   = 18,
++    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO       = 19,
++    VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO         = 20,
++    VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO    = 21,
++    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO    = 22,
++    VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO  = 23,
++    VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO                         = 24,
++    VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO                        = 25,
++    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO                   = 26,
++    VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO                   = 27,
++    VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO                     = 28,
++    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO                   = 29,
++    VK_STRUCTURE_TYPE_MEMORY_BARRIER                            = 30,
++    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER                     = 31,
++    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER                      = 32,
++    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO               = 33,
++    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET                      = 34,
++    VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET                       = 35,
++    VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO                      = 36,
++    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO               = 37,
++    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE                       = 38,
++    VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO                = 39,
++    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION                    = 40,
++    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION                       = 41,
++    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY                        = 42,
++    VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO                    = 43,
++    VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO                      = 44,
++    VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO                  = 45,
++    VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO        = 46,
+ }
+ 
+ enum VkRenderPassContents {
+@@ -605,7 +600,7 @@ enum VkRenderPassContents {
+     VK_RENDER_PASS_CONTENTS_SECONDARY_CMD_BUFFERS           = 0x00000001,
+ }
+ 
+-@lastUnused(-33)
++@lastUnused(-8)
+ /// Error and return codes
+ enum VkResult {
+     // Return codes for successful operation execution (positive values)
+@@ -618,38 +613,26 @@ enum VkResult {
+     VK_INCOMPLETE                                           = 0x00000006,
+ 
+     // Error codes (negative values)
+-    VK_ERROR_UNKNOWN                                        = 0xFFFFFFFF,
+-    VK_ERROR_UNAVAILABLE                                    = 0xFFFFFFFE,
++    VK_ERROR_OUT_OF_HOST_MEMORY                             = 0xFFFFFFFF,
++    VK_ERROR_OUT_OF_DEVICE_MEMORY                           = 0xFFFFFFFE,
+     VK_ERROR_INITIALIZATION_FAILED                          = 0xFFFFFFFD,
+-    VK_ERROR_OUT_OF_HOST_MEMORY                             = 0xFFFFFFFC,
+-    VK_ERROR_OUT_OF_DEVICE_MEMORY                           = 0xFFFFFFFB,
+-    VK_ERROR_DEVICE_ALREADY_CREATED                         = 0xFFFFFFFA,
+-    VK_ERROR_DEVICE_LOST                                    = 0xFFFFFFF9,
+-    VK_ERROR_INVALID_POINTER                                = 0xFFFFFFF8,
+-    VK_ERROR_INVALID_VALUE                                  = 0xFFFFFFF7,
+-    VK_ERROR_INVALID_HANDLE                                 = 0xFFFFFFF6,
+-    VK_ERROR_INVALID_ORDINAL                                = 0xFFFFFFF5,
+-    VK_ERROR_INVALID_MEMORY_SIZE                            = 0xFFFFFFF4,
+-    VK_ERROR_INVALID_EXTENSION                              = 0xFFFFFFF3,
+-    VK_ERROR_INVALID_FLAGS                                  = 0xFFFFFFF2,
+-    VK_ERROR_INVALID_ALIGNMENT                              = 0xFFFFFFF1,
+-    VK_ERROR_INVALID_FORMAT                                 = 0xFFFFFFF0,
+-    VK_ERROR_INVALID_IMAGE                                  = 0xFFFFFFEF,
+-    VK_ERROR_INVALID_DESCRIPTOR_SET_DATA                    = 0xFFFFFFEE,
+-    VK_ERROR_INVALID_QUEUE_TYPE                             = 0xFFFFFFED,
+-    VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION                  = 0xFFFFFFEC,
+-    VK_ERROR_BAD_SHADER_CODE                                = 0xFFFFFFEB,
+-    VK_ERROR_BAD_PIPELINE_DATA                              = 0xFFFFFFEA,
+-    VK_ERROR_NOT_MAPPABLE                                   = 0xFFFFFFE9,
+-    VK_ERROR_MEMORY_MAP_FAILED                              = 0xFFFFFFE8,
+-    VK_ERROR_MEMORY_UNMAP_FAILED                            = 0xFFFFFFE7,
+-    VK_ERROR_INCOMPATIBLE_DEVICE                            = 0xFFFFFFE6,
+-    VK_ERROR_INCOMPATIBLE_DRIVER                            = 0xFFFFFFE5,
+-    VK_ERROR_INCOMPLETE_COMMAND_BUFFER                      = 0xFFFFFFE4,
+-    VK_ERROR_BUILDING_COMMAND_BUFFER                        = 0xFFFFFFE3,
+-    VK_ERROR_MEMORY_NOT_BOUND                               = 0xFFFFFFE2,
+-    VK_ERROR_INCOMPATIBLE_QUEUE                             = 0xFFFFFFE1,
+-    VK_ERROR_INVALID_LAYER                                  = 0xFFFFFFE0,
++    VK_ERROR_DEVICE_LOST                                    = 0xFFFFFFFC,
++    VK_ERROR_MEMORY_MAP_FAILED                              = 0xFFFFFFFB,
++    VK_ERROR_LAYER_NOT_PRESENT                              = 0xFFFFFFFA,
++    VK_ERROR_EXTENSION_NOT_PRESENT                          = 0xFFFFFFF9,
++    VK_ERROR_INCOMPATIBLE_DRIVER                            = 0xFFFFFFF8,
++}
++
++enum VkDynamicState {
++    VK_DYNAMIC_STATE_VIEWPORT                               = 0x00000000,
++    VK_DYNAMIC_STATE_SCISSOR                                = 0x00000001,
++    VK_DYNAMIC_STATE_LINE_WIDTH                             = 0x00000002,
++    VK_DYNAMIC_STATE_DEPTH_BIAS                             = 0x00000003,
++    VK_DYNAMIC_STATE_BLEND_CONSTANTS                        = 0x00000004,
++    VK_DYNAMIC_STATE_DEPTH_BOUNDS                           = 0x00000005,
++    VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK                   = 0x00000006,
++    VK_DYNAMIC_STATE_STENCIL_WRITE_MASK                     = 0x00000007,
++    VK_DYNAMIC_STATE_STENCIL_REFERENCE                      = 0x00000008,
+ }
+ 
+ 
+@@ -657,11 +640,6 @@ enum VkResult {
+ //  Bitfields  //
+ /////////////////
+ 
+-/// Device creation flags
+-bitfield VkDeviceCreateFlags {
+-    VK_DEVICE_CREATE_VALIDATION_BIT                         = 0x00000001,
+-}
+-
+ /// Queue capabilities
+ bitfield VkQueueFlags {
+     VK_QUEUE_GRAPHICS_BIT                                   = 0x00000001,    /// Queue supports graphics operations
+@@ -684,7 +662,7 @@ bitfield VkMemoryPropertyFlags {
+ 
+ /// Memory heap flags
+ bitfield VkMemoryHeapFlags {
+-    VK_MEMORY_HEAP_HOST_LOCAL                               = 0x00000001,    /// If set, heap represents host memory
++    VK_MEMORY_HEAP_HOST_LOCAL_BIT                           = 0x00000001,    /// If set, heap represents host memory
+ }
+ 
+ /// Memory output flags passed to resource transition commands
+@@ -712,7 +690,6 @@ bitfield VkMemoryInputFlags {
+ 
+ /// Buffer usage flags
+ bitfield VkBufferUsageFlags {
+-    VK_BUFFER_USAGE_GENERAL                                 = 0x00000000,    /// No special usage
+     VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT                     = 0x00000001,    /// Can be used as a source of transfer operations
+     VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT                = 0x00000002,    /// Can be used as a destination of transfer operations
+     VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT                = 0x00000004,    /// Can be used as TBO
+@@ -726,7 +703,7 @@ bitfield VkBufferUsageFlags {
+ 
+ /// Buffer creation flags
+ bitfield VkBufferCreateFlags {
+-    VK_BUFFER_CREATE_SPARSE_BIT                             = 0x00000001,    /// Buffer should support sparse backing
++    VK_BUFFER_CREATE_SPARSE_BINDING_BIT                     = 0x00000001,    /// Buffer should support sparse backing
+     VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT                   = 0x00000002,    /// Buffer should support sparse backing with partial residency
+     VK_BUFFER_CREATE_SPARSE_ALIASED_BIT                     = 0x00000004,    /// Buffer should support constent data access to physical memory blocks mapped into multiple locations of sparse buffers
+ }
+@@ -745,31 +722,29 @@ bitfield VkShaderStageFlags {
+ 
+ /// Image usage flags
+ bitfield VkImageUsageFlags {
+-    VK_IMAGE_USAGE_GENERAL                                  = 0x00000000,    /// No special usage
+     VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT                      = 0x00000001,    /// Can be used as a source of transfer operations
+     VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT                 = 0x00000002,    /// Can be used as a destination of transfer operations
+     VK_IMAGE_USAGE_SAMPLED_BIT                              = 0x00000004,    /// Can be sampled from (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)
+     VK_IMAGE_USAGE_STORAGE_BIT                              = 0x00000008,    /// Can be used as storage image (STORAGE_IMAGE descriptor type)
+     VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT                     = 0x00000010,    /// Can be used as framebuffer color attachment
+-    VK_IMAGE_USAGE_DEPTH_STENCIL_BIT                        = 0x00000020,    /// Can be used as framebuffer depth/stencil attachment
++    VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT             = 0x00000020,    /// Can be used as framebuffer depth/stencil attachment
+     VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT                 = 0x00000040,    /// Image data not needed outside of rendering
+     VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT                     = 0x00000080,    /// Can be used as framebuffer input attachment
+ }
+ 
+ /// Image creation flags
+ bitfield VkImageCreateFlags {
+-    VK_IMAGE_CREATE_SPARSE_BIT                              = 0x00000001,    /// Image should support sparse backing
++    VK_IMAGE_CREATE_SPARSE_BINDING_BIT                      = 0x00000001,    /// Image should support sparse backing
+     VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT                    = 0x00000002,    /// Image should support sparse backing with partial residency
+     VK_IMAGE_CREATE_SPARSE_ALIASED_BIT                      = 0x00000004,    /// Image should support constent data access to physical memory blocks mapped into multiple locations of sparse images
+-    VK_IMAGE_CREATE_INVARIANT_DATA_BIT                      = 0x00000008,
+-    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT                      = 0x00000010,    /// Allows image views to have different format than the base image
+-    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT                     = 0x00000020,    /// Allows creating image views with cube type from the created image
++    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT                      = 0x00000008,    /// Allows image views to have different format than the base image
++    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT                     = 0x00000010,    /// Allows creating image views with cube type from the created image
+ }
+ 
+ /// Framebuffer attachment view creation flags
+-bitfield VkAttachmentViewCreateFlags {
+-    VK_ATTACHMENT_VIEW_CREATE_READ_ONLY_DEPTH_BIT           = 0x00000001,
+-    VK_ATTACHMENT_VIEW_CREATE_READ_ONLY_STENCIL_BIT         = 0x00000002,
++bitfield VkImageViewCreateFlags {
++    VK_IMAGE_VIEW_CREATE_READ_ONLY_DEPTH_BIT                = 0x00000001,
++    VK_IMAGE_VIEW_CREATE_READ_ONLY_STENCIL_BIT              = 0x00000002,
+ }
+ 
+ /// Pipeline creation flags
+@@ -808,7 +783,8 @@ bitfield VkFormatFeatureFlags {
+     VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT                  = 0x00000080,    /// Format can be used for color attachment images
+     VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT            = 0x00000100,    /// Format supports blending in case it's used for color attachment images
+     VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT          = 0x00000200,    /// Format can be used for depth/stencil attachment images
+-    VK_FORMAT_FEATURE_CONVERSION_BIT                        = 0x00000400,    /// Format can be used as the source or destination of format converting blits
++    VK_FORMAT_FEATURE_BLIT_SOURCE_BIT                       = 0x00000400,    /// Format can be used as the source image of blits with vkCmdBlitImage
++    VK_FORMAT_FEATURE_BLIT_DESTINATION_BIT                  = 0x00000800,    /// Format can be used as the destination image of blits with vkCmdBlitImage
+ }
+ 
+ /// Query control flags
+@@ -904,11 +880,15 @@ bitfield VkPipelineStageFlags {
+     VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT           = 0x00000400,  /// Color attachment writes
+     VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT                    = 0x00000800,  /// Compute shading
+     VK_PIPELINE_STAGE_TRANSFER_BIT                          = 0x00001000,  /// Transfer/copy operations
+-    VK_PIPELINE_STAGE_TRANSITION_BIT                        = 0x00002000,  /// Resource transition commands
+-    VK_PIPELINE_STAGE_HOST_BIT                              = 0x00004000,  /// Indicates host (CPU) is a source/sink of the dependency
++    VK_PIPELINE_STAGE_HOST_BIT                              = 0x00002000,  /// Indicates host (CPU) is a source/sink of the dependency
+ 
+     VK_PIPELINE_STAGE_ALL_GRAPHICS                          = 0x000007FF,  /// All stages of the graphics pipeline
+-    VK_PIPELINE_STAGE_ALL_GPU_COMMANDS                      = 0x00003FFF,  /// All graphics, compute, copy, and transition commands
++    VK_PIPELINE_STAGE_ALL_GPU_COMMANDS                      = 0x00001FFF,  /// All graphics, compute, copy, and transition commands
++}
++
++/// Render pass attachment description flags
++bitfield VkAttachmentDescriptionFlags {
++    VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT                 = 0x00000001,  /// The attachment may alias physical memory of another attachment in the same renderpass
+ }
+ 
+ /// Subpass description flags
+@@ -924,11 +904,27 @@ bitfield VkCmdPoolCreateFlags {
+ 
+ /// Command pool reset flags
+ bitfield VkCmdPoolResetFlags {
+-    VK_CMD_POOL_RESET_RELEASE_RESOURCES                     = 0x00000001,  /// Release resources owned by the pool
++    VK_CMD_POOL_RESET_RELEASE_RESOURCES_BIT                 = 0x00000001,  /// Release resources owned by the pool
+ }
+ 
+ bitfield VkCmdBufferResetFlags {
+-    VK_CMD_BUFFER_RESET_RELEASE_RESOURCES                   = 0x00000001,  /// Release resources owned by the buffer
++    VK_CMD_BUFFER_RESET_RELEASE_RESOURCES_BIT               = 0x00000001,  /// Release resources owned by the buffer
++}
++
++bitfield VkSampleCountFlags {
++    VK_SAMPLE_COUNT_1_BIT                                   = 0x00000001,
++    VK_SAMPLE_COUNT_2_BIT                                   = 0x00000002,
++    VK_SAMPLE_COUNT_4_BIT                                   = 0x00000004,
++    VK_SAMPLE_COUNT_8_BIT                                   = 0x00000008,
++    VK_SAMPLE_COUNT_16_BIT                                  = 0x00000010,
++    VK_SAMPLE_COUNT_32_BIT                                  = 0x00000020,
++    VK_SAMPLE_COUNT_64_BIT                                  = 0x00000040,
++}
++
++bitfield VkStencilFaceFlags {
++    VK_STENCIL_FACE_NONE                                    = 0x00000000,   /// No faces
++    VK_STENCIL_FACE_FRONT_BIT                               = 0x00000001,   /// Front face
++    VK_STENCIL_FACE_BACK_BIT                                = 0x00000002,   /// Back face
+ }
+ 
+ 
+@@ -992,6 +988,8 @@ class VkPhysicalDeviceProperties {
+     VkPhysicalDeviceType                        deviceType
+     char[VK_MAX_PHYSICAL_DEVICE_NAME]           deviceName
+     u8[VK_UUID_LENGTH]                          pipelineCacheUUID
++    VkPhysicalDeviceLimits                      limits
++    VkPhysicalDeviceSparseProperties            sparseProperties
+ }
+ 
+ class VkExtensionProperties {
+@@ -1023,6 +1021,8 @@ class VkAllocCallbacks {
+ }
+ 
+ class VkDeviceQueueCreateInfo {
++    VkStructureType                             sStype                    /// Should be VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO
++    const void*                                 pNext                     /// Pointer to next structure
+     u32                                         queueFamilyIndex
+     u32                                         queueCount
+ }
+@@ -1037,7 +1037,6 @@ class VkDeviceCreateInfo {
+     u32                                         extensionCount
+     const char* const*                          ppEnabledExtensionNames
+     const VkPhysicalDeviceFeatures*             pEnabledFeatures
+-    VkDeviceCreateFlags                         flags                      /// Device creation flags
+ }
+ 
+ class VkInstanceCreateInfo {
+@@ -1051,10 +1050,10 @@ class VkInstanceCreateInfo {
+     const char* const*                          ppEnabledExtensionNames    /// Extension names to be enabled
+ }
+ 
+-class VkPhysicalDeviceQueueProperties {
++class VkQueueFamilyProperties {
+     VkQueueFlags                                queueFlags                 /// Queue flags
+     u32                                         queueCount
+-    platform.VkBool32                           supportsTimestamps
++    VkBool32                                    supportsTimestamps
+ }
+ 
+ class VkPhysicalDeviceMemoryProperties {
+@@ -1067,13 +1066,13 @@ class VkPhysicalDeviceMemoryProperties {
+ class VkMemoryAllocInfo {
+     VkStructureType                             sType                      /// Must be VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO
+     const void*                                 pNext                      /// Pointer to next structure
+-    platform.VkDeviceSize                       allocationSize             /// Size of memory allocation
++    VkDeviceSize                                allocationSize             /// Size of memory allocation
+     u32                                         memoryTypeIndex            /// Index of the of the memory type to allocate from
+ }
+ 
+ class VkMemoryRequirements {
+-    platform.VkDeviceSize                       size                       /// Specified in bytes
+-    platform.VkDeviceSize                       alignment                  /// Specified in bytes
++    VkDeviceSize                                size                       /// Specified in bytes
++    VkDeviceSize                                alignment                  /// Specified in bytes
+     u32                                         memoryTypeBits             /// Bitfield of the allowed memory type indices into memoryTypes[] for this object
+ }
+ 
+@@ -1086,9 +1085,9 @@ class VkSparseImageFormatProperties {
+ class VkSparseImageMemoryRequirements {
+     VkSparseImageFormatProperties               formatProps
+     u32                                         imageMipTailStartLOD
+-    platform.VkDeviceSize                       imageMipTailSize           /// Specified in bytes, must be a multiple of image block size / alignment
+-    platform.VkDeviceSize                       imageMipTailOffset         /// Specified in bytes, must be a multiple of image block size / alignment
+-    platform.VkDeviceSize                       imageMipTailStride         /// Specified in bytes, must be a multiple of image block size / alignment
++    VkDeviceSize                                imageMipTailSize           /// Specified in bytes, must be a multiple of image block size / alignment
++    VkDeviceSize                                imageMipTailOffset         /// Specified in bytes, must be a multiple of image block size / alignment
++    VkDeviceSize                                imageMipTailStride         /// Specified in bytes, must be a multiple of image block size / alignment
+ }
+ 
+ class VkMemoryType {
+@@ -1097,7 +1096,7 @@ class VkMemoryType {
+ }
+ 
+ class VkMemoryHeap {
+-    platform.VkDeviceSize                       size                       /// Available memory in the heap
++    VkDeviceSize                                size                       /// Available memory in the heap
+     VkMemoryHeapFlags                           flags                      /// Flags for the heap
+ }
+ 
+@@ -1105,26 +1104,36 @@ class VkMappedMemoryRange {
+     VkStructureType                             sType                      /// Must be VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE
+     const void*                                 pNext                      /// Pointer to next structure
+     VkDeviceMemory                              mem                        /// Mapped memory object
+-    platform.VkDeviceSize                       offset                     /// Offset within the mapped memory the range starts from
+-    platform.VkDeviceSize                       size                       /// Size of the range within the mapped memory
++    VkDeviceSize                                offset                     /// Offset within the mapped memory the range starts from
++    VkDeviceSize                                size                       /// Size of the range within the mapped memory
+ }
+ 
+ class VkFormatProperties {
+     VkFormatFeatureFlags                        linearTilingFeatures       /// Format features in case of linear tiling
+     VkFormatFeatureFlags                        optimalTilingFeatures      /// Format features in case of optimal tiling
++    VkFormatFeatureFlags                        bufferFeatures             /// Format features supported by buffers
+ }
+ 
+ class VkImageFormatProperties {
+-    u64                                         maxResourceSize            /// max size (in bytes) of this resource type
+-    u32                                         maxSamples                 /// max sample count for this resource type
++    VkExtent3D                                  maxExtent                  /// max image dimensions for this resource type
++    u32                                         maxMipLevels               /// max number of mipmap levels for this resource type
++    u32                                         maxArraySize               /// max array size for this resource type
++    VkSampleCountFlags                          sampleCounts               /// supported sample counts for this resource type
++    VkDeviceSize                                maxResourceSize            /// max size (in bytes) of this resource type
++}
++
++class VkDescriptorBufferInfo {
++    VkBuffer                                    buffer                     /// Buffer used for this descriptor when the descriptor is UNIFORM_BUFFER[_DYNAMIC]
++    VkDeviceSize                                offset                     /// Base offset from buffer start in bytes to update in the descriptor set.
++    VkDeviceSize                                range                      /// Size in bytes of the buffer resource for this descriptor update.
+ }
+ 
+ class VkDescriptorInfo {
+     VkBufferView                                bufferView                 /// Buffer view to write to the descriptor (in case it's a buffer descriptor, otherwise should be VK_NULL_HANDLE)
+     VkSampler                                   sampler                    /// Sampler to write to the descriptor (in case it's a SAMPLER or COMBINED_IMAGE_SAMPLER descriptor, otherwise should be VK_NULL_HANDLE)
+-    VkImageView                                 imageView                  /// Image view to write to the descriptor (in case it's a SAMPLED_IMAGE, STORAGE_IMAGE, or COMBINED_IMAGE_SAMPLER descriptor, otherwise should be VK_NULL_HANDLE)
+-    VkAttachmentView                            attachmentView             /// Input attachment view to write to the descriptor (in case it's a INPUT_ATTACHMENT descriptor, otherwise should be VK_NULL_HANDLE)
+-    VkImageLayout                               imageLayout                /// Layout the image is expected to be in when accessed using this descriptor (only used if imageView or attachmentView is not VK_NULL_HANDLE)
++    VkImageView                                 imageView                  /// Image view to write to the descriptor (in case it's a SAMPLED_IMAGE, STORAGE_IMAGE, COMBINED_IMAGE_SAMPLER, or INPUT_ATTACHMENT descriptor, otherwise should be VK_NULL_HANDLE)
++    VkImageLayout                               imageLayout                /// Layout the image is expected to be in when accessed using this descriptor (only used if imageView is not VK_NULL_HANDLE)
++    VkDescriptorBufferInfo                      bufferInfo                 /// Raw buffer, size and offset for UNIFORM_BUFFER[_DYNAMIC] or STORAGE_BUFFER[_DYNAMIC] descriptor types. Ignored otherwise.
+ }
+ 
+ class VkWriteDescriptorSet {
+@@ -1153,7 +1162,7 @@ class VkCopyDescriptorSet {
+ class VkBufferCreateInfo {
+     VkStructureType                             sType                      /// Must be VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO
+     const void*                                 pNext                      /// Pointer to next structure.
+-    platform.VkDeviceSize                       size                       /// Specified in bytes
++    VkDeviceSize                                size                       /// Specified in bytes
+     VkBufferUsageFlags                          usage                      /// Buffer usage flags
+     VkBufferCreateFlags                         flags                      /// Buffer creation flags
+     VkSharingMode                               sharingMode
+@@ -1165,23 +1174,22 @@ class VkBufferViewCreateInfo {
+     VkStructureType                             sType                      /// Must be VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO
+     const void*                                 pNext                      /// Pointer to next structure.
+     VkBuffer                                    buffer
+-    VkBufferViewType                            viewType
+     VkFormat                                    format                     /// Optionally specifies format of elements
+-    platform.VkDeviceSize                       offset                     /// Specified in bytes
+-    platform.VkDeviceSize                       range                      /// View size specified in bytes
++    VkDeviceSize                                offset                     /// Specified in bytes
++    VkDeviceSize                                range                      /// View size specified in bytes
+ }
+ 
+ class VkImageSubresource {
+     VkImageAspect                               aspect
+     u32                                         mipLevel
+-    u32                                         arraySlice
++    u32                                         arrayLayer
+ }
+ 
+ class VkImageSubresourceRange {
+-    VkImageAspect                               aspect
++    VkImageAspectFlags                          aspectMask
+     u32                                         baseMipLevel
+     u32                                         mipLevels
+-    u32                                         baseArraySlice
++    u32                                         baseArrayLayer
+     u32                                         arraySize
+ }
+ 
+@@ -1200,8 +1208,8 @@ class VkBufferMemoryBarrier {
+     u32                                         srcQueueFamilyIndex        /// Queue family to transition ownership from
+     u32                                         destQueueFamilyIndex       /// Queue family to transition ownership to
+     VkBuffer                                    buffer                     /// Buffer to sync
+-    platform.VkDeviceSize                       offset                     /// Offset within the buffer to sync
+-    platform.VkDeviceSize                       size                       /// Amount of bytes to sync
++    VkDeviceSize                                offset                     /// Offset within the buffer to sync
++    VkDeviceSize                                size                       /// Amount of bytes to sync
+ }
+ 
+ class VkImageMemoryBarrier {
+@@ -1232,13 +1240,14 @@ class VkImageCreateInfo {
+     VkSharingMode                               sharingMode                /// Cross-queue-family sharing mode
+     u32                                         queueFamilyCount           /// Number of queue families to share across
+     const u32*                                  pQueueFamilyIndices        /// Array of queue family indices to share across
++    VkImageLayout                               initialLayout              /// Initial image layout for all subresources
+ }
+ 
+ class VkSubresourceLayout {
+-    platform.VkDeviceSize                       offset                 /// Specified in bytes
+-    platform.VkDeviceSize                       size                   /// Specified in bytes
+-    platform.VkDeviceSize                       rowPitch               /// Specified in bytes
+-    platform.VkDeviceSize                       depthPitch             /// Specified in bytes
++    VkDeviceSize                                offset                 /// Specified in bytes
++    VkDeviceSize                                size                   /// Specified in bytes
++    VkDeviceSize                                rowPitch               /// Specified in bytes
++    VkDeviceSize                                depthPitch             /// Specified in bytes
+ }
+ 
+ class VkImageViewCreateInfo {
+@@ -1249,34 +1258,19 @@ class VkImageViewCreateInfo {
+     VkFormat                                    format
+     VkChannelMapping                            channels
+     VkImageSubresourceRange                     subresourceRange
+-}
+-
+-class VkAttachmentViewCreateInfo {
+-    VkStructureType                             sType                  /// Must be VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO
+-    const void*                                 pNext                  /// Pointer to next structure
+-    VkImage                                     image
+-    VkFormat                                    format
+-    u32                                         mipLevel
+-    u32                                         baseArraySlice
+-    u32                                         arraySize
+-    VkAttachmentViewCreateFlags                 flags                  /// Framebuffer attachment view flags
+-}
+-
+-class VkAttachmentBindInfo {
+-    VkAttachmentView                            view
+-    VkImageLayout                               layout
++    VkImageViewCreateFlags                      flags
+ }
+ 
+ class VkBufferCopy {
+-    platform.VkDeviceSize                       srcOffset              /// Specified in bytes
+-    platform.VkDeviceSize                       destOffset             /// Specified in bytes
+-    platform.VkDeviceSize                       copySize               /// Specified in bytes
++    VkDeviceSize                                srcOffset              /// Specified in bytes
++    VkDeviceSize                                destOffset             /// Specified in bytes
++    VkDeviceSize                                copySize               /// Specified in bytes
+ }
+ 
+ class VkSparseMemoryBindInfo {
+-    platform.VkDeviceSize                       rangeOffset           /// Specified in bytes
+-    platform.VkDeviceSize                       rangeSize             /// Specified in bytes
+-    platform.VkDeviceSize                       memOffset             /// Specified in bytes
++    VkDeviceSize                                rangeOffset           /// Specified in bytes
++    VkDeviceSize                                rangeSize             /// Specified in bytes
++    VkDeviceSize                                memOffset             /// Specified in bytes
+     VkDeviceMemory                              mem
+     VkSparseMemoryBindFlags                     flags
+ }
+@@ -1285,41 +1279,48 @@ class VkSparseImageMemoryBindInfo {
+     VkImageSubresource                          subresource
+     VkOffset3D                                  offset
+     VkExtent3D                                  extent
+-    platform.VkDeviceSize                       memOffset             /// Specified in bytes
++    VkDeviceSize                                memOffset             /// Specified in bytes
+     VkDeviceMemory                              mem
+     VkSparseMemoryBindFlags                     flags
+ }
+ 
++class VkImageSubresourceCopy {
++    VkImageAspect                               aspect
++    u32                                         mipLevel
++    u32                                         arrayLayer
++    u32                                         arraySize
++}
++
+ class VkImageCopy {
+-    VkImageSubresource                          srcSubresource
++    VkImageSubresourceCopy                      srcSubresource
+     VkOffset3D                                  srcOffset             /// Specified in pixels for both compressed and uncompressed images
+-    VkImageSubresource                          destSubresource
++    VkImageSubresourceCopy                      destSubresource
+     VkOffset3D                                  destOffset            /// Specified in pixels for both compressed and uncompressed images
+     VkExtent3D                                  extent                /// Specified in pixels for both compressed and uncompressed images
+ }
+ 
+ class VkImageBlit {
+-    VkImageSubresource                          srcSubresource
++    VkImageSubresourceCopy                      srcSubresource
+     VkOffset3D                                  srcOffset              /// Specified in pixels for both compressed and uncompressed images
+     VkExtent3D                                  srcExtent              /// Specified in pixels for both compressed and uncompressed images
+-    VkImageSubresource                          destSubresource
++    VkImageSubresourceCopy                      destSubresource
+     VkOffset3D                                  destOffset             /// Specified in pixels for both compressed and uncompressed images
+     VkExtent3D                                  destExtent             /// Specified in pixels for both compressed and uncompressed images
+ }
+ 
+ class VkBufferImageCopy {
+-    platform.VkDeviceSize                       bufferOffset           /// Specified in bytes
++    VkDeviceSize                                bufferOffset           /// Specified in bytes
+     u32                                         bufferRowLength        /// Specified in texels
+     u32                                         bufferImageHeight
+-    VkImageSubresource                          imageSubresource
++    VkImageSubresourceCopy                      imageSubresource
+     VkOffset3D                                  imageOffset            /// Specified in pixels for both compressed and uncompressed images
+     VkExtent3D                                  imageExtent            /// Specified in pixels for both compressed and uncompressed images
+ }
+ 
+ class VkImageResolve {
+-    VkImageSubresource                          srcSubresource
++    VkImageSubresourceCopy                      srcSubresource
+     VkOffset3D                                  srcOffset
+-    VkImageSubresource                          destSubresource
++    VkImageSubresourceCopy                      destSubresource
+     VkOffset3D                                  destOffset
+     VkExtent3D                                  extent
+ }
+@@ -1338,6 +1339,7 @@ class VkShaderCreateInfo {
+     VkShaderModule                              module             /// Module containing entry point
+     const char*                                 pName              /// Null-terminated entry point name
+     VkShaderCreateFlags                         flags              /// Reserved
++    VkShaderStage                               stage
+ }
+ 
+ class VkDescriptorSetLayoutBinding {
+@@ -1362,6 +1364,8 @@ class VkDescriptorTypeCount {
+ class VkDescriptorPoolCreateInfo {
+     VkStructureType                             sType              /// Must be VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO
+     const void*                                 pNext              /// Pointer to next structure
++    VkDescriptorPoolUsage                       poolUsage
++    u32                                         maxSets
+     u32                                         count
+     const VkDescriptorTypeCount*                pTypeCount
+ }
+@@ -1390,7 +1394,7 @@ class VkPipelineShaderStageCreateInfo {
+ class VkComputePipelineCreateInfo {
+     VkStructureType                             sType              /// Must be VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
+     const void*                                 pNext              /// Pointer to next structure
+-    VkPipelineShaderStageCreateInfo             cs
++    VkPipelineShaderStageCreateInfo             stage
+     VkPipelineCreateFlags                       flags              /// Pipeline creation flags
+     VkPipelineLayout                            layout             /// Interface layout of the pipeline
+     VkPipeline                                  basePipelineHandle /// If VK_PIPELINE_CREATE_DERIVATIVE_BIT is set and this value is nonzero, it specifies the handle of the base pipeline this is a derivative of
+@@ -1423,7 +1427,7 @@ class VkPipelineInputAssemblyStateCreateInfo {
+     VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO
+     const void*                                 pNext      /// Pointer to next structure
+     VkPrimitiveTopology                         topology
+-    platform.VkBool32                           primitiveRestartEnable
++    VkBool32                                    primitiveRestartEnable
+ }
+ 
+ class VkPipelineTessellationStateCreateInfo {
+@@ -1436,29 +1440,37 @@ class VkPipelineViewportStateCreateInfo {
+     VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
+     const void*                                 pNext      /// Pointer to next structure
+     u32                                         viewportCount
++    const VkViewport*                           pViewports
++    u32                                         scissorCount
++    const VkRect2D*                             pScissors
+ }
+ 
+ class VkPipelineRasterStateCreateInfo {
+     VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO
+     const void*                                 pNext      /// Pointer to next structure
+-    platform.VkBool32                           depthClipEnable
+-    platform.VkBool32                           rasterizerDiscardEnable
++    VkBool32                                    depthClipEnable
++    VkBool32                                    rasterizerDiscardEnable
+     VkFillMode                                  fillMode                   /// optional (GL45)
+     VkCullMode                                  cullMode
+     VkFrontFace                                 frontFace
++    VkBool32                                    depthBiasEnable
++    f32                                         depthBias
++    f32                                         depthBiasClamp
++    f32                                         slopeScaledDepthBias
++    f32                                         lineWidth
+ }
+ 
+ class VkPipelineMultisampleStateCreateInfo {
+     VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO
+     const void*                                 pNext      /// Pointer to next structure
+     u32                                         rasterSamples              /// Number of samples used for rasterization
+-    platform.VkBool32                           sampleShadingEnable        /// optional (GL45)
++    VkBool32                                    sampleShadingEnable        /// optional (GL45)
+     f32                                         minSampleShading           /// optional (GL45)
+-    platform.VkSampleMask                       sampleMask
++    const VkSampleMask*                         pSampleMask
+ }
+ 
+ class VkPipelineColorBlendAttachmentState {
+-    platform.VkBool32                           blendEnable
++    VkBool32                                    blendEnable
+     VkBlend                                     srcBlendColor
+     VkBlend                                     destBlendColor
+     VkBlendOp                                   blendOpColor
+@@ -1471,11 +1483,13 @@ class VkPipelineColorBlendAttachmentState {
+ class VkPipelineColorBlendStateCreateInfo {
+     VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO
+     const void*                                 pNext      /// Pointer to next structure
+-    platform.VkBool32                           alphaToCoverageEnable
+-    platform.VkBool32                           logicOpEnable
++    VkBool32                                    alphaToCoverageEnable
++    VkBool32                                    alphaToOneEnable
++    VkBool32                                    logicOpEnable
+     VkLogicOp                                   logicOp
+     u32                                         attachmentCount    /// # of pAttachments
+     const VkPipelineColorBlendAttachmentState*  pAttachments
++    f32[4]                                      blendConst
+ }
+ 
+ class VkStencilOpState {
+@@ -1483,18 +1497,30 @@ class VkStencilOpState {
+     VkStencilOp                                 stencilPassOp
+     VkStencilOp                                 stencilDepthFailOp
+     VkCompareOp                                 stencilCompareOp
++    u32                                         stencilCompareMask
++    u32                                         stencilWriteMask
++    u32                                         stencilReference
+ }
+ 
+ class VkPipelineDepthStencilStateCreateInfo {
+     VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO
+     const void*                                 pNext      /// Pointer to next structure
+-    platform.VkBool32                           depthTestEnable
+-    platform.VkBool32                           depthWriteEnable
++    VkBool32                                    depthTestEnable
++    VkBool32                                    depthWriteEnable
+     VkCompareOp                                 depthCompareOp
+-    platform.VkBool32                           depthBoundsEnable  /// optional (depth_bounds_test)
+-    platform.VkBool32                           stencilTestEnable
++    VkBool32                                    depthBoundsTestEnable  /// optional (depth_bounds_test)
++    VkBool32                                    stencilTestEnable
+     VkStencilOpState                            front
+     VkStencilOpState                            back
++    f32                                         minDepthBounds
++    f32                                         maxDepthBounds
++}
++
++class VkPipelineDynamicStateCreateInfo {
++    VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO
++    const void*                                 pNext      /// Pointer to next structure
++    u32                                         dynamicStateCount
++    const VkDynamicState*                       pDynamicStates
+ }
+ 
+ class VkGraphicsPipelineCreateInfo {
+@@ -1510,6 +1536,7 @@ class VkGraphicsPipelineCreateInfo {
+     const VkPipelineMultisampleStateCreateInfo*     pMultisampleState
+     const VkPipelineDepthStencilStateCreateInfo*    pDepthStencilState
+     const VkPipelineColorBlendStateCreateInfo*      pColorBlendState
++    const VkPipelineDynamicStateCreateInfo*         pDynamicState
+     VkPipelineCreateFlags                           flags              /// Pipeline creation flags
+     VkPipelineLayout                                layout             /// Interface layout of the pipeline
+     VkRenderPass                                    renderPass
+@@ -1547,50 +1574,17 @@ class VkSamplerCreateInfo {
+     VkTexFilter                                 magFilter      /// Filter mode for magnification
+     VkTexFilter                                 minFilter      /// Filter mode for minifiation
+     VkTexMipmapMode                             mipMode        /// Mipmap selection mode
+-    VkTexAddress                                addressU
+-    VkTexAddress                                addressV
+-    VkTexAddress                                addressW
++    VkTexAddressMode                            addressModeU
++    VkTexAddressMode                            addressModeV
++    VkTexAddressMode                            addressModeW
+     f32                                         mipLodBias
+     f32                                         maxAnisotropy
+-    platform.VkBool32                           compareEnable
++    VkBool32                                    compareEnable
+     VkCompareOp                                 compareOp
+     f32                                         minLod
+     f32                                         maxLod
+     VkBorderColor                               borderColor
+-}
+-
+-class VkDynamicViewportStateCreateInfo {
+-    VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO
+-    const void*                                 pNext      /// Pointer to next structure
+-    u32                                         viewportAndScissorCount  /// number of entries in pViewports and pScissors
+-    const VkViewport*                           pViewports
+-    const VkRect2D*                             pScissors
+-}
+-
+-class VkDynamicRasterStateCreateInfo {
+-    VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO
+-    const void*                                 pNext      /// Pointer to next structure
+-    f32                                         depthBias
+-    f32                                         depthBiasClamp
+-    f32                                         slopeScaledDepthBias
+-    f32                                         lineWidth          /// optional (GL45) - Width of lines
+-}
+-
+-class VkDynamicColorBlendStateCreateInfo {
+-    VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO
+-    const void*                                 pNext      /// Pointer to next structure
+-    f32[4]                                      blendConst
+-}
+-
+-class VkDynamicDepthStencilStateCreateInfo {
+-    VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO
+-    const void*                                 pNext      /// Pointer to next structure
+-    f32                                         minDepthBounds         /// optional (depth_bounds_test)
+-    f32                                         maxDepthBounds         /// optional (depth_bounds_test)
+-    u32                                         stencilReadMask
+-    u32                                         stencilWriteMask
+-    u32                                         stencilFrontRef
+-    u32                                         stencilBackRef
++    VkBool32                                    unnormalizedCoordinates
+ }
+ 
+ class VkCmdPoolCreateInfo {
+@@ -1613,6 +1607,7 @@ class VkCmdBufferBeginInfo {
+     const void*                                 pNext       /// Pointer to next structure
+     VkCmdBufferOptimizeFlags                    flags       /// Command buffer optimization flags
+     VkRenderPass                                renderPass  /// Render pass for secondary command buffers
++    u32                                         subpass
+     VkFramebuffer                               framebuffer /// Framebuffer for secondary command buffers
+ }
+ 
+@@ -1622,16 +1617,16 @@ class VkRenderPassBeginInfo {
+     VkRenderPass                                renderPass
+     VkFramebuffer                               framebuffer
+     VkRect2D                                    renderArea
+-    u32                                         attachmentCount
+-    const VkClearValue*                         pAttachmentClearValues
++    u32                                         clearValueCount
++    const VkClearValue*                         pClearValues
+ }
+ 
+ @union
+ /// Union allowing specification of floating point, integer, or unsigned integer color data. Actual value selected is based on image/attachment being cleared.
+ class VkClearColorValue {
+-    f32[4]                                      f32
+-    s32[4]                                      s32
+-    u32[4]                                      u32
++    f32[4]                                      float32
++    s32[4]                                      int32
++    u32[4]                                      uint32
+ }
+ 
+ class VkClearDepthStencilValue {
+@@ -1643,7 +1638,7 @@ class VkClearDepthStencilValue {
+ /// Union allowing specification of color, depth, and stencil color values. Actual value selected is based on attachment being cleared.
+ class VkClearValue {
+     VkClearColorValue                           color
+-    VkClearDepthStencilValue                    ds
++    VkClearDepthStencilValue                    depthStencil
+ }
+ 
+ class VkAttachmentDescription {
+@@ -1657,6 +1652,7 @@ class VkAttachmentDescription {
+     VkAttachmentStoreOp                         stencilStoreOp  /// Store op for stencil data
+     VkImageLayout                               initialLayout
+     VkImageLayout                               finalLayout
++    VkAttachmentDescriptionFlags                flags
+ }
+ 
+ class VkAttachmentReference {
+@@ -1670,13 +1666,13 @@ class VkSubpassDescription {
+     VkPipelineBindPoint                         pipelineBindPoint  /// Must be VK_PIPELINE_BIND_POINT_GRAPHICS for now
+     VkSubpassDescriptionFlags                   flags
+     u32                                         inputCount
+-    const VkAttachmentReference*                inputAttachments
++    const VkAttachmentReference*                pInputAttachments
+     u32                                         colorCount
+-    const VkAttachmentReference*                colorAttachments
+-    const VkAttachmentReference*                resolveAttachments
++    const VkAttachmentReference*                pColorAttachments
++    const VkAttachmentReference*                pResolveAttachments
+     VkAttachmentReference                       depthStencilAttachment
+     u32                                         preserveCount
+-    const VkAttachmentReference*                preserveAttachments
++    const VkAttachmentReference*                pPreserveAttachments
+ }
+ 
+ class VkSubpassDependency {
+@@ -1688,7 +1684,7 @@ class VkSubpassDependency {
+     VkPipelineStageFlags                        destStageMask
+     VkMemoryOutputFlags                         outputMask
+     VkMemoryInputFlags                          inputMask
+-    platform.VkBool32                           byRegion
++    VkBool32                                    byRegion
+ }
+ 
+ class VkRenderPassCreateInfo {
+@@ -1715,64 +1711,57 @@ class VkFenceCreateInfo {
+ }
+ 
+ class VkPhysicalDeviceFeatures {
+-    platform.VkBool32                           robustBufferAccess                        /// out of bounds buffer accesses are well defined
+-    platform.VkBool32                           fullDrawIndexUint32                       /// full 32-bit range of indices for indexed draw calls
+-    platform.VkBool32                           imageCubeArray                            /// image views which are arrays of cube maps
+-    platform.VkBool32                           independentBlend                          /// blending operations are controlled per-attachment
+-    platform.VkBool32                           geometryShader                            /// geometry stage
+-    platform.VkBool32                           tessellationShader                        /// tessellation control and evaluation stage
+-    platform.VkBool32                           sampleRateShading                         /// per-sample shading and interpolation
+-    platform.VkBool32                           dualSourceBlend                           /// blend operations which take two sources
+-    platform.VkBool32                           logicOp                                   /// logic operations
+-    platform.VkBool32                           instancedDrawIndirect                     /// multi draw indirect
+-    platform.VkBool32                           depthClip                                 /// depth clipping
+-    platform.VkBool32                           depthBiasClamp                            /// depth bias clamping
+-    platform.VkBool32                           fillModeNonSolid                          /// point and wireframe fill modes
+-    platform.VkBool32                           depthBounds                               /// depth bounds test
+-    platform.VkBool32                           wideLines                                 /// lines with width greater than 1
+-    platform.VkBool32                           largePoints                               /// points with size greater than 1
+-    platform.VkBool32                           textureCompressionETC2                    /// ETC texture compression formats
+-    platform.VkBool32                           textureCompressionASTC_LDR                /// ASTC LDR texture compression formats
+-    platform.VkBool32                           textureCompressionBC                      /// BC1-7 texture compressed formats
+-    platform.VkBool32                           pipelineStatisticsQuery                   /// pipeline statistics query
+-    platform.VkBool32                           vertexSideEffects                         /// storage buffers and images in vertex stage
+-    platform.VkBool32                           tessellationSideEffects                   /// storage buffers and images in tessellation stage
+-    platform.VkBool32                           geometrySideEffects                       /// storage buffers and images in geometry stage
+-    platform.VkBool32                           fragmentSideEffects                       /// storage buffers and images in fragment stage
+-    platform.VkBool32                           shaderTessellationPointSize               /// tessellation stage can export point size
+-    platform.VkBool32                           shaderGeometryPointSize                   /// geometry stage can export point size
+-    platform.VkBool32                           shaderTextureGatherExtended               /// texture gather with run-time values and independent offsets
+-    platform.VkBool32                           shaderStorageImageExtendedFormats         /// the extended set of formats can be used for storage images
+-    platform.VkBool32                           shaderStorageImageMultisample             /// multisample images can be used for storage images
+-    platform.VkBool32                           shaderStorageBufferArrayConstantIndexing  /// arrays of storage buffers can be accessed with constant indices
+-    platform.VkBool32                           shaderStorageImageArrayConstantIndexing   /// arrays of storage images can be accessed with constant indices
+-    platform.VkBool32                           shaderUniformBufferArrayDynamicIndexing   /// arrays of uniform buffers can be accessed with dynamically uniform indices
+-    platform.VkBool32                           shaderSampledImageArrayDynamicIndexing    /// arrays of sampled images can be accessed with dynamically uniform indices
+-    platform.VkBool32                           shaderStorageBufferArrayDynamicIndexing   /// arrays of storage buffers can be accessed with dynamically uniform indices
+-    platform.VkBool32                           shaderStorageImageArrayDynamicIndexing    /// arrays of storage images can be accessed with dynamically uniform indices
+-    platform.VkBool32                           shaderClipDistance                        /// clip distance in shaders
+-    platform.VkBool32                           shaderCullDistance                        /// cull distance in shaders
+-    platform.VkBool32                           shaderFloat64                             /// 64-bit floats (doubles) in shaders
+-    platform.VkBool32                           shaderInt64                               /// 64-bit integers in shaders
+-    platform.VkBool32                           shaderFloat16                             /// 16-bit floats in shaders
+-    platform.VkBool32                           shaderInt16                               /// 16-bit integers in shaders
+-    platform.VkBool32                           shaderResourceResidency                   /// shader can use texture operations that return resource residency information (requires sparseNonResident support)
+-    platform.VkBool32                           shaderResourceMinLOD                      /// shader can use texture operations that specify minimum resource LOD
+-    platform.VkBool32                           sparse                                    /// Sparse resources support: Resource memory can be managed at opaque page level rather than object level
+-    platform.VkBool32                           sparseResidencyBuffer                     /// Sparse resources support: GPU can access partially resident buffers
+-    platform.VkBool32                           sparseResidencyImage2D                    /// Sparse resources support: GPU can access partially resident 2D (non-MSAA non-DepthStencil) images
+-    platform.VkBool32                           sparseResidencyImage3D                    /// Sparse resources support: GPU can access partially resident 3D images
+-    platform.VkBool32                           sparseResidency2Samples                   /// Sparse resources support: GPU can access partially resident MSAA 2D images with 2 samples
+-    platform.VkBool32                           sparseResidency4Samples                   /// Sparse resources support: GPU can access partially resident MSAA 2D images with 4 samples
+-    platform.VkBool32                           sparseResidency8Samples                   /// Sparse resources support: GPU can access partially resident MSAA 2D images with 8 samples
+-    platform.VkBool32                           sparseResidency16Samples                  /// Sparse resources support: GPU can access partially resident MSAA 2D images with 16 samples
+-    platform.VkBool32                           sparseResidencyStandard2DBlockShape       /// Sparse resources support: GPU will access all 2D (single sample) sparse resources using the standard block shapes (based on pixel format)
+-    platform.VkBool32                           sparseResidencyStandard2DMSBlockShape     /// Sparse resources support: GPU will access all 2D (multisample) sparse resources using the standard block shapes (based on pixel format)
+-    platform.VkBool32                           sparseResidencyStandard3DBlockShape       /// Sparse resources support: GPU will access all 3D sparse resources using the standard block shapes (based on pixel format)
+-    platform.VkBool32                           sparseResidencyAlignedMipSize             /// Sparse resources support: Images with mip-level dimensions that are NOT a multiple of the block size will be placed in the mip tail
+-    platform.VkBool32                           sparseResidencyNonResident                /// Sparse resources support: GPU can safely access non-resident regions of a resource, read values from read-write resources are undefined
+-    platform.VkBool32                           sparseResidencyNonResidentStrict          /// Sparse resources support: GPU can safely access non-resident regions of a resource, all reads return as if data is 0, writes are discarded
+-    platform.VkBool32                           sparseResidencyAliased                    /// Sparse resources support: GPU can correctly access data aliased into multiple locations (opt-in)
++    VkBool32                                    robustBufferAccess                        /// out of bounds buffer accesses are well defined
++    VkBool32                                    fullDrawIndexUint32                       /// full 32-bit range of indices for indexed draw calls
++    VkBool32                                    imageCubeArray                            /// image views which are arrays of cube maps
++    VkBool32                                    independentBlend                          /// blending operations are controlled per-attachment
++    VkBool32                                    geometryShader                            /// geometry stage
++    VkBool32                                    tessellationShader                        /// tessellation control and evaluation stage
++    VkBool32                                    sampleRateShading                         /// per-sample shading and interpolation
++    VkBool32                                    dualSourceBlend                           /// blend operations which take two sources
++    VkBool32                                    logicOp                                   /// logic operations
++    VkBool32                                    multiDrawIndirect                         /// multi draw indirect
++    VkBool32                                    depthClip                                 /// depth clipping
++    VkBool32                                    depthBiasClamp                            /// depth bias clamping
++    VkBool32                                    fillModeNonSolid                          /// point and wireframe fill modes
++    VkBool32                                    depthBounds                               /// depth bounds test
++    VkBool32                                    wideLines                                 /// lines with width greater than 1
++    VkBool32                                    largePoints                               /// points with size greater than 1
++    VkBool32                                    textureCompressionETC2                    /// ETC texture compression formats
++    VkBool32                                    textureCompressionASTC_LDR                /// ASTC LDR texture compression formats
++    VkBool32                                    textureCompressionBC                      /// BC1-7 texture compressed formats
++    VkBool32                                    occlusionQueryNonConservative             /// non-conservative (exact) occlusion queries
++    VkBool32                                    pipelineStatisticsQuery                   /// pipeline statistics query
++    VkBool32                                    vertexSideEffects                         /// storage buffers and images in vertex stage
++    VkBool32                                    tessellationSideEffects                   /// storage buffers and images in tessellation stage
++    VkBool32                                    geometrySideEffects                       /// storage buffers and images in geometry stage
++    VkBool32                                    fragmentSideEffects                       /// storage buffers and images in fragment stage
++    VkBool32                                    shaderTessellationPointSize               /// tessellation stage can export point size
++    VkBool32                                    shaderGeometryPointSize                   /// geometry stage can export point size
++    VkBool32                                    shaderImageGatherExtended                 /// texture gather with run-time values and independent offsets
++    VkBool32                                    shaderStorageImageExtendedFormats         /// the extended set of formats can be used for storage images
++    VkBool32                                    shaderStorageImageMultisample             /// multisample images can be used for storage images
++    VkBool32                                    shaderUniformBufferArrayDynamicIndexing   /// arrays of uniform buffers can be accessed with dynamically uniform indices
++    VkBool32                                    shaderSampledImageArrayDynamicIndexing    /// arrays of sampled images can be accessed with dynamically uniform indices
++    VkBool32                                    shaderStorageBufferArrayDynamicIndexing   /// arrays of storage buffers can be accessed with dynamically uniform indices
++    VkBool32                                    shaderStorageImageArrayDynamicIndexing    /// arrays of storage images can be accessed with dynamically uniform indices
++    VkBool32                                    shaderClipDistance                        /// clip distance in shaders
++    VkBool32                                    shaderCullDistance                        /// cull distance in shaders
++    VkBool32                                    shaderFloat64                             /// 64-bit floats (doubles) in shaders
++    VkBool32                                    shaderInt64                               /// 64-bit integers in shaders
++    VkBool32                                    shaderInt16                               /// 16-bit integers in shaders
++    VkBool32                                    shaderResourceResidency                   /// shader can use texture operations that return resource residency information (requires sparseNonResident support)
++    VkBool32                                    shaderResourceMinLOD                      /// shader can use texture operations that specify minimum resource LOD
++    VkBool32                                    alphaToOne                                /// The fragment alpha channel can be forced to maximum representable alpha value
++    VkBool32                                    sparseBinding                             /// Sparse resources support: Resource memory can be managed at opaque page level rather than object level
++    VkBool32                                    sparseResidencyBuffer                     /// Sparse resources support: GPU can access partially resident buffers
++    VkBool32                                    sparseResidencyImage2D                    /// Sparse resources support: GPU can access partially resident 2D (non-MSAA non-DepthStencil) images
++    VkBool32                                    sparseResidencyImage3D                    /// Sparse resources support: GPU can access partially resident 3D images
++    VkBool32                                    sparseResidency2Samples                   /// Sparse resources support: GPU can access partially resident MSAA 2D images with 2 samples
++    VkBool32                                    sparseResidency4Samples                   /// Sparse resources support: GPU can access partially resident MSAA 2D images with 4 samples
++    VkBool32                                    sparseResidency8Samples                   /// Sparse resources support: GPU can access partially resident MSAA 2D images with 8 samples
++    VkBool32                                    sparseResidency16Samples                  /// Sparse resources support: GPU can access partially resident MSAA 2D images with 16 samples
++    VkBool32                                    sparseResidencyAliased                    /// Sparse resources support: GPU can correctly access data aliased into multiple locations (opt-in)
+ }
+ 
+ class VkPhysicalDeviceLimits {
+@@ -1782,13 +1771,15 @@ class VkPhysicalDeviceLimits {
+     u32                                         maxImageDimension3D                       /// max 3D image dimension
+     u32                                         maxImageDimensionCube                     /// max cubemap image dimension
+     u32                                         maxImageArrayLayers                       /// max layers for image arrays
++    VkSampleCountFlags                          sampleCounts                              /// sample counts supported for all images supporting rendering and sampling
+     u32                                         maxTexelBufferSize                        /// max texel buffer size (bytes)
+     u32                                         maxUniformBufferSize                      /// max uniform buffer size (bytes)
+     u32                                         maxStorageBufferSize                      /// max storage buffer size (bytes)
+     u32                                         maxPushConstantsSize                      /// max size of the push constants pool (bytes)
+     /// memory limits
+     u32                                         maxMemoryAllocationCount                  /// max number of device memory allocations supported
+-    platform.VkDeviceSize                       bufferImageGranularity                    /// Granularity (in bytes) at which buffers and images can be bound to adjacent memory for simultaneous usage
++    VkDeviceSize                                bufferImageGranularity                    /// Granularity (in bytes) at which buffers and images can be bound to adjacent memory for simultaneous usage
++    VkDeviceSize                                sparseAddressSpaceSize                    /// Total address space available for sparse allocations (bytes)
+     /// descriptor set limits
+     u32                                         maxBoundDescriptorSets                    /// max number of descriptors sets that can be bound to a pipeline
+     u32                                         maxDescriptorSets                         /// max number of allocated descriptor sets
+@@ -1799,11 +1790,14 @@ class VkPhysicalDeviceLimits {
+     u32                                         maxPerStageDescriptorStorageImages        /// max num of storage images allowed per-stage in a descriptor set
+     u32                                         maxDescriptorSetSamplers                  /// max num of samplers allowed in all stages in a descriptor set
+     u32                                         maxDescriptorSetUniformBuffers            /// max num of uniform buffers allowed in all stages in a descriptor set
++    u32                                         maxDescriptorSetUniformBuffersDynamic     /// max num of dynamic uniform buffers allowed in all stages in a descriptor set
+     u32                                         maxDescriptorSetStorageBuffers            /// max num of storage buffers allowed in all stages in a descriptor set
++    u32                                         maxDescriptorSetStorageBuffersDynamic     /// max num of dynamic storage buffers allowed in all stages in a descriptor set
+     u32                                         maxDescriptorSetSampledImages             /// max num of sampled images allowed in all stages in a descriptor set
+     u32                                         maxDescriptorSetStorageImages             /// max num of storage images allowed in all stages in a descriptor set
+     /// vertex stage limits
+     u32                                         maxVertexInputAttributes                  /// max num of vertex input attribute slots
++    u32                                         maxVertexInputBindings                    /// max num of vertex input binding slots
+     u32                                         maxVertexInputAttributeOffset             /// max vertex input attribute offset added to vertex buffer offset
+     u32                                         maxVertexInputBindingStride               /// max vertex input binding stride
+     u32                                         maxVertexOutputComponents                 /// max num of output components written by vertex shader
+@@ -1839,13 +1833,12 @@ class VkPhysicalDeviceLimits {
+ 
+     u32                                         maxDrawIndexedIndexValue                  /// max index value for indexed draw calls (for 32-bit indices)
+     u32                                         maxDrawIndirectInstanceCount              /// max instance count for indirect draw calls
+-    platform.VkBool32                           primitiveRestartForPatches                /// is primitive restart supported for PATCHES
++    VkBool32                                    primitiveRestartForPatches                /// is primitive restart supported for PATCHES
+ 
+     f32                                         maxSamplerLodBias                         /// max absolute sampler level of detail bias
+     f32                                         maxSamplerAnisotropy                      /// max degree of sampler anisotropy
+ 
+     u32                                         maxViewports                              /// max number of active viewports
+-    u32                                         maxDynamicViewportStates                  /// max number of dynamic viewport state objects
+     u32[2]                                      maxViewportDimensions                     /// max viewport dimensions (x,y)
+     f32[2]                                      viewportBoundsRange                       /// viewport bounds range (min,max)
+     u32                                         viewportSubPixelBits                      /// num bits of subpixel precision for viewport
+@@ -1883,12 +1876,21 @@ class VkPhysicalDeviceLimits {
+     u32                                         maxCullDistances                          /// max number of cull distances
+     u32                                         maxCombinedClipAndCullDistances           /// max combined number of user clipping
+ 
+-    f32[2]                                      pointSizeRange                         /// range (min,max) of supported point sizes
+-    f32[2]                                      lineWidthRange                         /// range (min,max) of supported line widths
++    f32[2]                                      pointSizeRange                            /// range (min,max) of supported point sizes
++    f32[2]                                      lineWidthRange                            /// range (min,max) of supported line widths
+     f32                                         pointSizeGranularity                      /// granularity of supported point sizes
+     f32                                         lineWidthGranularity                      /// granularity of supported line widths
+ }
+ 
++class VkPhysicalDeviceSparseProperties {
++    VkBool32                                    residencyStandard2DBlockShape             /// Sparse resources support: GPU will access all 2D (single sample) sparse resources using the standard block shapes (based on pixel format)
++    VkBool32                                    residencyStandard2DMSBlockShape           /// Sparse resources support: GPU will access all 2D (multisample) sparse resources using the standard block shapes (based on pixel format)
++    VkBool32                                    residencyStandard3DBlockShape             /// Sparse resources support: GPU will access all 3D sparse resources using the standard block shapes (based on pixel format)
++    VkBool32                                    residencyAlignedMipSize                   /// Sparse resources support: Images with mip-level dimensions that are NOT a multiple of the block size will be placed in the mip tail
++    VkBool32                                    residencyNonResident                      /// Sparse resources support: GPU can safely access non-resident regions of a resource, read values from read-write resources are undefined
++    VkBool32                                    residencyNonResidentStrict                /// Sparse resources support: GPU can safely access non-resident regions of a resource, all reads return as if data is 0, writes are discarded
++}
++
+ class VkSemaphoreCreateInfo {
+     VkStructureType                             sType      /// Must be VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
+     const void*                                 pNext      /// Pointer to next structure
+@@ -1908,7 +1910,7 @@ class VkFramebufferCreateInfo {
+     const void*                                 pNext  /// Pointer to next structure
+     VkRenderPass                                renderPass
+     u32                                         attachmentCount
+-    const VkAttachmentBindInfo*                 pAttachments
++    const VkImageView*                          pAttachments
+     u32                                         width
+     u32                                         height
+     u32                                         layers
+@@ -1981,13 +1983,11 @@ cmd VkResult vkCreateInstance(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyInstance(
++cmd void vkDestroyInstance(
+         VkInstance                                  instance) {
+     instanceObject := GetInstance(instance)
+ 
+     State.Instances[instance] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("system")
+@@ -2015,7 +2015,7 @@ cmd VkResult vkEnumeratePhysicalDevices(
+ cmd PFN_vkVoidFunction vkGetDeviceProcAddr(
+         VkDevice                                    device,
+         const char*                                 pName) {
+-    if device != VK_NULL_HANDLE {
++    if device != NULL_HANDLE {
+         device := GetDevice(device)
+     }
+ 
+@@ -2025,7 +2025,7 @@ cmd PFN_vkVoidFunction vkGetDeviceProcAddr(
+ cmd PFN_vkVoidFunction vkGetInstanceProcAddr(
+         VkInstance                                  instance,
+         const char*                                 pName) {
+-    if instance != VK_NULL_HANDLE {
++    if instance != NULL_HANDLE {
+         instanceObject := GetInstance(instance)
+     }
+ 
+@@ -2043,27 +2043,25 @@ cmd VkResult vkGetPhysicalDeviceProperties(
+     return ?
+ }
+ 
+-cmd VkResult vkGetPhysicalDeviceQueueCount(
+-        VkPhysicalDevice                            physicalDevice,
+-        u32*                                        pCount) {
+-    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+-
+-    count := ?
+-    pCount[0] = count
+-
+-    return ?
+-}
+-
+-cmd VkResult vkGetPhysicalDeviceQueueProperties(
++cmd VkResult vkGetPhysicalDeviceQueueFamilyProperties(
+         VkPhysicalDevice                            physicalDevice,
+-        u32                                         count,
+-        VkPhysicalDeviceQueueProperties*            pQueueProperties) {
++        u32*                                        pCount,
++        VkQueueFamilyProperties*                    pQueueFamilyProperties) {
+     physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+-    queuesProperties := pQueueProperties[0:count]
+-    for i in (0 .. count) {
+-        queueProperties := as!VkPhysicalDeviceQueueProperties(?)
+-        queuesProperties[i] = queueProperties
+-    }
++    // TODO: Figure out how to express fetch-count-or-properties
++    // This version fails 'apic validate' with 'fence not allowed in
++    // *semantic.Branch'. Other attempts have failed with the same or other
++    // errors.
++    // if pQueueFamilyProperties != null {
++    //     queuesProperties := pQueueFamilyProperties[0:pCount[0]]
++    //     for i in (0 .. pCount[0]) {
++    //         queueProperties := as!VkQueueFamilyProperties(?)
++    //         queuesProperties[i] = queueProperties
++    //    }
++    // } else {
++    //     count := ?
++    //     pCount[0] = count
++    // }
+     return ?
+ }
+ 
+@@ -2107,6 +2105,7 @@ cmd VkResult vkGetPhysicalDeviceImageFormatProperties(
+         VkImageType                                 type,
+         VkImageTiling                               tiling,
+         VkImageUsageFlags                           usage,
++        VkImageCreateFlags                          flags,
+         VkImageFormatProperties*                    pImageFormatProperties) {
+     physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+ 
+@@ -2116,17 +2115,6 @@ cmd VkResult vkGetPhysicalDeviceImageFormatProperties(
+     return ?
+ }
+ 
+-cmd VkResult vkGetPhysicalDeviceLimits(
+-        VkPhysicalDevice                            physicalDevice,
+-        VkPhysicalDeviceLimits*                     pLimits) {
+-    physicalDeviceObject := GetPhysicalDevice(physicalDevice)
+-
+-    limits := ?
+-    pLimits[0] = limits
+-
+-    return ?
+-}
+-
+ 
+ // Device functions
+ 
+@@ -2146,19 +2134,17 @@ cmd VkResult vkCreateDevice(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyDevice(
++cmd void vkDestroyDevice(
+         VkDevice                                    device) {
+     deviceObject := GetDevice(device)
+ 
+     State.Devices[device] = null
+-
+-    return ?
+ }
+ 
+ 
+ // Extension discovery functions
+ 
+-cmd VkResult vkGetGlobalLayerProperties(
++cmd VkResult vkEnumerateInstanceLayerProperties(
+         u32*                                        pCount,
+         VkLayerProperties*                          pProperties) {
+     count := as!u32(?)
+@@ -2173,7 +2159,7 @@ cmd VkResult vkGetGlobalLayerProperties(
+     return ?
+ }
+ 
+-cmd VkResult vkGetGlobalExtensionProperties(
++cmd VkResult vkEnumerateInstanceExtensionProperties(
+         const char*                                 pLayerName,
+         u32*                                        pCount,
+         VkExtensionProperties*                      pProperties) {
+@@ -2189,7 +2175,7 @@ cmd VkResult vkGetGlobalExtensionProperties(
+     return ?
+ }
+ 
+-cmd VkResult vkGetPhysicalDeviceLayerProperties(
++cmd VkResult vkEnumerateDeviceLayerProperties(
+         VkPhysicalDevice                            physicalDevice,
+         u32*                                        pCount,
+         VkLayerProperties*                          pProperties) {
+@@ -2206,7 +2192,7 @@ cmd VkResult vkGetPhysicalDeviceLayerProperties(
+     return ?
+ }
+ 
+-cmd VkResult vkGetPhysicalDeviceExtensionProperties(
++cmd VkResult vkEnumerateDeviceExtensionProperties(
+         VkPhysicalDevice                            physicalDevice,
+         const char*                                 pLayerName,
+         u32*                                        pCount,
+@@ -2254,7 +2240,7 @@ cmd VkResult vkQueueSubmit(
+         VkFence                                     fence) {
+     queueObject := GetQueue(queue)
+ 
+-    if fence != VK_NULL_HANDLE {
++    if fence != NULL_HANDLE {
+         fenceObject := GetFence(fence)
+         assert(fenceObject.device == queueObject.device)
+     }
+@@ -2309,7 +2295,7 @@ cmd VkResult vkAllocMemory(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkFreeMemory(
++cmd void vkFreeMemory(
+         VkDevice                                    device,
+         VkDeviceMemory                              mem) {
+     deviceObject := GetDevice(device)
+@@ -2322,16 +2308,14 @@ cmd VkResult vkFreeMemory(
+     validate("MemoryCheck", len(memObject.boundCommandBuffers) == 0,
+         "vkFreeMemory: cmdBuffers still bound")
+     State.DeviceMemories[mem] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("app")
+ cmd VkResult vkMapMemory(
+         VkDevice                                    device,
+         VkDeviceMemory                              mem,
+-        platform.VkDeviceSize                       offset,
+-        platform.VkDeviceSize                       size,
++        VkDeviceSize                                offset,
++        VkDeviceSize                                size,
+         VkMemoryMapFlags                            flags,
+         void**                                      ppData) {
+     deviceObject := GetDevice(device)
+@@ -2345,14 +2329,12 @@ cmd VkResult vkMapMemory(
+ }
+ 
+ @threadSafety("app")
+-cmd VkResult vkUnmapMemory(
++cmd void vkUnmapMemory(
+         VkDevice                                    device,
+         VkDeviceMemory                              mem) {
+     deviceObject := GetDevice(device)
+     memObject := GetDeviceMemory(mem)
+     assert(memObject.device == device)
+-
+-    return ?
+ }
+ 
+ cmd VkResult vkFlushMappedMemoryRanges(
+@@ -2395,10 +2377,10 @@ cmd VkResult vkInvalidateMappedMemoryRanges(
+ cmd VkResult vkGetDeviceMemoryCommitment(
+         VkDevice                                    device,
+         VkDeviceMemory                              memory,
+-        platform.VkDeviceSize*                      pCommittedMemoryInBytes) {
++        VkDeviceSize*                               pCommittedMemoryInBytes) {
+     deviceObject := GetDevice(device)
+ 
+-    if memory != VK_NULL_HANDLE {
++    if memory != NULL_HANDLE {
+         memoryObject := GetDeviceMemory(memory)
+         assert(memoryObject.device == device)
+     }
+@@ -2424,19 +2406,19 @@ cmd VkResult vkBindBufferMemory(
+         VkDevice                                    device,
+         VkBuffer                                    buffer,
+         VkDeviceMemory                              mem,
+-        platform.VkDeviceSize                       memOffset) {
++        VkDeviceSize                                memOffset) {
+     deviceObject := GetDevice(device)
+     bufferObject := GetBuffer(buffer)
+     assert(bufferObject.device == device)
+ 
+     // Unbind buffer from previous memory object, if not VK_NULL_HANDLE.
+-    if bufferObject.mem != VK_NULL_HANDLE {
++    if bufferObject.mem != NULL_HANDLE {
+         memObject := GetDeviceMemory(bufferObject.mem)
+         memObject.boundObjects[as!u64(buffer)] = null
+     }
+ 
+     // Bind buffer to given memory object, if not VK_NULL_HANDLE.
+-    if mem != VK_NULL_HANDLE {
++    if mem != NULL_HANDLE {
+         memObject := GetDeviceMemory(mem)
+         assert(memObject.device == device)
+         memObject.boundObjects[as!u64(buffer)] = memOffset
+@@ -2462,19 +2444,19 @@ cmd VkResult vkBindImageMemory(
+         VkDevice                                    device,
+         VkImage                                     image,
+         VkDeviceMemory                              mem,
+-        platform.VkDeviceSize                       memOffset) {
++        VkDeviceSize                                memOffset) {
+     deviceObject := GetDevice(device)
+     imageObject := GetImage(image)
+     assert(imageObject.device == device)
+ 
+     // Unbind image from previous memory object, if not VK_NULL_HANDLE.
+-    if imageObject.mem != VK_NULL_HANDLE {
++    if imageObject.mem != NULL_HANDLE {
+         memObject := GetDeviceMemory(imageObject.mem)
+         memObject.boundObjects[as!u64(image)] = null
+     }
+ 
+     // Bind image to given memory object, if not VK_NULL_HANDLE.
+-    if mem != VK_NULL_HANDLE {
++    if mem != NULL_HANDLE {
+         memObject := GetDeviceMemory(mem)
+         assert(memObject.device == device)
+         memObject.boundObjects[as!u64(image)] = memOffset
+@@ -2567,7 +2549,7 @@ cmd VkResult vkCreateFence(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyFence(
++cmd void vkDestroyFence(
+         VkDevice                                    device,
+         VkFence                                     fence) {
+     deviceObject := GetDevice(device)
+@@ -2575,8 +2557,6 @@ cmd VkResult vkDestroyFence(
+     assert(fenceObject.device == device)
+ 
+     State.Fences[fence] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("system")
+@@ -2613,7 +2593,7 @@ cmd VkResult vkWaitForFences(
+         VkDevice                                    device,
+         u32                                         fenceCount,
+         const VkFence*                              pFences,
+-        platform.VkBool32                           waitAll,
++        VkBool32                                    waitAll,
+         u64                                         timeout) {  /// timeout in nanoseconds
+     deviceObject := GetDevice(device)
+ 
+@@ -2646,7 +2626,7 @@ cmd VkResult vkCreateSemaphore(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroySemaphore(
++cmd void vkDestroySemaphore(
+         VkDevice                                    device,
+         VkSemaphore                                 semaphore) {
+     deviceObject := GetDevice(device)
+@@ -2654,8 +2634,6 @@ cmd VkResult vkDestroySemaphore(
+     assert(semaphoreObject.device == device)
+ 
+     State.Semaphores[semaphore] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("app")
+@@ -2699,7 +2677,7 @@ cmd VkResult vkCreateEvent(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyEvent(
++cmd void vkDestroyEvent(
+         VkDevice                                    device,
+         VkEvent                                     event) {
+     deviceObject := GetDevice(device)
+@@ -2707,8 +2685,6 @@ cmd VkResult vkDestroyEvent(
+     assert(eventObject.device == device)
+ 
+     State.Events[event] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("system")
+@@ -2763,7 +2739,7 @@ cmd VkResult vkCreateQueryPool(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyQueryPool(
++cmd void vkDestroyQueryPool(
+         VkDevice                                    device,
+         VkQueryPool                                 queryPool) {
+     deviceObject := GetDevice(device)
+@@ -2771,8 +2747,6 @@ cmd VkResult vkDestroyQueryPool(
+     assert(queryPoolObject.device == device)
+ 
+     State.QueryPools[queryPool] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("system")
+@@ -2813,7 +2787,7 @@ cmd VkResult vkCreateBuffer(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyBuffer(
++cmd void vkDestroyBuffer(
+         VkDevice                                    device,
+         VkBuffer                                    buffer) {
+     deviceObject := GetDevice(device)
+@@ -2822,8 +2796,6 @@ cmd VkResult vkDestroyBuffer(
+ 
+     assert(bufferObject.mem == 0)
+     State.Buffers[buffer] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -2848,7 +2820,7 @@ cmd VkResult vkCreateBufferView(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyBufferView(
++cmd void vkDestroyBufferView(
+         VkDevice                                    device,
+         VkBufferView                                bufferView) {
+     deviceObject := GetDevice(device)
+@@ -2856,8 +2828,6 @@ cmd VkResult vkDestroyBufferView(
+     assert(bufferViewObject.device == device)
+ 
+     State.BufferViews[bufferView] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -2879,7 +2849,7 @@ cmd VkResult vkCreateImage(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyImage(
++cmd void vkDestroyImage(
+         VkDevice                                    device,
+         VkImage                                     image) {
+     deviceObject := GetDevice(device)
+@@ -2888,8 +2858,6 @@ cmd VkResult vkDestroyImage(
+ 
+     assert(imageObject.mem == 0)
+     State.Images[image] = null
+-
+-    return ?
+ }
+ 
+ cmd VkResult vkGetImageSubresourceLayout(
+@@ -2926,7 +2894,7 @@ cmd VkResult vkCreateImageView(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyImageView(
++cmd void vkDestroyImageView(
+         VkDevice                                    device,
+         VkImageView                                 imageView) {
+     deviceObject := GetDevice(device)
+@@ -2934,39 +2902,6 @@ cmd VkResult vkDestroyImageView(
+     assert(imageViewObject.device == device)
+ 
+     State.ImageViews[imageView] = null
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkCreateAttachmentView(
+-        VkDevice                                    device,
+-        const VkAttachmentViewCreateInfo*           pCreateInfo,
+-        VkAttachmentView*                           pView) {
+-    assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO)
+-    deviceObject := GetDevice(device)
+-
+-    imageObject := GetImage(pCreateInfo.image)
+-    assert(imageObject.device == device)
+-
+-    view := ?
+-    pView[0] = view
+-    State.AttachmentViews[view] = new!AttachmentViewObject(device: device, image: pCreateInfo.image)
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkDestroyAttachmentView(
+-        VkDevice                                    device,
+-        VkAttachmentView                            attachmentView) {
+-    deviceObject := GetDevice(device)
+-    attachmentViewObject := GetAttachmentView(attachmentView)
+-    assert(attachmentViewObject.device == device)
+-
+-    State.AttachmentViews[attachmentView] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -2986,7 +2921,7 @@ cmd VkResult vkCreateShaderModule(
+     return ?
+ }
+ 
+-cmd VkResult vkDestroyShaderModule(
++cmd void vkDestroyShaderModule(
+         VkDevice                                    device,
+         VkShaderModule                              shaderModule) {
+     deviceObject := GetDevice(device)
+@@ -2994,8 +2929,6 @@ cmd VkResult vkDestroyShaderModule(
+     assert(shaderModuleObject.device == device)
+ 
+     State.ShaderModules[shaderModule] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("system")
+@@ -3014,7 +2947,7 @@ cmd VkResult vkCreateShader(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyShader(
++cmd void vkDestroyShader(
+         VkDevice                                    device,
+         VkShader                                    shader) {
+     deviceObject := GetDevice(device)
+@@ -3022,8 +2955,6 @@ cmd VkResult vkDestroyShader(
+     assert(shaderObject.device == device)
+ 
+     State.Shaders[shader] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -3043,7 +2974,7 @@ cmd VkResult vkCreatePipelineCache(
+     return ?
+ }
+ 
+-cmd VkResult vkDestroyPipelineCache(
++cmd void vkDestroyPipelineCache(
+         VkDevice                                    device,
+         VkPipelineCache                             pipelineCache) {
+     deviceObject := GetDevice(device)
+@@ -3051,8 +2982,6 @@ cmd VkResult vkDestroyPipelineCache(
+     assert(pipelineCacheObject.device == device)
+ 
+     State.PipelineCaches[pipelineCache] = null
+-
+-    return ?
+ }
+ 
+ cmd platform.size_t vkGetPipelineCacheSize(
+@@ -3102,7 +3031,7 @@ cmd VkResult vkCreateGraphicsPipelines(
+         const VkGraphicsPipelineCreateInfo*         pCreateInfos,
+         VkPipeline*                                 pPipelines) {
+     deviceObject := GetDevice(device)
+-    if pipelineCache != VK_NULL_HANDLE {
++    if pipelineCache != NULL_HANDLE {
+         pipelineCacheObject := GetPipelineCache(pipelineCache)
+         assert(pipelineCacheObject.device == device)
+     }
+@@ -3125,7 +3054,7 @@ cmd VkResult vkCreateComputePipelines(
+         const VkComputePipelineCreateInfo*          pCreateInfos,
+         VkPipeline*                                 pPipelines) {
+     deviceObject := GetDevice(device)
+-    if pipelineCache != VK_NULL_HANDLE {
++    if pipelineCache != NULL_HANDLE {
+         pipelineCacheObject := GetPipelineCache(pipelineCache)
+         assert(pipelineCacheObject.device == device)
+     }
+@@ -3142,7 +3071,7 @@ cmd VkResult vkCreateComputePipelines(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyPipeline(
++cmd void vkDestroyPipeline(
+         VkDevice                                    device,
+         VkPipeline                                  pipeline) {
+     deviceObject := GetDevice(device)
+@@ -3150,8 +3079,6 @@ cmd VkResult vkDestroyPipeline(
+     assert(pipelineObjects.device == device)
+ 
+     State.Pipelines[pipeline] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -3173,7 +3100,7 @@ cmd VkResult vkCreatePipelineLayout(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyPipelineLayout(
++cmd void vkDestroyPipelineLayout(
+         VkDevice                                    device,
+         VkPipelineLayout                            pipelineLayout) {
+     deviceObject := GetDevice(device)
+@@ -3181,8 +3108,6 @@ cmd VkResult vkDestroyPipelineLayout(
+     assert(pipelineLayoutObjects.device == device)
+ 
+     State.PipelineLayouts[pipelineLayout] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -3204,7 +3129,7 @@ cmd VkResult vkCreateSampler(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroySampler(
++cmd void vkDestroySampler(
+         VkDevice                                    device,
+         VkSampler                                   sampler) {
+     deviceObject := GetDevice(device)
+@@ -3212,8 +3137,6 @@ cmd VkResult vkDestroySampler(
+     assert(samplerObject.device == device)
+ 
+     State.Samplers[sampler] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -3235,7 +3158,7 @@ cmd VkResult vkCreateDescriptorSetLayout(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyDescriptorSetLayout(
++cmd void vkDestroyDescriptorSetLayout(
+         VkDevice                                    device,
+         VkDescriptorSetLayout                       descriptorSetLayout) {
+     deviceObject := GetDevice(device)
+@@ -3243,16 +3166,12 @@ cmd VkResult vkDestroyDescriptorSetLayout(
+     assert(descriptorSetLayoutObject.device == device)
+ 
+     State.DescriptorSetLayouts[descriptorSetLayout] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("system")
+ cmd VkResult vkCreateDescriptorPool(
+         VkDevice                                    device,
+-        VkDescriptorPoolUsage                       poolUsage,
+-        u32                                         maxSets,
+-        const VkDescriptorPoolCreateInfo*           pCreateInfo,
++        const VkDescriptorPoolCreateInfo*           pCreateInfo
+         VkDescriptorPool*                           pDescriptorPool) {
+     assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO)
+     deviceObject := GetDevice(device)
+@@ -3265,7 +3184,7 @@ cmd VkResult vkCreateDescriptorPool(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyDescriptorPool(
++cmd void vkDestroyDescriptorPool(
+         VkDevice                                    device,
+         VkDescriptorPool                            descriptorPool) {
+     deviceObject := GetDevice(device)
+@@ -3273,8 +3192,6 @@ cmd VkResult vkDestroyDescriptorPool(
+     assert(descriptorPoolObject.device == device)
+ 
+     State.DescriptorPools[descriptorPool] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("app")
+@@ -3295,8 +3212,7 @@ cmd VkResult vkAllocDescriptorSets(
+         VkDescriptorSetUsage                        setUsage,
+         u32                                         count,
+         const VkDescriptorSetLayout*                pSetLayouts,
+-        VkDescriptorSet*                            pDescriptorSets,
+-        u32*                                        pCount) {
++        VkDescriptorSet*                            pDescriptorSets) {
+     deviceObject := GetDevice(device)
+     descriptorPoolObject := GetDescriptorPool(descriptorPool)
+ 
+@@ -3307,10 +3223,8 @@ cmd VkResult vkAllocDescriptorSets(
+         assert(setLayoutObject.device == device)
+     }
+ 
+-    setsCount := as!u32(?)
+-    pCount[0] = setsCount
+-    descriptorSets := pDescriptorSets[0:setsCount]
+-    for i in (0 .. setsCount) {
++    descriptorSets := pDescriptorSets[0:count]
++    for i in (0 .. count) {
+         descriptorSet := ?
+         descriptorSets[i] = descriptorSet
+         State.DescriptorSets[descriptorSet] = new!DescriptorSetObject(device: device)
+@@ -3338,7 +3252,7 @@ cmd VkResult vkFreeDescriptorSets(
+     return ?
+ }
+ 
+-cmd VkResult vkUpdateDescriptorSets(
++cmd void vkUpdateDescriptorSets(
+         VkDevice                                    device,
+         u32                                         writeCount,
+         const VkWriteDescriptorSet*                 pDescriptorWrites,
+@@ -3359,123 +3273,6 @@ cmd VkResult vkUpdateDescriptorSets(
+         descriptorCopyObject := GetDescriptorSet(descriptorCopy.destSet)
+         assert(descriptorCopyObject.device == device)
+     }
+-
+-    return ?
+-}
+-
+-
+-// State object functions
+-
+-@threadSafety("system")
+-cmd VkResult vkCreateDynamicViewportState(
+-        VkDevice                                    device,
+-        const VkDynamicViewportStateCreateInfo*     pCreateInfo,
+-        VkDynamicViewportState*                     pState) {
+-    assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO)
+-    deviceObject := GetDevice(device)
+-
+-    state := ?
+-    pState[0] = state
+-    State.DynamicViewportStates[state] = new!DynamicViewportStateObject(device: device)
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkDestroyDynamicViewportState(
+-        VkDevice                                    device,
+-        VkDynamicViewportState                      dynamicViewportState) {
+-    deviceObject := GetDevice(device)
+-    dynamicViewportStateObject := GetDynamicViewportState(dynamicViewportState)
+-    assert(dynamicViewportStateObject.device == device)
+-
+-    State.DynamicViewportStates[dynamicViewportState] = null
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkCreateDynamicRasterState(
+-        VkDevice                                    device,
+-        const VkDynamicRasterStateCreateInfo*       pCreateInfo,
+-        VkDynamicRasterState*                       pState) {
+-    assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO)
+-    deviceObject := GetDevice(device)
+-
+-    state := ?
+-    pState[0] = state
+-    State.DynamicRasterStates[state] = new!DynamicRasterStateObject(device: device)
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkDestroyDynamicRasterState(
+-        VkDevice                                    device,
+-        VkDynamicRasterState                        dynamicRasterState) {
+-    deviceObject := GetDevice(device)
+-    dynamicRasterStateObject := GetDynamicRasterState(dynamicRasterState)
+-    assert(dynamicRasterStateObject.device == device)
+-
+-    State.DynamicRasterStates[dynamicRasterState] = null
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkCreateDynamicColorBlendState(
+-        VkDevice                                    device,
+-        const VkDynamicColorBlendStateCreateInfo*   pCreateInfo,
+-        VkDynamicColorBlendState*                   pState) {
+-    assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO)
+-    deviceObject := GetDevice(device)
+-
+-    state := ?
+-    pState[0] = state
+-    State.DynamicColorBlendStates[state] = new!DynamicColorBlendStateObject(device: device)
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkDestroyDynamicColorBlendState(
+-        VkDevice                                    device,
+-        VkDynamicColorBlendState                    dynamicColorBlendState) {
+-    deviceObject := GetDevice(device)
+-    dynamicColorBlendStateObject := GetDynamicColorBlendState(dynamicColorBlendState)
+-    assert(dynamicColorBlendStateObject.device == device)
+-
+-    State.DynamicColorBlendStates[dynamicColorBlendState] = null
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkCreateDynamicDepthStencilState(
+-        VkDevice                                    device,
+-        const VkDynamicDepthStencilStateCreateInfo* pCreateInfo,
+-        VkDynamicDepthStencilState*                 pState) {
+-    assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO)
+-    deviceObject := GetDevice(device)
+-
+-    state := ?
+-    pState[0] = state
+-    State.DynamicDepthStencilStates[state] = new!DynamicDepthStencilStateObject(device: device)
+-
+-    return ?
+-}
+-
+-@threadSafety("system")
+-cmd VkResult vkDestroyDynamicDepthStencilState(
+-        VkDevice                                    device,
+-        VkDynamicDepthStencilState                  dynamicDepthStencilState) {
+-    deviceObject := GetDevice(device)
+-    dynamicDepthStencilStateObject := GetDynamicDepthStencilState(dynamicDepthStencilState)
+-    assert(dynamicDepthStencilStateObject.device == device)
+-
+-    State.DynamicDepthStencilStates[dynamicDepthStencilState] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -3497,7 +3294,7 @@ cmd VkResult vkCreateFramebuffer(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyFramebuffer(
++cmd void vkDestroyFramebuffer(
+         VkDevice                                    device,
+         VkFramebuffer                               framebuffer) {
+     deviceObject := GetDevice(device)
+@@ -3505,8 +3302,6 @@ cmd VkResult vkDestroyFramebuffer(
+     assert(framebufferObject.device == device)
+ 
+     State.Framebuffers[framebuffer] = null
+-
+-    return ?
+ }
+ 
+ 
+@@ -3528,7 +3323,7 @@ cmd VkResult vkCreateRenderPass(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyRenderPass(
++cmd void vkDestroyRenderPass(
+         VkDevice                                    device,
+         VkRenderPass                                renderPass) {
+     deviceObject := GetDevice(device)
+@@ -3536,8 +3331,6 @@ cmd VkResult vkDestroyRenderPass(
+     assert(renderPassObject.device == device)
+ 
+     State.RenderPasses[renderPass] = null
+-
+-    return ?
+ }
+ 
+ cmd VkResult vkGetRenderAreaGranularity(
+@@ -3569,7 +3362,7 @@ cmd VkResult vkCreateCommandPool(
+     return ?
+ }
+ 
+-cmd VkResult vkDestroyCommandPool(
++cmd void vkDestroyCommandPool(
+         VkDevice                                    device,
+         VkCmdPool                                   cmdPool) {
+     deviceObject := GetDevice(device)
+@@ -3577,8 +3370,6 @@ cmd VkResult vkDestroyCommandPool(
+     assert(cmdPoolObject.device == device)
+ 
+     State.CmdPools[cmdPool] = null
+-
+-    return ?
+ }
+ 
+ cmd VkResult vkResetCommandPool(
+@@ -3625,7 +3416,7 @@ cmd VkResult vkCreateCommandBuffer(
+ }
+ 
+ @threadSafety("system")
+-cmd VkResult vkDestroyCommandBuffer(
++cmd void vkDestroyCommandBuffer(
+         VkDevice                                    device,
+         VkCmdBuffer                                 commandBuffer) {
+     deviceObject := GetDevice(device)
+@@ -3634,8 +3425,6 @@ cmd VkResult vkDestroyCommandBuffer(
+ 
+     // TODO: iterate over boundObjects and clear memory bindings
+     State.CmdBuffers[commandBuffer] = null
+-
+-    return ?
+ }
+ 
+ @threadSafety("app")
+@@ -3689,49 +3478,93 @@ cmd void vkCmdBindPipeline(
+ }
+ 
+ @threadSafety("app")
+-cmd void vkCmdBindDynamicViewportState(
++cmd void vkCmdSetViewport(
+         VkCmdBuffer                                 cmdBuffer,
+-        VkDynamicViewportState                      dynamicViewportState) {
++        u32                                         viewportCount,
++        const VkViewport*                           pViewports) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+-    dynamicViewportStateObject := GetDynamicViewportState(dynamicViewportState)
+-    assert(cmdBufferObject.device == dynamicViewportStateObject.device)
++    queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
++    cmdBufferObject.queueFlags = queueFlags
++}
+ 
++@threadSafety("app")
++cmd void vkCmdSetScissor(
++        VkCmdBuffer                                 cmdBuffer,
++        u32                                         scissorCount,
++        const VkRect2D*                             pScissors) {
++    cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
+     cmdBufferObject.queueFlags = queueFlags
+ }
+ 
+ @threadSafety("app")
+-cmd void vkCmdBindDynamicRasterState(
++cmd void vkCmdSetLineWidth(
+         VkCmdBuffer                                 cmdBuffer,
+-        VkDynamicRasterState                        dynamicRasterState) {
++        f32                                         lineWidth) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+-    dynamicRasterStateObject := GetDynamicRasterState(dynamicRasterState)
+-    assert(cmdBufferObject.device == dynamicRasterStateObject.device)
++    queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
++    cmdBufferObject.queueFlags = queueFlags
++}
+ 
++@threadSafety("app")
++cmd void vkCmdSetDepthBias(
++        VkCmdBuffer                                 cmdBuffer,
++        f32                                         depthBias,
++        f32                                         depthBiasClamp,
++        f32                                         slopeScaledDepthBias) {
++    cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
+     cmdBufferObject.queueFlags = queueFlags
+ }
+ 
+ @threadSafety("app")
+-cmd void vkCmdBindDynamicColorBlendState(
++cmd void vkCmdSetBlendConstants(
+         VkCmdBuffer                                 cmdBuffer,
+-        VkDynamicColorBlendState                    dynamicColorBlendState) {
++        // TODO(jessehall): apic only supports 'const' on pointer types. Using
++        // an annotation as a quick hack to pass this to the template without
++        // having to modify the AST and semantic model.
++        @readonly f32[4]                            blendConst) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+-    dynamicColorBlendStateObject := GetDynamicColorBlendState(dynamicColorBlendState)
+-    assert(cmdBufferObject.device == dynamicColorBlendStateObject.device)
++    queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
++    cmdBufferObject.queueFlags = queueFlags
++}
+ 
++@threadSafety("app")
++cmd void vkCmdSetDepthBounds(
++        VkCmdBuffer                                 cmdBuffer,
++        f32                                         minDepthBounds,
++        f32                                         maxDepthBounds) {
++    cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
+     cmdBufferObject.queueFlags = queueFlags
+ }
+ 
+ @threadSafety("app")
+-cmd void vkCmdBindDynamicDepthStencilState(
++cmd void vkCmdSetStencilCompareMask(
+         VkCmdBuffer                                 cmdBuffer,
+-        VkDynamicDepthStencilState                  dynamicDepthStencilState) {
++        VkStencilFaceFlags                          faceMask,
++        u32                                         stencilCompareMask) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+-    dynamicDepthStencilStateObject := GetDynamicDepthStencilState(dynamicDepthStencilState)
+-    assert(cmdBufferObject.device == dynamicDepthStencilStateObject.device)
++    queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
++    cmdBufferObject.queueFlags = queueFlags
++}
+ 
++@threadSafety("app")
++cmd void vkCmdSetStencilWriteMask(
++        VkCmdBuffer                                 cmdBuffer,
++        VkStencilFaceFlags                          faceMask,
++        u32                                         stencilWriteMask) {
++    cmdBufferObject := GetCmdBuffer(cmdBuffer)
++    queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
++    cmdBufferObject.queueFlags = queueFlags
++}
++
++@threadSafety("app")
++cmd void vkCmdSetStencilReference(
++        VkCmdBuffer                                 cmdBuffer,
++        VkStencilFaceFlags                          faceMask,
++        u32                                         stencilReference) {
++    cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
+     cmdBufferObject.queueFlags = queueFlags
+ }
+@@ -3771,7 +3604,7 @@ cmd void vkCmdBindDescriptorSets(
+ cmd void vkCmdBindIndexBuffer(
+         VkCmdBuffer                                 cmdBuffer,
+         VkBuffer                                    buffer,
+-        platform.VkDeviceSize                       offset,
++        VkDeviceSize                                offset,
+         VkIndexType                                 indexType) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     bufferObject := GetBuffer(buffer)
+@@ -3789,7 +3622,7 @@ cmd void vkCmdBindVertexBuffers(
+         u32                                         startBinding,
+         u32                                         bindingCount,
+         const VkBuffer*                             pBuffers,
+-        const platform.VkDeviceSize*                pOffsets) {
++        const VkDeviceSize*                         pOffsets) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+ 
+     // TODO: check if not [startBinding:startBinding+bindingCount]
+@@ -3811,10 +3644,10 @@ cmd void vkCmdBindVertexBuffers(
+ @threadSafety("app")
+ cmd void vkCmdDraw(
+         VkCmdBuffer                                 cmdBuffer,
+-        u32                                         firstVertex,
+         u32                                         vertexCount,
+-        u32                                         firstInstance,
+-        u32                                         instanceCount) {
++        u32                                         instanceCount,
++        u32                                         firstVertex,
++        u32                                         firstInstance) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+ 
+     queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
+@@ -3824,11 +3657,11 @@ cmd void vkCmdDraw(
+ @threadSafety("app")
+ cmd void vkCmdDrawIndexed(
+         VkCmdBuffer                                 cmdBuffer,
+-        u32                                         firstIndex,
+         u32                                         indexCount,
++        u32                                         instanceCount,
++        u32                                         firstIndex,
+         s32                                         vertexOffset,
+-        u32                                         firstInstance,
+-        u32                                         instanceCount) {
++        u32                                         firstInstance) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+ 
+     queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
+@@ -3839,7 +3672,7 @@ cmd void vkCmdDrawIndexed(
+ cmd void vkCmdDrawIndirect(
+         VkCmdBuffer                                 cmdBuffer,
+         VkBuffer                                    buffer,
+-        platform.VkDeviceSize                       offset,
++        VkDeviceSize                                offset,
+         u32                                         count,
+         u32                                         stride) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+@@ -3856,7 +3689,7 @@ cmd void vkCmdDrawIndirect(
+ cmd void vkCmdDrawIndexedIndirect(
+         VkCmdBuffer                                 cmdBuffer,
+         VkBuffer                                    buffer,
+-        platform.VkDeviceSize                       offset,
++        VkDeviceSize                                offset,
+         u32                                         count,
+         u32                                         stride) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+@@ -3885,7 +3718,7 @@ cmd void vkCmdDispatch(
+ cmd void vkCmdDispatchIndirect(
+         VkCmdBuffer                                 cmdBuffer,
+         VkBuffer                                    buffer,
+-        platform.VkDeviceSize                       offset) {
++        VkDeviceSize                                offset) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     bufferObject := GetBuffer(buffer)
+     assert(cmdBufferObject.device == bufferObject.device)
+@@ -4032,8 +3865,8 @@ cmd void vkCmdCopyImageToBuffer(
+ cmd void vkCmdUpdateBuffer(
+         VkCmdBuffer                                 cmdBuffer,
+         VkBuffer                                    destBuffer,
+-        platform.VkDeviceSize                       destOffset,
+-        platform.VkDeviceSize                       dataSize,
++        VkDeviceSize                                destOffset,
++        VkDeviceSize                                dataSize,
+         const u32*                                  pData) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     destBufferObject := GetBuffer(destBuffer)
+@@ -4051,8 +3884,8 @@ cmd void vkCmdUpdateBuffer(
+ cmd void vkCmdFillBuffer(
+         VkCmdBuffer                                 cmdBuffer,
+         VkBuffer                                    destBuffer,
+-        platform.VkDeviceSize                       destOffset,
+-        platform.VkDeviceSize                       fillSize,
++        VkDeviceSize                                destOffset,
++        VkDeviceSize                                fillSize,
+         u32                                         data) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     destBufferObject := GetBuffer(destBuffer)
+@@ -4090,8 +3923,7 @@ cmd void vkCmdClearDepthStencilImage(
+         VkCmdBuffer                                 cmdBuffer,
+         VkImage                                     image,
+         VkImageLayout                               imageLayout,
+-        f32                                         depth,
+-        u32                                         stencil,
++        const VkClearDepthStencilValue*             pDepthStencil,
+         u32                                         rangeCount,
+         const VkImageSubresourceRange*              pRanges) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+@@ -4131,10 +3963,9 @@ cmd void vkCmdClearColorAttachment(
+ @threadSafety("app")
+ cmd void vkCmdClearDepthStencilAttachment(
+         VkCmdBuffer                                 cmdBuffer,
+-        VkImageAspectFlags                          imageAspectMask,
++        VkImageAspectFlags                          aspectMask,
+         VkImageLayout                               imageLayout,
+-        f32                                         depth,
+-        u32                                         stencil,
++        const VkClearDepthStencilValue*             pDepthStencil,
+         u32                                         rectCount,
+         const VkRect3D*                             pRects) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+@@ -4238,7 +4069,7 @@ cmd void vkCmdPipelineBarrier(
+         VkCmdBuffer                                 cmdBuffer,
+         VkPipelineStageFlags                        srcStageMask,
+         VkPipelineStageFlags                        destStageMask,
+-        platform.VkBool32                           byRegion,
++        VkBool32                                    byRegion,
+         u32                                         memBarrierCount,
+         const void* const*                          ppMemBarriers) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+@@ -4300,7 +4131,7 @@ cmd void vkCmdWriteTimestamp(
+         VkCmdBuffer                                 cmdBuffer,
+         VkTimestampType                             timestampType,
+         VkBuffer                                    destBuffer,
+-        platform.VkDeviceSize                       destOffset) {
++        VkDeviceSize                                destOffset) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     destBufferObject := GetBuffer(destBuffer)
+     assert(cmdBufferObject.device == destBufferObject.device)
+@@ -4313,8 +4144,8 @@ cmd void vkCmdCopyQueryPoolResults(
+         u32                                         startQuery,
+         u32                                         queryCount,
+         VkBuffer                                    destBuffer,
+-        platform.VkDeviceSize                       destOffset,
+-        platform.VkDeviceSize                       destStride,
++        VkDeviceSize                                destOffset,
++        VkDeviceSize                                destStride,
+         VkQueryResultFlags                          flags) {
+     cmdBufferObject := GetCmdBuffer(cmdBuffer)
+     queryPoolObject := GetQueryPool(queryPool)
+@@ -4407,7 +4238,6 @@ StateObject State
+     map!(VkBufferView,               ref!BufferViewObject)               BufferViews
+     map!(VkImage,                    ref!ImageObject)                    Images
+     map!(VkImageView,                ref!ImageViewObject)                ImageViews
+-    map!(VkAttachmentView,           ref!AttachmentViewObject)           AttachmentViews
+     map!(VkShaderModule,             ref!ShaderModuleObject)             ShaderModules
+     map!(VkShader,                   ref!ShaderObject)                   Shaders
+     map!(VkPipeline,                 ref!PipelineObject)                 Pipelines
+@@ -4416,10 +4246,6 @@ StateObject State
+     map!(VkDescriptorSet,            ref!DescriptorSetObject)            DescriptorSets
+     map!(VkDescriptorSetLayout,      ref!DescriptorSetLayoutObject)      DescriptorSetLayouts
+     map!(VkDescriptorPool,           ref!DescriptorPoolObject)           DescriptorPools
+-    map!(VkDynamicViewportState,     ref!DynamicViewportStateObject)     DynamicViewportStates
+-    map!(VkDynamicRasterState,       ref!DynamicRasterStateObject)       DynamicRasterStates
+-    map!(VkDynamicColorBlendState,   ref!DynamicColorBlendStateObject)   DynamicColorBlendStates
+-    map!(VkDynamicDepthStencilState, ref!DynamicDepthStencilStateObject) DynamicDepthStencilStates
+     map!(VkFence,                    ref!FenceObject)                    Fences
+     map!(VkSemaphore,                ref!SemaphoreObject)                Semaphores
+     map!(VkEvent,                    ref!EventObject)                    Events
+@@ -4454,15 +4280,15 @@ StateObject State
+ 
+ @internal class DeviceMemoryObject {
+     VkDevice                         device
+-    platform.VkDeviceSize            allocationSize
+-    map!(u64, platform.VkDeviceSize) boundObjects
++    VkDeviceSize                     allocationSize
++    map!(u64, VkDeviceSize         ) boundObjects
+     map!(VkCmdBuffer, VkCmdBuffer)   boundCommandBuffers
+ }
+ 
+ @internal class BufferObject {
+     VkDevice              device
+     VkDeviceMemory        mem
+-    platform.VkDeviceSize memOffset
++    VkDeviceSize          memOffset
+ }
+ 
+ @internal class BufferViewObject {
+@@ -4473,7 +4299,7 @@ StateObject State
+ @internal class ImageObject {
+     VkDevice              device
+     VkDeviceMemory        mem
+-    platform.VkDeviceSize memOffset
++    VkDeviceSize          memOffset
+ }
+ 
+ @internal class ImageViewObject {
+@@ -4481,11 +4307,6 @@ StateObject State
+     VkImage       image
+ }
+ 
+-@internal class AttachmentViewObject {
+-    VkDevice      device
+-    VkImage       image
+-}
+-
+ @internal class ShaderObject {
+     VkDevice      device
+ }
+@@ -4518,22 +4339,6 @@ StateObject State
+     VkDevice      device
+ }
+ 
+-@internal class DynamicViewportStateObject {
+-    VkDevice      device
+-}
+-
+-@internal class DynamicRasterStateObject {
+-    VkDevice      device
+-}
+-
+-@internal class DynamicColorBlendStateObject {
+-    VkDevice      device
+-}
+-
+-@internal class DynamicDepthStencilStateObject {
+-    VkDevice      device
+-}
+-
+ @internal class FenceObject {
+     VkDevice      device
+     bool          signaled
+@@ -4617,11 +4422,6 @@ macro ref!ImageViewObject GetImageView(VkImageView imageView) {
+     return State.ImageViews[imageView]
+ }
+ 
+-macro ref!AttachmentViewObject GetAttachmentView(VkAttachmentView attachmentView) {
+-    assert(attachmentView in State.AttachmentViews)
+-    return State.AttachmentViews[attachmentView]
+-}
+-
+ macro ref!ShaderObject GetShader(VkShader shader) {
+     assert(shader in State.Shaders)
+     return State.Shaders[shader]
+@@ -4662,26 +4462,6 @@ macro ref!DescriptorPoolObject GetDescriptorPool(VkDescriptorPool descriptorPool
+     return State.DescriptorPools[descriptorPool]
+ }
+ 
+-macro ref!DynamicViewportStateObject GetDynamicViewportState(VkDynamicViewportState dynamicViewportState) {
+-    assert(dynamicViewportState in State.DynamicViewportStates)
+-    return State.DynamicViewportStates[dynamicViewportState]
+-}
+-
+-macro ref!DynamicRasterStateObject GetDynamicRasterState(VkDynamicRasterState dynamicRasterState) {
+-    assert(dynamicRasterState in State.DynamicRasterStates)
+-    return State.DynamicRasterStates[dynamicRasterState]
+-}
+-
+-macro ref!DynamicColorBlendStateObject GetDynamicColorBlendState(VkDynamicColorBlendState dynamicColorBlendState) {
+-    assert(dynamicColorBlendState in State.DynamicColorBlendStates)
+-    return State.DynamicColorBlendStates[dynamicColorBlendState]
+-}
+-
+-macro ref!DynamicDepthStencilStateObject GetDynamicDepthStencilState(VkDynamicDepthStencilState dynamicDepthStencilState) {
+-    assert(dynamicDepthStencilState in State.DynamicDepthStencilStates)
+-    return State.DynamicDepthStencilStates[dynamicDepthStencilState]
+-}
+-
+ macro ref!FenceObject GetFence(VkFence fence) {
+     assert(fence in State.Fences)
+     return State.Fences[fence]
+diff --git a/vulkan/include/hardware/hwvulkan.h b/vulkan/include/hardware/hwvulkan.h
+index 91dd41e..e973f46 100644
+--- a/vulkan/include/hardware/hwvulkan.h
++++ b/vulkan/include/hardware/hwvulkan.h
+@@ -61,7 +61,8 @@ typedef union {
+ typedef struct hwvulkan_device_t {
+     struct hw_device_t common;
+ 
+-    PFN_vkGetGlobalExtensionProperties GetGlobalExtensionProperties;
++    PFN_vkEnumerateInstanceExtensionProperties
++        EnumerateInstanceExtensionProperties;
+     PFN_vkCreateInstance CreateInstance;
+     PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
+ } hwvulkan_device_t;
+diff --git a/vulkan/include/vulkan/vk_platform.h b/vulkan/include/vulkan/vk_platform.h
+index 7ba8d77..969e532 100644
+--- a/vulkan/include/vulkan/vk_platform.h
++++ b/vulkan/include/vulkan/vk_platform.h
+@@ -67,22 +67,6 @@ extern "C"
+     #endif
+ #endif // !defined(VK_NO_STDINT_H)
+ 
+-typedef uint64_t   VkDeviceSize;
+-typedef uint32_t   VkBool32;
+-
+-typedef uint32_t   VkSampleMask;
+-typedef uint32_t   VkFlags;
+-
+-#if (UINTPTR_MAX >= UINT64_MAX)
+-    #define VK_UINTPTRLEAST64_MAX UINTPTR_MAX
+-
+-    typedef uintptr_t VkUintPtrLeast64;
+-#else
+-    #define VK_UINTPTRLEAST64_MAX UINT64_MAX
+-
+-    typedef uint64_t  VkUintPtrLeast64;
+-#endif
+-
+ #ifdef __cplusplus
+ } // extern "C"
+ #endif // __cplusplus
+diff --git a/vulkan/include/vulkan/vulkan.h b/vulkan/include/vulkan/vulkan.h
+index 9877233..03bcefe 100644
+--- a/vulkan/include/vulkan/vulkan.h
++++ b/vulkan/include/vulkan/vulkan.h
+@@ -41,14 +41,21 @@ extern "C" {
+     ((major << 22) | (minor << 12) | patch)
+ 
+ // Vulkan API version supported by this file
+-#define VK_API_VERSION VK_MAKE_VERSION(0, 138, 2)
++#define VK_API_VERSION VK_MAKE_VERSION(0, 170, 2)
++
++
++#if defined(__cplusplus) && (_MSC_VER >= 1800 || __cplusplus >= 201103L)
++    #define VK_NULL_HANDLE nullptr
++#else
++    #define VK_NULL_HANDLE 0
++#endif
+ 
+ 
+ #define VK_DEFINE_HANDLE(obj) typedef struct obj##_T* obj;
+ 
+ 
+ #if defined(__cplusplus)
+-    #if (_MSC_VER >= 1800 || __cplusplus >= 201103L)
++    #if ((defined(_MSC_VER) && _MSC_VER >= 1800) || __cplusplus >= 201103L)
+         // The bool operator only works if there are no implicit conversions from an obj to
+         // a bool-compatible type, which can then be used to unintentionally violate type safety.
+         // C++11 and above supports the "explicit" keyword on conversion operators to stop this
+@@ -56,13 +63,18 @@ extern "C" {
+         // the object handle as a bool in expressions like:
+         //     if (obj) vkDestroy(obj);
+         #define VK_NONDISP_HANDLE_OPERATOR_BOOL() explicit operator bool() const { return handle != 0; }
++        #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
++            explicit obj(uint64_t x) : handle(x) { } \
++            obj(decltype(nullptr)) : handle(0) { }
+     #else
+         #define VK_NONDISP_HANDLE_OPERATOR_BOOL()
++        #define VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
++            obj(uint64_t x) : handle(x) { }
+     #endif
+     #define VK_DEFINE_NONDISP_HANDLE(obj) \
+         struct obj { \
+             obj() : handle(0) { } \
+-            obj(uint64_t x) : handle(x) { } \
++            VK_NONDISP_HANDLE_CONSTRUCTOR_FROM_UINT64(obj) \
+             obj& operator =(uint64_t x) { handle = x; return *this; } \
+             bool operator==(const obj& other) const { return handle == other.handle; } \
+             bool operator!=(const obj& other) const { return handle != other.handle; } \
+@@ -76,20 +88,10 @@ extern "C" {
+         
+ 
+ 
+-#define VK_LOD_CLAMP_NONE                 MAX_FLOAT
+-#define VK_LAST_MIP_LEVEL                 UINT32_MAX
+-#define VK_LAST_ARRAY_SLICE               UINT32_MAX
+-#define VK_WHOLE_SIZE                     UINT64_MAX
+-#define VK_ATTACHMENT_UNUSED              UINT32_MAX
+-#define VK_TRUE                           1
+-#define VK_FALSE                          0
+-#define VK_NULL_HANDLE                    0
+-#define VK_MAX_PHYSICAL_DEVICE_NAME       256
+-#define VK_UUID_LENGTH                    16
+-#define VK_MAX_MEMORY_TYPES               32
+-#define VK_MAX_MEMORY_HEAPS               16
+-#define VK_MAX_EXTENSION_NAME             256
+-#define VK_MAX_DESCRIPTION                256
++typedef uint32_t VkBool32;
++typedef uint32_t VkFlags;
++typedef uint64_t VkDeviceSize;
++typedef uint32_t VkSampleMask;
+ 
+ VK_DEFINE_HANDLE(VkInstance)
+ VK_DEFINE_HANDLE(VkPhysicalDevice)
+@@ -105,7 +107,6 @@ VK_DEFINE_NONDISP_HANDLE(VkEvent)
+ VK_DEFINE_NONDISP_HANDLE(VkQueryPool)
+ VK_DEFINE_NONDISP_HANDLE(VkBufferView)
+ VK_DEFINE_NONDISP_HANDLE(VkImageView)
+-VK_DEFINE_NONDISP_HANDLE(VkAttachmentView)
+ VK_DEFINE_NONDISP_HANDLE(VkShaderModule)
+ VK_DEFINE_NONDISP_HANDLE(VkShader)
+ VK_DEFINE_NONDISP_HANDLE(VkPipelineCache)
+@@ -116,13 +117,25 @@ VK_DEFINE_NONDISP_HANDLE(VkDescriptorSetLayout)
+ VK_DEFINE_NONDISP_HANDLE(VkSampler)
+ VK_DEFINE_NONDISP_HANDLE(VkDescriptorPool)
+ VK_DEFINE_NONDISP_HANDLE(VkDescriptorSet)
+-VK_DEFINE_NONDISP_HANDLE(VkDynamicViewportState)
+-VK_DEFINE_NONDISP_HANDLE(VkDynamicRasterState)
+-VK_DEFINE_NONDISP_HANDLE(VkDynamicColorBlendState)
+-VK_DEFINE_NONDISP_HANDLE(VkDynamicDepthStencilState)
+ VK_DEFINE_NONDISP_HANDLE(VkFramebuffer)
+ VK_DEFINE_NONDISP_HANDLE(VkCmdPool)
+ 
++#define VK_LOD_CLAMP_NONE                 1000.0f
++#define VK_REMAINING_MIP_LEVELS           (~0U)
++#define VK_REMAINING_ARRAY_LAYERS         (~0U)
++#define VK_WHOLE_SIZE                     (~0ULL)
++#define VK_ATTACHMENT_UNUSED              (~0U)
++#define VK_TRUE                           1
++#define VK_FALSE                          0
++#define VK_QUEUE_FAMILY_IGNORED           (~0U)
++#define VK_SUBPASS_EXTERNAL               (~0U)
++#define VK_MAX_PHYSICAL_DEVICE_NAME       256
++#define VK_UUID_LENGTH                    16
++#define VK_MAX_MEMORY_TYPES               32
++#define VK_MAX_MEMORY_HEAPS               16
++#define VK_MAX_EXTENSION_NAME             256
++#define VK_MAX_DESCRIPTION                256
++
+ 
+ typedef enum {
+     VK_SUCCESS = 0,
+@@ -132,41 +145,17 @@ typedef enum {
+     VK_EVENT_SET = 4,
+     VK_EVENT_RESET = 5,
+     VK_INCOMPLETE = 6,
+-    VK_ERROR_UNKNOWN = -1,
+-    VK_ERROR_UNAVAILABLE = -2,
++    VK_ERROR_OUT_OF_HOST_MEMORY = -1,
++    VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,
+     VK_ERROR_INITIALIZATION_FAILED = -3,
+-    VK_ERROR_OUT_OF_HOST_MEMORY = -4,
+-    VK_ERROR_OUT_OF_DEVICE_MEMORY = -5,
+-    VK_ERROR_DEVICE_ALREADY_CREATED = -6,
+-    VK_ERROR_DEVICE_LOST = -7,
+-    VK_ERROR_INVALID_POINTER = -8,
+-    VK_ERROR_INVALID_VALUE = -9,
+-    VK_ERROR_INVALID_HANDLE = -10,
+-    VK_ERROR_INVALID_ORDINAL = -11,
+-    VK_ERROR_INVALID_MEMORY_SIZE = -12,
+-    VK_ERROR_INVALID_EXTENSION = -13,
+-    VK_ERROR_INVALID_FLAGS = -14,
+-    VK_ERROR_INVALID_ALIGNMENT = -15,
+-    VK_ERROR_INVALID_FORMAT = -16,
+-    VK_ERROR_INVALID_IMAGE = -17,
+-    VK_ERROR_INVALID_DESCRIPTOR_SET_DATA = -18,
+-    VK_ERROR_INVALID_QUEUE_TYPE = -19,
+-    VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION = -20,
+-    VK_ERROR_BAD_SHADER_CODE = -21,
+-    VK_ERROR_BAD_PIPELINE_DATA = -22,
+-    VK_ERROR_NOT_MAPPABLE = -23,
+-    VK_ERROR_MEMORY_MAP_FAILED = -24,
+-    VK_ERROR_MEMORY_UNMAP_FAILED = -25,
+-    VK_ERROR_INCOMPATIBLE_DEVICE = -26,
+-    VK_ERROR_INCOMPATIBLE_DRIVER = -27,
+-    VK_ERROR_INCOMPLETE_COMMAND_BUFFER = -28,
+-    VK_ERROR_BUILDING_COMMAND_BUFFER = -29,
+-    VK_ERROR_MEMORY_NOT_BOUND = -30,
+-    VK_ERROR_INCOMPATIBLE_QUEUE = -31,
+-    VK_ERROR_INVALID_LAYER = -32,
+-    VK_RESULT_BEGIN_RANGE = VK_ERROR_INVALID_LAYER,
++    VK_ERROR_DEVICE_LOST = -4,
++    VK_ERROR_MEMORY_MAP_FAILED = -5,
++    VK_ERROR_LAYER_NOT_PRESENT = -6,
++    VK_ERROR_EXTENSION_NOT_PRESENT = -7,
++    VK_ERROR_INCOMPATIBLE_DRIVER = -8,
++    VK_RESULT_BEGIN_RANGE = VK_ERROR_INCOMPATIBLE_DRIVER,
+     VK_RESULT_END_RANGE = VK_INCOMPLETE,
+-    VK_RESULT_NUM = (VK_INCOMPLETE - VK_ERROR_INVALID_LAYER + 1),
++    VK_RESULT_NUM = (VK_INCOMPLETE - VK_ERROR_INCOMPATIBLE_DRIVER + 1),
+     VK_RESULT_MAX_ENUM = 0x7FFFFFFF
+ } VkResult;
+ 
+@@ -175,55 +164,52 @@ typedef enum {
+     VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = 1,
+     VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO = 2,
+     VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 3,
+-    VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO = 4,
+-    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 5,
+-    VK_STRUCTURE_TYPE_SHADER_CREATE_INFO = 6,
+-    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 7,
+-    VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 8,
+-    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 9,
+-    VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO = 10,
+-    VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO = 11,
+-    VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO = 12,
+-    VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO = 13,
+-    VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO = 14,
+-    VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 15,
+-    VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 16,
+-    VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 17,
+-    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 18,
+-    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 19,
+-    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 20,
+-    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 21,
+-    VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 22,
+-    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 23,
+-    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 24,
+-    VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO = 25,
+-    VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 26,
+-    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 27,
+-    VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 28,
+-    VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 29,
+-    VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 30,
+-    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 31,
+-    VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 32,
+-    VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO = 33,
+-    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 34,
+-    VK_STRUCTURE_TYPE_MEMORY_BARRIER = 35,
+-    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 36,
+-    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 37,
+-    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 38,
+-    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 39,
+-    VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 40,
+-    VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 41,
+-    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 42,
+-    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 43,
+-    VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 44,
+-    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION = 45,
+-    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION = 46,
+-    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY = 47,
+-    VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 48,
+-    VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO = 49,
++    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 4,
++    VK_STRUCTURE_TYPE_SHADER_CREATE_INFO = 5,
++    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 6,
++    VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 7,
++    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 8,
++    VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO = 9,
++    VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 10,
++    VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 11,
++    VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 12,
++    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 13,
++    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 14,
++    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 15,
++    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 16,
++    VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 17,
++    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 18,
++    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 19,
++    VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO = 20,
++    VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 21,
++    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 22,
++    VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 23,
++    VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 24,
++    VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 25,
++    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 26,
++    VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 27,
++    VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO = 28,
++    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 29,
++    VK_STRUCTURE_TYPE_MEMORY_BARRIER = 30,
++    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 31,
++    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 32,
++    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 33,
++    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 34,
++    VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 35,
++    VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 36,
++    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 37,
++    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 38,
++    VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 39,
++    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION = 40,
++    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION = 41,
++    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY = 42,
++    VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43,
++    VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO = 44,
++    VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = 45,
++    VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 46,
+     VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO,
+-    VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO,
+-    VK_STRUCTURE_TYPE_NUM = (VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1),
++    VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
++    VK_STRUCTURE_TYPE_NUM = (VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1),
+     VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
+ } VkStructureType;
+ 
+@@ -330,7 +316,7 @@ typedef enum {
+     VK_FORMAT_R11G11B10_UFLOAT = 87,
+     VK_FORMAT_R9G9B9E5_UFLOAT = 88,
+     VK_FORMAT_D16_UNORM = 89,
+-    VK_FORMAT_D24_UNORM = 90,
++    VK_FORMAT_D24_UNORM_X8 = 90,
+     VK_FORMAT_D32_SFLOAT = 91,
+     VK_FORMAT_S8_UINT = 92,
+     VK_FORMAT_D16_UNORM_S8_UINT = 93,
+@@ -481,13 +467,20 @@ typedef enum {
+ } VkSharingMode;
+ 
+ typedef enum {
+-    VK_BUFFER_VIEW_TYPE_RAW = 0,
+-    VK_BUFFER_VIEW_TYPE_FORMATTED = 1,
+-    VK_BUFFER_VIEW_TYPE_BEGIN_RANGE = VK_BUFFER_VIEW_TYPE_RAW,
+-    VK_BUFFER_VIEW_TYPE_END_RANGE = VK_BUFFER_VIEW_TYPE_FORMATTED,
+-    VK_BUFFER_VIEW_TYPE_NUM = (VK_BUFFER_VIEW_TYPE_FORMATTED - VK_BUFFER_VIEW_TYPE_RAW + 1),
+-    VK_BUFFER_VIEW_TYPE_MAX_ENUM = 0x7FFFFFFF
+-} VkBufferViewType;
++    VK_IMAGE_LAYOUT_UNDEFINED = 0,
++    VK_IMAGE_LAYOUT_GENERAL = 1,
++    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,
++    VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,
++    VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,
++    VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,
++    VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL = 6,
++    VK_IMAGE_LAYOUT_TRANSFER_DESTINATION_OPTIMAL = 7,
++    VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
++    VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED,
++    VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_PREINITIALIZED,
++    VK_IMAGE_LAYOUT_NUM = (VK_IMAGE_LAYOUT_PREINITIALIZED - VK_IMAGE_LAYOUT_UNDEFINED + 1),
++    VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF
++} VkImageLayout;
+ 
+ typedef enum {
+     VK_IMAGE_VIEW_TYPE_1D = 0,
+@@ -678,6 +671,22 @@ typedef enum {
+ } VkBlendOp;
+ 
+ typedef enum {
++    VK_DYNAMIC_STATE_VIEWPORT = 0,
++    VK_DYNAMIC_STATE_SCISSOR = 1,
++    VK_DYNAMIC_STATE_LINE_WIDTH = 2,
++    VK_DYNAMIC_STATE_DEPTH_BIAS = 3,
++    VK_DYNAMIC_STATE_BLEND_CONSTANTS = 4,
++    VK_DYNAMIC_STATE_DEPTH_BOUNDS = 5,
++    VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = 6,
++    VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = 7,
++    VK_DYNAMIC_STATE_STENCIL_REFERENCE = 8,
++    VK_DYNAMIC_STATE_BEGIN_RANGE = VK_DYNAMIC_STATE_VIEWPORT,
++    VK_DYNAMIC_STATE_END_RANGE = VK_DYNAMIC_STATE_STENCIL_REFERENCE,
++    VK_DYNAMIC_STATE_NUM = (VK_DYNAMIC_STATE_STENCIL_REFERENCE - VK_DYNAMIC_STATE_VIEWPORT + 1),
++    VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF
++} VkDynamicState;
++
++typedef enum {
+     VK_TEX_FILTER_NEAREST = 0,
+     VK_TEX_FILTER_LINEAR = 1,
+     VK_TEX_FILTER_BEGIN_RANGE = VK_TEX_FILTER_NEAREST,
+@@ -697,16 +706,16 @@ typedef enum {
+ } VkTexMipmapMode;
+ 
+ typedef enum {
+-    VK_TEX_ADDRESS_WRAP = 0,
+-    VK_TEX_ADDRESS_MIRROR = 1,
+-    VK_TEX_ADDRESS_CLAMP = 2,
+-    VK_TEX_ADDRESS_MIRROR_ONCE = 3,
+-    VK_TEX_ADDRESS_CLAMP_BORDER = 4,
+-    VK_TEX_ADDRESS_BEGIN_RANGE = VK_TEX_ADDRESS_WRAP,
+-    VK_TEX_ADDRESS_END_RANGE = VK_TEX_ADDRESS_CLAMP_BORDER,
+-    VK_TEX_ADDRESS_NUM = (VK_TEX_ADDRESS_CLAMP_BORDER - VK_TEX_ADDRESS_WRAP + 1),
++    VK_TEX_ADDRESS_MODE_WRAP = 0,
++    VK_TEX_ADDRESS_MODE_MIRROR = 1,
++    VK_TEX_ADDRESS_MODE_CLAMP = 2,
++    VK_TEX_ADDRESS_MODE_MIRROR_ONCE = 3,
++    VK_TEX_ADDRESS_MODE_CLAMP_BORDER = 4,
++    VK_TEX_ADDRESS_BEGIN_RANGE = VK_TEX_ADDRESS_MODE_WRAP,
++    VK_TEX_ADDRESS_END_RANGE = VK_TEX_ADDRESS_MODE_CLAMP_BORDER,
++    VK_TEX_ADDRESS_NUM = (VK_TEX_ADDRESS_MODE_CLAMP_BORDER - VK_TEX_ADDRESS_MODE_WRAP + 1),
+     VK_TEX_ADDRESS_MAX_ENUM = 0x7FFFFFFF
+-} VkTexAddress;
++} VkTexAddressMode;
+ 
+ typedef enum {
+     VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0,
+@@ -758,21 +767,6 @@ typedef enum {
+ } VkDescriptorSetUsage;
+ 
+ typedef enum {
+-    VK_IMAGE_LAYOUT_UNDEFINED = 0,
+-    VK_IMAGE_LAYOUT_GENERAL = 1,
+-    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,
+-    VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,
+-    VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,
+-    VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,
+-    VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL = 6,
+-    VK_IMAGE_LAYOUT_TRANSFER_DESTINATION_OPTIMAL = 7,
+-    VK_IMAGE_LAYOUT_BEGIN_RANGE = VK_IMAGE_LAYOUT_UNDEFINED,
+-    VK_IMAGE_LAYOUT_END_RANGE = VK_IMAGE_LAYOUT_TRANSFER_DESTINATION_OPTIMAL,
+-    VK_IMAGE_LAYOUT_NUM = (VK_IMAGE_LAYOUT_TRANSFER_DESTINATION_OPTIMAL - VK_IMAGE_LAYOUT_UNDEFINED + 1),
+-    VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF
+-} VkImageLayout;
+-
+-typedef enum {
+     VK_ATTACHMENT_LOAD_OP_LOAD = 0,
+     VK_ATTACHMENT_LOAD_OP_CLEAR = 1,
+     VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2,
+@@ -848,24 +842,44 @@ typedef enum {
+     VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 0x00000080,
+     VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 0x00000100,
+     VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000200,
+-    VK_FORMAT_FEATURE_CONVERSION_BIT = 0x00000400,
++    VK_FORMAT_FEATURE_BLIT_SOURCE_BIT = 0x00000400,
++    VK_FORMAT_FEATURE_BLIT_DESTINATION_BIT = 0x00000800,
+ } VkFormatFeatureFlagBits;
+ typedef VkFlags VkFormatFeatureFlags;
+ 
+ typedef enum {
+-    VK_IMAGE_USAGE_GENERAL = 0,
+     VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT = 0x00000001,
+     VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT = 0x00000002,
+     VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,
+     VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,
+     VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,
+-    VK_IMAGE_USAGE_DEPTH_STENCIL_BIT = 0x00000020,
++    VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
+     VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
+     VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
+ } VkImageUsageFlagBits;
+ typedef VkFlags VkImageUsageFlags;
+ 
+ typedef enum {
++    VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0x00000001,
++    VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
++    VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
++    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008,
++    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010,
++} VkImageCreateFlagBits;
++typedef VkFlags VkImageCreateFlags;
++
++typedef enum {
++    VK_SAMPLE_COUNT_1_BIT = 0x00000001,
++    VK_SAMPLE_COUNT_2_BIT = 0x00000002,
++    VK_SAMPLE_COUNT_4_BIT = 0x00000004,
++    VK_SAMPLE_COUNT_8_BIT = 0x00000008,
++    VK_SAMPLE_COUNT_16_BIT = 0x00000010,
++    VK_SAMPLE_COUNT_32_BIT = 0x00000020,
++    VK_SAMPLE_COUNT_64_BIT = 0x00000040,
++} VkSampleCountFlagBits;
++typedef VkFlags VkSampleCountFlags;
++
++typedef enum {
+     VK_QUEUE_GRAPHICS_BIT = 0x00000001,
+     VK_QUEUE_COMPUTE_BIT = 0x00000002,
+     VK_QUEUE_DMA_BIT = 0x00000004,
+@@ -885,14 +899,9 @@ typedef enum {
+ typedef VkFlags VkMemoryPropertyFlags;
+ 
+ typedef enum {
+-    VK_MEMORY_HEAP_HOST_LOCAL = 0x00000001,
++    VK_MEMORY_HEAP_HOST_LOCAL_BIT = 0x00000001,
+ } VkMemoryHeapFlagBits;
+ typedef VkFlags VkMemoryHeapFlags;
+-
+-typedef enum {
+-    VK_DEVICE_CREATE_VALIDATION_BIT = 0x00000001,
+-} VkDeviceCreateFlagBits;
+-typedef VkFlags VkDeviceCreateFlags;
+ typedef VkFlags VkMemoryMapFlags;
+ 
+ typedef enum {
+@@ -939,7 +948,6 @@ typedef enum {
+ typedef VkFlags VkQueryResultFlags;
+ 
+ typedef enum {
+-    VK_BUFFER_USAGE_GENERAL = 0,
+     VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT = 0x00000001,
+     VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT = 0x00000002,
+     VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004,
+@@ -953,27 +961,25 @@ typedef enum {
+ typedef VkFlags VkBufferUsageFlags;
+ 
+ typedef enum {
+-    VK_BUFFER_CREATE_SPARSE_BIT = 0x00000001,
++    VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0x00000001,
+     VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
+     VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
+ } VkBufferCreateFlagBits;
+ typedef VkFlags VkBufferCreateFlags;
+ 
+ typedef enum {
+-    VK_IMAGE_CREATE_SPARSE_BIT = 0x00000001,
+-    VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
+-    VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
+-    VK_IMAGE_CREATE_INVARIANT_DATA_BIT = 0x00000008,
+-    VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000010,
+-    VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000020,
+-} VkImageCreateFlagBits;
+-typedef VkFlags VkImageCreateFlags;
++    VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,
++    VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,
++    VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,
++    VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,
++} VkImageAspectFlagBits;
++typedef VkFlags VkImageAspectFlags;
+ 
+ typedef enum {
+-    VK_ATTACHMENT_VIEW_CREATE_READ_ONLY_DEPTH_BIT = 0x00000001,
+-    VK_ATTACHMENT_VIEW_CREATE_READ_ONLY_STENCIL_BIT = 0x00000002,
+-} VkAttachmentViewCreateFlagBits;
+-typedef VkFlags VkAttachmentViewCreateFlags;
++    VK_IMAGE_VIEW_CREATE_READ_ONLY_DEPTH_BIT = 0x00000001,
++    VK_IMAGE_VIEW_CREATE_READ_ONLY_STENCIL_BIT = 0x00000002,
++} VkImageViewCreateFlagBits;
++typedef VkFlags VkImageViewCreateFlags;
+ typedef VkFlags VkShaderModuleCreateFlags;
+ typedef VkFlags VkShaderCreateFlags;
+ 
+@@ -1004,6 +1010,11 @@ typedef enum {
+ typedef VkFlags VkShaderStageFlags;
+ 
+ typedef enum {
++    VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001,
++} VkAttachmentDescriptionFlagBits;
++typedef VkFlags VkAttachmentDescriptionFlags;
++
++typedef enum {
+     VK_SUBPASS_DESCRIPTION_NO_OVERDRAW_BIT = 0x00000001,
+ } VkSubpassDescriptionFlagBits;
+ typedef VkFlags VkSubpassDescriptionFlags;
+@@ -1022,10 +1033,9 @@ typedef enum {
+     VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400,
+     VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 0x00000800,
+     VK_PIPELINE_STAGE_TRANSFER_BIT = 0x00001000,
+-    VK_PIPELINE_STAGE_TRANSITION_BIT = 0x00002000,
+-    VK_PIPELINE_STAGE_HOST_BIT = 0x00004000,
++    VK_PIPELINE_STAGE_HOST_BIT = 0x00002000,
+     VK_PIPELINE_STAGE_ALL_GRAPHICS = 0x000007FF,
+-    VK_PIPELINE_STAGE_ALL_GPU_COMMANDS = 0x00003FFF,
++    VK_PIPELINE_STAGE_ALL_GPU_COMMANDS = 0x00001FFF,
+ } VkPipelineStageFlagBits;
+ typedef VkFlags VkPipelineStageFlags;
+ 
+@@ -1059,7 +1069,7 @@ typedef enum {
+ typedef VkFlags VkCmdPoolCreateFlags;
+ 
+ typedef enum {
+-    VK_CMD_POOL_RESET_RELEASE_RESOURCES = 0x00000001,
++    VK_CMD_POOL_RESET_RELEASE_RESOURCES_BIT = 0x00000001,
+ } VkCmdPoolResetFlagBits;
+ typedef VkFlags VkCmdPoolResetFlags;
+ typedef VkFlags VkCmdBufferCreateFlags;
+@@ -1074,33 +1084,22 @@ typedef enum {
+ typedef VkFlags VkCmdBufferOptimizeFlags;
+ 
+ typedef enum {
+-    VK_CMD_BUFFER_RESET_RELEASE_RESOURCES = 0x00000001,
++    VK_CMD_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0x00000001,
+ } VkCmdBufferResetFlagBits;
+ typedef VkFlags VkCmdBufferResetFlags;
+ 
+ typedef enum {
+-    VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,
+-    VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,
+-    VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,
+-    VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,
+-} VkImageAspectFlagBits;
+-typedef VkFlags VkImageAspectFlags;
++    VK_STENCIL_FACE_NONE = 0,
++    VK_STENCIL_FACE_FRONT_BIT = 0x00000001,
++    VK_STENCIL_FACE_BACK_BIT = 0x00000002,
++} VkStencilFaceFlagBits;
++typedef VkFlags VkStencilFaceFlags;
+ 
+ typedef enum {
+     VK_QUERY_CONTROL_CONSERVATIVE_BIT = 0x00000001,
+ } VkQueryControlFlagBits;
+ typedef VkFlags VkQueryControlFlags;
+ 
+-typedef struct {
+-    VkStructureType                             sType;
+-    const void*                                 pNext;
+-    const char*                                 pAppName;
+-    uint32_t                                    appVersion;
+-    const char*                                 pEngineName;
+-    uint32_t                                    engineVersion;
+-    uint32_t                                    apiVersion;
+-} VkApplicationInfo;
+-
+ typedef void* (VKAPI *PFN_vkAllocFunction)(
+     void*                           pUserData,
+     size_t                          size,
+@@ -1111,6 +1110,18 @@ typedef void (VKAPI *PFN_vkFreeFunction)(
+     void*                           pUserData,
+     void*                           pMem);
+ 
++typedef void (VKAPI *PFN_vkVoidFunction)(void);
++
++typedef struct {
++    VkStructureType                             sType;
++    const void*                                 pNext;
++    const char*                                 pAppName;
++    uint32_t                                    appVersion;
++    const char*                                 pEngineName;
++    uint32_t                                    engineVersion;
++    uint32_t                                    apiVersion;
++} VkApplicationInfo;
++
+ typedef struct {
+     void*                                       pUserData;
+     PFN_vkAllocFunction                         pfnAlloc;
+@@ -1138,7 +1149,7 @@ typedef struct {
+     VkBool32                                    sampleRateShading;
+     VkBool32                                    dualSourceBlend;
+     VkBool32                                    logicOp;
+-    VkBool32                                    instancedDrawIndirect;
++    VkBool32                                    multiDrawIndirect;
+     VkBool32                                    depthClip;
+     VkBool32                                    depthBiasClamp;
+     VkBool32                                    fillModeNonSolid;
+@@ -1148,6 +1159,7 @@ typedef struct {
+     VkBool32                                    textureCompressionETC2;
+     VkBool32                                    textureCompressionASTC_LDR;
+     VkBool32                                    textureCompressionBC;
++    VkBool32                                    occlusionQueryNonConservative;
+     VkBool32                                    pipelineStatisticsQuery;
+     VkBool32                                    vertexSideEffects;
+     VkBool32                                    tessellationSideEffects;
+@@ -1155,11 +1167,9 @@ typedef struct {
+     VkBool32                                    fragmentSideEffects;
+     VkBool32                                    shaderTessellationPointSize;
+     VkBool32                                    shaderGeometryPointSize;
+-    VkBool32                                    shaderTextureGatherExtended;
++    VkBool32                                    shaderImageGatherExtended;
+     VkBool32                                    shaderStorageImageExtendedFormats;
+     VkBool32                                    shaderStorageImageMultisample;
+-    VkBool32                                    shaderStorageBufferArrayConstantIndexing;
+-    VkBool32                                    shaderStorageImageArrayConstantIndexing;
+     VkBool32                                    shaderUniformBufferArrayDynamicIndexing;
+     VkBool32                                    shaderSampledImageArrayDynamicIndexing;
+     VkBool32                                    shaderStorageBufferArrayDynamicIndexing;
+@@ -1168,11 +1178,11 @@ typedef struct {
+     VkBool32                                    shaderCullDistance;
+     VkBool32                                    shaderFloat64;
+     VkBool32                                    shaderInt64;
+-    VkBool32                                    shaderFloat16;
+     VkBool32                                    shaderInt16;
+     VkBool32                                    shaderResourceResidency;
+     VkBool32                                    shaderResourceMinLOD;
+-    VkBool32                                    sparse;
++    VkBool32                                    alphaToOne;
++    VkBool32                                    sparseBinding;
+     VkBool32                                    sparseResidencyBuffer;
+     VkBool32                                    sparseResidencyImage2D;
+     VkBool32                                    sparseResidencyImage3D;
+@@ -1180,23 +1190,27 @@ typedef struct {
+     VkBool32                                    sparseResidency4Samples;
+     VkBool32                                    sparseResidency8Samples;
+     VkBool32                                    sparseResidency16Samples;
+-    VkBool32                                    sparseResidencyStandard2DBlockShape;
+-    VkBool32                                    sparseResidencyStandard2DMSBlockShape;
+-    VkBool32                                    sparseResidencyStandard3DBlockShape;
+-    VkBool32                                    sparseResidencyAlignedMipSize;
+-    VkBool32                                    sparseResidencyNonResident;
+-    VkBool32                                    sparseResidencyNonResidentStrict;
+     VkBool32                                    sparseResidencyAliased;
+ } VkPhysicalDeviceFeatures;
+ 
+ typedef struct {
+     VkFormatFeatureFlags                        linearTilingFeatures;
+     VkFormatFeatureFlags                        optimalTilingFeatures;
++    VkFormatFeatureFlags                        bufferFeatures;
+ } VkFormatProperties;
+ 
+ typedef struct {
+-    uint64_t                                    maxResourceSize;
+-    uint32_t                                    maxSamples;
++    int32_t                                     width;
++    int32_t                                     height;
++    int32_t                                     depth;
++} VkExtent3D;
++
++typedef struct {
++    VkExtent3D                                  maxExtent;
++    uint32_t                                    maxMipLevels;
++    uint32_t                                    maxArraySize;
++    VkSampleCountFlags                          sampleCounts;
++    VkDeviceSize                                maxResourceSize;
+ } VkImageFormatProperties;
+ 
+ typedef struct {
+@@ -1205,12 +1219,14 @@ typedef struct {
+     uint32_t                                    maxImageDimension3D;
+     uint32_t                                    maxImageDimensionCube;
+     uint32_t                                    maxImageArrayLayers;
++    VkSampleCountFlags                          sampleCounts;
+     uint32_t                                    maxTexelBufferSize;
+     uint32_t                                    maxUniformBufferSize;
+     uint32_t                                    maxStorageBufferSize;
+     uint32_t                                    maxPushConstantsSize;
+     uint32_t                                    maxMemoryAllocationCount;
+     VkDeviceSize                                bufferImageGranularity;
++    VkDeviceSize                                sparseAddressSpaceSize;
+     uint32_t                                    maxBoundDescriptorSets;
+     uint32_t                                    maxDescriptorSets;
+     uint32_t                                    maxPerStageDescriptorSamplers;
+@@ -1220,10 +1236,13 @@ typedef struct {
+     uint32_t                                    maxPerStageDescriptorStorageImages;
+     uint32_t                                    maxDescriptorSetSamplers;
+     uint32_t                                    maxDescriptorSetUniformBuffers;
++    uint32_t                                    maxDescriptorSetUniformBuffersDynamic;
+     uint32_t                                    maxDescriptorSetStorageBuffers;
++    uint32_t                                    maxDescriptorSetStorageBuffersDynamic;
+     uint32_t                                    maxDescriptorSetSampledImages;
+     uint32_t                                    maxDescriptorSetStorageImages;
+     uint32_t                                    maxVertexInputAttributes;
++    uint32_t                                    maxVertexInputBindings;
+     uint32_t                                    maxVertexInputAttributeOffset;
+     uint32_t                                    maxVertexInputBindingStride;
+     uint32_t                                    maxVertexOutputComponents;
+@@ -1257,7 +1276,6 @@ typedef struct {
+     float                                       maxSamplerLodBias;
+     float                                       maxSamplerAnisotropy;
+     uint32_t                                    maxViewports;
+-    uint32_t                                    maxDynamicViewportStates;
+     uint32_t                                    maxViewportDimensions[2];
+     float                                       viewportBoundsRange[2];
+     uint32_t                                    viewportSubPixelBits;
+@@ -1295,6 +1313,15 @@ typedef struct {
+ } VkPhysicalDeviceLimits;
+ 
+ typedef struct {
++    VkBool32                                    residencyStandard2DBlockShape;
++    VkBool32                                    residencyStandard2DMSBlockShape;
++    VkBool32                                    residencyStandard3DBlockShape;
++    VkBool32                                    residencyAlignedMipSize;
++    VkBool32                                    residencyNonResident;
++    VkBool32                                    residencyNonResidentStrict;
++} VkPhysicalDeviceSparseProperties;
++
++typedef struct {
+     uint32_t                                    apiVersion;
+     uint32_t                                    driverVersion;
+     uint32_t                                    vendorId;
+@@ -1302,13 +1329,15 @@ typedef struct {
+     VkPhysicalDeviceType                        deviceType;
+     char                                        deviceName[VK_MAX_PHYSICAL_DEVICE_NAME];
+     uint8_t                                     pipelineCacheUUID[VK_UUID_LENGTH];
++    VkPhysicalDeviceLimits                      limits;
++    VkPhysicalDeviceSparseProperties            sparseProperties;
+ } VkPhysicalDeviceProperties;
+ 
+ typedef struct {
+     VkQueueFlags                                queueFlags;
+     uint32_t                                    queueCount;
+     VkBool32                                    supportsTimestamps;
+-} VkPhysicalDeviceQueueProperties;
++} VkQueueFamilyProperties;
+ 
+ typedef struct {
+     VkMemoryPropertyFlags                       propertyFlags;
+@@ -1327,8 +1356,9 @@ typedef struct {
+     VkMemoryHeap                                memoryHeaps[VK_MAX_MEMORY_HEAPS];
+ } VkPhysicalDeviceMemoryProperties;
+ 
+-typedef void (VKAPI *PFN_vkVoidFunction)(void);
+ typedef struct {
++    VkStructureType                             sType;
++    const void*                                 pNext;
+     uint32_t                                    queueFamilyIndex;
+     uint32_t                                    queueCount;
+ } VkDeviceQueueCreateInfo;
+@@ -1343,7 +1373,6 @@ typedef struct {
+     uint32_t                                    extensionCount;
+     const char*const*                           ppEnabledExtensionNames;
+     const VkPhysicalDeviceFeatures*             pEnabledFeatures;
+-    VkDeviceCreateFlags                         flags;
+ } VkDeviceCreateInfo;
+ 
+ typedef struct {
+@@ -1380,12 +1409,6 @@ typedef struct {
+ } VkMemoryRequirements;
+ 
+ typedef struct {
+-    int32_t                                     width;
+-    int32_t                                     height;
+-    int32_t                                     depth;
+-} VkExtent3D;
+-
+-typedef struct {
+     VkImageAspect                               aspect;
+     VkExtent3D                                  imageGranularity;
+     VkSparseImageFormatFlags                    flags;
+@@ -1410,7 +1433,7 @@ typedef struct {
+ typedef struct {
+     VkImageAspect                               aspect;
+     uint32_t                                    mipLevel;
+-    uint32_t                                    arraySlice;
++    uint32_t                                    arrayLayer;
+ } VkImageSubresource;
+ 
+ typedef struct {
+@@ -1469,7 +1492,6 @@ typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
+     VkBuffer                                    buffer;
+-    VkBufferViewType                            viewType;
+     VkFormat                                    format;
+     VkDeviceSize                                offset;
+     VkDeviceSize                                range;
+@@ -1490,6 +1512,7 @@ typedef struct {
+     VkSharingMode                               sharingMode;
+     uint32_t                                    queueFamilyCount;
+     const uint32_t*                             pQueueFamilyIndices;
++    VkImageLayout                               initialLayout;
+ } VkImageCreateInfo;
+ 
+ typedef struct {
+@@ -1507,10 +1530,10 @@ typedef struct {
+ } VkChannelMapping;
+ 
+ typedef struct {
+-    VkImageAspect                               aspect;
++    VkImageAspectFlags                          aspectMask;
+     uint32_t                                    baseMipLevel;
+     uint32_t                                    mipLevels;
+-    uint32_t                                    baseArraySlice;
++    uint32_t                                    baseArrayLayer;
+     uint32_t                                    arraySize;
+ } VkImageSubresourceRange;
+ 
+@@ -1522,22 +1545,12 @@ typedef struct {
+     VkFormat                                    format;
+     VkChannelMapping                            channels;
+     VkImageSubresourceRange                     subresourceRange;
++    VkImageViewCreateFlags                      flags;
+ } VkImageViewCreateInfo;
+ 
+ typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
+-    VkImage                                     image;
+-    VkFormat                                    format;
+-    uint32_t                                    mipLevel;
+-    uint32_t                                    baseArraySlice;
+-    uint32_t                                    arraySize;
+-    VkAttachmentViewCreateFlags                 flags;
+-} VkAttachmentViewCreateInfo;
+-
+-typedef struct {
+-    VkStructureType                             sType;
+-    const void*                                 pNext;
+     size_t                                      codeSize;
+     const void*                                 pCode;
+     VkShaderModuleCreateFlags                   flags;
+@@ -1549,6 +1562,7 @@ typedef struct {
+     VkShaderModule                              module;
+     const char*                                 pName;
+     VkShaderCreateFlags                         flags;
++    VkShaderStage                               stage;
+ } VkShaderCreateInfo;
+ 
+ typedef struct {
+@@ -1616,9 +1630,36 @@ typedef struct {
+ } VkPipelineTessellationStateCreateInfo;
+ 
+ typedef struct {
++    float                                       originX;
++    float                                       originY;
++    float                                       width;
++    float                                       height;
++    float                                       minDepth;
++    float                                       maxDepth;
++} VkViewport;
++
++typedef struct {
++    int32_t                                     x;
++    int32_t                                     y;
++} VkOffset2D;
++
++typedef struct {
++    int32_t                                     width;
++    int32_t                                     height;
++} VkExtent2D;
++
++typedef struct {
++    VkOffset2D                                  offset;
++    VkExtent2D                                  extent;
++} VkRect2D;
++
++typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
+     uint32_t                                    viewportCount;
++    const VkViewport*                           pViewports;
++    uint32_t                                    scissorCount;
++    const VkRect2D*                             pScissors;
+ } VkPipelineViewportStateCreateInfo;
+ 
+ typedef struct {
+@@ -1629,6 +1670,11 @@ typedef struct {
+     VkFillMode                                  fillMode;
+     VkCullMode                                  cullMode;
+     VkFrontFace                                 frontFace;
++    VkBool32                                    depthBiasEnable;
++    float                                       depthBias;
++    float                                       depthBiasClamp;
++    float                                       slopeScaledDepthBias;
++    float                                       lineWidth;
+ } VkPipelineRasterStateCreateInfo;
+ 
+ typedef struct {
+@@ -1637,7 +1683,7 @@ typedef struct {
+     uint32_t                                    rasterSamples;
+     VkBool32                                    sampleShadingEnable;
+     float                                       minSampleShading;
+-    VkSampleMask                                sampleMask;
++    const VkSampleMask*                         pSampleMask;
+ } VkPipelineMultisampleStateCreateInfo;
+ 
+ typedef struct {
+@@ -1645,6 +1691,9 @@ typedef struct {
+     VkStencilOp                                 stencilPassOp;
+     VkStencilOp                                 stencilDepthFailOp;
+     VkCompareOp                                 stencilCompareOp;
++    uint32_t                                    stencilCompareMask;
++    uint32_t                                    stencilWriteMask;
++    uint32_t                                    stencilReference;
+ } VkStencilOpState;
+ 
+ typedef struct {
+@@ -1653,10 +1702,12 @@ typedef struct {
+     VkBool32                                    depthTestEnable;
+     VkBool32                                    depthWriteEnable;
+     VkCompareOp                                 depthCompareOp;
+-    VkBool32                                    depthBoundsEnable;
++    VkBool32                                    depthBoundsTestEnable;
+     VkBool32                                    stencilTestEnable;
+     VkStencilOpState                            front;
+     VkStencilOpState                            back;
++    float                                       minDepthBounds;
++    float                                       maxDepthBounds;
+ } VkPipelineDepthStencilStateCreateInfo;
+ 
+ typedef struct {
+@@ -1674,15 +1725,24 @@ typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
+     VkBool32                                    alphaToCoverageEnable;
++    VkBool32                                    alphaToOneEnable;
+     VkBool32                                    logicOpEnable;
+     VkLogicOp                                   logicOp;
+     uint32_t                                    attachmentCount;
+     const VkPipelineColorBlendAttachmentState*  pAttachments;
++    float                                       blendConst[4];
+ } VkPipelineColorBlendStateCreateInfo;
+ 
+ typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
++    uint32_t                                    dynamicStateCount;
++    const VkDynamicState*                       pDynamicStates;
++} VkPipelineDynamicStateCreateInfo;
++
++typedef struct {
++    VkStructureType                             sType;
++    const void*                                 pNext;
+     uint32_t                                    stageCount;
+     const VkPipelineShaderStageCreateInfo*      pStages;
+     const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
+@@ -1693,6 +1753,7 @@ typedef struct {
+     const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
+     const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
+     const VkPipelineColorBlendStateCreateInfo*  pColorBlendState;
++    const VkPipelineDynamicStateCreateInfo*     pDynamicState;
+     VkPipelineCreateFlags                       flags;
+     VkPipelineLayout                            layout;
+     VkRenderPass                                renderPass;
+@@ -1704,7 +1765,7 @@ typedef struct {
+ typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
+-    VkPipelineShaderStageCreateInfo             cs;
++    VkPipelineShaderStageCreateInfo             stage;
+     VkPipelineCreateFlags                       flags;
+     VkPipelineLayout                            layout;
+     VkPipeline                                  basePipelineHandle;
+@@ -1732,9 +1793,9 @@ typedef struct {
+     VkTexFilter                                 magFilter;
+     VkTexFilter                                 minFilter;
+     VkTexMipmapMode                             mipMode;
+-    VkTexAddress                                addressU;
+-    VkTexAddress                                addressV;
+-    VkTexAddress                                addressW;
++    VkTexAddressMode                            addressModeU;
++    VkTexAddressMode                            addressModeV;
++    VkTexAddressMode                            addressModeW;
+     float                                       mipLodBias;
+     float                                       maxAnisotropy;
+     VkBool32                                    compareEnable;
+@@ -1742,6 +1803,7 @@ typedef struct {
+     float                                       minLod;
+     float                                       maxLod;
+     VkBorderColor                               borderColor;
++    VkBool32                                    unnormalizedCoordinates;
+ } VkSamplerCreateInfo;
+ 
+ typedef struct {
+@@ -1766,16 +1828,24 @@ typedef struct {
+ typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
++    VkDescriptorPoolUsage                       poolUsage;
++    uint32_t                                    maxSets;
+     uint32_t                                    count;
+     const VkDescriptorTypeCount*                pTypeCount;
+ } VkDescriptorPoolCreateInfo;
+ 
+ typedef struct {
++    VkBuffer                                    buffer;
++    VkDeviceSize                                offset;
++    VkDeviceSize                                range;
++} VkDescriptorBufferInfo;
++
++typedef struct {
+     VkBufferView                                bufferView;
+     VkSampler                                   sampler;
+     VkImageView                                 imageView;
+-    VkAttachmentView                            attachmentView;
+     VkImageLayout                               imageLayout;
++    VkDescriptorBufferInfo                      bufferInfo;
+ } VkDescriptorInfo;
+ 
+ typedef struct {
+@@ -1802,74 +1872,11 @@ typedef struct {
+ } VkCopyDescriptorSet;
+ 
+ typedef struct {
+-    float                                       originX;
+-    float                                       originY;
+-    float                                       width;
+-    float                                       height;
+-    float                                       minDepth;
+-    float                                       maxDepth;
+-} VkViewport;
+-
+-typedef struct {
+-    int32_t                                     x;
+-    int32_t                                     y;
+-} VkOffset2D;
+-
+-typedef struct {
+-    int32_t                                     width;
+-    int32_t                                     height;
+-} VkExtent2D;
+-
+-typedef struct {
+-    VkOffset2D                                  offset;
+-    VkExtent2D                                  extent;
+-} VkRect2D;
+-
+-typedef struct {
+-    VkStructureType                             sType;
+-    const void*                                 pNext;
+-    uint32_t                                    viewportAndScissorCount;
+-    const VkViewport*                           pViewports;
+-    const VkRect2D*                             pScissors;
+-} VkDynamicViewportStateCreateInfo;
+-
+-typedef struct {
+-    VkStructureType                             sType;
+-    const void*                                 pNext;
+-    float                                       depthBias;
+-    float                                       depthBiasClamp;
+-    float                                       slopeScaledDepthBias;
+-    float                                       lineWidth;
+-} VkDynamicRasterStateCreateInfo;
+-
+-typedef struct {
+-    VkStructureType                             sType;
+-    const void*                                 pNext;
+-    float                                       blendConst[4];
+-} VkDynamicColorBlendStateCreateInfo;
+-
+-typedef struct {
+-    VkStructureType                             sType;
+-    const void*                                 pNext;
+-    float                                       minDepthBounds;
+-    float                                       maxDepthBounds;
+-    uint32_t                                    stencilReadMask;
+-    uint32_t                                    stencilWriteMask;
+-    uint32_t                                    stencilFrontRef;
+-    uint32_t                                    stencilBackRef;
+-} VkDynamicDepthStencilStateCreateInfo;
+-
+-typedef struct {
+-    VkAttachmentView                            view;
+-    VkImageLayout                               layout;
+-} VkAttachmentBindInfo;
+-
+-typedef struct {
+     VkStructureType                             sType;
+     const void*                                 pNext;
+     VkRenderPass                                renderPass;
+     uint32_t                                    attachmentCount;
+-    const VkAttachmentBindInfo*                 pAttachments;
++    const VkImageView*                          pAttachments;
+     uint32_t                                    width;
+     uint32_t                                    height;
+     uint32_t                                    layers;
+@@ -1886,6 +1893,7 @@ typedef struct {
+     VkAttachmentStoreOp                         stencilStoreOp;
+     VkImageLayout                               initialLayout;
+     VkImageLayout                               finalLayout;
++    VkAttachmentDescriptionFlags                flags;
+ } VkAttachmentDescription;
+ 
+ typedef struct {
+@@ -1899,13 +1907,13 @@ typedef struct {
+     VkPipelineBindPoint                         pipelineBindPoint;
+     VkSubpassDescriptionFlags                   flags;
+     uint32_t                                    inputCount;
+-    const VkAttachmentReference*                inputAttachments;
++    const VkAttachmentReference*                pInputAttachments;
+     uint32_t                                    colorCount;
+-    const VkAttachmentReference*                colorAttachments;
+-    const VkAttachmentReference*                resolveAttachments;
++    const VkAttachmentReference*                pColorAttachments;
++    const VkAttachmentReference*                pResolveAttachments;
+     VkAttachmentReference                       depthStencilAttachment;
+     uint32_t                                    preserveCount;
+-    const VkAttachmentReference*                preserveAttachments;
++    const VkAttachmentReference*                pPreserveAttachments;
+ } VkSubpassDescription;
+ 
+ typedef struct {
+@@ -1951,6 +1959,7 @@ typedef struct {
+     const void*                                 pNext;
+     VkCmdBufferOptimizeFlags                    flags;
+     VkRenderPass                                renderPass;
++    uint32_t                                    subpass;
+     VkFramebuffer                               framebuffer;
+ } VkCmdBufferBeginInfo;
+ 
+@@ -1961,18 +1970,25 @@ typedef struct {
+ } VkBufferCopy;
+ 
+ typedef struct {
+-    VkImageSubresource                          srcSubresource;
++    VkImageAspect                               aspect;
++    uint32_t                                    mipLevel;
++    uint32_t                                    arrayLayer;
++    uint32_t                                    arraySize;
++} VkImageSubresourceCopy;
++
++typedef struct {
++    VkImageSubresourceCopy                      srcSubresource;
+     VkOffset3D                                  srcOffset;
+-    VkImageSubresource                          destSubresource;
++    VkImageSubresourceCopy                      destSubresource;
+     VkOffset3D                                  destOffset;
+     VkExtent3D                                  extent;
+ } VkImageCopy;
+ 
+ typedef struct {
+-    VkImageSubresource                          srcSubresource;
++    VkImageSubresourceCopy                      srcSubresource;
+     VkOffset3D                                  srcOffset;
+     VkExtent3D                                  srcExtent;
+-    VkImageSubresource                          destSubresource;
++    VkImageSubresourceCopy                      destSubresource;
+     VkOffset3D                                  destOffset;
+     VkExtent3D                                  destExtent;
+ } VkImageBlit;
+@@ -1981,38 +1997,38 @@ typedef struct {
+     VkDeviceSize                                bufferOffset;
+     uint32_t                                    bufferRowLength;
+     uint32_t                                    bufferImageHeight;
+-    VkImageSubresource                          imageSubresource;
++    VkImageSubresourceCopy                      imageSubresource;
+     VkOffset3D                                  imageOffset;
+     VkExtent3D                                  imageExtent;
+ } VkBufferImageCopy;
+ 
+ typedef union {
+-    float                                       f32[4];
+-    int32_t                                     s32[4];
+-    uint32_t                                    u32[4];
++    float                                       float32[4];
++    int32_t                                     int32[4];
++    uint32_t                                    uint32[4];
+ } VkClearColorValue;
+ 
+ typedef struct {
++    float                                       depth;
++    uint32_t                                    stencil;
++} VkClearDepthStencilValue;
++
++typedef struct {
+     VkOffset3D                                  offset;
+     VkExtent3D                                  extent;
+ } VkRect3D;
+ 
+ typedef struct {
+-    VkImageSubresource                          srcSubresource;
++    VkImageSubresourceCopy                      srcSubresource;
+     VkOffset3D                                  srcOffset;
+-    VkImageSubresource                          destSubresource;
++    VkImageSubresourceCopy                      destSubresource;
+     VkOffset3D                                  destOffset;
+     VkExtent3D                                  extent;
+ } VkImageResolve;
+ 
+-typedef struct {
+-    float                                       depth;
+-    uint32_t                                    stencil;
+-} VkClearDepthStencilValue;
+-
+ typedef union {
+     VkClearColorValue                           color;
+-    VkClearDepthStencilValue                    ds;
++    VkClearDepthStencilValue                    depthStencil;
+ } VkClearValue;
+ 
+ typedef struct {
+@@ -2021,8 +2037,8 @@ typedef struct {
+     VkRenderPass                                renderPass;
+     VkFramebuffer                               framebuffer;
+     VkRect2D                                    renderArea;
+-    uint32_t                                    attachmentCount;
+-    const VkClearValue*                         pAttachmentClearValues;
++    uint32_t                                    clearValueCount;
++    const VkClearValue*                         pClearValues;
+ } VkRenderPassBeginInfo;
+ 
+ typedef struct {
+@@ -2080,32 +2096,30 @@ typedef struct {
+ 
+ 
+ typedef VkResult (VKAPI *PFN_vkCreateInstance)(const VkInstanceCreateInfo* pCreateInfo, VkInstance* pInstance);
+-typedef VkResult (VKAPI *PFN_vkDestroyInstance)(VkInstance instance);
++typedef void (VKAPI *PFN_vkDestroyInstance)(VkInstance instance);
+ typedef VkResult (VKAPI *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);
+ typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures);
+ typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties);
+-typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageFormatProperties* pImageFormatProperties);
+-typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceLimits)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceLimits* pLimits);
++typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties);
+ typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties);
+-typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceQueueCount)(VkPhysicalDevice physicalDevice, uint32_t* pCount);
+-typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceQueueProperties)(VkPhysicalDevice physicalDevice, uint32_t count, VkPhysicalDeviceQueueProperties* pQueueProperties);
++typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceQueueFamilyProperties)(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkQueueFamilyProperties* pQueueFamilyProperties);
+ typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceMemoryProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties);
+ typedef PFN_vkVoidFunction (VKAPI *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char* pName);
+ typedef PFN_vkVoidFunction (VKAPI *PFN_vkGetDeviceProcAddr)(VkDevice device, const char* pName);
+ typedef VkResult (VKAPI *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice);
+-typedef VkResult (VKAPI *PFN_vkDestroyDevice)(VkDevice device);
+-typedef VkResult (VKAPI *PFN_vkGetGlobalExtensionProperties)(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
+-typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceExtensionProperties)(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
+-typedef VkResult (VKAPI *PFN_vkGetGlobalLayerProperties)(uint32_t* pCount, VkLayerProperties* pProperties);
+-typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceLayerProperties)(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties);
++typedef void (VKAPI *PFN_vkDestroyDevice)(VkDevice device);
++typedef VkResult (VKAPI *PFN_vkEnumerateInstanceExtensionProperties)(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
++typedef VkResult (VKAPI *PFN_vkEnumerateDeviceExtensionProperties)(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
++typedef VkResult (VKAPI *PFN_vkEnumerateInstanceLayerProperties)(uint32_t* pCount, VkLayerProperties* pProperties);
++typedef VkResult (VKAPI *PFN_vkEnumerateDeviceLayerProperties)(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties);
+ typedef VkResult (VKAPI *PFN_vkGetDeviceQueue)(VkDevice device, uint32_t queueFamilyIndex, 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);
+ typedef VkResult (VKAPI *PFN_vkDeviceWaitIdle)(VkDevice device);
+ typedef VkResult (VKAPI *PFN_vkAllocMemory)(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkDeviceMemory* pMem);
+-typedef VkResult (VKAPI *PFN_vkFreeMemory)(VkDevice device, VkDeviceMemory mem);
++typedef void (VKAPI *PFN_vkFreeMemory)(VkDevice device, VkDeviceMemory mem);
+ typedef VkResult (VKAPI *PFN_vkMapMemory)(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData);
+-typedef VkResult (VKAPI *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory mem);
++typedef void (VKAPI *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory mem);
+ typedef VkResult (VKAPI *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges);
+ typedef VkResult (VKAPI *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges);
+ typedef VkResult (VKAPI *PFN_vkGetDeviceMemoryCommitment)(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes);
+@@ -2119,88 +2133,83 @@ typedef VkResult (VKAPI *PFN_vkQueueBindSparseBufferMemory)(VkQueue queue, VkBuf
+ typedef VkResult (VKAPI *PFN_vkQueueBindSparseImageOpaqueMemory)(VkQueue queue, VkImage image, uint32_t numBindings, const VkSparseMemoryBindInfo* pBindInfo);
+ typedef VkResult (VKAPI *PFN_vkQueueBindSparseImageMemory)(VkQueue queue, VkImage image, uint32_t numBindings, const VkSparseImageMemoryBindInfo* pBindInfo);
+ typedef VkResult (VKAPI *PFN_vkCreateFence)(VkDevice device, const VkFenceCreateInfo* pCreateInfo, VkFence* pFence);
+-typedef VkResult (VKAPI *PFN_vkDestroyFence)(VkDevice device, VkFence fence);
++typedef void (VKAPI *PFN_vkDestroyFence)(VkDevice device, VkFence fence);
+ typedef VkResult (VKAPI *PFN_vkResetFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences);
+ typedef VkResult (VKAPI *PFN_vkGetFenceStatus)(VkDevice device, VkFence fence);
+ typedef VkResult (VKAPI *PFN_vkWaitForFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout);
+ typedef VkResult (VKAPI *PFN_vkCreateSemaphore)(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, VkSemaphore* pSemaphore);
+-typedef VkResult (VKAPI *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore);
++typedef void (VKAPI *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore);
+ typedef VkResult (VKAPI *PFN_vkQueueSignalSemaphore)(VkQueue queue, VkSemaphore semaphore);
+ typedef VkResult (VKAPI *PFN_vkQueueWaitSemaphore)(VkQueue queue, VkSemaphore semaphore);
+ typedef VkResult (VKAPI *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo* pCreateInfo, VkEvent* pEvent);
+-typedef VkResult (VKAPI *PFN_vkDestroyEvent)(VkDevice device, VkEvent event);
++typedef void (VKAPI *PFN_vkDestroyEvent)(VkDevice device, VkEvent event);
+ typedef VkResult (VKAPI *PFN_vkGetEventStatus)(VkDevice device, VkEvent event);
+ typedef VkResult (VKAPI *PFN_vkSetEvent)(VkDevice device, VkEvent event);
+ typedef VkResult (VKAPI *PFN_vkResetEvent)(VkDevice device, VkEvent event);
+ typedef VkResult (VKAPI *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool);
+-typedef VkResult (VKAPI *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool);
++typedef void (VKAPI *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool);
+ typedef VkResult (VKAPI *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags);
+ typedef VkResult (VKAPI *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer);
+-typedef VkResult (VKAPI *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer);
++typedef void (VKAPI *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer);
+ typedef VkResult (VKAPI *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView);
+-typedef VkResult (VKAPI *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView);
++typedef void (VKAPI *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView);
+ typedef VkResult (VKAPI *PFN_vkCreateImage)(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkImage* pImage);
+-typedef VkResult (VKAPI *PFN_vkDestroyImage)(VkDevice device, VkImage image);
++typedef void (VKAPI *PFN_vkDestroyImage)(VkDevice device, VkImage image);
+ typedef VkResult (VKAPI *PFN_vkGetImageSubresourceLayout)(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout);
+ typedef VkResult (VKAPI *PFN_vkCreateImageView)(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView);
+-typedef VkResult (VKAPI *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView);
+-typedef VkResult (VKAPI *PFN_vkCreateAttachmentView)(VkDevice device, const VkAttachmentViewCreateInfo* pCreateInfo, VkAttachmentView* pView);
+-typedef VkResult (VKAPI *PFN_vkDestroyAttachmentView)(VkDevice device, VkAttachmentView attachmentView);
++typedef void (VKAPI *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView);
+ typedef VkResult (VKAPI *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, VkShaderModule* pShaderModule);
+-typedef VkResult (VKAPI *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule);
++typedef void (VKAPI *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule);
+ typedef VkResult (VKAPI *PFN_vkCreateShader)(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader);
+-typedef VkResult (VKAPI *PFN_vkDestroyShader)(VkDevice device, VkShader shader);
++typedef void (VKAPI *PFN_vkDestroyShader)(VkDevice device, VkShader shader);
+ typedef VkResult (VKAPI *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, VkPipelineCache* pPipelineCache);
+-typedef VkResult (VKAPI *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache);
++typedef void (VKAPI *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache);
+ typedef size_t (VKAPI *PFN_vkGetPipelineCacheSize)(VkDevice device, VkPipelineCache pipelineCache);
+ typedef VkResult (VKAPI *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, void* pData);
+ typedef VkResult (VKAPI *PFN_vkMergePipelineCaches)(VkDevice device, VkPipelineCache destCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches);
+ typedef VkResult (VKAPI *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkGraphicsPipelineCreateInfo* pCreateInfos, VkPipeline* pPipelines);
+ typedef VkResult (VKAPI *PFN_vkCreateComputePipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t count, const VkComputePipelineCreateInfo* pCreateInfos, VkPipeline* pPipelines);
+-typedef VkResult (VKAPI *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline);
++typedef void (VKAPI *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline);
+ typedef VkResult (VKAPI *PFN_vkCreatePipelineLayout)(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, VkPipelineLayout* pPipelineLayout);
+-typedef VkResult (VKAPI *PFN_vkDestroyPipelineLayout)(VkDevice device, VkPipelineLayout pipelineLayout);
++typedef void (VKAPI *PFN_vkDestroyPipelineLayout)(VkDevice device, VkPipelineLayout pipelineLayout);
+ typedef VkResult (VKAPI *PFN_vkCreateSampler)(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, VkSampler* pSampler);
+-typedef VkResult (VKAPI *PFN_vkDestroySampler)(VkDevice device, VkSampler sampler);
++typedef void (VKAPI *PFN_vkDestroySampler)(VkDevice device, VkSampler sampler);
+ typedef VkResult (VKAPI *PFN_vkCreateDescriptorSetLayout)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout);
+-typedef VkResult (VKAPI *PFN_vkDestroyDescriptorSetLayout)(VkDevice device, VkDescriptorSetLayout descriptorSetLayout);
+-typedef VkResult (VKAPI *PFN_vkCreateDescriptorPool)(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool);
+-typedef VkResult (VKAPI *PFN_vkDestroyDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool);
++typedef void (VKAPI *PFN_vkDestroyDescriptorSetLayout)(VkDevice device, VkDescriptorSetLayout descriptorSetLayout);
++typedef VkResult (VKAPI *PFN_vkCreateDescriptorPool)(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool);
++typedef void (VKAPI *PFN_vkDestroyDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool);
+ typedef VkResult (VKAPI *PFN_vkResetDescriptorPool)(VkDevice device, VkDescriptorPool descriptorPool);
+-typedef VkResult (VKAPI *PFN_vkAllocDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount);
++typedef VkResult (VKAPI *PFN_vkAllocDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets);
+ typedef VkResult (VKAPI *PFN_vkFreeDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets);
+-typedef VkResult (VKAPI *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies);
+-typedef VkResult (VKAPI *PFN_vkCreateDynamicViewportState)(VkDevice device, const VkDynamicViewportStateCreateInfo* pCreateInfo, VkDynamicViewportState* pState);
+-typedef VkResult (VKAPI *PFN_vkDestroyDynamicViewportState)(VkDevice device, VkDynamicViewportState dynamicViewportState);
+-typedef VkResult (VKAPI *PFN_vkCreateDynamicRasterState)(VkDevice device, const VkDynamicRasterStateCreateInfo* pCreateInfo, VkDynamicRasterState* pState);
+-typedef VkResult (VKAPI *PFN_vkDestroyDynamicRasterState)(VkDevice device, VkDynamicRasterState dynamicRasterState);
+-typedef VkResult (VKAPI *PFN_vkCreateDynamicColorBlendState)(VkDevice device, const VkDynamicColorBlendStateCreateInfo* pCreateInfo, VkDynamicColorBlendState* pState);
+-typedef VkResult (VKAPI *PFN_vkDestroyDynamicColorBlendState)(VkDevice device, VkDynamicColorBlendState dynamicColorBlendState);
+-typedef VkResult (VKAPI *PFN_vkCreateDynamicDepthStencilState)(VkDevice device, const VkDynamicDepthStencilStateCreateInfo* pCreateInfo, VkDynamicDepthStencilState* pState);
+-typedef VkResult (VKAPI *PFN_vkDestroyDynamicDepthStencilState)(VkDevice device, VkDynamicDepthStencilState dynamicDepthStencilState);
++typedef void (VKAPI *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies);
+ typedef VkResult (VKAPI *PFN_vkCreateFramebuffer)(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer);
+-typedef VkResult (VKAPI *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer);
++typedef void (VKAPI *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer);
+ typedef VkResult (VKAPI *PFN_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass);
+-typedef VkResult (VKAPI *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass);
++typedef void (VKAPI *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass);
+ typedef VkResult (VKAPI *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity);
+ typedef VkResult (VKAPI *PFN_vkCreateCommandPool)(VkDevice device, const VkCmdPoolCreateInfo* pCreateInfo, VkCmdPool* pCmdPool);
+-typedef VkResult (VKAPI *PFN_vkDestroyCommandPool)(VkDevice device, VkCmdPool cmdPool);
++typedef void (VKAPI *PFN_vkDestroyCommandPool)(VkDevice device, VkCmdPool cmdPool);
+ typedef VkResult (VKAPI *PFN_vkResetCommandPool)(VkDevice device, VkCmdPool cmdPool, VkCmdPoolResetFlags flags);
+ typedef VkResult (VKAPI *PFN_vkCreateCommandBuffer)(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer);
+-typedef VkResult (VKAPI *PFN_vkDestroyCommandBuffer)(VkDevice device, VkCmdBuffer commandBuffer);
++typedef void (VKAPI *PFN_vkDestroyCommandBuffer)(VkDevice device, VkCmdBuffer commandBuffer);
+ typedef VkResult (VKAPI *PFN_vkBeginCommandBuffer)(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo);
+ typedef VkResult (VKAPI *PFN_vkEndCommandBuffer)(VkCmdBuffer cmdBuffer);
+ typedef VkResult (VKAPI *PFN_vkResetCommandBuffer)(VkCmdBuffer cmdBuffer, VkCmdBufferResetFlags flags);
+ typedef void (VKAPI *PFN_vkCmdBindPipeline)(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
+-typedef void (VKAPI *PFN_vkCmdBindDynamicViewportState)(VkCmdBuffer cmdBuffer, VkDynamicViewportState dynamicViewportState);
+-typedef void (VKAPI *PFN_vkCmdBindDynamicRasterState)(VkCmdBuffer cmdBuffer, VkDynamicRasterState dynamicRasterState);
+-typedef void (VKAPI *PFN_vkCmdBindDynamicColorBlendState)(VkCmdBuffer cmdBuffer, VkDynamicColorBlendState dynamicColorBlendState);
+-typedef void (VKAPI *PFN_vkCmdBindDynamicDepthStencilState)(VkCmdBuffer cmdBuffer, VkDynamicDepthStencilState dynamicDepthStencilState);
++typedef void (VKAPI *PFN_vkCmdSetViewport)(VkCmdBuffer cmdBuffer, uint32_t viewportCount, const VkViewport* pViewports);
++typedef void (VKAPI *PFN_vkCmdSetScissor)(VkCmdBuffer cmdBuffer, uint32_t scissorCount, const VkRect2D* pScissors);
++typedef void (VKAPI *PFN_vkCmdSetLineWidth)(VkCmdBuffer cmdBuffer, float lineWidth);
++typedef void (VKAPI *PFN_vkCmdSetDepthBias)(VkCmdBuffer cmdBuffer, float depthBias, float depthBiasClamp, float slopeScaledDepthBias);
++typedef void (VKAPI *PFN_vkCmdSetBlendConstants)(VkCmdBuffer cmdBuffer, const float blendConst[4]);
++typedef void (VKAPI *PFN_vkCmdSetDepthBounds)(VkCmdBuffer cmdBuffer, float minDepthBounds, float maxDepthBounds);
++typedef void (VKAPI *PFN_vkCmdSetStencilCompareMask)(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilCompareMask);
++typedef void (VKAPI *PFN_vkCmdSetStencilWriteMask)(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilWriteMask);
++typedef void (VKAPI *PFN_vkCmdSetStencilReference)(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilReference);
+ typedef void (VKAPI *PFN_vkCmdBindDescriptorSets)(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets);
+ typedef void (VKAPI *PFN_vkCmdBindIndexBuffer)(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
+ typedef void (VKAPI *PFN_vkCmdBindVertexBuffers)(VkCmdBuffer cmdBuffer, uint32_t startBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
+-typedef void (VKAPI *PFN_vkCmdDraw)(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount);
+-typedef void (VKAPI *PFN_vkCmdDrawIndexed)(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount);
++typedef void (VKAPI *PFN_vkCmdDraw)(VkCmdBuffer cmdBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance);
++typedef void (VKAPI *PFN_vkCmdDrawIndexed)(VkCmdBuffer cmdBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);
+ typedef void (VKAPI *PFN_vkCmdDrawIndirect)(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride);
+ typedef void (VKAPI *PFN_vkCmdDrawIndexedIndirect)(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride);
+ typedef void (VKAPI *PFN_vkCmdDispatch)(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z);
+@@ -2213,9 +2222,9 @@ typedef void (VKAPI *PFN_vkCmdCopyImageToBuffer)(VkCmdBuffer cmdBuffer, VkImage
+ typedef void (VKAPI *PFN_vkCmdUpdateBuffer)(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData);
+ typedef void (VKAPI *PFN_vkCmdFillBuffer)(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data);
+ typedef void (VKAPI *PFN_vkCmdClearColorImage)(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
+-typedef void (VKAPI *PFN_vkCmdClearDepthStencilImage)(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
++typedef void (VKAPI *PFN_vkCmdClearDepthStencilImage)(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
+ typedef void (VKAPI *PFN_vkCmdClearColorAttachment)(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rectCount, const VkRect3D* pRects);
+-typedef void (VKAPI *PFN_vkCmdClearDepthStencilAttachment)(VkCmdBuffer cmdBuffer, VkImageAspectFlags imageAspectMask, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rectCount, const VkRect3D* pRects);
++typedef void (VKAPI *PFN_vkCmdClearDepthStencilAttachment)(VkCmdBuffer cmdBuffer, VkImageAspectFlags aspectMask, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rectCount, const VkRect3D* pRects);
+ typedef void (VKAPI *PFN_vkCmdResolveImage)(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions);
+ typedef void (VKAPI *PFN_vkCmdSetEvent)(VkCmdBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+ typedef void (VKAPI *PFN_vkCmdResetEvent)(VkCmdBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+@@ -2237,7 +2246,7 @@ VkResult VKAPI vkCreateInstance(
+     const VkInstanceCreateInfo*                 pCreateInfo,
+     VkInstance*                                 pInstance);
+ 
+-VkResult VKAPI vkDestroyInstance(
++void VKAPI vkDestroyInstance(
+     VkInstance                                  instance);
+ 
+ VkResult VKAPI vkEnumeratePhysicalDevices(
+@@ -2260,24 +2269,17 @@ VkResult VKAPI vkGetPhysicalDeviceImageFormatProperties(
+     VkImageType                                 type,
+     VkImageTiling                               tiling,
+     VkImageUsageFlags                           usage,
++    VkImageCreateFlags                          flags,
+     VkImageFormatProperties*                    pImageFormatProperties);
+ 
+-VkResult VKAPI vkGetPhysicalDeviceLimits(
+-    VkPhysicalDevice                            physicalDevice,
+-    VkPhysicalDeviceLimits*                     pLimits);
+-
+ VkResult VKAPI vkGetPhysicalDeviceProperties(
+     VkPhysicalDevice                            physicalDevice,
+     VkPhysicalDeviceProperties*                 pProperties);
+ 
+-VkResult VKAPI vkGetPhysicalDeviceQueueCount(
++VkResult VKAPI vkGetPhysicalDeviceQueueFamilyProperties(
+     VkPhysicalDevice                            physicalDevice,
+-    uint32_t*                                   pCount);
+-
+-VkResult VKAPI vkGetPhysicalDeviceQueueProperties(
+-    VkPhysicalDevice                            physicalDevice,
+-    uint32_t                                    count,
+-    VkPhysicalDeviceQueueProperties*            pQueueProperties);
++    uint32_t*                                   pCount,
++    VkQueueFamilyProperties*                    pQueueFamilyProperties);
+ 
+ VkResult VKAPI vkGetPhysicalDeviceMemoryProperties(
+     VkPhysicalDevice                            physicalDevice,
+@@ -2296,25 +2298,25 @@ VkResult VKAPI vkCreateDevice(
+     const VkDeviceCreateInfo*                   pCreateInfo,
+     VkDevice*                                   pDevice);
+ 
+-VkResult VKAPI vkDestroyDevice(
++void VKAPI vkDestroyDevice(
+     VkDevice                                    device);
+ 
+-VkResult VKAPI vkGetGlobalExtensionProperties(
++VkResult VKAPI vkEnumerateInstanceExtensionProperties(
+     const char*                                 pLayerName,
+     uint32_t*                                   pCount,
+     VkExtensionProperties*                      pProperties);
+ 
+-VkResult VKAPI vkGetPhysicalDeviceExtensionProperties(
++VkResult VKAPI vkEnumerateDeviceExtensionProperties(
+     VkPhysicalDevice                            physicalDevice,
+     const char*                                 pLayerName,
+     uint32_t*                                   pCount,
+     VkExtensionProperties*                      pProperties);
+ 
+-VkResult VKAPI vkGetGlobalLayerProperties(
++VkResult VKAPI vkEnumerateInstanceLayerProperties(
+     uint32_t*                                   pCount,
+     VkLayerProperties*                          pProperties);
+ 
+-VkResult VKAPI vkGetPhysicalDeviceLayerProperties(
++VkResult VKAPI vkEnumerateDeviceLayerProperties(
+     VkPhysicalDevice                            physicalDevice,
+     uint32_t*                                   pCount,
+     VkLayerProperties*                          pProperties);
+@@ -2342,7 +2344,7 @@ VkResult VKAPI vkAllocMemory(
+     const VkMemoryAllocInfo*                    pAllocInfo,
+     VkDeviceMemory*                             pMem);
+ 
+-VkResult VKAPI vkFreeMemory(
++void VKAPI vkFreeMemory(
+     VkDevice                                    device,
+     VkDeviceMemory                              mem);
+ 
+@@ -2354,7 +2356,7 @@ VkResult VKAPI vkMapMemory(
+     VkMemoryMapFlags                            flags,
+     void**                                      ppData);
+ 
+-VkResult VKAPI vkUnmapMemory(
++void VKAPI vkUnmapMemory(
+     VkDevice                                    device,
+     VkDeviceMemory                              mem);
+ 
+@@ -2434,7 +2436,7 @@ VkResult VKAPI vkCreateFence(
+     const VkFenceCreateInfo*                    pCreateInfo,
+     VkFence*                                    pFence);
+ 
+-VkResult VKAPI vkDestroyFence(
++void VKAPI vkDestroyFence(
+     VkDevice                                    device,
+     VkFence                                     fence);
+ 
+@@ -2459,7 +2461,7 @@ VkResult VKAPI vkCreateSemaphore(
+     const VkSemaphoreCreateInfo*                pCreateInfo,
+     VkSemaphore*                                pSemaphore);
+ 
+-VkResult VKAPI vkDestroySemaphore(
++void VKAPI vkDestroySemaphore(
+     VkDevice                                    device,
+     VkSemaphore                                 semaphore);
+ 
+@@ -2476,7 +2478,7 @@ VkResult VKAPI vkCreateEvent(
+     const VkEventCreateInfo*                    pCreateInfo,
+     VkEvent*                                    pEvent);
+ 
+-VkResult VKAPI vkDestroyEvent(
++void VKAPI vkDestroyEvent(
+     VkDevice                                    device,
+     VkEvent                                     event);
+ 
+@@ -2497,7 +2499,7 @@ VkResult VKAPI vkCreateQueryPool(
+     const VkQueryPoolCreateInfo*                pCreateInfo,
+     VkQueryPool*                                pQueryPool);
+ 
+-VkResult VKAPI vkDestroyQueryPool(
++void VKAPI vkDestroyQueryPool(
+     VkDevice                                    device,
+     VkQueryPool                                 queryPool);
+ 
+@@ -2515,7 +2517,7 @@ VkResult VKAPI vkCreateBuffer(
+     const VkBufferCreateInfo*                   pCreateInfo,
+     VkBuffer*                                   pBuffer);
+ 
+-VkResult VKAPI vkDestroyBuffer(
++void VKAPI vkDestroyBuffer(
+     VkDevice                                    device,
+     VkBuffer                                    buffer);
+ 
+@@ -2524,7 +2526,7 @@ VkResult VKAPI vkCreateBufferView(
+     const VkBufferViewCreateInfo*               pCreateInfo,
+     VkBufferView*                               pView);
+ 
+-VkResult VKAPI vkDestroyBufferView(
++void VKAPI vkDestroyBufferView(
+     VkDevice                                    device,
+     VkBufferView                                bufferView);
+ 
+@@ -2533,7 +2535,7 @@ VkResult VKAPI vkCreateImage(
+     const VkImageCreateInfo*                    pCreateInfo,
+     VkImage*                                    pImage);
+ 
+-VkResult VKAPI vkDestroyImage(
++void VKAPI vkDestroyImage(
+     VkDevice                                    device,
+     VkImage                                     image);
+ 
+@@ -2548,25 +2550,16 @@ VkResult VKAPI vkCreateImageView(
+     const VkImageViewCreateInfo*                pCreateInfo,
+     VkImageView*                                pView);
+ 
+-VkResult VKAPI vkDestroyImageView(
++void VKAPI vkDestroyImageView(
+     VkDevice                                    device,
+     VkImageView                                 imageView);
+ 
+-VkResult VKAPI vkCreateAttachmentView(
+-    VkDevice                                    device,
+-    const VkAttachmentViewCreateInfo*           pCreateInfo,
+-    VkAttachmentView*                           pView);
+-
+-VkResult VKAPI vkDestroyAttachmentView(
+-    VkDevice                                    device,
+-    VkAttachmentView                            attachmentView);
+-
+ VkResult VKAPI vkCreateShaderModule(
+     VkDevice                                    device,
+     const VkShaderModuleCreateInfo*             pCreateInfo,
+     VkShaderModule*                             pShaderModule);
+ 
+-VkResult VKAPI vkDestroyShaderModule(
++void VKAPI vkDestroyShaderModule(
+     VkDevice                                    device,
+     VkShaderModule                              shaderModule);
+ 
+@@ -2575,7 +2568,7 @@ VkResult VKAPI vkCreateShader(
+     const VkShaderCreateInfo*                   pCreateInfo,
+     VkShader*                                   pShader);
+ 
+-VkResult VKAPI vkDestroyShader(
++void VKAPI vkDestroyShader(
+     VkDevice                                    device,
+     VkShader                                    shader);
+ 
+@@ -2584,7 +2577,7 @@ VkResult VKAPI vkCreatePipelineCache(
+     const VkPipelineCacheCreateInfo*            pCreateInfo,
+     VkPipelineCache*                            pPipelineCache);
+ 
+-VkResult VKAPI vkDestroyPipelineCache(
++void VKAPI vkDestroyPipelineCache(
+     VkDevice                                    device,
+     VkPipelineCache                             pipelineCache);
+ 
+@@ -2617,7 +2610,7 @@ VkResult VKAPI vkCreateComputePipelines(
+     const VkComputePipelineCreateInfo*          pCreateInfos,
+     VkPipeline*                                 pPipelines);
+ 
+-VkResult VKAPI vkDestroyPipeline(
++void VKAPI vkDestroyPipeline(
+     VkDevice                                    device,
+     VkPipeline                                  pipeline);
+ 
+@@ -2626,7 +2619,7 @@ VkResult VKAPI vkCreatePipelineLayout(
+     const VkPipelineLayoutCreateInfo*           pCreateInfo,
+     VkPipelineLayout*                           pPipelineLayout);
+ 
+-VkResult VKAPI vkDestroyPipelineLayout(
++void VKAPI vkDestroyPipelineLayout(
+     VkDevice                                    device,
+     VkPipelineLayout                            pipelineLayout);
+ 
+@@ -2635,7 +2628,7 @@ VkResult VKAPI vkCreateSampler(
+     const VkSamplerCreateInfo*                  pCreateInfo,
+     VkSampler*                                  pSampler);
+ 
+-VkResult VKAPI vkDestroySampler(
++void VKAPI vkDestroySampler(
+     VkDevice                                    device,
+     VkSampler                                   sampler);
+ 
+@@ -2644,18 +2637,16 @@ VkResult VKAPI vkCreateDescriptorSetLayout(
+     const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,
+     VkDescriptorSetLayout*                      pSetLayout);
+ 
+-VkResult VKAPI vkDestroyDescriptorSetLayout(
++void VKAPI vkDestroyDescriptorSetLayout(
+     VkDevice                                    device,
+     VkDescriptorSetLayout                       descriptorSetLayout);
+ 
+ VkResult VKAPI vkCreateDescriptorPool(
+     VkDevice                                    device,
+-    VkDescriptorPoolUsage                       poolUsage,
+-    uint32_t                                    maxSets,
+     const VkDescriptorPoolCreateInfo*           pCreateInfo,
+     VkDescriptorPool*                           pDescriptorPool);
+ 
+-VkResult VKAPI vkDestroyDescriptorPool(
++void VKAPI vkDestroyDescriptorPool(
+     VkDevice                                    device,
+     VkDescriptorPool                            descriptorPool);
+ 
+@@ -2669,8 +2660,7 @@ VkResult VKAPI vkAllocDescriptorSets(
+     VkDescriptorSetUsage                        setUsage,
+     uint32_t                                    count,
+     const VkDescriptorSetLayout*                pSetLayouts,
+-    VkDescriptorSet*                            pDescriptorSets,
+-    uint32_t*                                   pCount);
++    VkDescriptorSet*                            pDescriptorSets);
+ 
+ VkResult VKAPI vkFreeDescriptorSets(
+     VkDevice                                    device,
+@@ -2678,55 +2668,19 @@ VkResult VKAPI vkFreeDescriptorSets(
+     uint32_t                                    count,
+     const VkDescriptorSet*                      pDescriptorSets);
+ 
+-VkResult VKAPI vkUpdateDescriptorSets(
++void VKAPI vkUpdateDescriptorSets(
+     VkDevice                                    device,
+     uint32_t                                    writeCount,
+     const VkWriteDescriptorSet*                 pDescriptorWrites,
+     uint32_t                                    copyCount,
+     const VkCopyDescriptorSet*                  pDescriptorCopies);
+ 
+-VkResult VKAPI vkCreateDynamicViewportState(
+-    VkDevice                                    device,
+-    const VkDynamicViewportStateCreateInfo*     pCreateInfo,
+-    VkDynamicViewportState*                     pState);
+-
+-VkResult VKAPI vkDestroyDynamicViewportState(
+-    VkDevice                                    device,
+-    VkDynamicViewportState                      dynamicViewportState);
+-
+-VkResult VKAPI vkCreateDynamicRasterState(
+-    VkDevice                                    device,
+-    const VkDynamicRasterStateCreateInfo*       pCreateInfo,
+-    VkDynamicRasterState*                       pState);
+-
+-VkResult VKAPI vkDestroyDynamicRasterState(
+-    VkDevice                                    device,
+-    VkDynamicRasterState                        dynamicRasterState);
+-
+-VkResult VKAPI vkCreateDynamicColorBlendState(
+-    VkDevice                                    device,
+-    const VkDynamicColorBlendStateCreateInfo*   pCreateInfo,
+-    VkDynamicColorBlendState*                   pState);
+-
+-VkResult VKAPI vkDestroyDynamicColorBlendState(
+-    VkDevice                                    device,
+-    VkDynamicColorBlendState                    dynamicColorBlendState);
+-
+-VkResult VKAPI vkCreateDynamicDepthStencilState(
+-    VkDevice                                    device,
+-    const VkDynamicDepthStencilStateCreateInfo* pCreateInfo,
+-    VkDynamicDepthStencilState*                 pState);
+-
+-VkResult VKAPI vkDestroyDynamicDepthStencilState(
+-    VkDevice                                    device,
+-    VkDynamicDepthStencilState                  dynamicDepthStencilState);
+-
+ VkResult VKAPI vkCreateFramebuffer(
+     VkDevice                                    device,
+     const VkFramebufferCreateInfo*              pCreateInfo,
+     VkFramebuffer*                              pFramebuffer);
+ 
+-VkResult VKAPI vkDestroyFramebuffer(
++void VKAPI vkDestroyFramebuffer(
+     VkDevice                                    device,
+     VkFramebuffer                               framebuffer);
+ 
+@@ -2735,7 +2689,7 @@ VkResult VKAPI vkCreateRenderPass(
+     const VkRenderPassCreateInfo*               pCreateInfo,
+     VkRenderPass*                               pRenderPass);
+ 
+-VkResult VKAPI vkDestroyRenderPass(
++void VKAPI vkDestroyRenderPass(
+     VkDevice                                    device,
+     VkRenderPass                                renderPass);
+ 
+@@ -2749,7 +2703,7 @@ VkResult VKAPI vkCreateCommandPool(
+     const VkCmdPoolCreateInfo*                  pCreateInfo,
+     VkCmdPool*                                  pCmdPool);
+ 
+-VkResult VKAPI vkDestroyCommandPool(
++void VKAPI vkDestroyCommandPool(
+     VkDevice                                    device,
+     VkCmdPool                                   cmdPool);
+ 
+@@ -2763,7 +2717,7 @@ VkResult VKAPI vkCreateCommandBuffer(
+     const VkCmdBufferCreateInfo*                pCreateInfo,
+     VkCmdBuffer*                                pCmdBuffer);
+ 
+-VkResult VKAPI vkDestroyCommandBuffer(
++void VKAPI vkDestroyCommandBuffer(
+     VkDevice                                    device,
+     VkCmdBuffer                                 commandBuffer);
+ 
+@@ -2783,21 +2737,49 @@ void VKAPI vkCmdBindPipeline(
+     VkPipelineBindPoint                         pipelineBindPoint,
+     VkPipeline                                  pipeline);
+ 
+-void VKAPI vkCmdBindDynamicViewportState(
++void VKAPI vkCmdSetViewport(
++    VkCmdBuffer                                 cmdBuffer,
++    uint32_t                                    viewportCount,
++    const VkViewport*                           pViewports);
++
++void VKAPI vkCmdSetScissor(
++    VkCmdBuffer                                 cmdBuffer,
++    uint32_t                                    scissorCount,
++    const VkRect2D*                             pScissors);
++
++void VKAPI vkCmdSetLineWidth(
++    VkCmdBuffer                                 cmdBuffer,
++    float                                       lineWidth);
++
++void VKAPI vkCmdSetDepthBias(
+     VkCmdBuffer                                 cmdBuffer,
+-    VkDynamicViewportState                      dynamicViewportState);
++    float                                       depthBias,
++    float                                       depthBiasClamp,
++    float                                       slopeScaledDepthBias);
+ 
+-void VKAPI vkCmdBindDynamicRasterState(
++void VKAPI vkCmdSetBlendConstants(
+     VkCmdBuffer                                 cmdBuffer,
+-    VkDynamicRasterState                        dynamicRasterState);
++    const float                                 blendConst[4]);
+ 
+-void VKAPI vkCmdBindDynamicColorBlendState(
++void VKAPI vkCmdSetDepthBounds(
+     VkCmdBuffer                                 cmdBuffer,
+-    VkDynamicColorBlendState                    dynamicColorBlendState);
++    float                                       minDepthBounds,
++    float                                       maxDepthBounds);
+ 
+-void VKAPI vkCmdBindDynamicDepthStencilState(
++void VKAPI vkCmdSetStencilCompareMask(
+     VkCmdBuffer                                 cmdBuffer,
+-    VkDynamicDepthStencilState                  dynamicDepthStencilState);
++    VkStencilFaceFlags                          faceMask,
++    uint32_t                                    stencilCompareMask);
++
++void VKAPI vkCmdSetStencilWriteMask(
++    VkCmdBuffer                                 cmdBuffer,
++    VkStencilFaceFlags                          faceMask,
++    uint32_t                                    stencilWriteMask);
++
++void VKAPI vkCmdSetStencilReference(
++    VkCmdBuffer                                 cmdBuffer,
++    VkStencilFaceFlags                          faceMask,
++    uint32_t                                    stencilReference);
+ 
+ void VKAPI vkCmdBindDescriptorSets(
+     VkCmdBuffer                                 cmdBuffer,
+@@ -2824,18 +2806,18 @@ void VKAPI vkCmdBindVertexBuffers(
+ 
+ void VKAPI vkCmdDraw(
+     VkCmdBuffer                                 cmdBuffer,
+-    uint32_t                                    firstVertex,
+     uint32_t                                    vertexCount,
+-    uint32_t                                    firstInstance,
+-    uint32_t                                    instanceCount);
++    uint32_t                                    instanceCount,
++    uint32_t                                    firstVertex,
++    uint32_t                                    firstInstance);
+ 
+ void VKAPI vkCmdDrawIndexed(
+     VkCmdBuffer                                 cmdBuffer,
+-    uint32_t                                    firstIndex,
+     uint32_t                                    indexCount,
++    uint32_t                                    instanceCount,
++    uint32_t                                    firstIndex,
+     int32_t                                     vertexOffset,
+-    uint32_t                                    firstInstance,
+-    uint32_t                                    instanceCount);
++    uint32_t                                    firstInstance);
+ 
+ void VKAPI vkCmdDrawIndirect(
+     VkCmdBuffer                                 cmdBuffer,
+@@ -2930,8 +2912,7 @@ void VKAPI vkCmdClearDepthStencilImage(
+     VkCmdBuffer                                 cmdBuffer,
+     VkImage                                     image,
+     VkImageLayout                               imageLayout,
+-    float                                       depth,
+-    uint32_t                                    stencil,
++    const VkClearDepthStencilValue*             pDepthStencil,
+     uint32_t                                    rangeCount,
+     const VkImageSubresourceRange*              pRanges);
+ 
+@@ -2945,10 +2926,9 @@ void VKAPI vkCmdClearColorAttachment(
+ 
+ void VKAPI vkCmdClearDepthStencilAttachment(
+     VkCmdBuffer                                 cmdBuffer,
+-    VkImageAspectFlags                          imageAspectMask,
++    VkImageAspectFlags                          aspectMask,
+     VkImageLayout                               imageLayout,
+-    float                                       depth,
+-    uint32_t                                    stencil,
++    const VkClearDepthStencilValue*             pDepthStencil,
+     uint32_t                                    rectCount,
+     const VkRect3D*                             pRects);
+ 
+diff --git a/vulkan/libvulkan/entry.cpp b/vulkan/libvulkan/entry.cpp
+index cd5dd99..2f7583d 100644
+--- a/vulkan/libvulkan/entry.cpp
++++ b/vulkan/libvulkan/entry.cpp
+@@ -47,8 +47,8 @@ VkResult vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, VkInstance* p
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyInstance(VkInstance instance) {
+-    return GetVtbl(instance).DestroyInstance(instance);
++void vkDestroyInstance(VkInstance instance) {
++    GetVtbl(instance).DestroyInstance(instance);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -72,13 +72,8 @@ VkResult vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysic
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkGetPhysicalDeviceQueueCount(VkPhysicalDevice physicalDevice, uint32_t* pCount) {
+-    return GetVtbl(physicalDevice).GetPhysicalDeviceQueueCount(physicalDevice, pCount);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkGetPhysicalDeviceQueueProperties(VkPhysicalDevice physicalDevice, uint32_t count, VkPhysicalDeviceQueueProperties* pQueueProperties) {
+-    return GetVtbl(physicalDevice).GetPhysicalDeviceQueueProperties(physicalDevice, count, pQueueProperties);
++VkResult vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkQueueFamilyProperties* pQueueFamilyProperties) {
++    return GetVtbl(physicalDevice).GetPhysicalDeviceQueueFamilyProperties(physicalDevice, pCount, pQueueFamilyProperties);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -97,13 +92,8 @@ VkResult vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, Vk
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageFormatProperties* pImageFormatProperties) {
+-    return GetVtbl(physicalDevice).GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, pImageFormatProperties);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkGetPhysicalDeviceLimits(VkPhysicalDevice physicalDevice, VkPhysicalDeviceLimits* pLimits) {
+-    return GetVtbl(physicalDevice).GetPhysicalDeviceLimits(physicalDevice, pLimits);
++VkResult vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) {
++    return GetVtbl(physicalDevice).GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -112,28 +102,28 @@ VkResult vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInf
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyDevice(VkDevice device) {
+-    return vulkan::DestroyDevice(device);
++void vkDestroyDevice(VkDevice device) {
++    vulkan::DestroyDevice(device);
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkGetGlobalLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties) {
+-    return vulkan::GetGlobalLayerProperties(pCount, pProperties);
++VkResult vkEnumerateInstanceLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties) {
++    return vulkan::EnumerateInstanceLayerProperties(pCount, pProperties);
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkGetGlobalExtensionProperties(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
+-    return vulkan::GetGlobalExtensionProperties(pLayerName, pCount, pProperties);
++VkResult vkEnumerateInstanceExtensionProperties(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
++    return vulkan::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkGetPhysicalDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties) {
+-    return GetVtbl(physicalDevice).GetPhysicalDeviceLayerProperties(physicalDevice, pCount, pProperties);
++VkResult vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties) {
++    return GetVtbl(physicalDevice).EnumerateDeviceLayerProperties(physicalDevice, pCount, pProperties);
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkGetPhysicalDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
+-    return GetVtbl(physicalDevice).GetPhysicalDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties);
++VkResult vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
++    return GetVtbl(physicalDevice).EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -162,8 +152,8 @@ VkResult vkAllocMemory(VkDevice device, const VkMemoryAllocInfo* pAllocInfo, VkD
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkFreeMemory(VkDevice device, VkDeviceMemory mem) {
+-    return GetVtbl(device).FreeMemory(device, mem);
++void vkFreeMemory(VkDevice device, VkDeviceMemory mem) {
++    GetVtbl(device).FreeMemory(device, mem);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -172,8 +162,8 @@ VkResult vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, V
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkUnmapMemory(VkDevice device, VkDeviceMemory mem) {
+-    return GetVtbl(device).UnmapMemory(device, mem);
++void vkUnmapMemory(VkDevice device, VkDeviceMemory mem) {
++    GetVtbl(device).UnmapMemory(device, mem);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -242,8 +232,8 @@ VkResult vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, Vk
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyFence(VkDevice device, VkFence fence) {
+-    return GetVtbl(device).DestroyFence(device, fence);
++void vkDestroyFence(VkDevice device, VkFence fence) {
++    GetVtbl(device).DestroyFence(device, fence);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -267,8 +257,8 @@ VkResult vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreate
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroySemaphore(VkDevice device, VkSemaphore semaphore) {
+-    return GetVtbl(device).DestroySemaphore(device, semaphore);
++void vkDestroySemaphore(VkDevice device, VkSemaphore semaphore) {
++    GetVtbl(device).DestroySemaphore(device, semaphore);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -287,8 +277,8 @@ VkResult vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, Vk
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyEvent(VkDevice device, VkEvent event) {
+-    return GetVtbl(device).DestroyEvent(device, event);
++void vkDestroyEvent(VkDevice device, VkEvent event) {
++    GetVtbl(device).DestroyEvent(device, event);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -312,8 +302,8 @@ VkResult vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreate
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool) {
+-    return GetVtbl(device).DestroyQueryPool(device, queryPool);
++void vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool) {
++    GetVtbl(device).DestroyQueryPool(device, queryPool);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -327,8 +317,8 @@ VkResult vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo,
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyBuffer(VkDevice device, VkBuffer buffer) {
+-    return GetVtbl(device).DestroyBuffer(device, buffer);
++void vkDestroyBuffer(VkDevice device, VkBuffer buffer) {
++    GetVtbl(device).DestroyBuffer(device, buffer);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -337,8 +327,8 @@ VkResult vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCrea
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyBufferView(VkDevice device, VkBufferView bufferView) {
+-    return GetVtbl(device).DestroyBufferView(device, bufferView);
++void vkDestroyBufferView(VkDevice device, VkBufferView bufferView) {
++    GetVtbl(device).DestroyBufferView(device, bufferView);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -347,8 +337,8 @@ VkResult vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, Vk
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyImage(VkDevice device, VkImage image) {
+-    return GetVtbl(device).DestroyImage(device, image);
++void vkDestroyImage(VkDevice device, VkImage image) {
++    GetVtbl(device).DestroyImage(device, image);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -362,18 +352,8 @@ VkResult vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreate
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyImageView(VkDevice device, VkImageView imageView) {
+-    return GetVtbl(device).DestroyImageView(device, imageView);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkCreateAttachmentView(VkDevice device, const VkAttachmentViewCreateInfo* pCreateInfo, VkAttachmentView* pView) {
+-    return GetVtbl(device).CreateAttachmentView(device, pCreateInfo, pView);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkDestroyAttachmentView(VkDevice device, VkAttachmentView attachmentView) {
+-    return GetVtbl(device).DestroyAttachmentView(device, attachmentView);
++void vkDestroyImageView(VkDevice device, VkImageView imageView) {
++    GetVtbl(device).DestroyImageView(device, imageView);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -382,8 +362,8 @@ VkResult vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* p
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule) {
+-    return GetVtbl(device).DestroyShaderModule(device, shaderModule);
++void vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule) {
++    GetVtbl(device).DestroyShaderModule(device, shaderModule);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -392,8 +372,8 @@ VkResult vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo,
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyShader(VkDevice device, VkShader shader) {
+-    return GetVtbl(device).DestroyShader(device, shader);
++void vkDestroyShader(VkDevice device, VkShader shader) {
++    GetVtbl(device).DestroyShader(device, shader);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -402,8 +382,8 @@ VkResult vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo*
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache) {
+-    return GetVtbl(device).DestroyPipelineCache(device, pipelineCache);
++void vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache) {
++    GetVtbl(device).DestroyPipelineCache(device, pipelineCache);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -432,8 +412,8 @@ VkResult vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyPipeline(VkDevice device, VkPipeline pipeline) {
+-    return GetVtbl(device).DestroyPipeline(device, pipeline);
++void vkDestroyPipeline(VkDevice device, VkPipeline pipeline) {
++    GetVtbl(device).DestroyPipeline(device, pipeline);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -442,8 +422,8 @@ VkResult vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInf
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout) {
+-    return GetVtbl(device).DestroyPipelineLayout(device, pipelineLayout);
++void vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout) {
++    GetVtbl(device).DestroyPipelineLayout(device, pipelineLayout);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -452,8 +432,8 @@ VkResult vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroySampler(VkDevice device, VkSampler sampler) {
+-    return GetVtbl(device).DestroySampler(device, sampler);
++void vkDestroySampler(VkDevice device, VkSampler sampler) {
++    GetVtbl(device).DestroySampler(device, sampler);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -462,18 +442,18 @@ VkResult vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayou
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout) {
+-    return GetVtbl(device).DestroyDescriptorSetLayout(device, descriptorSetLayout);
++void vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout) {
++    GetVtbl(device).DestroyDescriptorSetLayout(device, descriptorSetLayout);
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkCreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool) {
+-    return GetVtbl(device).CreateDescriptorPool(device, poolUsage, maxSets, pCreateInfo, pDescriptorPool);
++VkResult vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool) {
++    return GetVtbl(device).CreateDescriptorPool(device, pCreateInfo, pDescriptorPool);
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool) {
+-    return GetVtbl(device).DestroyDescriptorPool(device, descriptorPool);
++void vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool) {
++    GetVtbl(device).DestroyDescriptorPool(device, descriptorPool);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -482,8 +462,8 @@ VkResult vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool)
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkAllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount) {
+-    return GetVtbl(device).AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets, pCount);
++VkResult vkAllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets) {
++    return GetVtbl(device).AllocDescriptorSets(device, descriptorPool, setUsage, count, pSetLayouts, pDescriptorSets);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -492,48 +472,8 @@ VkResult vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies) {
+-    return GetVtbl(device).UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkCreateDynamicViewportState(VkDevice device, const VkDynamicViewportStateCreateInfo* pCreateInfo, VkDynamicViewportState* pState) {
+-    return GetVtbl(device).CreateDynamicViewportState(device, pCreateInfo, pState);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkDestroyDynamicViewportState(VkDevice device, VkDynamicViewportState dynamicViewportState) {
+-    return GetVtbl(device).DestroyDynamicViewportState(device, dynamicViewportState);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkCreateDynamicRasterState(VkDevice device, const VkDynamicRasterStateCreateInfo* pCreateInfo, VkDynamicRasterState* pState) {
+-    return GetVtbl(device).CreateDynamicRasterState(device, pCreateInfo, pState);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkDestroyDynamicRasterState(VkDevice device, VkDynamicRasterState dynamicRasterState) {
+-    return GetVtbl(device).DestroyDynamicRasterState(device, dynamicRasterState);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkCreateDynamicColorBlendState(VkDevice device, const VkDynamicColorBlendStateCreateInfo* pCreateInfo, VkDynamicColorBlendState* pState) {
+-    return GetVtbl(device).CreateDynamicColorBlendState(device, pCreateInfo, pState);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkDestroyDynamicColorBlendState(VkDevice device, VkDynamicColorBlendState dynamicColorBlendState) {
+-    return GetVtbl(device).DestroyDynamicColorBlendState(device, dynamicColorBlendState);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkCreateDynamicDepthStencilState(VkDevice device, const VkDynamicDepthStencilStateCreateInfo* pCreateInfo, VkDynamicDepthStencilState* pState) {
+-    return GetVtbl(device).CreateDynamicDepthStencilState(device, pCreateInfo, pState);
+-}
+-
+-__attribute__((visibility("default")))
+-VkResult vkDestroyDynamicDepthStencilState(VkDevice device, VkDynamicDepthStencilState dynamicDepthStencilState) {
+-    return GetVtbl(device).DestroyDynamicDepthStencilState(device, dynamicDepthStencilState);
++void vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies) {
++    GetVtbl(device).UpdateDescriptorSets(device, writeCount, pDescriptorWrites, copyCount, pDescriptorCopies);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -542,8 +482,8 @@ VkResult vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCr
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer) {
+-    return GetVtbl(device).DestroyFramebuffer(device, framebuffer);
++void vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer) {
++    GetVtbl(device).DestroyFramebuffer(device, framebuffer);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -552,8 +492,8 @@ VkResult vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCrea
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass) {
+-    return GetVtbl(device).DestroyRenderPass(device, renderPass);
++void vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass) {
++    GetVtbl(device).DestroyRenderPass(device, renderPass);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -567,8 +507,8 @@ VkResult vkCreateCommandPool(VkDevice device, const VkCmdPoolCreateInfo* pCreate
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyCommandPool(VkDevice device, VkCmdPool cmdPool) {
+-    return GetVtbl(device).DestroyCommandPool(device, cmdPool);
++void vkDestroyCommandPool(VkDevice device, VkCmdPool cmdPool) {
++    GetVtbl(device).DestroyCommandPool(device, cmdPool);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -582,8 +522,8 @@ VkResult vkCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCr
+ }
+ 
+ __attribute__((visibility("default")))
+-VkResult vkDestroyCommandBuffer(VkDevice device, VkCmdBuffer commandBuffer) {
+-    return GetVtbl(device).DestroyCommandBuffer(device, commandBuffer);
++void vkDestroyCommandBuffer(VkDevice device, VkCmdBuffer commandBuffer) {
++    GetVtbl(device).DestroyCommandBuffer(device, commandBuffer);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -607,23 +547,48 @@ void vkCmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPo
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdBindDynamicViewportState(VkCmdBuffer cmdBuffer, VkDynamicViewportState dynamicViewportState) {
+-    GetVtbl(cmdBuffer).CmdBindDynamicViewportState(cmdBuffer, dynamicViewportState);
++void vkCmdSetViewport(VkCmdBuffer cmdBuffer, uint32_t viewportCount, const VkViewport* pViewports) {
++    GetVtbl(cmdBuffer).CmdSetViewport(cmdBuffer, viewportCount, pViewports);
++}
++
++__attribute__((visibility("default")))
++void vkCmdSetScissor(VkCmdBuffer cmdBuffer, uint32_t scissorCount, const VkRect2D* pScissors) {
++    GetVtbl(cmdBuffer).CmdSetScissor(cmdBuffer, scissorCount, pScissors);
++}
++
++__attribute__((visibility("default")))
++void vkCmdSetLineWidth(VkCmdBuffer cmdBuffer, float lineWidth) {
++    GetVtbl(cmdBuffer).CmdSetLineWidth(cmdBuffer, lineWidth);
++}
++
++__attribute__((visibility("default")))
++void vkCmdSetDepthBias(VkCmdBuffer cmdBuffer, float depthBias, float depthBiasClamp, float slopeScaledDepthBias) {
++    GetVtbl(cmdBuffer).CmdSetDepthBias(cmdBuffer, depthBias, depthBiasClamp, slopeScaledDepthBias);
++}
++
++__attribute__((visibility("default")))
++void vkCmdSetBlendConstants(VkCmdBuffer cmdBuffer, const float blendConst[4]) {
++    GetVtbl(cmdBuffer).CmdSetBlendConstants(cmdBuffer, blendConst);
++}
++
++__attribute__((visibility("default")))
++void vkCmdSetDepthBounds(VkCmdBuffer cmdBuffer, float minDepthBounds, float maxDepthBounds) {
++    GetVtbl(cmdBuffer).CmdSetDepthBounds(cmdBuffer, minDepthBounds, maxDepthBounds);
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdBindDynamicRasterState(VkCmdBuffer cmdBuffer, VkDynamicRasterState dynamicRasterState) {
+-    GetVtbl(cmdBuffer).CmdBindDynamicRasterState(cmdBuffer, dynamicRasterState);
++void vkCmdSetStencilCompareMask(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilCompareMask) {
++    GetVtbl(cmdBuffer).CmdSetStencilCompareMask(cmdBuffer, faceMask, stencilCompareMask);
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdBindDynamicColorBlendState(VkCmdBuffer cmdBuffer, VkDynamicColorBlendState dynamicColorBlendState) {
+-    GetVtbl(cmdBuffer).CmdBindDynamicColorBlendState(cmdBuffer, dynamicColorBlendState);
++void vkCmdSetStencilWriteMask(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilWriteMask) {
++    GetVtbl(cmdBuffer).CmdSetStencilWriteMask(cmdBuffer, faceMask, stencilWriteMask);
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdBindDynamicDepthStencilState(VkCmdBuffer cmdBuffer, VkDynamicDepthStencilState dynamicDepthStencilState) {
+-    GetVtbl(cmdBuffer).CmdBindDynamicDepthStencilState(cmdBuffer, dynamicDepthStencilState);
++void vkCmdSetStencilReference(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilReference) {
++    GetVtbl(cmdBuffer).CmdSetStencilReference(cmdBuffer, faceMask, stencilReference);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -642,13 +607,13 @@ void vkCmdBindVertexBuffers(VkCmdBuffer cmdBuffer, uint32_t startBinding, uint32
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount) {
+-    GetVtbl(cmdBuffer).CmdDraw(cmdBuffer, firstVertex, vertexCount, firstInstance, instanceCount);
++void vkCmdDraw(VkCmdBuffer cmdBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
++    GetVtbl(cmdBuffer).CmdDraw(cmdBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount) {
+-    GetVtbl(cmdBuffer).CmdDrawIndexed(cmdBuffer, firstIndex, indexCount, vertexOffset, firstInstance, instanceCount);
++void vkCmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
++    GetVtbl(cmdBuffer).CmdDrawIndexed(cmdBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -712,8 +677,8 @@ void vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout im
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdClearDepthStencilImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
+-    GetVtbl(cmdBuffer).CmdClearDepthStencilImage(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
++void vkCmdClearDepthStencilImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
++    GetVtbl(cmdBuffer).CmdClearDepthStencilImage(cmdBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+ }
+ 
+ __attribute__((visibility("default")))
+@@ -722,8 +687,8 @@ void vkCmdClearColorAttachment(VkCmdBuffer cmdBuffer, uint32_t colorAttachment,
+ }
+ 
+ __attribute__((visibility("default")))
+-void vkCmdClearDepthStencilAttachment(VkCmdBuffer cmdBuffer, VkImageAspectFlags imageAspectMask, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rectCount, const VkRect3D* pRects) {
+-    GetVtbl(cmdBuffer).CmdClearDepthStencilAttachment(cmdBuffer, imageAspectMask, imageLayout, depth, stencil, rectCount, pRects);
++void vkCmdClearDepthStencilAttachment(VkCmdBuffer cmdBuffer, VkImageAspectFlags aspectMask, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rectCount, const VkRect3D* pRects) {
++    GetVtbl(cmdBuffer).CmdClearDepthStencilAttachment(cmdBuffer, aspectMask, imageLayout, pDepthStencil, rectCount, pRects);
+ }
+ 
+ __attribute__((visibility("default")))
+diff --git a/vulkan/libvulkan/get_proc_addr.cpp b/vulkan/libvulkan/get_proc_addr.cpp
+index ceb76b9..5247950 100644
+--- a/vulkan/libvulkan/get_proc_addr.cpp
++++ b/vulkan/libvulkan/get_proc_addr.cpp
+@@ -51,18 +51,16 @@ const NameProcEntry kInstanceProcTbl[] = {
+     // clang-format off
+     {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDevice)},
+     {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyInstance)},
++    {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(vkEnumerateDeviceExtensionProperties)},
++    {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(vkEnumerateDeviceLayerProperties)},
+     {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(vkEnumeratePhysicalDevices)},
+     {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(vkGetInstanceProcAddr)},
+-    {"vkGetPhysicalDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceExtensionProperties)},
+     {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceFeatures)},
+     {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceFormatProperties)},
+     {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceImageFormatProperties)},
+-    {"vkGetPhysicalDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceLayerProperties)},
+-    {"vkGetPhysicalDeviceLimits", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceLimits)},
+     {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceMemoryProperties)},
+     {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceProperties)},
+-    {"vkGetPhysicalDeviceQueueCount", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceQueueCount)},
+-    {"vkGetPhysicalDeviceQueueProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceQueueProperties)},
++    {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceQueueFamilyProperties)},
+     {"vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceSparseImageFormatProperties)},
+     // clang-format on
+ };
+@@ -77,10 +75,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBeginQuery)},
+     {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBeginRenderPass)},
+     {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDescriptorSets)},
+-    {"vkCmdBindDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicColorBlendState)},
+-    {"vkCmdBindDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicDepthStencilState)},
+-    {"vkCmdBindDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicRasterState)},
+-    {"vkCmdBindDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindDynamicViewportState)},
+     {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindIndexBuffer)},
+     {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindPipeline)},
+     {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(vkCmdBindVertexBuffers)},
+@@ -110,11 +104,19 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(vkCmdResetEvent)},
+     {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(vkCmdResetQueryPool)},
+     {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(vkCmdResolveImage)},
++    {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetBlendConstants)},
++    {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetDepthBias)},
++    {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetDepthBounds)},
+     {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetEvent)},
++    {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetLineWidth)},
++    {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetScissor)},
++    {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetStencilCompareMask)},
++    {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetStencilReference)},
++    {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetStencilWriteMask)},
++    {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(vkCmdSetViewport)},
+     {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCmdUpdateBuffer)},
+     {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(vkCmdWaitEvents)},
+     {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(vkCmdWriteTimestamp)},
+-    {"vkCreateAttachmentView", reinterpret_cast<PFN_vkVoidFunction>(vkCreateAttachmentView)},
+     {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCreateBuffer)},
+     {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(vkCreateBufferView)},
+     {"vkCreateCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCreateCommandBuffer)},
+@@ -122,10 +124,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(vkCreateComputePipelines)},
+     {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDescriptorPool)},
+     {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDescriptorSetLayout)},
+-    {"vkCreateDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicColorBlendState)},
+-    {"vkCreateDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicDepthStencilState)},
+-    {"vkCreateDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicRasterState)},
+-    {"vkCreateDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(vkCreateDynamicViewportState)},
+     {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(vkCreateEvent)},
+     {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(vkCreateFence)},
+     {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(vkCreateFramebuffer)},
+@@ -140,7 +138,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(vkCreateSemaphore)},
+     {"vkCreateShader", reinterpret_cast<PFN_vkVoidFunction>(vkCreateShader)},
+     {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(vkCreateShaderModule)},
+-    {"vkDestroyAttachmentView", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyAttachmentView)},
+     {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyBuffer)},
+     {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyBufferView)},
+     {"vkDestroyCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyCommandBuffer)},
+@@ -148,10 +145,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDescriptorPool)},
+     {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDescriptorSetLayout)},
+     {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDevice)},
+-    {"vkDestroyDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicColorBlendState)},
+-    {"vkDestroyDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicDepthStencilState)},
+-    {"vkDestroyDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicRasterState)},
+-    {"vkDestroyDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyDynamicViewportState)},
+     {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyEvent)},
+     {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyFence)},
+     {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(vkDestroyFramebuffer)},
+@@ -210,18 +203,16 @@ const NameOffsetEntry kInstanceOffsetTbl[] = {
+     // clang-format off
+     {"vkCreateDevice", offsetof(InstanceVtbl, CreateDevice)},
+     {"vkDestroyInstance", offsetof(InstanceVtbl, DestroyInstance)},
++    {"vkEnumerateDeviceExtensionProperties", offsetof(InstanceVtbl, EnumerateDeviceExtensionProperties)},
++    {"vkEnumerateDeviceLayerProperties", offsetof(InstanceVtbl, EnumerateDeviceLayerProperties)},
+     {"vkEnumeratePhysicalDevices", offsetof(InstanceVtbl, EnumeratePhysicalDevices)},
+     {"vkGetInstanceProcAddr", offsetof(InstanceVtbl, GetInstanceProcAddr)},
+-    {"vkGetPhysicalDeviceExtensionProperties", offsetof(InstanceVtbl, GetPhysicalDeviceExtensionProperties)},
+     {"vkGetPhysicalDeviceFeatures", offsetof(InstanceVtbl, GetPhysicalDeviceFeatures)},
+     {"vkGetPhysicalDeviceFormatProperties", offsetof(InstanceVtbl, GetPhysicalDeviceFormatProperties)},
+     {"vkGetPhysicalDeviceImageFormatProperties", offsetof(InstanceVtbl, GetPhysicalDeviceImageFormatProperties)},
+-    {"vkGetPhysicalDeviceLayerProperties", offsetof(InstanceVtbl, GetPhysicalDeviceLayerProperties)},
+-    {"vkGetPhysicalDeviceLimits", offsetof(InstanceVtbl, GetPhysicalDeviceLimits)},
+     {"vkGetPhysicalDeviceMemoryProperties", offsetof(InstanceVtbl, GetPhysicalDeviceMemoryProperties)},
+     {"vkGetPhysicalDeviceProperties", offsetof(InstanceVtbl, GetPhysicalDeviceProperties)},
+-    {"vkGetPhysicalDeviceQueueCount", offsetof(InstanceVtbl, GetPhysicalDeviceQueueCount)},
+-    {"vkGetPhysicalDeviceQueueProperties", offsetof(InstanceVtbl, GetPhysicalDeviceQueueProperties)},
++    {"vkGetPhysicalDeviceQueueFamilyProperties", offsetof(InstanceVtbl, GetPhysicalDeviceQueueFamilyProperties)},
+     {"vkGetPhysicalDeviceSparseImageFormatProperties", offsetof(InstanceVtbl, GetPhysicalDeviceSparseImageFormatProperties)},
+     // clang-format on
+ };
+@@ -236,10 +227,6 @@ const NameOffsetEntry kDeviceOffsetTbl[] = {
+     {"vkCmdBeginQuery", offsetof(DeviceVtbl, CmdBeginQuery)},
+     {"vkCmdBeginRenderPass", offsetof(DeviceVtbl, CmdBeginRenderPass)},
+     {"vkCmdBindDescriptorSets", offsetof(DeviceVtbl, CmdBindDescriptorSets)},
+-    {"vkCmdBindDynamicColorBlendState", offsetof(DeviceVtbl, CmdBindDynamicColorBlendState)},
+-    {"vkCmdBindDynamicDepthStencilState", offsetof(DeviceVtbl, CmdBindDynamicDepthStencilState)},
+-    {"vkCmdBindDynamicRasterState", offsetof(DeviceVtbl, CmdBindDynamicRasterState)},
+-    {"vkCmdBindDynamicViewportState", offsetof(DeviceVtbl, CmdBindDynamicViewportState)},
+     {"vkCmdBindIndexBuffer", offsetof(DeviceVtbl, CmdBindIndexBuffer)},
+     {"vkCmdBindPipeline", offsetof(DeviceVtbl, CmdBindPipeline)},
+     {"vkCmdBindVertexBuffers", offsetof(DeviceVtbl, CmdBindVertexBuffers)},
+@@ -269,11 +256,19 @@ const NameOffsetEntry kDeviceOffsetTbl[] = {
+     {"vkCmdResetEvent", offsetof(DeviceVtbl, CmdResetEvent)},
+     {"vkCmdResetQueryPool", offsetof(DeviceVtbl, CmdResetQueryPool)},
+     {"vkCmdResolveImage", offsetof(DeviceVtbl, CmdResolveImage)},
++    {"vkCmdSetBlendConstants", offsetof(DeviceVtbl, CmdSetBlendConstants)},
++    {"vkCmdSetDepthBias", offsetof(DeviceVtbl, CmdSetDepthBias)},
++    {"vkCmdSetDepthBounds", offsetof(DeviceVtbl, CmdSetDepthBounds)},
+     {"vkCmdSetEvent", offsetof(DeviceVtbl, CmdSetEvent)},
++    {"vkCmdSetLineWidth", offsetof(DeviceVtbl, CmdSetLineWidth)},
++    {"vkCmdSetScissor", offsetof(DeviceVtbl, CmdSetScissor)},
++    {"vkCmdSetStencilCompareMask", offsetof(DeviceVtbl, CmdSetStencilCompareMask)},
++    {"vkCmdSetStencilReference", offsetof(DeviceVtbl, CmdSetStencilReference)},
++    {"vkCmdSetStencilWriteMask", offsetof(DeviceVtbl, CmdSetStencilWriteMask)},
++    {"vkCmdSetViewport", offsetof(DeviceVtbl, CmdSetViewport)},
+     {"vkCmdUpdateBuffer", offsetof(DeviceVtbl, CmdUpdateBuffer)},
+     {"vkCmdWaitEvents", offsetof(DeviceVtbl, CmdWaitEvents)},
+     {"vkCmdWriteTimestamp", offsetof(DeviceVtbl, CmdWriteTimestamp)},
+-    {"vkCreateAttachmentView", offsetof(DeviceVtbl, CreateAttachmentView)},
+     {"vkCreateBuffer", offsetof(DeviceVtbl, CreateBuffer)},
+     {"vkCreateBufferView", offsetof(DeviceVtbl, CreateBufferView)},
+     {"vkCreateCommandBuffer", offsetof(DeviceVtbl, CreateCommandBuffer)},
+@@ -281,10 +276,6 @@ const NameOffsetEntry kDeviceOffsetTbl[] = {
+     {"vkCreateComputePipelines", offsetof(DeviceVtbl, CreateComputePipelines)},
+     {"vkCreateDescriptorPool", offsetof(DeviceVtbl, CreateDescriptorPool)},
+     {"vkCreateDescriptorSetLayout", offsetof(DeviceVtbl, CreateDescriptorSetLayout)},
+-    {"vkCreateDynamicColorBlendState", offsetof(DeviceVtbl, CreateDynamicColorBlendState)},
+-    {"vkCreateDynamicDepthStencilState", offsetof(DeviceVtbl, CreateDynamicDepthStencilState)},
+-    {"vkCreateDynamicRasterState", offsetof(DeviceVtbl, CreateDynamicRasterState)},
+-    {"vkCreateDynamicViewportState", offsetof(DeviceVtbl, CreateDynamicViewportState)},
+     {"vkCreateEvent", offsetof(DeviceVtbl, CreateEvent)},
+     {"vkCreateFence", offsetof(DeviceVtbl, CreateFence)},
+     {"vkCreateFramebuffer", offsetof(DeviceVtbl, CreateFramebuffer)},
+@@ -299,7 +290,6 @@ const NameOffsetEntry kDeviceOffsetTbl[] = {
+     {"vkCreateSemaphore", offsetof(DeviceVtbl, CreateSemaphore)},
+     {"vkCreateShader", offsetof(DeviceVtbl, CreateShader)},
+     {"vkCreateShaderModule", offsetof(DeviceVtbl, CreateShaderModule)},
+-    {"vkDestroyAttachmentView", offsetof(DeviceVtbl, DestroyAttachmentView)},
+     {"vkDestroyBuffer", offsetof(DeviceVtbl, DestroyBuffer)},
+     {"vkDestroyBufferView", offsetof(DeviceVtbl, DestroyBufferView)},
+     {"vkDestroyCommandBuffer", offsetof(DeviceVtbl, DestroyCommandBuffer)},
+@@ -307,10 +297,6 @@ const NameOffsetEntry kDeviceOffsetTbl[] = {
+     {"vkDestroyDescriptorPool", offsetof(DeviceVtbl, DestroyDescriptorPool)},
+     {"vkDestroyDescriptorSetLayout", offsetof(DeviceVtbl, DestroyDescriptorSetLayout)},
+     {"vkDestroyDevice", offsetof(DeviceVtbl, DestroyDevice)},
+-    {"vkDestroyDynamicColorBlendState", offsetof(DeviceVtbl, DestroyDynamicColorBlendState)},
+-    {"vkDestroyDynamicDepthStencilState", offsetof(DeviceVtbl, DestroyDynamicDepthStencilState)},
+-    {"vkDestroyDynamicRasterState", offsetof(DeviceVtbl, DestroyDynamicRasterState)},
+-    {"vkDestroyDynamicViewportState", offsetof(DeviceVtbl, DestroyDynamicViewportState)},
+     {"vkDestroyEvent", offsetof(DeviceVtbl, DestroyEvent)},
+     {"vkDestroyFence", offsetof(DeviceVtbl, DestroyFence)},
+     {"vkDestroyFramebuffer", offsetof(DeviceVtbl, DestroyFramebuffer)},
+@@ -453,7 +439,6 @@ PFN_vkVoidFunction GetSpecificDeviceProcAddr(const DeviceVtbl* vtbl,
+         const_cast<unsigned char*>(base) + entry->offset);
+ }
+ 
+-// TODO: remove need for instance_next
+ bool LoadInstanceVtbl(VkInstance instance,
+                       VkInstance instance_next,
+                       PFN_vkGetInstanceProcAddr get_proc_addr,
+@@ -484,14 +469,9 @@ bool LoadInstanceVtbl(VkInstance instance,
+         ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceProperties");
+         success = false;
+     }
+-    vtbl.GetPhysicalDeviceQueueCount = reinterpret_cast<PFN_vkGetPhysicalDeviceQueueCount>(get_proc_addr(instance, "vkGetPhysicalDeviceQueueCount"));
+-    if (UNLIKELY(!vtbl.GetPhysicalDeviceQueueCount)) {
+-        ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceQueueCount");
+-        success = false;
+-    }
+-    vtbl.GetPhysicalDeviceQueueProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceQueueProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceQueueProperties"));
+-    if (UNLIKELY(!vtbl.GetPhysicalDeviceQueueProperties)) {
+-        ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceQueueProperties");
++    vtbl.GetPhysicalDeviceQueueFamilyProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceQueueFamilyProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceQueueFamilyProperties"));
++    if (UNLIKELY(!vtbl.GetPhysicalDeviceQueueFamilyProperties)) {
++        ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceQueueFamilyProperties");
+         success = false;
+     }
+     vtbl.GetPhysicalDeviceMemoryProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceMemoryProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceMemoryProperties"));
+@@ -514,24 +494,19 @@ bool LoadInstanceVtbl(VkInstance instance,
+         ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceImageFormatProperties");
+         success = false;
+     }
+-    vtbl.GetPhysicalDeviceLimits = reinterpret_cast<PFN_vkGetPhysicalDeviceLimits>(get_proc_addr(instance, "vkGetPhysicalDeviceLimits"));
+-    if (UNLIKELY(!vtbl.GetPhysicalDeviceLimits)) {
+-        ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceLimits");
+-        success = false;
+-    }
+     vtbl.CreateDevice = reinterpret_cast<PFN_vkCreateDevice>(get_proc_addr(instance, "vkCreateDevice"));
+     if (UNLIKELY(!vtbl.CreateDevice)) {
+         ALOGE("missing instance proc: %s", "vkCreateDevice");
+         success = false;
+     }
+-    vtbl.GetPhysicalDeviceLayerProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceLayerProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceLayerProperties"));
+-    if (UNLIKELY(!vtbl.GetPhysicalDeviceLayerProperties)) {
+-        ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceLayerProperties");
++    vtbl.EnumerateDeviceLayerProperties = reinterpret_cast<PFN_vkEnumerateDeviceLayerProperties>(get_proc_addr(instance, "vkEnumerateDeviceLayerProperties"));
++    if (UNLIKELY(!vtbl.EnumerateDeviceLayerProperties)) {
++        ALOGE("missing instance proc: %s", "vkEnumerateDeviceLayerProperties");
+         success = false;
+     }
+-    vtbl.GetPhysicalDeviceExtensionProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceExtensionProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceExtensionProperties"));
+-    if (UNLIKELY(!vtbl.GetPhysicalDeviceExtensionProperties)) {
+-        ALOGE("missing instance proc: %s", "vkGetPhysicalDeviceExtensionProperties");
++    vtbl.EnumerateDeviceExtensionProperties = reinterpret_cast<PFN_vkEnumerateDeviceExtensionProperties>(get_proc_addr(instance, "vkEnumerateDeviceExtensionProperties"));
++    if (UNLIKELY(!vtbl.EnumerateDeviceExtensionProperties)) {
++        ALOGE("missing instance proc: %s", "vkEnumerateDeviceExtensionProperties");
+         success = false;
+     }
+     vtbl.GetPhysicalDeviceSparseImageFormatProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceSparseImageFormatProperties>(get_proc_addr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties"));
+@@ -784,16 +759,6 @@ bool LoadDeviceVtbl(VkDevice device,
+         ALOGE("missing device proc: %s", "vkDestroyImageView");
+         success = false;
+     }
+-    vtbl.CreateAttachmentView = reinterpret_cast<PFN_vkCreateAttachmentView>(get_proc_addr(device, "vkCreateAttachmentView"));
+-    if (UNLIKELY(!vtbl.CreateAttachmentView)) {
+-        ALOGE("missing device proc: %s", "vkCreateAttachmentView");
+-        success = false;
+-    }
+-    vtbl.DestroyAttachmentView = reinterpret_cast<PFN_vkDestroyAttachmentView>(get_proc_addr(device, "vkDestroyAttachmentView"));
+-    if (UNLIKELY(!vtbl.DestroyAttachmentView)) {
+-        ALOGE("missing device proc: %s", "vkDestroyAttachmentView");
+-        success = false;
+-    }
+     vtbl.CreateShaderModule = reinterpret_cast<PFN_vkCreateShaderModule>(get_proc_addr(device, "vkCreateShaderModule"));
+     if (UNLIKELY(!vtbl.CreateShaderModule)) {
+         ALOGE("missing device proc: %s", "vkCreateShaderModule");
+@@ -914,46 +879,6 @@ bool LoadDeviceVtbl(VkDevice device,
+         ALOGE("missing device proc: %s", "vkUpdateDescriptorSets");
+         success = false;
+     }
+-    vtbl.CreateDynamicViewportState = reinterpret_cast<PFN_vkCreateDynamicViewportState>(get_proc_addr(device, "vkCreateDynamicViewportState"));
+-    if (UNLIKELY(!vtbl.CreateDynamicViewportState)) {
+-        ALOGE("missing device proc: %s", "vkCreateDynamicViewportState");
+-        success = false;
+-    }
+-    vtbl.DestroyDynamicViewportState = reinterpret_cast<PFN_vkDestroyDynamicViewportState>(get_proc_addr(device, "vkDestroyDynamicViewportState"));
+-    if (UNLIKELY(!vtbl.DestroyDynamicViewportState)) {
+-        ALOGE("missing device proc: %s", "vkDestroyDynamicViewportState");
+-        success = false;
+-    }
+-    vtbl.CreateDynamicRasterState = reinterpret_cast<PFN_vkCreateDynamicRasterState>(get_proc_addr(device, "vkCreateDynamicRasterState"));
+-    if (UNLIKELY(!vtbl.CreateDynamicRasterState)) {
+-        ALOGE("missing device proc: %s", "vkCreateDynamicRasterState");
+-        success = false;
+-    }
+-    vtbl.DestroyDynamicRasterState = reinterpret_cast<PFN_vkDestroyDynamicRasterState>(get_proc_addr(device, "vkDestroyDynamicRasterState"));
+-    if (UNLIKELY(!vtbl.DestroyDynamicRasterState)) {
+-        ALOGE("missing device proc: %s", "vkDestroyDynamicRasterState");
+-        success = false;
+-    }
+-    vtbl.CreateDynamicColorBlendState = reinterpret_cast<PFN_vkCreateDynamicColorBlendState>(get_proc_addr(device, "vkCreateDynamicColorBlendState"));
+-    if (UNLIKELY(!vtbl.CreateDynamicColorBlendState)) {
+-        ALOGE("missing device proc: %s", "vkCreateDynamicColorBlendState");
+-        success = false;
+-    }
+-    vtbl.DestroyDynamicColorBlendState = reinterpret_cast<PFN_vkDestroyDynamicColorBlendState>(get_proc_addr(device, "vkDestroyDynamicColorBlendState"));
+-    if (UNLIKELY(!vtbl.DestroyDynamicColorBlendState)) {
+-        ALOGE("missing device proc: %s", "vkDestroyDynamicColorBlendState");
+-        success = false;
+-    }
+-    vtbl.CreateDynamicDepthStencilState = reinterpret_cast<PFN_vkCreateDynamicDepthStencilState>(get_proc_addr(device, "vkCreateDynamicDepthStencilState"));
+-    if (UNLIKELY(!vtbl.CreateDynamicDepthStencilState)) {
+-        ALOGE("missing device proc: %s", "vkCreateDynamicDepthStencilState");
+-        success = false;
+-    }
+-    vtbl.DestroyDynamicDepthStencilState = reinterpret_cast<PFN_vkDestroyDynamicDepthStencilState>(get_proc_addr(device, "vkDestroyDynamicDepthStencilState"));
+-    if (UNLIKELY(!vtbl.DestroyDynamicDepthStencilState)) {
+-        ALOGE("missing device proc: %s", "vkDestroyDynamicDepthStencilState");
+-        success = false;
+-    }
+     vtbl.CreateFramebuffer = reinterpret_cast<PFN_vkCreateFramebuffer>(get_proc_addr(device, "vkCreateFramebuffer"));
+     if (UNLIKELY(!vtbl.CreateFramebuffer)) {
+         ALOGE("missing device proc: %s", "vkCreateFramebuffer");
+@@ -1024,24 +949,49 @@ bool LoadDeviceVtbl(VkDevice device,
+         ALOGE("missing device proc: %s", "vkCmdBindPipeline");
+         success = false;
+     }
+-    vtbl.CmdBindDynamicViewportState = reinterpret_cast<PFN_vkCmdBindDynamicViewportState>(get_proc_addr(device, "vkCmdBindDynamicViewportState"));
+-    if (UNLIKELY(!vtbl.CmdBindDynamicViewportState)) {
+-        ALOGE("missing device proc: %s", "vkCmdBindDynamicViewportState");
++    vtbl.CmdSetViewport = reinterpret_cast<PFN_vkCmdSetViewport>(get_proc_addr(device, "vkCmdSetViewport"));
++    if (UNLIKELY(!vtbl.CmdSetViewport)) {
++        ALOGE("missing device proc: %s", "vkCmdSetViewport");
++        success = false;
++    }
++    vtbl.CmdSetScissor = reinterpret_cast<PFN_vkCmdSetScissor>(get_proc_addr(device, "vkCmdSetScissor"));
++    if (UNLIKELY(!vtbl.CmdSetScissor)) {
++        ALOGE("missing device proc: %s", "vkCmdSetScissor");
++        success = false;
++    }
++    vtbl.CmdSetLineWidth = reinterpret_cast<PFN_vkCmdSetLineWidth>(get_proc_addr(device, "vkCmdSetLineWidth"));
++    if (UNLIKELY(!vtbl.CmdSetLineWidth)) {
++        ALOGE("missing device proc: %s", "vkCmdSetLineWidth");
++        success = false;
++    }
++    vtbl.CmdSetDepthBias = reinterpret_cast<PFN_vkCmdSetDepthBias>(get_proc_addr(device, "vkCmdSetDepthBias"));
++    if (UNLIKELY(!vtbl.CmdSetDepthBias)) {
++        ALOGE("missing device proc: %s", "vkCmdSetDepthBias");
++        success = false;
++    }
++    vtbl.CmdSetBlendConstants = reinterpret_cast<PFN_vkCmdSetBlendConstants>(get_proc_addr(device, "vkCmdSetBlendConstants"));
++    if (UNLIKELY(!vtbl.CmdSetBlendConstants)) {
++        ALOGE("missing device proc: %s", "vkCmdSetBlendConstants");
++        success = false;
++    }
++    vtbl.CmdSetDepthBounds = reinterpret_cast<PFN_vkCmdSetDepthBounds>(get_proc_addr(device, "vkCmdSetDepthBounds"));
++    if (UNLIKELY(!vtbl.CmdSetDepthBounds)) {
++        ALOGE("missing device proc: %s", "vkCmdSetDepthBounds");
+         success = false;
+     }
+-    vtbl.CmdBindDynamicRasterState = reinterpret_cast<PFN_vkCmdBindDynamicRasterState>(get_proc_addr(device, "vkCmdBindDynamicRasterState"));
+-    if (UNLIKELY(!vtbl.CmdBindDynamicRasterState)) {
+-        ALOGE("missing device proc: %s", "vkCmdBindDynamicRasterState");
++    vtbl.CmdSetStencilCompareMask = reinterpret_cast<PFN_vkCmdSetStencilCompareMask>(get_proc_addr(device, "vkCmdSetStencilCompareMask"));
++    if (UNLIKELY(!vtbl.CmdSetStencilCompareMask)) {
++        ALOGE("missing device proc: %s", "vkCmdSetStencilCompareMask");
+         success = false;
+     }
+-    vtbl.CmdBindDynamicColorBlendState = reinterpret_cast<PFN_vkCmdBindDynamicColorBlendState>(get_proc_addr(device, "vkCmdBindDynamicColorBlendState"));
+-    if (UNLIKELY(!vtbl.CmdBindDynamicColorBlendState)) {
+-        ALOGE("missing device proc: %s", "vkCmdBindDynamicColorBlendState");
++    vtbl.CmdSetStencilWriteMask = reinterpret_cast<PFN_vkCmdSetStencilWriteMask>(get_proc_addr(device, "vkCmdSetStencilWriteMask"));
++    if (UNLIKELY(!vtbl.CmdSetStencilWriteMask)) {
++        ALOGE("missing device proc: %s", "vkCmdSetStencilWriteMask");
+         success = false;
+     }
+-    vtbl.CmdBindDynamicDepthStencilState = reinterpret_cast<PFN_vkCmdBindDynamicDepthStencilState>(get_proc_addr(device, "vkCmdBindDynamicDepthStencilState"));
+-    if (UNLIKELY(!vtbl.CmdBindDynamicDepthStencilState)) {
+-        ALOGE("missing device proc: %s", "vkCmdBindDynamicDepthStencilState");
++    vtbl.CmdSetStencilReference = reinterpret_cast<PFN_vkCmdSetStencilReference>(get_proc_addr(device, "vkCmdSetStencilReference"));
++    if (UNLIKELY(!vtbl.CmdSetStencilReference)) {
++        ALOGE("missing device proc: %s", "vkCmdSetStencilReference");
+         success = false;
+     }
+     vtbl.CmdBindDescriptorSets = reinterpret_cast<PFN_vkCmdBindDescriptorSets>(get_proc_addr(device, "vkCmdBindDescriptorSets"));
+diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
+index 97ceb4a..f608c57 100644
+--- a/vulkan/libvulkan/loader.cpp
++++ b/vulkan/libvulkan/loader.cpp
+@@ -257,12 +257,12 @@ void FindLayersInDirectory(
+             }
+ 
+             // Get Layers in so
+-            PFN_vkGetGlobalLayerProperties get_layer_properties =
+-                reinterpret_cast<PFN_vkGetGlobalLayerProperties>(
+-                    dlsym(layer_handle, "vkGetGlobalLayerProperties"));
++            PFN_vkEnumerateInstanceLayerProperties get_layer_properties =
++                reinterpret_cast<PFN_vkEnumerateInstanceLayerProperties>(
++                    dlsym(layer_handle, "vkEnumerateInstanceLayerProperties"));
+             if (!get_layer_properties) {
+                 ALOGE(
+-                    "%s failed to find vkGetGlobalLayerProperties with "
++                    "%s failed to find vkEnumerateInstanceLayerProperties with "
+                     "error %s; Skipping",
+                     entry->d_name, dlerror());
+                 dlclose(layer_handle);
+@@ -353,7 +353,7 @@ void LogDebugMessageCallback(VkFlags message_flags,
+ // "Bottom" functions. These are called at the end of the instance dispatch
+ // chain.
+ 
+-VkResult DestroyInstanceBottom(VkInstance instance) {
++void DestroyInstanceBottom(VkInstance instance) {
+     // These checks allow us to call DestroyInstanceBottom from any error path
+     // in CreateInstanceBottom, before the driver instance is fully initialized.
+     if (instance->drv.vtbl.instance != VK_NULL_HANDLE &&
+@@ -372,7 +372,6 @@ VkResult DestroyInstanceBottom(VkInstance instance) {
+     const VkAllocCallbacks* alloc = instance->alloc;
+     instance->~VkInstance_T();
+     alloc->pfnFree(alloc->pUserData, instance);
+-    return VK_SUCCESS;
+ }
+ 
+ VkResult CreateInstanceBottom(const VkInstanceCreateInfo* create_info,
+@@ -484,16 +483,11 @@ VkResult GetPhysicalDeviceImageFormatPropertiesBottom(
+     VkImageType type,
+     VkImageTiling tiling,
+     VkImageUsageFlags usage,
++    VkImageCreateFlags flags,
+     VkImageFormatProperties* properties) {
+     return GetVtbl(pdev)
+         ->instance->drv.vtbl.GetPhysicalDeviceImageFormatProperties(
+-            pdev, format, type, tiling, usage, properties);
+-}
+-
+-VkResult GetPhysicalDeviceLimitsBottom(VkPhysicalDevice pdev,
+-                                       VkPhysicalDeviceLimits* limits) {
+-    return GetVtbl(pdev)
+-        ->instance->drv.vtbl.GetPhysicalDeviceLimits(pdev, limits);
++            pdev, format, type, tiling, usage, flags, properties);
+ }
+ 
+ VkResult GetPhysicalDevicePropertiesBottom(
+@@ -503,18 +497,13 @@ VkResult GetPhysicalDevicePropertiesBottom(
+         ->instance->drv.vtbl.GetPhysicalDeviceProperties(pdev, properties);
+ }
+ 
+-VkResult GetPhysicalDeviceQueueCountBottom(VkPhysicalDevice pdev,
+-                                           uint32_t* count) {
+-    return GetVtbl(pdev)
+-        ->instance->drv.vtbl.GetPhysicalDeviceQueueCount(pdev, count);
+-}
+-
+-VkResult GetPhysicalDeviceQueuePropertiesBottom(
++VkResult GetPhysicalDeviceQueueFamilyPropertiesBottom(
+     VkPhysicalDevice pdev,
+-    uint32_t count,
+-    VkPhysicalDeviceQueueProperties* properties) {
+-    return GetVtbl(pdev)->instance->drv.vtbl.GetPhysicalDeviceQueueProperties(
+-        pdev, count, properties);
++    uint32_t* pCount,
++    VkQueueFamilyProperties* properties) {
++    return GetVtbl(pdev)
++        ->instance->drv.vtbl.GetPhysicalDeviceQueueFamilyProperties(
++            pdev, pCount, properties);
+ }
+ 
+ VkResult GetPhysicalDeviceMemoryPropertiesBottom(
+@@ -618,21 +607,20 @@ VkResult CreateDeviceBottom(VkPhysicalDevice pdev,
+     return VK_SUCCESS;
+ }
+ 
+-VkResult GetPhysicalDeviceExtensionPropertiesBottom(
++VkResult EnumerateDeviceExtensionPropertiesBottom(
+     VkPhysicalDevice pdev,
+     const char* layer_name,
+     uint32_t* properties_count,
+     VkExtensionProperties* properties) {
+     // TODO: what are we supposed to do with layer_name here?
+-    return GetVtbl(pdev)
+-        ->instance->drv.vtbl.GetPhysicalDeviceExtensionProperties(
+-            pdev, layer_name, properties_count, properties);
++    return GetVtbl(pdev)->instance->drv.vtbl.EnumerateDeviceExtensionProperties(
++        pdev, layer_name, properties_count, properties);
+ }
+ 
+-VkResult GetPhysicalDeviceLayerPropertiesBottom(VkPhysicalDevice pdev,
+-                                                uint32_t* properties_count,
+-                                                VkLayerProperties* properties) {
+-    return GetVtbl(pdev)->instance->drv.vtbl.GetPhysicalDeviceLayerProperties(
++VkResult EnumerateDeviceLayerPropertiesBottom(VkPhysicalDevice pdev,
++                                              uint32_t* properties_count,
++                                              VkLayerProperties* properties) {
++    return GetVtbl(pdev)->instance->drv.vtbl.EnumerateDeviceLayerProperties(
+         pdev, properties_count, properties);
+ }
+ 
+@@ -663,14 +651,12 @@ const InstanceVtbl kBottomInstanceFunctions = {
+     .GetPhysicalDeviceFeatures = GetPhysicalDeviceFeaturesBottom,
+     .GetPhysicalDeviceFormatProperties = GetPhysicalDeviceFormatPropertiesBottom,
+     .GetPhysicalDeviceImageFormatProperties = GetPhysicalDeviceImageFormatPropertiesBottom,
+-    .GetPhysicalDeviceLimits = GetPhysicalDeviceLimitsBottom,
+     .GetPhysicalDeviceProperties = GetPhysicalDevicePropertiesBottom,
+-    .GetPhysicalDeviceQueueCount = GetPhysicalDeviceQueueCountBottom,
+-    .GetPhysicalDeviceQueueProperties = GetPhysicalDeviceQueuePropertiesBottom,
++    .GetPhysicalDeviceQueueFamilyProperties = GetPhysicalDeviceQueueFamilyPropertiesBottom,
+     .GetPhysicalDeviceMemoryProperties = GetPhysicalDeviceMemoryPropertiesBottom,
+     .CreateDevice = CreateDeviceBottom,
+-    .GetPhysicalDeviceExtensionProperties = GetPhysicalDeviceExtensionPropertiesBottom,
+-    .GetPhysicalDeviceLayerProperties = GetPhysicalDeviceLayerPropertiesBottom,
++    .EnumerateDeviceExtensionProperties = EnumerateDeviceExtensionPropertiesBottom,
++    .EnumerateDeviceLayerProperties = EnumerateDeviceLayerPropertiesBottom,
+     .GetPhysicalDeviceSparseImageFormatProperties = GetPhysicalDeviceSparseImageFormatPropertiesBottom,
+     .GetPhysicalDeviceSurfaceSupportKHR = GetPhysicalDeviceSurfaceSupportKHR,
+     // clang-format on
+@@ -701,30 +687,27 @@ PFN_vkVoidFunction GetInstanceProcAddrBottom(VkInstance, const char* name) {
+ 
+ namespace vulkan {
+ 
+-VkResult GetGlobalExtensionProperties(const char* /*layer_name*/,
+-                                      uint32_t* count,
+-                                      VkExtensionProperties* /*properties*/) {
+-    if (!count)
+-        return VK_ERROR_INVALID_POINTER;
++VkResult EnumerateInstanceExtensionProperties(
++    const char* /*layer_name*/,
++    uint32_t* count,
++    VkExtensionProperties* /*properties*/) {
+     if (!EnsureInitialized())
+-        return VK_ERROR_UNAVAILABLE;
++        return VK_ERROR_INITIALIZATION_FAILED;
+ 
+     // TODO: not yet implemented
+-    ALOGW("vkGetGlobalExtensionProperties not implemented");
++    ALOGW("vkEnumerateInstanceExtensionProperties not implemented");
+ 
+     *count = 0;
+     return VK_SUCCESS;
+ }
+ 
+-VkResult GetGlobalLayerProperties(uint32_t* count,
+-                                  VkLayerProperties* /*properties*/) {
+-    if (!count)
+-        return VK_ERROR_INVALID_POINTER;
++VkResult EnumerateInstanceLayerProperties(uint32_t* count,
++                                          VkLayerProperties* /*properties*/) {
+     if (!EnsureInitialized())
+-        return VK_ERROR_UNAVAILABLE;
++        return VK_ERROR_INITIALIZATION_FAILED;
+ 
+     // TODO: not yet implemented
+-    ALOGW("vkGetGlobalLayerProperties not implemented");
++    ALOGW("vkEnumerateInstanceLayerProperties not implemented");
+ 
+     *count = 0;
+     return VK_SUCCESS;
+@@ -735,7 +718,7 @@ VkResult CreateInstance(const VkInstanceCreateInfo* create_info,
+     VkResult result;
+ 
+     if (!EnsureInitialized())
+-        return VK_ERROR_UNAVAILABLE;
++        return VK_ERROR_INITIALIZATION_FAILED;
+ 
+     VkInstanceCreateInfo local_create_info = *create_info;
+     if (!local_create_info.pAllocCb)
+diff --git a/vulkan/libvulkan/loader.h b/vulkan/libvulkan/loader.h
+index 5933eb2..ef3d1f1 100644
+--- a/vulkan/libvulkan/loader.h
++++ b/vulkan/libvulkan/loader.h
+@@ -43,14 +43,12 @@ struct InstanceVtbl {
+     PFN_vkGetPhysicalDeviceFeatures GetPhysicalDeviceFeatures;
+     PFN_vkGetPhysicalDeviceFormatProperties GetPhysicalDeviceFormatProperties;
+     PFN_vkGetPhysicalDeviceImageFormatProperties GetPhysicalDeviceImageFormatProperties;
+-    PFN_vkGetPhysicalDeviceLimits GetPhysicalDeviceLimits;
+     PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties;
+-    PFN_vkGetPhysicalDeviceQueueCount GetPhysicalDeviceQueueCount;
+-    PFN_vkGetPhysicalDeviceQueueProperties GetPhysicalDeviceQueueProperties;
++    PFN_vkGetPhysicalDeviceQueueFamilyProperties GetPhysicalDeviceQueueFamilyProperties;
+     PFN_vkGetPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties;
+     PFN_vkCreateDevice CreateDevice;
+-    PFN_vkGetPhysicalDeviceExtensionProperties GetPhysicalDeviceExtensionProperties;
+-    PFN_vkGetPhysicalDeviceLayerProperties GetPhysicalDeviceLayerProperties;
++    PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties;
++    PFN_vkEnumerateDeviceLayerProperties EnumerateDeviceLayerProperties;
+     PFN_vkGetPhysicalDeviceSparseImageFormatProperties GetPhysicalDeviceSparseImageFormatProperties;
+ 
+     // Layers and loader only, not implemented by drivers
+@@ -101,8 +99,6 @@ struct DeviceVtbl {
+     PFN_vkGetImageSubresourceLayout GetImageSubresourceLayout;
+     PFN_vkCreateImageView CreateImageView;
+     PFN_vkDestroyImageView DestroyImageView;
+-    PFN_vkCreateAttachmentView CreateAttachmentView;
+-    PFN_vkDestroyAttachmentView DestroyAttachmentView;
+     PFN_vkCreateShaderModule CreateShaderModule;
+     PFN_vkDestroyShaderModule DestroyShaderModule;
+     PFN_vkCreateShader CreateShader;
+@@ -127,14 +123,6 @@ struct DeviceVtbl {
+     PFN_vkAllocDescriptorSets AllocDescriptorSets;
+     PFN_vkFreeDescriptorSets FreeDescriptorSets;
+     PFN_vkUpdateDescriptorSets UpdateDescriptorSets;
+-    PFN_vkCreateDynamicViewportState CreateDynamicViewportState;
+-    PFN_vkDestroyDynamicViewportState DestroyDynamicViewportState;
+-    PFN_vkCreateDynamicRasterState CreateDynamicRasterState;
+-    PFN_vkDestroyDynamicRasterState DestroyDynamicRasterState;
+-    PFN_vkCreateDynamicColorBlendState CreateDynamicColorBlendState;
+-    PFN_vkDestroyDynamicColorBlendState DestroyDynamicColorBlendState;
+-    PFN_vkCreateDynamicDepthStencilState CreateDynamicDepthStencilState;
+-    PFN_vkDestroyDynamicDepthStencilState DestroyDynamicDepthStencilState;
+     PFN_vkCreateFramebuffer CreateFramebuffer;
+     PFN_vkDestroyFramebuffer DestroyFramebuffer;
+     PFN_vkCreateRenderPass CreateRenderPass;
+@@ -158,10 +146,15 @@ struct DeviceVtbl {
+     PFN_vkEndCommandBuffer EndCommandBuffer;
+     PFN_vkResetCommandBuffer ResetCommandBuffer;
+     PFN_vkCmdBindPipeline CmdBindPipeline;
+-    PFN_vkCmdBindDynamicViewportState CmdBindDynamicViewportState;
+-    PFN_vkCmdBindDynamicRasterState CmdBindDynamicRasterState;
+-    PFN_vkCmdBindDynamicColorBlendState CmdBindDynamicColorBlendState;
+-    PFN_vkCmdBindDynamicDepthStencilState CmdBindDynamicDepthStencilState;
++    PFN_vkCmdSetViewport CmdSetViewport;
++    PFN_vkCmdSetScissor CmdSetScissor;
++    PFN_vkCmdSetLineWidth CmdSetLineWidth;
++    PFN_vkCmdSetDepthBias CmdSetDepthBias;
++    PFN_vkCmdSetBlendConstants CmdSetBlendConstants;
++    PFN_vkCmdSetDepthBounds CmdSetDepthBounds;
++    PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask;
++    PFN_vkCmdSetStencilWriteMask CmdSetStencilWriteMask;
++    PFN_vkCmdSetStencilReference CmdSetStencilReference;
+     PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets;
+     PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer;
+     PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers;
+@@ -216,11 +209,12 @@ struct DeviceVtbl {
+ // -----------------------------------------------------------------------------
+ // loader.cpp
+ 
+-VkResult GetGlobalExtensionProperties(const char* layer_name,
+-                                      uint32_t* count,
+-                                      VkExtensionProperties* properties);
+-VkResult GetGlobalLayerProperties(uint32_t* count,
+-                                  VkLayerProperties* properties);
++VkResult EnumerateInstanceExtensionProperties(
++    const char* layer_name,
++    uint32_t* count,
++    VkExtensionProperties* properties);
++VkResult EnumerateInstanceLayerProperties(uint32_t* count,
++                                          VkLayerProperties* properties);
+ VkResult CreateInstance(const VkInstanceCreateInfo* create_info,
+                         VkInstance* instance);
+ PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* name);
+diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp
+index af3d585..6320192 100644
+--- a/vulkan/libvulkan/swapchain.cpp
++++ b/vulkan/libvulkan/swapchain.cpp
+@@ -27,6 +27,11 @@
+ 
+ using namespace vulkan;
+ 
++// TODO(jessehall): Currently we don't have a good error code for when a native
++// window operation fails. Just returning INITIALIZATION_FAILED for now. Later
++// versions (post SDK 0.9) of the API/extension have a better error code.
++// When updating to that version, audit all error returns.
++
+ namespace {
+ 
+ // ----------------------------------------------------------------------------
+@@ -118,8 +123,11 @@ VkResult GetPhysicalDeviceSurfaceSupportKHR(
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wold-style-cast"
+ #pragma clang diagnostic ignored "-Wsign-conversion"
+-    if (surface_desc->sType != VK_STRUCTURE_TYPE_SURFACE_DESCRIPTION_WINDOW_KHR)
+-        return VK_ERROR_INVALID_VALUE;
++    ALOGE_IF(
++        surface_desc->sType != VK_STRUCTURE_TYPE_SURFACE_DESCRIPTION_WINDOW_KHR,
++        "vkGetPhysicalDeviceSurfaceSupportKHR: pSurfaceDescription->sType=%#x "
++        "not supported",
++        surface_desc->sType);
+ #pragma clang diagnostic pop
+ 
+     const VkSurfaceDescriptionWindowKHR* window_desc =
+@@ -170,7 +178,7 @@ VkResult GetSurfacePropertiesKHR(VkDevice /*device*/,
+     } else if (err != 0) {
+         // TODO(jessehall): Improve error reporting. Can we enumerate possible
+         // errors and translate them to valid Vulkan result codes?
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+ 
+     int width, height;
+@@ -180,7 +188,7 @@ VkResult GetSurfacePropertiesKHR(VkDevice /*device*/,
+               strerror(-err), err);
+         if (disconnect)
+             native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+     err = window->query(window, NATIVE_WINDOW_DEFAULT_HEIGHT, &height);
+     if (err != 0) {
+@@ -188,7 +196,7 @@ VkResult GetSurfacePropertiesKHR(VkDevice /*device*/,
+               strerror(-err), err);
+         if (disconnect)
+             native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+ 
+     if (disconnect)
+@@ -311,7 +319,7 @@ VkResult CreateSwapchainKHR(VkDevice device,
+         // errors and translate them to valid Vulkan result codes?
+         ALOGE("native_window_api_connect() failed: %s (%d)", strerror(-err),
+               err);
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+ 
+     err = native_window_set_buffers_dimensions(window.get(),
+@@ -324,7 +332,7 @@ VkResult CreateSwapchainKHR(VkDevice device,
+               create_info->imageExtent.width, create_info->imageExtent.height,
+               strerror(-err), err);
+         native_window_api_disconnect(window.get(), NATIVE_WINDOW_API_EGL);
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+ 
+     uint32_t min_undequeued_buffers;
+@@ -335,7 +343,7 @@ VkResult CreateSwapchainKHR(VkDevice device,
+         // errors and translate them to valid Vulkan result codes?
+         ALOGE("window->query failed: %s (%d)", strerror(-err), err);
+         native_window_api_disconnect(window.get(), NATIVE_WINDOW_API_EGL);
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+     uint32_t num_images =
+         (create_info->minImageCount - 1) + min_undequeued_buffers;
+@@ -346,7 +354,7 @@ VkResult CreateSwapchainKHR(VkDevice device,
+         ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err),
+               err);
+         native_window_api_disconnect(window.get(), NATIVE_WINDOW_API_EGL);
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+ 
+     // TODO(jessehall): Do we need to call modify native_window_set_usage()
+@@ -401,7 +409,7 @@ VkResult CreateSwapchainKHR(VkDevice device,
+             // TODO(jessehall): Improve error reporting. Can we enumerate
+             // possible errors and translate them to valid Vulkan result codes?
+             ALOGE("dequeueBuffer[%u] failed: %s (%d)", i, strerror(-err), err);
+-            result = VK_ERROR_UNKNOWN;
++            result = VK_ERROR_INITIALIZATION_FAILED;
+             break;
+         }
+         img.buffer = InitSharedPtr(device, buffer);
+@@ -517,7 +525,7 @@ VkResult AcquireNextImageKHR(VkDevice device,
+         // TODO(jessehall): Improve error reporting. Can we enumerate possible
+         // errors and translate them to valid Vulkan result codes?
+         ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), err);
+-        return VK_ERROR_UNKNOWN;
++        return VK_ERROR_INITIALIZATION_FAILED;
+     }
+ 
+     uint32_t idx;
+@@ -582,20 +590,10 @@ VkResult QueuePresentKHR(VkQueue queue, VkPresentInfoKHR* present_info) {
+         Swapchain& swapchain =
+             *SwapchainFromHandle(present_info->swapchains[sc]);
+         uint32_t image_idx = present_info->imageIndices[sc];
++        Swapchain::Image& img = swapchain.images[image_idx];
+         VkResult result;
+         int err;
+ 
+-        if (image_idx >= swapchain.num_images ||
+-            !swapchain.images[image_idx].dequeued) {
+-            ALOGE(
+-                "invalid image index or image not acquired: swapchain=%u "
+-                "index=%u",
+-                sc, image_idx);
+-            final_result = VK_ERROR_INVALID_VALUE;
+-            continue;
+-        }
+-        Swapchain::Image& img = swapchain.images[image_idx];
+-
+         int fence = -1;
+         result = driver_vtbl.QueueSignalNativeFenceANDROID(queue, &fence);
+         if (result != VK_SUCCESS) {
+@@ -616,7 +614,7 @@ VkResult QueuePresentKHR(VkQueue queue, VkPresentInfoKHR* present_info) {
+             // I guess?
+             ALOGE("queueBuffer failed: %s (%d)", strerror(-err), err);
+             if (final_result == VK_SUCCESS)
+-                final_result = VK_ERROR_UNKNOWN;
++                final_result = VK_ERROR_INITIALIZATION_FAILED;
+             continue;
+         }
+ 
+diff --git a/vulkan/nulldrv/null_driver.cpp b/vulkan/nulldrv/null_driver.cpp
+index 8f65156..a7b66dd 100644
+--- a/vulkan/nulldrv/null_driver.cpp
++++ b/vulkan/nulldrv/null_driver.cpp
+@@ -66,16 +66,11 @@ namespace {
+ // constants but also want implicit conversions to integral types.
+ namespace HandleType {
+ enum Enum {
+-    kAttachmentView,
+     kBufferView,
+     kCmdPool,
+     kDescriptorPool,
+     kDescriptorSet,
+     kDescriptorSetLayout,
+-    kDynamicColorBlendState,
+-    kDynamicDepthStencilState,
+-    kDynamicRasterState,
+-    kDynamicViewportState,
+     kEvent,
+     kFence,
+     kFramebuffer,
+@@ -170,7 +165,8 @@ hwvulkan_device_t nulldrv_device = {
+             .module = &HAL_MODULE_INFO_SYM.common,
+             .close = CloseDevice,
+         },
+-    .GetGlobalExtensionProperties = GetGlobalExtensionProperties,
++    .EnumerateInstanceExtensionProperties =
++        EnumerateInstanceExtensionProperties,
+     .CreateInstance = CreateInstance,
+     .GetInstanceProcAddr = GetInstanceProcAddr};
+ 
+@@ -221,9 +217,9 @@ typename T::HandleType GetHandleToObject(const T* obj) {
+ // -----------------------------------------------------------------------------
+ // Global
+ 
+-VkResult GetGlobalExtensionProperties(const char*,
+-                                      uint32_t* count,
+-                                      VkExtensionProperties*) {
++VkResult EnumerateInstanceExtensionProperties(const char*,
++                                              uint32_t* count,
++                                              VkExtensionProperties*) {
+     *count = 0;
+     return VK_SUCCESS;
+ }
+@@ -271,8 +267,8 @@ VkResult GetPhysicalDeviceProperties(VkPhysicalDevice,
+                                      VkPhysicalDeviceProperties* properties) {
+     properties->apiVersion = VK_API_VERSION;
+     properties->driverVersion = VK_MAKE_VERSION(0, 0, 1);
+-    properties->vendorId = 0xC0DE;
+-    properties->deviceId = 0xCAFE;
++    properties->vendorId = 0;
++    properties->deviceId = 0;
+     properties->deviceType = VK_PHYSICAL_DEVICE_TYPE_OTHER;
+     strcpy(properties->deviceName, "Android Vulkan Null Driver");
+     memset(properties->pipelineCacheUUID, 0,
+@@ -280,6 +276,22 @@ VkResult GetPhysicalDeviceProperties(VkPhysicalDevice,
+     return VK_SUCCESS;
+ }
+ 
++VkResult GetPhysicalDeviceQueueFamilyProperties(
++    VkPhysicalDevice,
++    uint32_t* count,
++    VkQueueFamilyProperties* properties) {
++    if (properties) {
++        if (*count < 1)
++            return VK_INCOMPLETE;
++        properties->queueFlags =
++            VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_DMA_BIT;
++        properties->queueCount = 1;
++        properties->supportsTimestamps = VK_FALSE;
++    }
++    *count = 1;
++    return VK_SUCCESS;
++}
++
+ VkResult GetPhysicalDeviceMemoryProperties(
+     VkPhysicalDevice,
+     VkPhysicalDeviceMemoryProperties* properties) {
+@@ -289,7 +301,7 @@ VkResult GetPhysicalDeviceMemoryProperties(
+     properties->memoryTypes[0].heapIndex = 0;
+     properties->memoryHeapCount = 1;
+     properties->memoryHeaps[0].size = kMaxDeviceMemory;
+-    properties->memoryHeaps[0].flags = VK_MEMORY_HEAP_HOST_LOCAL;
++    properties->memoryHeaps[0].flags = VK_MEMORY_HEAP_HOST_LOCAL_BIT;
+     return VK_SUCCESS;
+ }
+ 
+@@ -470,7 +482,7 @@ VkResult CreateImage(VkDevice device,
+         ALOGE("CreateImage: not yet implemented: type=%d format=%d mips=%u",
+               create_info->imageType, create_info->format,
+               create_info->mipLevels);
+-        return VK_ERROR_UNAVAILABLE;
++        return VK_UNSUPPORTED;
+     }
+ 
+     VkDeviceSize size =
+@@ -512,13 +524,6 @@ VkResult DestroyImage(VkDevice device, VkImage image_handle) {
+ // -----------------------------------------------------------------------------
+ // No-op types
+ 
+-VkResult CreateAttachmentView(VkDevice device,
+-                              const VkAttachmentViewCreateInfo*,
+-                              VkAttachmentView* view) {
+-    *view = AllocHandle(device, HandleType::kAttachmentView);
+-    return VK_SUCCESS;
+-}
+-
+ VkResult CreateBufferView(VkDevice device,
+                           const VkBufferViewCreateInfo*,
+                           VkBufferView* view) {
+@@ -534,8 +539,6 @@ VkResult CreateCommandPool(VkDevice device,
+ }
+ 
+ VkResult CreateDescriptorPool(VkDevice device,
+-                              VkDescriptorPoolUsage,
+-                              uint32_t,
+                               const VkDescriptorPoolCreateInfo*,
+                               VkDescriptorPool* pool) {
+     *pool = AllocHandle(device, HandleType::kDescriptorPool);
+@@ -562,35 +565,6 @@ VkResult CreateDescriptorSetLayout(VkDevice device,
+     return VK_SUCCESS;
+ }
+ 
+-VkResult CreateDynamicColorBlendState(VkDevice device,
+-                                      const VkDynamicColorBlendStateCreateInfo*,
+-                                      VkDynamicColorBlendState* state) {
+-    *state = AllocHandle(device, HandleType::kDynamicColorBlendState);
+-    return VK_SUCCESS;
+-}
+-
+-VkResult CreateDynamicDepthStencilState(
+-    VkDevice device,
+-    const VkDynamicDepthStencilStateCreateInfo*,
+-    VkDynamicDepthStencilState* state) {
+-    *state = AllocHandle(device, HandleType::kDynamicDepthStencilState);
+-    return VK_SUCCESS;
+-}
+-
+-VkResult CreateDynamicRasterState(VkDevice device,
+-                                  const VkDynamicRasterStateCreateInfo*,
+-                                  VkDynamicRasterState* state) {
+-    *state = AllocHandle(device, HandleType::kDynamicRasterState);
+-    return VK_SUCCESS;
+-}
+-
+-VkResult CreateDynamicViewportState(VkDevice device,
+-                                    const VkDynamicViewportStateCreateInfo*,
+-                                    VkDynamicViewportState* state) {
+-    *state = AllocHandle(device, HandleType::kDynamicViewportState);
+-    return VK_SUCCESS;
+-}
+-
+ VkResult CreateEvent(VkDevice device,
+                      const VkEventCreateInfo*,
+                      VkEvent* event) {
+@@ -712,16 +686,6 @@ VkResult QueueSignalNativeFenceANDROID(VkQueue, int* fence) {
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wunused-parameter"
+ 
+-VkResult GetPhysicalDeviceQueueCount(VkPhysicalDevice physicalDevice, uint32_t* pCount) {
+-    ALOGV("TODO: vk%s", __FUNCTION__);
+-    return VK_SUCCESS;
+-}
+-
+-VkResult GetPhysicalDeviceQueueProperties(VkPhysicalDevice physicalDevice, uint32_t count, VkPhysicalDeviceQueueProperties* pQueueProperties) {
+-    ALOGV("TODO: vk%s", __FUNCTION__);
+-    return VK_SUCCESS;
+-}
+-
+ VkResult GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures) {
+     ALOGV("TODO: vk%s", __FUNCTION__);
+     return VK_SUCCESS;
+@@ -742,17 +706,17 @@ VkResult GetPhysicalDeviceLimits(VkPhysicalDevice physicalDevice, VkPhysicalDevi
+     return VK_SUCCESS;
+ }
+ 
+-VkResult GetGlobalLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties) {
++VkResult EnumerateInstanceLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties) {
+     ALOGV("TODO: vk%s", __FUNCTION__);
+     return VK_SUCCESS;
+ }
+ 
+-VkResult GetPhysicalDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties) {
++VkResult EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties) {
+     ALOGV("TODO: vk%s", __FUNCTION__);
+     return VK_SUCCESS;
+ }
+ 
+-VkResult GetPhysicalDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
++VkResult EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
+     ALOGV("TODO: vk%s", __FUNCTION__);
+     return VK_SUCCESS;
+ }
+@@ -894,10 +858,6 @@ VkResult DestroyImageView(VkDevice device, VkImageView imageView) {
+     return VK_SUCCESS;
+ }
+ 
+-VkResult DestroyAttachmentView(VkDevice device, VkAttachmentView attachmentView) {
+-    return VK_SUCCESS;
+-}
+-
+ VkResult DestroyShaderModule(VkDevice device, VkShaderModule shaderModule) {
+     return VK_SUCCESS;
+ }
+@@ -960,22 +920,6 @@ VkResult FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, ui
+     return VK_SUCCESS;
+ }
+ 
+-VkResult DestroyDynamicViewportState(VkDevice device, VkDynamicViewportState dynamicViewportState) {
+-    return VK_SUCCESS;
+-}
+-
+-VkResult DestroyDynamicRasterState(VkDevice device, VkDynamicRasterState dynamicRasterState) {
+-    return VK_SUCCESS;
+-}
+-
+-VkResult DestroyDynamicColorBlendState(VkDevice device, VkDynamicColorBlendState dynamicColorBlendState) {
+-    return VK_SUCCESS;
+-}
+-
+-VkResult DestroyDynamicDepthStencilState(VkDevice device, VkDynamicDepthStencilState dynamicDepthStencilState) {
+-    return VK_SUCCESS;
+-}
+-
+ VkResult DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer) {
+     return VK_SUCCESS;
+ }
+@@ -1014,16 +958,31 @@ VkResult ResetCommandBuffer(VkCmdBuffer cmdBuffer, VkCmdBufferResetFlags flags)
+ void CmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
+ }
+ 
+-void CmdBindDynamicViewportState(VkCmdBuffer cmdBuffer, VkDynamicViewportState dynamicViewportState) {
++void CmdSetViewport(VkCmdBuffer cmdBuffer, uint32_t viewportCount, const VkViewport* pViewports) {
++}
++
++void CmdSetScissor(VkCmdBuffer cmdBuffer, uint32_t scissorCount, const VkRect2D* pScissors) {
++}
++
++void CmdSetLineWidth(VkCmdBuffer cmdBuffer, float lineWidth) {
++}
++
++void CmdSetDepthBias(VkCmdBuffer cmdBuffer, float depthBias, float depthBiasClamp, float slopeScaledDepthBias) {
++}
++
++void CmdSetBlendConstants(VkCmdBuffer cmdBuffer, const float blendConst[4]) {
++}
++
++void CmdSetDepthBounds(VkCmdBuffer cmdBuffer, float minDepthBounds, float maxDepthBounds) {
+ }
+ 
+-void CmdBindDynamicRasterState(VkCmdBuffer cmdBuffer, VkDynamicRasterState dynamicRasterState) {
++void CmdSetStencilCompareMask(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilCompareMask) {
+ }
+ 
+-void CmdBindDynamicColorBlendState(VkCmdBuffer cmdBuffer, VkDynamicColorBlendState dynamicColorBlendState) {
++void CmdSetStencilWriteMask(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilWriteMask) {
+ }
+ 
+-void CmdBindDynamicDepthStencilState(VkCmdBuffer cmdBuffer, VkDynamicDepthStencilState dynamicDepthStencilState) {
++void CmdSetStencilReference(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilReference) {
+ }
+ 
+ void CmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets) {
+@@ -1077,13 +1036,13 @@ void CmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize dest
+ void CmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
+ }
+ 
+-void CmdClearDepthStencilImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
++void CmdClearDepthStencilImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
+ }
+ 
+ void CmdClearColorAttachment(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rectCount, const VkRect3D* pRects) {
+ }
+ 
+-void CmdClearDepthStencilAttachment(VkCmdBuffer cmdBuffer, VkImageAspectFlags imageAspectMask, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rectCount, const VkRect3D* pRects) {
++void CmdClearDepthStencilAttachment(VkCmdBuffer cmdBuffer, VkImageAspectFlags aspectMask, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rectCount, const VkRect3D* pRects) {
+ }
+ 
+ void CmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions) {
+diff --git a/vulkan/nulldrv/null_driver.h b/vulkan/nulldrv/null_driver.h
+index 6bfbda5..9c26f0e 100644
+--- a/vulkan/nulldrv/null_driver.h
++++ b/vulkan/nulldrv/null_driver.h
+@@ -31,8 +31,7 @@ VkResult DestroyInstance(VkInstance instance);
+ VkResult EnumeratePhysicalDevices(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);
+ PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName);
+ VkResult GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties);
+-VkResult GetPhysicalDeviceQueueCount(VkPhysicalDevice physicalDevice, uint32_t* pCount);
+-VkResult GetPhysicalDeviceQueueProperties(VkPhysicalDevice physicalDevice, uint32_t count, VkPhysicalDeviceQueueProperties* pQueueProperties);
++VkResult GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkQueueFamilyProperties* pQueueFamilyProperties);
+ VkResult GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties);
+ PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName);
+ VkResult GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures);
+@@ -41,10 +40,10 @@ VkResult GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice,
+ VkResult GetPhysicalDeviceLimits(VkPhysicalDevice physicalDevice, VkPhysicalDeviceLimits* pLimits);
+ VkResult CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice);
+ VkResult DestroyDevice(VkDevice device);
+-VkResult GetGlobalExtensionProperties(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
+-VkResult GetGlobalLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties);
+-VkResult GetPhysicalDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties);
+-VkResult GetPhysicalDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
++VkResult EnumerateInstanceExtensionProperties(const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
++VkResult EnumerateInstanceLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties);
++VkResult EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties);
++VkResult EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties);
+ VkResult GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue* pQueue);
+ VkResult QueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence);
+ VkResult QueueWaitIdle(VkQueue queue);
+@@ -91,8 +90,6 @@ VkResult DestroyImage(VkDevice device, VkImage image);
+ VkResult GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout);
+ VkResult CreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, VkImageView* pView);
+ VkResult DestroyImageView(VkDevice device, VkImageView imageView);
+-VkResult CreateAttachmentView(VkDevice device, const VkAttachmentViewCreateInfo* pCreateInfo, VkAttachmentView* pView);
+-VkResult DestroyAttachmentView(VkDevice device, VkAttachmentView attachmentView);
+ VkResult CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, VkShaderModule* pShaderModule);
+ VkResult DestroyShaderModule(VkDevice device, VkShaderModule shaderModule);
+ VkResult CreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, VkShader* pShader);
+@@ -111,20 +108,12 @@ VkResult CreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo,
+ VkResult DestroySampler(VkDevice device, VkSampler sampler);
+ VkResult CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayout* pSetLayout);
+ VkResult DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout);
+-VkResult CreateDescriptorPool(VkDevice device, VkDescriptorPoolUsage poolUsage, uint32_t maxSets, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool);
++VkResult CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, VkDescriptorPool* pDescriptorPool);
+ VkResult DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool);
+ VkResult ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool);
+ VkResult AllocDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorSetUsage setUsage, uint32_t count, const VkDescriptorSetLayout* pSetLayouts, VkDescriptorSet* pDescriptorSets, uint32_t* pCount);
+ VkResult FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets);
+ VkResult UpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies);
+-VkResult CreateDynamicViewportState(VkDevice device, const VkDynamicViewportStateCreateInfo* pCreateInfo, VkDynamicViewportState* pState);
+-VkResult DestroyDynamicViewportState(VkDevice device, VkDynamicViewportState dynamicViewportState);
+-VkResult CreateDynamicRasterState(VkDevice device, const VkDynamicRasterStateCreateInfo* pCreateInfo, VkDynamicRasterState* pState);
+-VkResult DestroyDynamicRasterState(VkDevice device, VkDynamicRasterState dynamicRasterState);
+-VkResult CreateDynamicColorBlendState(VkDevice device, const VkDynamicColorBlendStateCreateInfo* pCreateInfo, VkDynamicColorBlendState* pState);
+-VkResult DestroyDynamicColorBlendState(VkDevice device, VkDynamicColorBlendState dynamicColorBlendState);
+-VkResult CreateDynamicDepthStencilState(VkDevice device, const VkDynamicDepthStencilStateCreateInfo* pCreateInfo, VkDynamicDepthStencilState* pState);
+-VkResult DestroyDynamicDepthStencilState(VkDevice device, VkDynamicDepthStencilState dynamicDepthStencilState);
+ VkResult CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer);
+ VkResult DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer);
+ VkResult CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, VkRenderPass* pRenderPass);
+@@ -139,10 +128,15 @@ VkResult BeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* p
+ VkResult EndCommandBuffer(VkCmdBuffer cmdBuffer);
+ VkResult ResetCommandBuffer(VkCmdBuffer cmdBuffer, VkCmdBufferResetFlags flags);
+ void CmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
+-void CmdBindDynamicViewportState(VkCmdBuffer cmdBuffer, VkDynamicViewportState dynamicViewportState);
+-void CmdBindDynamicRasterState(VkCmdBuffer cmdBuffer, VkDynamicRasterState dynamicRasterState);
+-void CmdBindDynamicColorBlendState(VkCmdBuffer cmdBuffer, VkDynamicColorBlendState dynamicColorBlendState);
+-void CmdBindDynamicDepthStencilState(VkCmdBuffer cmdBuffer, VkDynamicDepthStencilState dynamicDepthStencilState);
++void CmdSetViewport(VkCmdBuffer cmdBuffer, uint32_t viewportCount, const VkViewport* pViewports);
++void CmdSetScissor(VkCmdBuffer cmdBuffer, uint32_t scissorCount, const VkRect2D* pScissors);
++void CmdSetLineWidth(VkCmdBuffer cmdBuffer, float lineWidth);
++void CmdSetDepthBias(VkCmdBuffer cmdBuffer, float depthBias, float depthBiasClamp, float slopeScaledDepthBias);
++void CmdSetBlendConstants(VkCmdBuffer cmdBuffer, const float blendConst[4]);
++void CmdSetDepthBounds(VkCmdBuffer cmdBuffer, float minDepthBounds, float maxDepthBounds);
++void CmdSetStencilCompareMask(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilCompareMask);
++void CmdSetStencilWriteMask(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilWriteMask);
++void CmdSetStencilReference(VkCmdBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilReference);
+ void CmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets);
+ void CmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType);
+ void CmdBindVertexBuffers(VkCmdBuffer cmdBuffer, uint32_t startBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
+@@ -160,9 +154,9 @@ void CmdCopyImageToBuffer(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout
+ void CmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData);
+ void CmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data);
+ void CmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
+-void CmdClearDepthStencilImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
++void CmdClearDepthStencilImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
+ void CmdClearColorAttachment(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rectCount, const VkRect3D* pRects);
+-void CmdClearDepthStencilAttachment(VkCmdBuffer cmdBuffer, VkImageAspectFlags imageAspectMask, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rectCount, const VkRect3D* pRects);
++void CmdClearDepthStencilAttachment(VkCmdBuffer cmdBuffer, VkImageAspectFlags aspectMask, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rectCount, const VkRect3D* pRects);
+ void CmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions);
+ void CmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+ void CmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask);
+diff --git a/vulkan/nulldrv/null_driver_gen.cpp b/vulkan/nulldrv/null_driver_gen.cpp
+index 56ee49a..879ad32 100644
+--- a/vulkan/nulldrv/null_driver_gen.cpp
++++ b/vulkan/nulldrv/null_driver_gen.cpp
+@@ -46,18 +46,16 @@ const NameProcEntry kInstanceProcTbl[] = {
+     // clang-format off
+     {"vkCreateDevice", reinterpret_cast<PFN_vkVoidFunction>(CreateDevice)},
+     {"vkDestroyInstance", reinterpret_cast<PFN_vkVoidFunction>(DestroyInstance)},
++    {"vkEnumerateDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties)},
++    {"vkEnumerateDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceLayerProperties)},
+     {"vkEnumeratePhysicalDevices", reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDevices)},
+     {"vkGetInstanceProcAddr", reinterpret_cast<PFN_vkVoidFunction>(GetInstanceProcAddr)},
+-    {"vkGetPhysicalDeviceExtensionProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceExtensionProperties)},
+     {"vkGetPhysicalDeviceFeatures", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFeatures)},
+     {"vkGetPhysicalDeviceFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceFormatProperties)},
+     {"vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceImageFormatProperties)},
+-    {"vkGetPhysicalDeviceLayerProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceLayerProperties)},
+-    {"vkGetPhysicalDeviceLimits", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceLimits)},
+     {"vkGetPhysicalDeviceMemoryProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceMemoryProperties)},
+     {"vkGetPhysicalDeviceProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceProperties)},
+-    {"vkGetPhysicalDeviceQueueCount", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueCount)},
+-    {"vkGetPhysicalDeviceQueueProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueProperties)},
++    {"vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties)},
+     {"vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSparseImageFormatProperties)},
+     // clang-format on
+ };
+@@ -72,10 +70,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCmdBeginQuery", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginQuery)},
+     {"vkCmdBeginRenderPass", reinterpret_cast<PFN_vkVoidFunction>(CmdBeginRenderPass)},
+     {"vkCmdBindDescriptorSets", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDescriptorSets)},
+-    {"vkCmdBindDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDynamicColorBlendState)},
+-    {"vkCmdBindDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDynamicDepthStencilState)},
+-    {"vkCmdBindDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDynamicRasterState)},
+-    {"vkCmdBindDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(CmdBindDynamicViewportState)},
+     {"vkCmdBindIndexBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdBindIndexBuffer)},
+     {"vkCmdBindPipeline", reinterpret_cast<PFN_vkVoidFunction>(CmdBindPipeline)},
+     {"vkCmdBindVertexBuffers", reinterpret_cast<PFN_vkVoidFunction>(CmdBindVertexBuffers)},
+@@ -105,11 +99,19 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCmdResetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdResetEvent)},
+     {"vkCmdResetQueryPool", reinterpret_cast<PFN_vkVoidFunction>(CmdResetQueryPool)},
+     {"vkCmdResolveImage", reinterpret_cast<PFN_vkVoidFunction>(CmdResolveImage)},
++    {"vkCmdSetBlendConstants", reinterpret_cast<PFN_vkVoidFunction>(CmdSetBlendConstants)},
++    {"vkCmdSetDepthBias", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBias)},
++    {"vkCmdSetDepthBounds", reinterpret_cast<PFN_vkVoidFunction>(CmdSetDepthBounds)},
+     {"vkCmdSetEvent", reinterpret_cast<PFN_vkVoidFunction>(CmdSetEvent)},
++    {"vkCmdSetLineWidth", reinterpret_cast<PFN_vkVoidFunction>(CmdSetLineWidth)},
++    {"vkCmdSetScissor", reinterpret_cast<PFN_vkVoidFunction>(CmdSetScissor)},
++    {"vkCmdSetStencilCompareMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilCompareMask)},
++    {"vkCmdSetStencilReference", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilReference)},
++    {"vkCmdSetStencilWriteMask", reinterpret_cast<PFN_vkVoidFunction>(CmdSetStencilWriteMask)},
++    {"vkCmdSetViewport", reinterpret_cast<PFN_vkVoidFunction>(CmdSetViewport)},
+     {"vkCmdUpdateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CmdUpdateBuffer)},
+     {"vkCmdWaitEvents", reinterpret_cast<PFN_vkVoidFunction>(CmdWaitEvents)},
+     {"vkCmdWriteTimestamp", reinterpret_cast<PFN_vkVoidFunction>(CmdWriteTimestamp)},
+-    {"vkCreateAttachmentView", reinterpret_cast<PFN_vkVoidFunction>(CreateAttachmentView)},
+     {"vkCreateBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateBuffer)},
+     {"vkCreateBufferView", reinterpret_cast<PFN_vkVoidFunction>(CreateBufferView)},
+     {"vkCreateCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateCommandBuffer)},
+@@ -117,10 +119,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCreateComputePipelines", reinterpret_cast<PFN_vkVoidFunction>(CreateComputePipelines)},
+     {"vkCreateDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorPool)},
+     {"vkCreateDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(CreateDescriptorSetLayout)},
+-    {"vkCreateDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(CreateDynamicColorBlendState)},
+-    {"vkCreateDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(CreateDynamicDepthStencilState)},
+-    {"vkCreateDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(CreateDynamicRasterState)},
+-    {"vkCreateDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(CreateDynamicViewportState)},
+     {"vkCreateEvent", reinterpret_cast<PFN_vkVoidFunction>(CreateEvent)},
+     {"vkCreateFence", reinterpret_cast<PFN_vkVoidFunction>(CreateFence)},
+     {"vkCreateFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(CreateFramebuffer)},
+@@ -135,7 +133,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkCreateSemaphore", reinterpret_cast<PFN_vkVoidFunction>(CreateSemaphore)},
+     {"vkCreateShader", reinterpret_cast<PFN_vkVoidFunction>(CreateShader)},
+     {"vkCreateShaderModule", reinterpret_cast<PFN_vkVoidFunction>(CreateShaderModule)},
+-    {"vkDestroyAttachmentView", reinterpret_cast<PFN_vkVoidFunction>(DestroyAttachmentView)},
+     {"vkDestroyBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyBuffer)},
+     {"vkDestroyBufferView", reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferView)},
+     {"vkDestroyCommandBuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyCommandBuffer)},
+@@ -143,10 +140,6 @@ const NameProcEntry kDeviceProcTbl[] = {
+     {"vkDestroyDescriptorPool", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorPool)},
+     {"vkDestroyDescriptorSetLayout", reinterpret_cast<PFN_vkVoidFunction>(DestroyDescriptorSetLayout)},
+     {"vkDestroyDevice", reinterpret_cast<PFN_vkVoidFunction>(DestroyDevice)},
+-    {"vkDestroyDynamicColorBlendState", reinterpret_cast<PFN_vkVoidFunction>(DestroyDynamicColorBlendState)},
+-    {"vkDestroyDynamicDepthStencilState", reinterpret_cast<PFN_vkVoidFunction>(DestroyDynamicDepthStencilState)},
+-    {"vkDestroyDynamicRasterState", reinterpret_cast<PFN_vkVoidFunction>(DestroyDynamicRasterState)},
+-    {"vkDestroyDynamicViewportState", reinterpret_cast<PFN_vkVoidFunction>(DestroyDynamicViewportState)},
+     {"vkDestroyEvent", reinterpret_cast<PFN_vkVoidFunction>(DestroyEvent)},
+     {"vkDestroyFence", reinterpret_cast<PFN_vkVoidFunction>(DestroyFence)},
+     {"vkDestroyFramebuffer", reinterpret_cast<PFN_vkVoidFunction>(DestroyFramebuffer)},
+diff --git a/vulkan/tools/Android.mk b/vulkan/tools/Android.mk
+index 9ea5f14..31d6089 100644
+--- a/vulkan/tools/Android.mk
++++ b/vulkan/tools/Android.mk
+@@ -17,6 +17,7 @@ include $(CLEAR_VARS)
+ 
+ LOCAL_CLANG := true
+ LOCAL_CFLAGS := -std=c99 -fvisibility=hidden -fstrict-aliasing
++LOCAL_CFLAGS += -DLOG_TAG=\"vkinfo\"
+ LOCAL_CFLAGS += -Weverything -Werror -Wno-padded -Wno-undef -Wno-switch-enum
+ LOCAL_CPPFLAGS := -std=c++1y \
+ 	-Wno-c++98-compat-pedantic \
+diff --git a/vulkan/tools/vkinfo.cpp b/vulkan/tools/vkinfo.cpp
+index e1eb129..583e607 100644
+--- a/vulkan/tools/vkinfo.cpp
++++ b/vulkan/tools/vkinfo.cpp
+@@ -38,38 +38,14 @@ namespace {
+         case VK_EVENT_SET: result_str = "VK_EVENT_SET"; break;
+         case VK_EVENT_RESET: result_str = "VK_EVENT_RESET"; break;
+         case VK_INCOMPLETE: result_str = "VK_INCOMPLETE"; break;
+-        case VK_ERROR_UNKNOWN: result_str = "VK_ERROR_UNKNOWN"; break;
+-        case VK_ERROR_UNAVAILABLE: result_str = "VK_ERROR_UNAVAILABLE"; break;
+-        case VK_ERROR_INITIALIZATION_FAILED: result_str = "VK_ERROR_INITIALIZATION_FAILED"; break;
+         case VK_ERROR_OUT_OF_HOST_MEMORY: result_str = "VK_ERROR_OUT_OF_HOST_MEMORY"; break;
+         case VK_ERROR_OUT_OF_DEVICE_MEMORY: result_str = "VK_ERROR_OUT_OF_DEVICE_MEMORY"; break;
+-        case VK_ERROR_DEVICE_ALREADY_CREATED: result_str = "VK_ERROR_DEVICE_ALREADY_CREATED"; break;
++        case VK_ERROR_INITIALIZATION_FAILED: result_str = "VK_ERROR_INITIALIZATION_FAILED"; break;
+         case VK_ERROR_DEVICE_LOST: result_str = "VK_ERROR_DEVICE_LOST"; break;
+-        case VK_ERROR_INVALID_POINTER: result_str = "VK_ERROR_INVALID_POINTER"; break;
+-        case VK_ERROR_INVALID_VALUE: result_str = "VK_ERROR_INVALID_VALUE"; break;
+-        case VK_ERROR_INVALID_HANDLE: result_str = "VK_ERROR_INVALID_HANDLE"; break;
+-        case VK_ERROR_INVALID_ORDINAL: result_str = "VK_ERROR_INVALID_ORDINAL"; break;
+-        case VK_ERROR_INVALID_MEMORY_SIZE: result_str = "VK_ERROR_INVALID_MEMORY_SIZE"; break;
+-        case VK_ERROR_INVALID_EXTENSION: result_str = "VK_ERROR_INVALID_EXTENSION"; break;
+-        case VK_ERROR_INVALID_FLAGS: result_str = "VK_ERROR_INVALID_FLAGS"; break;
+-        case VK_ERROR_INVALID_ALIGNMENT: result_str = "VK_ERROR_INVALID_ALIGNMENT"; break;
+-        case VK_ERROR_INVALID_FORMAT: result_str = "VK_ERROR_INVALID_FORMAT"; break;
+-        case VK_ERROR_INVALID_IMAGE: result_str = "VK_ERROR_INVALID_IMAGE"; break;
+-        case VK_ERROR_INVALID_DESCRIPTOR_SET_DATA: result_str = "VK_ERROR_INVALID_DESCRIPTOR_SET_DATA"; break;
+-        case VK_ERROR_INVALID_QUEUE_TYPE: result_str = "VK_ERROR_INVALID_QUEUE_TYPE"; break;
+-        case VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION: result_str = "VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION"; break;
+-        case VK_ERROR_BAD_SHADER_CODE: result_str = "VK_ERROR_BAD_SHADER_CODE"; break;
+-        case VK_ERROR_BAD_PIPELINE_DATA: result_str = "VK_ERROR_BAD_PIPELINE_DATA"; break;
+-        case VK_ERROR_NOT_MAPPABLE: result_str = "VK_ERROR_NOT_MAPPABLE"; break;
+         case VK_ERROR_MEMORY_MAP_FAILED: result_str = "VK_ERROR_MEMORY_MAP_FAILED"; break;
+-        case VK_ERROR_MEMORY_UNMAP_FAILED: result_str = "VK_ERROR_MEMORY_UNMAP_FAILED"; break;
+-        case VK_ERROR_INCOMPATIBLE_DEVICE: result_str = "VK_ERROR_INCOMPATIBLE_DEVICE"; break;
++        case VK_ERROR_LAYER_NOT_PRESENT: result_str = "VK_ERROR_LAYER_NOT_PRESENT"; break;
++        case VK_ERROR_EXTENSION_NOT_PRESENT: result_str = "VK_ERROR_EXTENSION_NOT_PRESENT"; break;
+         case VK_ERROR_INCOMPATIBLE_DRIVER: result_str = "VK_ERROR_INCOMPATIBLE_DRIVER"; break;
+-        case VK_ERROR_INCOMPLETE_COMMAND_BUFFER: result_str = "VK_ERROR_INCOMPLETE_COMMAND_BUFFER"; break;
+-        case VK_ERROR_BUILDING_COMMAND_BUFFER: result_str = "VK_ERROR_BUILDING_COMMAND_BUFFER"; break;
+-        case VK_ERROR_MEMORY_NOT_BOUND: result_str = "VK_ERROR_MEMORY_NOT_BOUND"; break;
+-        case VK_ERROR_INCOMPATIBLE_QUEUE: result_str = "VK_ERROR_INCOMPATIBLE_QUEUE"; break;
+-        case VK_ERROR_INVALID_LAYER: result_str = "VK_ERROR_INVALID_LAYER"; break;
+         default: result_str = "<unknown VkResult>"; break;
+             // clang-format on
+     }
+@@ -94,6 +70,21 @@ const char* VkPhysicalDeviceTypeStr(VkPhysicalDeviceType type) {
+     }
+ }
+ 
++const char* VkQueueFlagBitStr(VkQueueFlagBits bit) {
++    switch (bit) {
++        case VK_QUEUE_GRAPHICS_BIT:
++            return "GRAPHICS";
++        case VK_QUEUE_COMPUTE_BIT:
++            return "COMPUTE";
++        case VK_QUEUE_DMA_BIT:
++            return "DMA";
++        case VK_QUEUE_SPARSE_MEMMGR_BIT:
++            return "SPARSE";
++        case VK_QUEUE_EXTENDED_BIT:
++            return "EXT";
++    }
++}
++
+ void DumpPhysicalDevice(uint32_t idx, VkPhysicalDevice pdev) {
+     VkResult result;
+     std::ostringstream strbuf;
+@@ -113,8 +104,8 @@ void DumpPhysicalDevice(uint32_t idx, VkPhysicalDevice pdev) {
+     if (result != VK_SUCCESS)
+         die("vkGetPhysicalDeviceMemoryProperties", result);
+     for (uint32_t heap = 0; heap < mem_props.memoryHeapCount; heap++) {
+-        if ((mem_props.memoryHeaps[heap].flags & VK_MEMORY_HEAP_HOST_LOCAL) !=
+-            0)
++        if ((mem_props.memoryHeaps[heap].flags &
++             VK_MEMORY_HEAP_HOST_LOCAL_BIT) != 0)
+             strbuf << "HOST_LOCAL";
+         printf("     Heap %u: 0x%" PRIx64 " %s\n", heap,
+                mem_props.memoryHeaps[heap].size, strbuf.str().c_str());
+@@ -137,10 +128,37 @@ void DumpPhysicalDevice(uint32_t idx, VkPhysicalDevice pdev) {
+                 strbuf << " WRITE_COMBINED";
+             if ((flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)
+                 strbuf << " LAZILY_ALLOCATED";
+-            printf("        Type %u: %s\n", type, strbuf.str().c_str());
++            printf("       Type %u: %s\n", type, strbuf.str().c_str());
+             strbuf.str(std::string());
+         }
+     }
++
++    uint32_t num_queue_families;
++    result = vkGetPhysicalDeviceQueueFamilyProperties(pdev, &num_queue_families,
++                                                      nullptr);
++    if (result != VK_SUCCESS)
++        die("vkGetPhysicalDeviceQueueFamilyProperties (count)", result);
++    std::vector<VkQueueFamilyProperties> queue_family_properties(
++        num_queue_families);
++    result = vkGetPhysicalDeviceQueueFamilyProperties(
++        pdev, &num_queue_families, queue_family_properties.data());
++    if (result != VK_SUCCESS)
++        die("vkGetPhysicalDeviceQueueFamilyProperties (values)", result);
++    for (uint32_t family = 0; family < num_queue_families; family++) {
++        const VkQueueFamilyProperties& qprops = queue_family_properties[family];
++        const char* sep = "";
++        int bit, queue_flags = static_cast<int>(qprops.queueFlags);
++        while ((bit = __builtin_ffs(queue_flags)) != 0) {
++            VkQueueFlagBits flag = VkQueueFlagBits(1 << (bit - 1));
++            strbuf << sep << VkQueueFlagBitStr(flag);
++            queue_flags &= ~flag;
++            sep = "+";
++        }
++        printf("     Queue Family %u: %2ux %s timestamps:%s\n", family,
++               qprops.queueCount, strbuf.str().c_str(),
++               qprops.supportsTimestamps ? "YES" : "NO");
++        strbuf.str(std::string());
++    }
+ }
+ 
+ }  // namespace
+@@ -184,9 +202,7 @@ int main(int /*argc*/, char const* /*argv*/ []) {
+     for (uint32_t i = 0; i < physical_devices.size(); i++)
+         DumpPhysicalDevice(i, physical_devices[i]);
+ 
+-    result = vkDestroyInstance(instance);
+-    if (result != VK_SUCCESS)
+-        die("vkDestroyInstance", result);
++    vkDestroyInstance(instance);
+ 
+     return 0;
+ }
+-- 
+2.6.0.rc2.230.g3dd15c0
+