diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,10 @@
+# Change Log
+
+## [1.0.0.0] - 2016-02-25
+Split the interface up into many modules.
+
+## [0.2.0.0] - 2016-02-22
+Make wildcard matches lazy for `sizeof` and `alignment`
+
+## [0.1.0.0] - 2016-02-21
+Initial release targeting Vulkan 1.0.3 Core
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -8,14 +8,14 @@
 `DuplicateRecordFields` and `Strict` language extensions.
 
 I highly recommend compiling with `-O0` at the moment as compiling with
-optimizations leads to huge compile times. It's likely that the library will be
-split into a few smaller modules in the future to alleviate this.
+optimizations leads to huge compile times. 
 
+
 ## Current Status
 
 All the core Vulkan functionality is here.
 
 This is currently a 64 bit only library, 32 bit support is on the roadmap.
 
-Examples are on the way!
+Examples can be found [here](https://github.com/expipiplus1/vulkan-examples)
 
diff --git a/src/Graphics/Vulkan.hs b/src/Graphics/Vulkan.hs
--- a/src/Graphics/Vulkan.hs
+++ b/src/Graphics/Vulkan.hs
@@ -1,6647 +1,67 @@
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE ForeignFunctionInterface #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE PatternSynonyms #-}
-{-# LANGUAGE Strict #-}
-
-module Graphics.Vulkan where
-
-import Data.Bits (Bits, FiniteBits)
-import Data.Int (Int32)
-import Data.Vector.Fixed.Storable (Vec)
-import Data.Vector.Fixed.Cont (ToPeano)
-import Data.Void (Void)
-import Data.Word (Word8, Word32, Word64)
-import Foreign.C.Types (CChar, CFloat(..), CSize(..))
-import Foreign.Ptr (Ptr, FunPtr, plusPtr, castPtr)
-import Foreign.Storable (Storable(..))
-
-
--- * Constants
-
-
-pattern VK_MAX_PHYSICAL_DEVICE_NAME_SIZE = 256
-type VK_MAX_PHYSICAL_DEVICE_NAME_SIZE = 256
-
-pattern VK_UUID_SIZE = 16
-type VK_UUID_SIZE = 16
-
-pattern VK_MAX_EXTENSION_NAME_SIZE = 256
-type VK_MAX_EXTENSION_NAME_SIZE = 256
-
-pattern VK_MAX_DESCRIPTION_SIZE = 256
-type VK_MAX_DESCRIPTION_SIZE = 256
-
-pattern VK_MAX_MEMORY_TYPES = 32
-type VK_MAX_MEMORY_TYPES = 32
-
-pattern VK_MAX_MEMORY_HEAPS = 16
-type VK_MAX_MEMORY_HEAPS = 16
-
-pattern VK_LOD_CLAMP_NONE = 1000.0
-
-pattern VK_REMAINING_MIP_LEVELS = 0xffffffff :: Word32
-
-pattern VK_REMAINING_ARRAY_LAYERS = 0xffffffff :: Word32
-
-pattern VK_WHOLE_SIZE = 0xffffffffffffffff :: Word64
-
-pattern VK_ATTACHMENT_UNUSED = 0xffffffff :: Word32
-
-pattern VK_TRUE = 1
-type VK_TRUE = 1
-
-pattern VK_FALSE = 0
-type VK_FALSE = 0
-
-pattern VK_QUEUE_FAMILY_IGNORED = 0xffffffff :: Word32
-
-pattern VK_SUBPASS_EXTERNAL = 0xffffffff :: Word32
--- * Base Types
-
-newtype VkSampleMask = VkSampleMask Word32
-  deriving (Eq, Storable)
-
-newtype VkBool32 = VkBool32 Word32
-  deriving (Eq, Storable)
-
-type VkFlags = Word32
-
-newtype VkDeviceSize = VkDeviceSize Word64
-  deriving (Eq, Storable)
-
--- * Handle Types
-
-data VkInstance_T
-type VkInstance = Ptr VkInstance_T
-
-data VkPhysicalDevice_T
-type VkPhysicalDevice = Ptr VkPhysicalDevice_T
-
-data VkDevice_T
-type VkDevice = Ptr VkDevice_T
-
-data VkQueue_T
-type VkQueue = Ptr VkQueue_T
-
-data VkCommandBuffer_T
-type VkCommandBuffer = Ptr VkCommandBuffer_T
-
-newtype VkDeviceMemory = VkDeviceMemory Word64
-  deriving (Eq, Storable)
-
-newtype VkCommandPool = VkCommandPool Word64
-  deriving (Eq, Storable)
-
-newtype VkBuffer = VkBuffer Word64
-  deriving (Eq, Storable)
-
-newtype VkBufferView = VkBufferView Word64
-  deriving (Eq, Storable)
-
-newtype VkImage = VkImage Word64
-  deriving (Eq, Storable)
-
-newtype VkImageView = VkImageView Word64
-  deriving (Eq, Storable)
-
-newtype VkShaderModule = VkShaderModule Word64
-  deriving (Eq, Storable)
-
-newtype VkPipeline = VkPipeline Word64
-  deriving (Eq, Storable)
-
-newtype VkPipelineLayout = VkPipelineLayout Word64
-  deriving (Eq, Storable)
-
-newtype VkSampler = VkSampler Word64
-  deriving (Eq, Storable)
-
-newtype VkDescriptorSet = VkDescriptorSet Word64
-  deriving (Eq, Storable)
-
-newtype VkDescriptorSetLayout = VkDescriptorSetLayout Word64
-  deriving (Eq, Storable)
-
-newtype VkDescriptorPool = VkDescriptorPool Word64
-  deriving (Eq, Storable)
-
-newtype VkFence = VkFence Word64
-  deriving (Eq, Storable)
-
-newtype VkSemaphore = VkSemaphore Word64
-  deriving (Eq, Storable)
-
-newtype VkEvent = VkEvent Word64
-  deriving (Eq, Storable)
-
-newtype VkQueryPool = VkQueryPool Word64
-  deriving (Eq, Storable)
-
-newtype VkFramebuffer = VkFramebuffer Word64
-  deriving (Eq, Storable)
-
-newtype VkRenderPass = VkRenderPass Word64
-  deriving (Eq, Storable)
-
-newtype VkPipelineCache = VkPipelineCache Word64
-  deriving (Eq, Storable)
-
-newtype VkDisplayKHR = VkDisplayKHR Word64
-  deriving (Eq, Storable)
-
-newtype VkDisplayModeKHR = VkDisplayModeKHR Word64
-  deriving (Eq, Storable)
-
-newtype VkSurfaceKHR = VkSurfaceKHR Word64
-  deriving (Eq, Storable)
-
-newtype VkSwapchainKHR = VkSwapchainKHR Word64
-  deriving (Eq, Storable)
-
-newtype VkDebugReportCallbackEXT = VkDebugReportCallbackEXT Word64
-  deriving (Eq, Storable)
-
--- * FuncPointer Types
-
-type PFN_vkInternalAllocationNotification = FunPtr
-  (Ptr Void ->
-     CSize ->
-       VkInternalAllocationType -> VkSystemAllocationScope -> IO ())
-
-type PFN_vkInternalFreeNotification = FunPtr
-  (Ptr Void ->
-     CSize ->
-       VkInternalAllocationType -> VkSystemAllocationScope -> IO ())
-
-type PFN_vkReallocationFunction = FunPtr
-  (Ptr Void ->
-     Ptr Void ->
-       CSize -> CSize -> VkSystemAllocationScope -> IO (Ptr Void))
-
-type PFN_vkAllocationFunction = FunPtr
-  (Ptr Void ->
-     CSize -> CSize -> VkSystemAllocationScope -> IO (Ptr Void))
-
-type PFN_vkFreeFunction = FunPtr (Ptr Void -> Ptr Void -> IO ())
-
-type PFN_vkVoidFunction = FunPtr (IO ())
-
-type PFN_vkDebugReportCallbackEXT = FunPtr
-  (VkDebugReportFlagsEXT ->
-     VkDebugReportObjectTypeEXT ->
-       Word64 ->
-         CSize ->
-           Int32 -> Ptr CChar -> Ptr CChar -> Ptr Void -> IO VkBool32)
-
--- * Flags
-
--- ** VkFramebufferCreateFlags
--- | Opaque flag
-newtype VkFramebufferCreateFlags = VkFramebufferCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkQueryPoolCreateFlags
--- | Opaque flag
-newtype VkQueryPoolCreateFlags = VkQueryPoolCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkRenderPassCreateFlags
--- | Opaque flag
-newtype VkRenderPassCreateFlags = VkRenderPassCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkSamplerCreateFlags
--- | Opaque flag
-newtype VkSamplerCreateFlags = VkSamplerCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineLayoutCreateFlags
--- | Opaque flag
-newtype VkPipelineLayoutCreateFlags = VkPipelineLayoutCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineCacheCreateFlags
--- | Opaque flag
-newtype VkPipelineCacheCreateFlags = VkPipelineCacheCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineDepthStencilStateCreateFlags
--- | Opaque flag
-newtype VkPipelineDepthStencilStateCreateFlags = VkPipelineDepthStencilStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineDynamicStateCreateFlags
--- | Opaque flag
-newtype VkPipelineDynamicStateCreateFlags = VkPipelineDynamicStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineColorBlendStateCreateFlags
--- | Opaque flag
-newtype VkPipelineColorBlendStateCreateFlags = VkPipelineColorBlendStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineMultisampleStateCreateFlags
--- | Opaque flag
-newtype VkPipelineMultisampleStateCreateFlags = VkPipelineMultisampleStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineRasterizationStateCreateFlags
--- | Opaque flag
-newtype VkPipelineRasterizationStateCreateFlags = VkPipelineRasterizationStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineViewportStateCreateFlags
--- | Opaque flag
-newtype VkPipelineViewportStateCreateFlags = VkPipelineViewportStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineTessellationStateCreateFlags
--- | Opaque flag
-newtype VkPipelineTessellationStateCreateFlags = VkPipelineTessellationStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineInputAssemblyStateCreateFlags
--- | Opaque flag
-newtype VkPipelineInputAssemblyStateCreateFlags = VkPipelineInputAssemblyStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineVertexInputStateCreateFlags
--- | Opaque flag
-newtype VkPipelineVertexInputStateCreateFlags = VkPipelineVertexInputStateCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineShaderStageCreateFlags
--- | Opaque flag
-newtype VkPipelineShaderStageCreateFlags = VkPipelineShaderStageCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkDescriptorSetLayoutCreateFlags
--- | Opaque flag
-newtype VkDescriptorSetLayoutCreateFlags = VkDescriptorSetLayoutCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkBufferViewCreateFlags
--- | Opaque flag
-newtype VkBufferViewCreateFlags = VkBufferViewCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkInstanceCreateFlags
--- | Opaque flag
-newtype VkInstanceCreateFlags = VkInstanceCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkDeviceCreateFlags
--- | Opaque flag
-newtype VkDeviceCreateFlags = VkDeviceCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkDeviceQueueCreateFlags
--- | Opaque flag
-newtype VkDeviceQueueCreateFlags = VkDeviceQueueCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkQueueFlags
-
-newtype VkQueueFlagBits = VkQueueFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkQueueFlagBits
-type VkQueueFlags = VkQueueFlagBits
--- | Queue supports graphics operations
-pattern VK_QUEUE_GRAPHICS_BIT = VkQueueFlagBits 0x1
--- | Queue supports compute operations
-pattern VK_QUEUE_COMPUTE_BIT = VkQueueFlagBits 0x2
--- | Queue supports transfer operations
-pattern VK_QUEUE_TRANSFER_BIT = VkQueueFlagBits 0x4
--- | Queue supports sparse resource memory management operations
-pattern VK_QUEUE_SPARSE_BINDING_BIT = VkQueueFlagBits 0x8
-
-
--- ** VkMemoryPropertyFlags
-
-newtype VkMemoryPropertyFlagBits = VkMemoryPropertyFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkMemoryPropertyFlagBits
-type VkMemoryPropertyFlags = VkMemoryPropertyFlagBits
--- | If otherwise stated, then allocate memory on device
-pattern VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = VkMemoryPropertyFlagBits 0x1
--- | Memory is mappable by host
-pattern VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = VkMemoryPropertyFlagBits 0x2
--- | Memory will have i/o coherency. If not set, application may need to use vkFlushMappedMemoryRanges and vkInvalidateMappedMemoryRanges to flush/invalidate host cache
-pattern VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = VkMemoryPropertyFlagBits 0x4
--- | Memory will be cached by the host
-pattern VK_MEMORY_PROPERTY_HOST_CACHED_BIT = VkMemoryPropertyFlagBits 0x8
--- | Memory may be allocated by the driver when it is required
-pattern VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = VkMemoryPropertyFlagBits 0x10
-
-
--- ** VkMemoryHeapFlags
-
-newtype VkMemoryHeapFlagBits = VkMemoryHeapFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkMemoryHeapFlagBits
-type VkMemoryHeapFlags = VkMemoryHeapFlagBits
--- | If set, heap represents device memory
-pattern VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = VkMemoryHeapFlagBits 0x1
-
-
--- ** VkAccessFlags
-
-newtype VkAccessFlagBits = VkAccessFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkAccessFlagBits
-type VkAccessFlags = VkAccessFlagBits
--- | Controls coherency of indirect command reads
-pattern VK_ACCESS_INDIRECT_COMMAND_READ_BIT = VkAccessFlagBits 0x1
--- | Controls coherency of index reads
-pattern VK_ACCESS_INDEX_READ_BIT = VkAccessFlagBits 0x2
--- | Controls coherency of vertex attribute reads
-pattern VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = VkAccessFlagBits 0x4
--- | Controls coherency of uniform buffer reads
-pattern VK_ACCESS_UNIFORM_READ_BIT = VkAccessFlagBits 0x8
--- | Controls coherency of input attachment reads
-pattern VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = VkAccessFlagBits 0x10
--- | Controls coherency of shader reads
-pattern VK_ACCESS_SHADER_READ_BIT = VkAccessFlagBits 0x20
--- | Controls coherency of shader writes
-pattern VK_ACCESS_SHADER_WRITE_BIT = VkAccessFlagBits 0x40
--- | Controls coherency of color attachment reads
-pattern VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = VkAccessFlagBits 0x80
--- | Controls coherency of color attachment writes
-pattern VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = VkAccessFlagBits 0x100
--- | Controls coherency of depth/stencil attachment reads
-pattern VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = VkAccessFlagBits 0x200
--- | Controls coherency of depth/stencil attachment writes
-pattern VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = VkAccessFlagBits 0x400
--- | Controls coherency of transfer reads
-pattern VK_ACCESS_TRANSFER_READ_BIT = VkAccessFlagBits 0x800
--- | Controls coherency of transfer writes
-pattern VK_ACCESS_TRANSFER_WRITE_BIT = VkAccessFlagBits 0x1000
--- | Controls coherency of host reads
-pattern VK_ACCESS_HOST_READ_BIT = VkAccessFlagBits 0x2000
--- | Controls coherency of host writes
-pattern VK_ACCESS_HOST_WRITE_BIT = VkAccessFlagBits 0x4000
--- | Controls coherency of memory reads
-pattern VK_ACCESS_MEMORY_READ_BIT = VkAccessFlagBits 0x8000
--- | Controls coherency of memory writes
-pattern VK_ACCESS_MEMORY_WRITE_BIT = VkAccessFlagBits 0x10000
-
-
--- ** VkBufferUsageFlags
-
-newtype VkBufferUsageFlagBits = VkBufferUsageFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkBufferUsageFlagBits
-type VkBufferUsageFlags = VkBufferUsageFlagBits
--- | Can be used as a source of transfer operations
-pattern VK_BUFFER_USAGE_TRANSFER_SRC_BIT = VkBufferUsageFlagBits 0x1
--- | Can be used as a destination of transfer operations
-pattern VK_BUFFER_USAGE_TRANSFER_DST_BIT = VkBufferUsageFlagBits 0x2
--- | Can be used as TBO
-pattern VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = VkBufferUsageFlagBits 0x4
--- | Can be used as IBO
-pattern VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = VkBufferUsageFlagBits 0x8
--- | Can be used as UBO
-pattern VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = VkBufferUsageFlagBits 0x10
--- | Can be used as SSBO
-pattern VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = VkBufferUsageFlagBits 0x20
--- | Can be used as source of fixed-function index fetch (index buffer)
-pattern VK_BUFFER_USAGE_INDEX_BUFFER_BIT = VkBufferUsageFlagBits 0x40
--- | Can be used as source of fixed-function vertex fetch (VBO)
-pattern VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = VkBufferUsageFlagBits 0x80
--- | Can be the source of indirect parameters (e.g. indirect buffer, parameter buffer)
-pattern VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = VkBufferUsageFlagBits 0x100
-
-
--- ** VkBufferCreateFlags
-
-newtype VkBufferCreateFlagBits = VkBufferCreateFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkBufferCreateFlagBits
-type VkBufferCreateFlags = VkBufferCreateFlagBits
--- | Buffer should support sparse backing
-pattern VK_BUFFER_CREATE_SPARSE_BINDING_BIT = VkBufferCreateFlagBits 0x1
--- | Buffer should support sparse backing with partial residency
-pattern VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = VkBufferCreateFlagBits 0x2
--- | Buffer should support constent data access to physical memory blocks mapped into multiple locations of sparse buffers
-pattern VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = VkBufferCreateFlagBits 0x4
-
-
--- ** VkShaderStageFlags
-
-newtype VkShaderStageFlagBits = VkShaderStageFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkShaderStageFlagBits
-type VkShaderStageFlags = VkShaderStageFlagBits
-
-pattern VK_SHADER_STAGE_VERTEX_BIT = VkShaderStageFlagBits 0x1
-
-pattern VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = VkShaderStageFlagBits 0x2
-
-pattern VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = VkShaderStageFlagBits 0x4
-
-pattern VK_SHADER_STAGE_GEOMETRY_BIT = VkShaderStageFlagBits 0x8
-
-pattern VK_SHADER_STAGE_FRAGMENT_BIT = VkShaderStageFlagBits 0x10
-
-pattern VK_SHADER_STAGE_COMPUTE_BIT = VkShaderStageFlagBits 0x20
-
-pattern VK_SHADER_STAGE_ALL_GRAPHICS = VkShaderStageFlagBits 0x1f
-
-pattern VK_SHADER_STAGE_ALL = VkShaderStageFlagBits 0x7fffffff
-
--- ** VkImageUsageFlags
-
-newtype VkImageUsageFlagBits = VkImageUsageFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkImageUsageFlagBits
-type VkImageUsageFlags = VkImageUsageFlagBits
--- | Can be used as a source of transfer operations
-pattern VK_IMAGE_USAGE_TRANSFER_SRC_BIT = VkImageUsageFlagBits 0x1
--- | Can be used as a destination of transfer operations
-pattern VK_IMAGE_USAGE_TRANSFER_DST_BIT = VkImageUsageFlagBits 0x2
--- | Can be sampled from (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)
-pattern VK_IMAGE_USAGE_SAMPLED_BIT = VkImageUsageFlagBits 0x4
--- | Can be used as storage image (STORAGE_IMAGE descriptor type)
-pattern VK_IMAGE_USAGE_STORAGE_BIT = VkImageUsageFlagBits 0x8
--- | Can be used as framebuffer color attachment
-pattern VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = VkImageUsageFlagBits 0x10
--- | Can be used as framebuffer depth/stencil attachment
-pattern VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = VkImageUsageFlagBits 0x20
--- | Image data not needed outside of rendering
-pattern VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = VkImageUsageFlagBits 0x40
--- | Can be used as framebuffer input attachment
-pattern VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = VkImageUsageFlagBits 0x80
-
-
--- ** VkImageCreateFlags
-
-newtype VkImageCreateFlagBits = VkImageCreateFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkImageCreateFlagBits
-type VkImageCreateFlags = VkImageCreateFlagBits
--- | Image should support sparse backing
-pattern VK_IMAGE_CREATE_SPARSE_BINDING_BIT = VkImageCreateFlagBits 0x1
--- | Image should support sparse backing with partial residency
-pattern VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = VkImageCreateFlagBits 0x2
--- | Image should support constent data access to physical memory blocks mapped into multiple locations of sparse images
-pattern VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = VkImageCreateFlagBits 0x4
--- | Allows image views to have different format than the base image
-pattern VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = VkImageCreateFlagBits 0x8
--- | Allows creating image views with cube type from the created image
-pattern VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = VkImageCreateFlagBits 0x10
-
-
--- ** VkImageViewCreateFlags
--- | Opaque flag
-newtype VkImageViewCreateFlags = VkImageViewCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineCreateFlags
-
-newtype VkPipelineCreateFlagBits = VkPipelineCreateFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkPipelineCreateFlagBits
-type VkPipelineCreateFlags = VkPipelineCreateFlagBits
-
-pattern VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = VkPipelineCreateFlagBits 0x1
-
-pattern VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = VkPipelineCreateFlagBits 0x2
-
-pattern VK_PIPELINE_CREATE_DERIVATIVE_BIT = VkPipelineCreateFlagBits 0x4
-
-
--- ** VkColorComponentFlags
-
-newtype VkColorComponentFlagBits = VkColorComponentFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkColorComponentFlagBits
-type VkColorComponentFlags = VkColorComponentFlagBits
-
-pattern VK_COLOR_COMPONENT_R_BIT = VkColorComponentFlagBits 0x1
-
-pattern VK_COLOR_COMPONENT_G_BIT = VkColorComponentFlagBits 0x2
-
-pattern VK_COLOR_COMPONENT_B_BIT = VkColorComponentFlagBits 0x4
-
-pattern VK_COLOR_COMPONENT_A_BIT = VkColorComponentFlagBits 0x8
-
-
--- ** VkFenceCreateFlags
-
-newtype VkFenceCreateFlagBits = VkFenceCreateFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkFenceCreateFlagBits
-type VkFenceCreateFlags = VkFenceCreateFlagBits
-
-pattern VK_FENCE_CREATE_SIGNALED_BIT = VkFenceCreateFlagBits 0x1
-
-
--- ** VkSemaphoreCreateFlags
--- | Opaque flag
-newtype VkSemaphoreCreateFlags = VkSemaphoreCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkFormatFeatureFlags
-
-newtype VkFormatFeatureFlagBits = VkFormatFeatureFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkFormatFeatureFlagBits
-type VkFormatFeatureFlags = VkFormatFeatureFlagBits
--- | Format can be used for sampled images (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)
-pattern VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = VkFormatFeatureFlagBits 0x1
--- | Format can be used for storage images (STORAGE_IMAGE descriptor type)
-pattern VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = VkFormatFeatureFlagBits 0x2
--- | Format supports atomic operations in case it's used for storage images
-pattern VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = VkFormatFeatureFlagBits 0x4
--- | Format can be used for uniform texel buffers (TBOs)
-pattern VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = VkFormatFeatureFlagBits 0x8
--- | Format can be used for storage texel buffers (IBOs)
-pattern VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = VkFormatFeatureFlagBits 0x10
--- | Format supports atomic operations in case it's used for storage texel buffers
-pattern VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = VkFormatFeatureFlagBits 0x20
--- | Format can be used for vertex buffers (VBOs)
-pattern VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = VkFormatFeatureFlagBits 0x40
--- | Format can be used for color attachment images
-pattern VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = VkFormatFeatureFlagBits 0x80
--- | Format supports blending in case it's used for color attachment images
-pattern VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = VkFormatFeatureFlagBits 0x100
--- | Format can be used for depth/stencil attachment images
-pattern VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = VkFormatFeatureFlagBits 0x200
--- | Format can be used as the source image of blits with vkCmdBlitImage
-pattern VK_FORMAT_FEATURE_BLIT_SRC_BIT = VkFormatFeatureFlagBits 0x400
--- | Format can be used as the destination image of blits with vkCmdBlitImage
-pattern VK_FORMAT_FEATURE_BLIT_DST_BIT = VkFormatFeatureFlagBits 0x800
--- | Format can be filtered with VK_FILTER_LINEAR when being sampled
-pattern VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = VkFormatFeatureFlagBits 0x1000
-
-
--- ** VkQueryControlFlags
-
-newtype VkQueryControlFlagBits = VkQueryControlFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkQueryControlFlagBits
-type VkQueryControlFlags = VkQueryControlFlagBits
--- | Require precise results to be collected by the query
-pattern VK_QUERY_CONTROL_PRECISE_BIT = VkQueryControlFlagBits 0x1
-
-
--- ** VkQueryResultFlags
-
-newtype VkQueryResultFlagBits = VkQueryResultFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkQueryResultFlagBits
-type VkQueryResultFlags = VkQueryResultFlagBits
--- | Results of the queries are written to the destination buffer as 64-bit values
-pattern VK_QUERY_RESULT_64_BIT = VkQueryResultFlagBits 0x1
--- | Results of the queries are waited on before proceeding with the result copy
-pattern VK_QUERY_RESULT_WAIT_BIT = VkQueryResultFlagBits 0x2
--- | Besides the results of the query, the availability of the results is also written
-pattern VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = VkQueryResultFlagBits 0x4
--- | Copy the partial results of the query even if the final results aren't available
-pattern VK_QUERY_RESULT_PARTIAL_BIT = VkQueryResultFlagBits 0x8
-
-
--- ** VkShaderModuleCreateFlags
--- | Opaque flag
-newtype VkShaderModuleCreateFlags = VkShaderModuleCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkEventCreateFlags
--- | Opaque flag
-newtype VkEventCreateFlags = VkEventCreateFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkCommandPoolCreateFlags
-
-newtype VkCommandPoolCreateFlagBits = VkCommandPoolCreateFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkCommandPoolCreateFlagBits
-type VkCommandPoolCreateFlags = VkCommandPoolCreateFlagBits
--- | Command buffers have a short lifetime
-pattern VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = VkCommandPoolCreateFlagBits 0x1
--- | Command buffers may release their memory individually
-pattern VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = VkCommandPoolCreateFlagBits 0x2
-
-
--- ** VkCommandPoolResetFlags
-
-newtype VkCommandPoolResetFlagBits = VkCommandPoolResetFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkCommandPoolResetFlagBits
-type VkCommandPoolResetFlags = VkCommandPoolResetFlagBits
--- | Release resources owned by the pool
-pattern VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = VkCommandPoolResetFlagBits 0x1
-
-
--- ** VkCommandBufferResetFlags
-
-newtype VkCommandBufferResetFlagBits = VkCommandBufferResetFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkCommandBufferResetFlagBits
-type VkCommandBufferResetFlags = VkCommandBufferResetFlagBits
--- | Release resources owned by the buffer
-pattern VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = VkCommandBufferResetFlagBits 0x1
-
-
--- ** VkCommandBufferUsageFlags
-
-newtype VkCommandBufferUsageFlagBits = VkCommandBufferUsageFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkCommandBufferUsageFlagBits
-type VkCommandBufferUsageFlags = VkCommandBufferUsageFlagBits
-
-pattern VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = VkCommandBufferUsageFlagBits 0x1
-
-pattern VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = VkCommandBufferUsageFlagBits 0x2
--- | Command buffer may be submitted/executed more than once simultaneously
-pattern VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = VkCommandBufferUsageFlagBits 0x4
-
-
--- ** VkQueryPipelineStatisticFlags
-
-newtype VkQueryPipelineStatisticFlagBits = VkQueryPipelineStatisticFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkQueryPipelineStatisticFlagBits
-type VkQueryPipelineStatisticFlags = VkQueryPipelineStatisticFlagBits
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = VkQueryPipelineStatisticFlagBits 0x1
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = VkQueryPipelineStatisticFlagBits 0x2
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x4
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x8
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = VkQueryPipelineStatisticFlagBits 0x10
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x20
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = VkQueryPipelineStatisticFlagBits 0x40
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x80
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = VkQueryPipelineStatisticFlagBits 0x100
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x200
--- | Optional
-pattern VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x400
-
-
--- ** VkMemoryMapFlags
--- | Opaque flag
-newtype VkMemoryMapFlags = VkMemoryMapFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkImageAspectFlags
-
-newtype VkImageAspectFlagBits = VkImageAspectFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkImageAspectFlagBits
-type VkImageAspectFlags = VkImageAspectFlagBits
-
-pattern VK_IMAGE_ASPECT_COLOR_BIT = VkImageAspectFlagBits 0x1
-
-pattern VK_IMAGE_ASPECT_DEPTH_BIT = VkImageAspectFlagBits 0x2
-
-pattern VK_IMAGE_ASPECT_STENCIL_BIT = VkImageAspectFlagBits 0x4
-
-pattern VK_IMAGE_ASPECT_METADATA_BIT = VkImageAspectFlagBits 0x8
-
-
--- ** VkSparseMemoryBindFlags
-
-newtype VkSparseMemoryBindFlagBits = VkSparseMemoryBindFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkSparseMemoryBindFlagBits
-type VkSparseMemoryBindFlags = VkSparseMemoryBindFlagBits
--- | Operation binds resource metadata to memory
-pattern VK_SPARSE_MEMORY_BIND_METADATA_BIT = VkSparseMemoryBindFlagBits 0x1
-
-
--- ** VkSparseImageFormatFlags
-
-newtype VkSparseImageFormatFlagBits = VkSparseImageFormatFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkSparseImageFormatFlagBits
-type VkSparseImageFormatFlags = VkSparseImageFormatFlagBits
--- | Image uses a single miptail region for all array layers
-pattern VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = VkSparseImageFormatFlagBits 0x1
--- | Image requires mip levels to be an exact multiple of the sparse image block size for non-miptail levels.
-pattern VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = VkSparseImageFormatFlagBits 0x2
--- | Image uses a non-standard sparse block size
-pattern VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = VkSparseImageFormatFlagBits 0x4
-
-
--- ** VkSubpassDescriptionFlags
--- | Opaque flag
-newtype VkSubpassDescriptionFlags = VkSubpassDescriptionFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkPipelineStageFlags
-
-newtype VkPipelineStageFlagBits = VkPipelineStageFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkPipelineStageFlagBits
-type VkPipelineStageFlags = VkPipelineStageFlagBits
--- | Before subsequent commands are processed
-pattern VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = VkPipelineStageFlagBits 0x1
--- | Draw/DispatchIndirect command fetch
-pattern VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = VkPipelineStageFlagBits 0x2
--- | Vertex/index fetch
-pattern VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = VkPipelineStageFlagBits 0x4
--- | Vertex shading
-pattern VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = VkPipelineStageFlagBits 0x8
--- | Tessellation control shading
-pattern VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = VkPipelineStageFlagBits 0x10
--- | Tessellation evaluation shading
-pattern VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = VkPipelineStageFlagBits 0x20
--- | Geometry shading
-pattern VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = VkPipelineStageFlagBits 0x40
--- | Fragment shading
-pattern VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = VkPipelineStageFlagBits 0x80
--- | Early fragment (depth and stencil) tests
-pattern VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = VkPipelineStageFlagBits 0x100
--- | Late fragment (depth and stencil) tests
-pattern VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = VkPipelineStageFlagBits 0x200
--- | Color attachment writes
-pattern VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = VkPipelineStageFlagBits 0x400
--- | Compute shading
-pattern VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = VkPipelineStageFlagBits 0x800
--- | Transfer/copy operations
-pattern VK_PIPELINE_STAGE_TRANSFER_BIT = VkPipelineStageFlagBits 0x1000
--- | After previous commands have completed
-pattern VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = VkPipelineStageFlagBits 0x2000
--- | Indicates host (CPU) is a source/sink of the dependency
-pattern VK_PIPELINE_STAGE_HOST_BIT = VkPipelineStageFlagBits 0x4000
--- | All stages of the graphics pipeline
-pattern VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = VkPipelineStageFlagBits 0x8000
--- | All stages supported on the queue
-pattern VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = VkPipelineStageFlagBits 0x10000
-
-
--- ** VkSampleCountFlags
-
-newtype VkSampleCountFlagBits = VkSampleCountFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkSampleCountFlagBits
-type VkSampleCountFlags = VkSampleCountFlagBits
--- | Sample count 1 supported
-pattern VK_SAMPLE_COUNT_1_BIT = VkSampleCountFlagBits 0x1
--- | Sample count 2 supported
-pattern VK_SAMPLE_COUNT_2_BIT = VkSampleCountFlagBits 0x2
--- | Sample count 4 supported
-pattern VK_SAMPLE_COUNT_4_BIT = VkSampleCountFlagBits 0x4
--- | Sample count 8 supported
-pattern VK_SAMPLE_COUNT_8_BIT = VkSampleCountFlagBits 0x8
--- | Sample count 16 supported
-pattern VK_SAMPLE_COUNT_16_BIT = VkSampleCountFlagBits 0x10
--- | Sample count 32 supported
-pattern VK_SAMPLE_COUNT_32_BIT = VkSampleCountFlagBits 0x20
--- | Sample count 64 supported
-pattern VK_SAMPLE_COUNT_64_BIT = VkSampleCountFlagBits 0x40
-
-
--- ** VkAttachmentDescriptionFlags
-
-newtype VkAttachmentDescriptionFlagBits = VkAttachmentDescriptionFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkAttachmentDescriptionFlagBits
-type VkAttachmentDescriptionFlags = VkAttachmentDescriptionFlagBits
--- | The attachment may alias physical memory of another attachment in the same render pass
-pattern VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = VkAttachmentDescriptionFlagBits 0x1
-
-
--- ** VkStencilFaceFlags
-
-newtype VkStencilFaceFlagBits = VkStencilFaceFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkStencilFaceFlagBits
-type VkStencilFaceFlags = VkStencilFaceFlagBits
--- | Front face
-pattern VK_STENCIL_FACE_FRONT_BIT = VkStencilFaceFlagBits 0x1
--- | Back face
-pattern VK_STENCIL_FACE_BACK_BIT = VkStencilFaceFlagBits 0x2
--- | Front and back faces
-pattern VK_STENCIL_FRONT_AND_BACK = VkStencilFaceFlagBits 0x3
-
--- ** VkCullModeFlags
-
-newtype VkCullModeFlagBits = VkCullModeFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkCullModeFlagBits
-type VkCullModeFlags = VkCullModeFlagBits
-
-pattern VK_CULL_MODE_FRONT_BIT = VkCullModeFlagBits 0x1
-
-pattern VK_CULL_MODE_BACK_BIT = VkCullModeFlagBits 0x2
-
-pattern VK_CULL_MODE_NONE = VkCullModeFlagBits 0x0
-
-pattern VK_CULL_MODE_FRONT_AND_BACK = VkCullModeFlagBits 0x3
-
--- ** VkDescriptorPoolCreateFlags
-
-newtype VkDescriptorPoolCreateFlagBits = VkDescriptorPoolCreateFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkDescriptorPoolCreateFlagBits
-type VkDescriptorPoolCreateFlags = VkDescriptorPoolCreateFlagBits
--- | Descriptor sets may be freed individually
-pattern VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = VkDescriptorPoolCreateFlagBits 0x1
-
-
--- ** VkDescriptorPoolResetFlags
--- | Opaque flag
-newtype VkDescriptorPoolResetFlags = VkDescriptorPoolResetFlags VkFlags
-  deriving (Eq, Storable)
-
--- ** VkDependencyFlags
-
-newtype VkDependencyFlagBits = VkDependencyFlagBits VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkDependencyFlagBits
-type VkDependencyFlags = VkDependencyFlagBits
--- | Dependency is per pixel region 
-pattern VK_DEPENDENCY_BY_REGION_BIT = VkDependencyFlagBits 0x1
-
-
--- ** VkCompositeAlphaFlagsKHR
-
-newtype VkCompositeAlphaFlagBitsKHR = VkCompositeAlphaFlagBitsKHR VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkCompositeAlphaFlagBitsKHR
-type VkCompositeAlphaFlagsKHR = VkCompositeAlphaFlagBitsKHR
-
-pattern VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = VkCompositeAlphaFlagBitsKHR 0x1
-
-pattern VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR = VkCompositeAlphaFlagBitsKHR 0x2
-
-pattern VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR = VkCompositeAlphaFlagBitsKHR 0x4
-
-pattern VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR = VkCompositeAlphaFlagBitsKHR 0x8
-
-
--- ** VkDisplayPlaneAlphaFlagsKHR
-
-newtype VkDisplayPlaneAlphaFlagBitsKHR = VkDisplayPlaneAlphaFlagBitsKHR VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkDisplayPlaneAlphaFlagBitsKHR
-type VkDisplayPlaneAlphaFlagsKHR = VkDisplayPlaneAlphaFlagBitsKHR
-
-pattern VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR = VkDisplayPlaneAlphaFlagBitsKHR 0x1
-
-pattern VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR = VkDisplayPlaneAlphaFlagBitsKHR 0x2
-
-pattern VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR = VkDisplayPlaneAlphaFlagBitsKHR 0x4
-
-pattern VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR = VkDisplayPlaneAlphaFlagBitsKHR 0x8
-
-
--- ** VkSurfaceTransformFlagsKHR
-
-newtype VkSurfaceTransformFlagBitsKHR = VkSurfaceTransformFlagBitsKHR VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkSurfaceTransformFlagBitsKHR
-type VkSurfaceTransformFlagsKHR = VkSurfaceTransformFlagBitsKHR
-
-pattern VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x1
-
-pattern VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x2
-
-pattern VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x4
-
-pattern VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x8
-
-pattern VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x10
-
-pattern VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x20
-
-pattern VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x40
-
-pattern VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x80
-
-pattern VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = VkSurfaceTransformFlagBitsKHR 0x100
-
-
--- ** VkSwapchainCreateFlagsKHR
--- | Opaque flag
-newtype VkSwapchainCreateFlagsKHR = VkSwapchainCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkDisplayModeCreateFlagsKHR
--- | Opaque flag
-newtype VkDisplayModeCreateFlagsKHR = VkDisplayModeCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkDisplaySurfaceCreateFlagsKHR
--- | Opaque flag
-newtype VkDisplaySurfaceCreateFlagsKHR = VkDisplaySurfaceCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkAndroidSurfaceCreateFlagsKHR
--- | Opaque flag
-newtype VkAndroidSurfaceCreateFlagsKHR = VkAndroidSurfaceCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkMirSurfaceCreateFlagsKHR
--- | Opaque flag
-newtype VkMirSurfaceCreateFlagsKHR = VkMirSurfaceCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkWaylandSurfaceCreateFlagsKHR
--- | Opaque flag
-newtype VkWaylandSurfaceCreateFlagsKHR = VkWaylandSurfaceCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkWin32SurfaceCreateFlagsKHR
--- | Opaque flag
-newtype VkWin32SurfaceCreateFlagsKHR = VkWin32SurfaceCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkXlibSurfaceCreateFlagsKHR
--- | Opaque flag
-newtype VkXlibSurfaceCreateFlagsKHR = VkXlibSurfaceCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkXcbSurfaceCreateFlagsKHR
--- | Opaque flag
-newtype VkXcbSurfaceCreateFlagsKHR = VkXcbSurfaceCreateFlagsKHR VkFlags
-  deriving (Eq, Storable)
-
--- ** VkDebugReportFlagsEXT
-
-newtype VkDebugReportFlagBitsEXT = VkDebugReportFlagBitsEXT VkFlags
-  deriving (Eq, Storable, Bits, FiniteBits)
--- | Alias for VkDebugReportFlagBitsEXT
-type VkDebugReportFlagsEXT = VkDebugReportFlagBitsEXT
-
-pattern VK_DEBUG_REPORT_INFORMATION_BIT_EXT = VkDebugReportFlagBitsEXT 0x1
-
-pattern VK_DEBUG_REPORT_WARNING_BIT_EXT = VkDebugReportFlagBitsEXT 0x2
-
-pattern VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = VkDebugReportFlagBitsEXT 0x4
-
-pattern VK_DEBUG_REPORT_ERROR_BIT_EXT = VkDebugReportFlagBitsEXT 0x8
-
-pattern VK_DEBUG_REPORT_DEBUG_BIT_EXT = VkDebugReportFlagBitsEXT 0x10
-
-
--- * Enumerations
-
--- ** VkImageLayout
-
-newtype VkImageLayout = VkImageLayout Int32
-  deriving (Eq, Storable)
--- | Implicit layout an image is when its contents are undefined due to various reasons (e.g. right after creation)
-pattern VK_IMAGE_LAYOUT_UNDEFINED = VkImageLayout 0
--- | General layout when image can be used for any kind of access
-pattern VK_IMAGE_LAYOUT_GENERAL = VkImageLayout 1
--- | Optimal layout when image is only used for color attachment read/write
-pattern VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = VkImageLayout 2
--- | Optimal layout when image is only used for depth/stencil attachment read/write
-pattern VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = VkImageLayout 3
--- | Optimal layout when image is used for read only depth/stencil attachment and shader access
-pattern VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = VkImageLayout 4
--- | Optimal layout when image is used for read only shader access
-pattern VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = VkImageLayout 5
--- | Optimal layout when image is used only as source of transfer operations
-pattern VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = VkImageLayout 6
--- | Optimal layout when image is used only as destination of transfer operations
-pattern VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = VkImageLayout 7
--- | Initial layout used when the data is populated by the CPU
-pattern VK_IMAGE_LAYOUT_PREINITIALIZED = VkImageLayout 8
-
--- ** VkAttachmentLoadOp
-
-newtype VkAttachmentLoadOp = VkAttachmentLoadOp Int32
-  deriving (Eq, Storable)
-
-pattern VK_ATTACHMENT_LOAD_OP_LOAD = VkAttachmentLoadOp 0
-
-pattern VK_ATTACHMENT_LOAD_OP_CLEAR = VkAttachmentLoadOp 1
-
-pattern VK_ATTACHMENT_LOAD_OP_DONT_CARE = VkAttachmentLoadOp 2
-
--- ** VkAttachmentStoreOp
-
-newtype VkAttachmentStoreOp = VkAttachmentStoreOp Int32
-  deriving (Eq, Storable)
-
-pattern VK_ATTACHMENT_STORE_OP_STORE = VkAttachmentStoreOp 0
-
-pattern VK_ATTACHMENT_STORE_OP_DONT_CARE = VkAttachmentStoreOp 1
-
--- ** VkImageType
-
-newtype VkImageType = VkImageType Int32
-  deriving (Eq, Storable)
-
-pattern VK_IMAGE_TYPE_1D = VkImageType 0
-
-pattern VK_IMAGE_TYPE_2D = VkImageType 1
-
-pattern VK_IMAGE_TYPE_3D = VkImageType 2
-
--- ** VkImageTiling
-
-newtype VkImageTiling = VkImageTiling Int32
-  deriving (Eq, Storable)
-
-pattern VK_IMAGE_TILING_OPTIMAL = VkImageTiling 0
-
-pattern VK_IMAGE_TILING_LINEAR = VkImageTiling 1
-
--- ** VkImageViewType
-
-newtype VkImageViewType = VkImageViewType Int32
-  deriving (Eq, Storable)
-
-pattern VK_IMAGE_VIEW_TYPE_1D = VkImageViewType 0
-
-pattern VK_IMAGE_VIEW_TYPE_2D = VkImageViewType 1
-
-pattern VK_IMAGE_VIEW_TYPE_3D = VkImageViewType 2
-
-pattern VK_IMAGE_VIEW_TYPE_CUBE = VkImageViewType 3
-
-pattern VK_IMAGE_VIEW_TYPE_1D_ARRAY = VkImageViewType 4
-
-pattern VK_IMAGE_VIEW_TYPE_2D_ARRAY = VkImageViewType 5
-
-pattern VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = VkImageViewType 6
-
--- ** VkCommandBufferLevel
-
-newtype VkCommandBufferLevel = VkCommandBufferLevel Int32
-  deriving (Eq, Storable)
-
-pattern VK_COMMAND_BUFFER_LEVEL_PRIMARY = VkCommandBufferLevel 0
-
-pattern VK_COMMAND_BUFFER_LEVEL_SECONDARY = VkCommandBufferLevel 1
-
--- ** VkComponentSwizzle
-
-newtype VkComponentSwizzle = VkComponentSwizzle Int32
-  deriving (Eq, Storable)
-
-pattern VK_COMPONENT_SWIZZLE_IDENTITY = VkComponentSwizzle 0
-
-pattern VK_COMPONENT_SWIZZLE_ZERO = VkComponentSwizzle 1
-
-pattern VK_COMPONENT_SWIZZLE_ONE = VkComponentSwizzle 2
-
-pattern VK_COMPONENT_SWIZZLE_R = VkComponentSwizzle 3
-
-pattern VK_COMPONENT_SWIZZLE_G = VkComponentSwizzle 4
-
-pattern VK_COMPONENT_SWIZZLE_B = VkComponentSwizzle 5
-
-pattern VK_COMPONENT_SWIZZLE_A = VkComponentSwizzle 6
-
--- ** VkDescriptorType
-
-newtype VkDescriptorType = VkDescriptorType Int32
-  deriving (Eq, Storable)
-
-pattern VK_DESCRIPTOR_TYPE_SAMPLER = VkDescriptorType 0
-
-pattern VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = VkDescriptorType 1
-
-pattern VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = VkDescriptorType 2
-
-pattern VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = VkDescriptorType 3
-
-pattern VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = VkDescriptorType 4
-
-pattern VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = VkDescriptorType 5
-
-pattern VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = VkDescriptorType 6
-
-pattern VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = VkDescriptorType 7
-
-pattern VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = VkDescriptorType 8
-
-pattern VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = VkDescriptorType 9
-
-pattern VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = VkDescriptorType 10
-
--- ** VkQueryType
-
-newtype VkQueryType = VkQueryType Int32
-  deriving (Eq, Storable)
-
-pattern VK_QUERY_TYPE_OCCLUSION = VkQueryType 0
--- | Optional
-pattern VK_QUERY_TYPE_PIPELINE_STATISTICS = VkQueryType 1
-
-pattern VK_QUERY_TYPE_TIMESTAMP = VkQueryType 2
-
--- ** VkBorderColor
-
-newtype VkBorderColor = VkBorderColor Int32
-  deriving (Eq, Storable)
-
-pattern VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = VkBorderColor 0
-
-pattern VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = VkBorderColor 1
-
-pattern VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = VkBorderColor 2
-
-pattern VK_BORDER_COLOR_INT_OPAQUE_BLACK = VkBorderColor 3
-
-pattern VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = VkBorderColor 4
-
-pattern VK_BORDER_COLOR_INT_OPAQUE_WHITE = VkBorderColor 5
-
--- ** VkPipelineBindPoint
-
-newtype VkPipelineBindPoint = VkPipelineBindPoint Int32
-  deriving (Eq, Storable)
-
-pattern VK_PIPELINE_BIND_POINT_GRAPHICS = VkPipelineBindPoint 0
-
-pattern VK_PIPELINE_BIND_POINT_COMPUTE = VkPipelineBindPoint 1
-
--- ** VkPipelineCacheHeaderVersion
-
-newtype VkPipelineCacheHeaderVersion = VkPipelineCacheHeaderVersion Int32
-  deriving (Eq, Storable)
-
-pattern VK_PIPELINE_CACHE_HEADER_VERSION_ONE = VkPipelineCacheHeaderVersion 1
-
--- ** VkPrimitiveTopology
-
-newtype VkPrimitiveTopology = VkPrimitiveTopology Int32
-  deriving (Eq, Storable)
-
-pattern VK_PRIMITIVE_TOPOLOGY_POINT_LIST = VkPrimitiveTopology 0
-
-pattern VK_PRIMITIVE_TOPOLOGY_LINE_LIST = VkPrimitiveTopology 1
-
-pattern VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = VkPrimitiveTopology 2
-
-pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = VkPrimitiveTopology 3
-
-pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = VkPrimitiveTopology 4
-
-pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = VkPrimitiveTopology 5
-
-pattern VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = VkPrimitiveTopology 6
-
-pattern VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = VkPrimitiveTopology 7
-
-pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = VkPrimitiveTopology 8
-
-pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = VkPrimitiveTopology 9
-
-pattern VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = VkPrimitiveTopology 10
-
--- ** VkSharingMode
-
-newtype VkSharingMode = VkSharingMode Int32
-  deriving (Eq, Storable)
-
-pattern VK_SHARING_MODE_EXCLUSIVE = VkSharingMode 0
-
-pattern VK_SHARING_MODE_CONCURRENT = VkSharingMode 1
-
--- ** VkIndexType
-
-newtype VkIndexType = VkIndexType Int32
-  deriving (Eq, Storable)
-
-pattern VK_INDEX_TYPE_UINT16 = VkIndexType 0
-
-pattern VK_INDEX_TYPE_UINT32 = VkIndexType 1
-
--- ** VkFilter
-
-newtype VkFilter = VkFilter Int32
-  deriving (Eq, Storable)
-
-pattern VK_FILTER_NEAREST = VkFilter 0
-
-pattern VK_FILTER_LINEAR = VkFilter 1
-
--- ** VkSamplerMipmapMode
-
-newtype VkSamplerMipmapMode = VkSamplerMipmapMode Int32
-  deriving (Eq, Storable)
--- | Choose nearest mip level
-pattern VK_SAMPLER_MIPMAP_MODE_NEAREST = VkSamplerMipmapMode 0
--- | Linear filter between mip levels
-pattern VK_SAMPLER_MIPMAP_MODE_LINEAR = VkSamplerMipmapMode 1
-
--- ** VkSamplerAddressMode
-
-newtype VkSamplerAddressMode = VkSamplerAddressMode Int32
-  deriving (Eq, Storable)
-
-pattern VK_SAMPLER_ADDRESS_MODE_REPEAT = VkSamplerAddressMode 0
-
-pattern VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = VkSamplerAddressMode 1
-
-pattern VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = VkSamplerAddressMode 2
-
-pattern VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = VkSamplerAddressMode 3
-
-pattern VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = VkSamplerAddressMode 4
-
--- ** VkCompareOp
-
-newtype VkCompareOp = VkCompareOp Int32
-  deriving (Eq, Storable)
-
-pattern VK_COMPARE_OP_NEVER = VkCompareOp 0
-
-pattern VK_COMPARE_OP_LESS = VkCompareOp 1
-
-pattern VK_COMPARE_OP_EQUAL = VkCompareOp 2
-
-pattern VK_COMPARE_OP_LESS_OR_EQUAL = VkCompareOp 3
-
-pattern VK_COMPARE_OP_GREATER = VkCompareOp 4
-
-pattern VK_COMPARE_OP_NOT_EQUAL = VkCompareOp 5
-
-pattern VK_COMPARE_OP_GREATER_OR_EQUAL = VkCompareOp 6
-
-pattern VK_COMPARE_OP_ALWAYS = VkCompareOp 7
-
--- ** VkPolygonMode
-
-newtype VkPolygonMode = VkPolygonMode Int32
-  deriving (Eq, Storable)
-
-pattern VK_POLYGON_MODE_FILL = VkPolygonMode 0
-
-pattern VK_POLYGON_MODE_LINE = VkPolygonMode 1
-
-pattern VK_POLYGON_MODE_POINT = VkPolygonMode 2
-
--- ** VkFrontFace
-
-newtype VkFrontFace = VkFrontFace Int32
-  deriving (Eq, Storable)
-
-pattern VK_FRONT_FACE_COUNTER_CLOCKWISE = VkFrontFace 0
-
-pattern VK_FRONT_FACE_CLOCKWISE = VkFrontFace 1
-
--- ** VkBlendFactor
-
-newtype VkBlendFactor = VkBlendFactor Int32
-  deriving (Eq, Storable)
-
-pattern VK_BLEND_FACTOR_ZERO = VkBlendFactor 0
-
-pattern VK_BLEND_FACTOR_ONE = VkBlendFactor 1
-
-pattern VK_BLEND_FACTOR_SRC_COLOR = VkBlendFactor 2
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = VkBlendFactor 3
-
-pattern VK_BLEND_FACTOR_DST_COLOR = VkBlendFactor 4
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR = VkBlendFactor 5
-
-pattern VK_BLEND_FACTOR_SRC_ALPHA = VkBlendFactor 6
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = VkBlendFactor 7
-
-pattern VK_BLEND_FACTOR_DST_ALPHA = VkBlendFactor 8
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = VkBlendFactor 9
-
-pattern VK_BLEND_FACTOR_CONSTANT_COLOR = VkBlendFactor 10
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = VkBlendFactor 11
-
-pattern VK_BLEND_FACTOR_CONSTANT_ALPHA = VkBlendFactor 12
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = VkBlendFactor 13
-
-pattern VK_BLEND_FACTOR_SRC_ALPHA_SATURATE = VkBlendFactor 14
-
-pattern VK_BLEND_FACTOR_SRC1_COLOR = VkBlendFactor 15
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR = VkBlendFactor 16
-
-pattern VK_BLEND_FACTOR_SRC1_ALPHA = VkBlendFactor 17
-
-pattern VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA = VkBlendFactor 18
-
--- ** VkBlendOp
-
-newtype VkBlendOp = VkBlendOp Int32
-  deriving (Eq, Storable)
-
-pattern VK_BLEND_OP_ADD = VkBlendOp 0
-
-pattern VK_BLEND_OP_SUBTRACT = VkBlendOp 1
-
-pattern VK_BLEND_OP_REVERSE_SUBTRACT = VkBlendOp 2
-
-pattern VK_BLEND_OP_MIN = VkBlendOp 3
-
-pattern VK_BLEND_OP_MAX = VkBlendOp 4
-
--- ** VkStencilOp
-
-newtype VkStencilOp = VkStencilOp Int32
-  deriving (Eq, Storable)
-
-pattern VK_STENCIL_OP_KEEP = VkStencilOp 0
-
-pattern VK_STENCIL_OP_ZERO = VkStencilOp 1
-
-pattern VK_STENCIL_OP_REPLACE = VkStencilOp 2
-
-pattern VK_STENCIL_OP_INCREMENT_AND_CLAMP = VkStencilOp 3
-
-pattern VK_STENCIL_OP_DECREMENT_AND_CLAMP = VkStencilOp 4
-
-pattern VK_STENCIL_OP_INVERT = VkStencilOp 5
-
-pattern VK_STENCIL_OP_INCREMENT_AND_WRAP = VkStencilOp 6
-
-pattern VK_STENCIL_OP_DECREMENT_AND_WRAP = VkStencilOp 7
-
--- ** VkLogicOp
-
-newtype VkLogicOp = VkLogicOp Int32
-  deriving (Eq, Storable)
-
-pattern VK_LOGIC_OP_CLEAR = VkLogicOp 0
-
-pattern VK_LOGIC_OP_AND = VkLogicOp 1
-
-pattern VK_LOGIC_OP_AND_REVERSE = VkLogicOp 2
-
-pattern VK_LOGIC_OP_COPY = VkLogicOp 3
-
-pattern VK_LOGIC_OP_AND_INVERTED = VkLogicOp 4
-
-pattern VK_LOGIC_OP_NO_OP = VkLogicOp 5
-
-pattern VK_LOGIC_OP_XOR = VkLogicOp 6
-
-pattern VK_LOGIC_OP_OR = VkLogicOp 7
-
-pattern VK_LOGIC_OP_NOR = VkLogicOp 8
-
-pattern VK_LOGIC_OP_EQUIVALENT = VkLogicOp 9
-
-pattern VK_LOGIC_OP_INVERT = VkLogicOp 10
-
-pattern VK_LOGIC_OP_OR_REVERSE = VkLogicOp 11
-
-pattern VK_LOGIC_OP_COPY_INVERTED = VkLogicOp 12
-
-pattern VK_LOGIC_OP_OR_INVERTED = VkLogicOp 13
-
-pattern VK_LOGIC_OP_NAND = VkLogicOp 14
-
-pattern VK_LOGIC_OP_SET = VkLogicOp 15
-
--- ** VkInternalAllocationType
-
-newtype VkInternalAllocationType = VkInternalAllocationType Int32
-  deriving (Eq, Storable)
-
-pattern VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = VkInternalAllocationType 0
-
--- ** VkSystemAllocationScope
-
-newtype VkSystemAllocationScope = VkSystemAllocationScope Int32
-  deriving (Eq, Storable)
-
-pattern VK_SYSTEM_ALLOCATION_SCOPE_COMMAND = VkSystemAllocationScope 0
-
-pattern VK_SYSTEM_ALLOCATION_SCOPE_OBJECT = VkSystemAllocationScope 1
-
-pattern VK_SYSTEM_ALLOCATION_SCOPE_CACHE = VkSystemAllocationScope 2
-
-pattern VK_SYSTEM_ALLOCATION_SCOPE_DEVICE = VkSystemAllocationScope 3
-
-pattern VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE = VkSystemAllocationScope 4
-
--- ** VkPhysicalDeviceType
-
-newtype VkPhysicalDeviceType = VkPhysicalDeviceType Int32
-  deriving (Eq, Storable)
-
-pattern VK_PHYSICAL_DEVICE_TYPE_OTHER = VkPhysicalDeviceType 0
-
-pattern VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = VkPhysicalDeviceType 1
-
-pattern VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = VkPhysicalDeviceType 2
-
-pattern VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = VkPhysicalDeviceType 3
-
-pattern VK_PHYSICAL_DEVICE_TYPE_CPU = VkPhysicalDeviceType 4
-
--- ** VkVertexInputRate
-
-newtype VkVertexInputRate = VkVertexInputRate Int32
-  deriving (Eq, Storable)
-
-pattern VK_VERTEX_INPUT_RATE_VERTEX = VkVertexInputRate 0
-
-pattern VK_VERTEX_INPUT_RATE_INSTANCE = VkVertexInputRate 1
-
--- ** VkFormat
--- | Vulkan format definitions
-newtype VkFormat = VkFormat Int32
-  deriving (Eq, Storable)
-
-pattern VK_FORMAT_UNDEFINED = VkFormat 0
-
-pattern VK_FORMAT_R4G4_UNORM_PACK8 = VkFormat 1
-
-pattern VK_FORMAT_R4G4B4A4_UNORM_PACK16 = VkFormat 2
-
-pattern VK_FORMAT_B4G4R4A4_UNORM_PACK16 = VkFormat 3
-
-pattern VK_FORMAT_R5G6B5_UNORM_PACK16 = VkFormat 4
-
-pattern VK_FORMAT_B5G6R5_UNORM_PACK16 = VkFormat 5
-
-pattern VK_FORMAT_R5G5B5A1_UNORM_PACK16 = VkFormat 6
-
-pattern VK_FORMAT_B5G5R5A1_UNORM_PACK16 = VkFormat 7
-
-pattern VK_FORMAT_A1R5G5B5_UNORM_PACK16 = VkFormat 8
-
-pattern VK_FORMAT_R8_UNORM = VkFormat 9
-
-pattern VK_FORMAT_R8_SNORM = VkFormat 10
-
-pattern VK_FORMAT_R8_USCALED = VkFormat 11
-
-pattern VK_FORMAT_R8_SSCALED = VkFormat 12
-
-pattern VK_FORMAT_R8_UINT = VkFormat 13
-
-pattern VK_FORMAT_R8_SINT = VkFormat 14
-
-pattern VK_FORMAT_R8_SRGB = VkFormat 15
-
-pattern VK_FORMAT_R8G8_UNORM = VkFormat 16
-
-pattern VK_FORMAT_R8G8_SNORM = VkFormat 17
-
-pattern VK_FORMAT_R8G8_USCALED = VkFormat 18
-
-pattern VK_FORMAT_R8G8_SSCALED = VkFormat 19
-
-pattern VK_FORMAT_R8G8_UINT = VkFormat 20
-
-pattern VK_FORMAT_R8G8_SINT = VkFormat 21
-
-pattern VK_FORMAT_R8G8_SRGB = VkFormat 22
-
-pattern VK_FORMAT_R8G8B8_UNORM = VkFormat 23
-
-pattern VK_FORMAT_R8G8B8_SNORM = VkFormat 24
-
-pattern VK_FORMAT_R8G8B8_USCALED = VkFormat 25
-
-pattern VK_FORMAT_R8G8B8_SSCALED = VkFormat 26
-
-pattern VK_FORMAT_R8G8B8_UINT = VkFormat 27
-
-pattern VK_FORMAT_R8G8B8_SINT = VkFormat 28
-
-pattern VK_FORMAT_R8G8B8_SRGB = VkFormat 29
-
-pattern VK_FORMAT_B8G8R8_UNORM = VkFormat 30
-
-pattern VK_FORMAT_B8G8R8_SNORM = VkFormat 31
-
-pattern VK_FORMAT_B8G8R8_USCALED = VkFormat 32
-
-pattern VK_FORMAT_B8G8R8_SSCALED = VkFormat 33
-
-pattern VK_FORMAT_B8G8R8_UINT = VkFormat 34
-
-pattern VK_FORMAT_B8G8R8_SINT = VkFormat 35
-
-pattern VK_FORMAT_B8G8R8_SRGB = VkFormat 36
-
-pattern VK_FORMAT_R8G8B8A8_UNORM = VkFormat 37
-
-pattern VK_FORMAT_R8G8B8A8_SNORM = VkFormat 38
-
-pattern VK_FORMAT_R8G8B8A8_USCALED = VkFormat 39
-
-pattern VK_FORMAT_R8G8B8A8_SSCALED = VkFormat 40
-
-pattern VK_FORMAT_R8G8B8A8_UINT = VkFormat 41
-
-pattern VK_FORMAT_R8G8B8A8_SINT = VkFormat 42
-
-pattern VK_FORMAT_R8G8B8A8_SRGB = VkFormat 43
-
-pattern VK_FORMAT_B8G8R8A8_UNORM = VkFormat 44
-
-pattern VK_FORMAT_B8G8R8A8_SNORM = VkFormat 45
-
-pattern VK_FORMAT_B8G8R8A8_USCALED = VkFormat 46
-
-pattern VK_FORMAT_B8G8R8A8_SSCALED = VkFormat 47
-
-pattern VK_FORMAT_B8G8R8A8_UINT = VkFormat 48
-
-pattern VK_FORMAT_B8G8R8A8_SINT = VkFormat 49
-
-pattern VK_FORMAT_B8G8R8A8_SRGB = VkFormat 50
-
-pattern VK_FORMAT_A8B8G8R8_UNORM_PACK32 = VkFormat 51
-
-pattern VK_FORMAT_A8B8G8R8_SNORM_PACK32 = VkFormat 52
-
-pattern VK_FORMAT_A8B8G8R8_USCALED_PACK32 = VkFormat 53
-
-pattern VK_FORMAT_A8B8G8R8_SSCALED_PACK32 = VkFormat 54
-
-pattern VK_FORMAT_A8B8G8R8_UINT_PACK32 = VkFormat 55
-
-pattern VK_FORMAT_A8B8G8R8_SINT_PACK32 = VkFormat 56
-
-pattern VK_FORMAT_A8B8G8R8_SRGB_PACK32 = VkFormat 57
-
-pattern VK_FORMAT_A2R10G10B10_UNORM_PACK32 = VkFormat 58
-
-pattern VK_FORMAT_A2R10G10B10_SNORM_PACK32 = VkFormat 59
-
-pattern VK_FORMAT_A2R10G10B10_USCALED_PACK32 = VkFormat 60
-
-pattern VK_FORMAT_A2R10G10B10_SSCALED_PACK32 = VkFormat 61
-
-pattern VK_FORMAT_A2R10G10B10_UINT_PACK32 = VkFormat 62
-
-pattern VK_FORMAT_A2R10G10B10_SINT_PACK32 = VkFormat 63
-
-pattern VK_FORMAT_A2B10G10R10_UNORM_PACK32 = VkFormat 64
-
-pattern VK_FORMAT_A2B10G10R10_SNORM_PACK32 = VkFormat 65
-
-pattern VK_FORMAT_A2B10G10R10_USCALED_PACK32 = VkFormat 66
-
-pattern VK_FORMAT_A2B10G10R10_SSCALED_PACK32 = VkFormat 67
-
-pattern VK_FORMAT_A2B10G10R10_UINT_PACK32 = VkFormat 68
-
-pattern VK_FORMAT_A2B10G10R10_SINT_PACK32 = VkFormat 69
-
-pattern VK_FORMAT_R16_UNORM = VkFormat 70
-
-pattern VK_FORMAT_R16_SNORM = VkFormat 71
-
-pattern VK_FORMAT_R16_USCALED = VkFormat 72
-
-pattern VK_FORMAT_R16_SSCALED = VkFormat 73
-
-pattern VK_FORMAT_R16_UINT = VkFormat 74
-
-pattern VK_FORMAT_R16_SINT = VkFormat 75
-
-pattern VK_FORMAT_R16_SFLOAT = VkFormat 76
-
-pattern VK_FORMAT_R16G16_UNORM = VkFormat 77
-
-pattern VK_FORMAT_R16G16_SNORM = VkFormat 78
-
-pattern VK_FORMAT_R16G16_USCALED = VkFormat 79
-
-pattern VK_FORMAT_R16G16_SSCALED = VkFormat 80
-
-pattern VK_FORMAT_R16G16_UINT = VkFormat 81
-
-pattern VK_FORMAT_R16G16_SINT = VkFormat 82
-
-pattern VK_FORMAT_R16G16_SFLOAT = VkFormat 83
-
-pattern VK_FORMAT_R16G16B16_UNORM = VkFormat 84
-
-pattern VK_FORMAT_R16G16B16_SNORM = VkFormat 85
-
-pattern VK_FORMAT_R16G16B16_USCALED = VkFormat 86
-
-pattern VK_FORMAT_R16G16B16_SSCALED = VkFormat 87
-
-pattern VK_FORMAT_R16G16B16_UINT = VkFormat 88
-
-pattern VK_FORMAT_R16G16B16_SINT = VkFormat 89
-
-pattern VK_FORMAT_R16G16B16_SFLOAT = VkFormat 90
-
-pattern VK_FORMAT_R16G16B16A16_UNORM = VkFormat 91
-
-pattern VK_FORMAT_R16G16B16A16_SNORM = VkFormat 92
-
-pattern VK_FORMAT_R16G16B16A16_USCALED = VkFormat 93
-
-pattern VK_FORMAT_R16G16B16A16_SSCALED = VkFormat 94
-
-pattern VK_FORMAT_R16G16B16A16_UINT = VkFormat 95
-
-pattern VK_FORMAT_R16G16B16A16_SINT = VkFormat 96
-
-pattern VK_FORMAT_R16G16B16A16_SFLOAT = VkFormat 97
-
-pattern VK_FORMAT_R32_UINT = VkFormat 98
-
-pattern VK_FORMAT_R32_SINT = VkFormat 99
-
-pattern VK_FORMAT_R32_SFLOAT = VkFormat 100
-
-pattern VK_FORMAT_R32G32_UINT = VkFormat 101
-
-pattern VK_FORMAT_R32G32_SINT = VkFormat 102
-
-pattern VK_FORMAT_R32G32_SFLOAT = VkFormat 103
-
-pattern VK_FORMAT_R32G32B32_UINT = VkFormat 104
-
-pattern VK_FORMAT_R32G32B32_SINT = VkFormat 105
-
-pattern VK_FORMAT_R32G32B32_SFLOAT = VkFormat 106
-
-pattern VK_FORMAT_R32G32B32A32_UINT = VkFormat 107
-
-pattern VK_FORMAT_R32G32B32A32_SINT = VkFormat 108
-
-pattern VK_FORMAT_R32G32B32A32_SFLOAT = VkFormat 109
-
-pattern VK_FORMAT_R64_UINT = VkFormat 110
-
-pattern VK_FORMAT_R64_SINT = VkFormat 111
-
-pattern VK_FORMAT_R64_SFLOAT = VkFormat 112
-
-pattern VK_FORMAT_R64G64_UINT = VkFormat 113
-
-pattern VK_FORMAT_R64G64_SINT = VkFormat 114
-
-pattern VK_FORMAT_R64G64_SFLOAT = VkFormat 115
-
-pattern VK_FORMAT_R64G64B64_UINT = VkFormat 116
-
-pattern VK_FORMAT_R64G64B64_SINT = VkFormat 117
-
-pattern VK_FORMAT_R64G64B64_SFLOAT = VkFormat 118
-
-pattern VK_FORMAT_R64G64B64A64_UINT = VkFormat 119
-
-pattern VK_FORMAT_R64G64B64A64_SINT = VkFormat 120
-
-pattern VK_FORMAT_R64G64B64A64_SFLOAT = VkFormat 121
-
-pattern VK_FORMAT_B10G11R11_UFLOAT_PACK32 = VkFormat 122
-
-pattern VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = VkFormat 123
-
-pattern VK_FORMAT_D16_UNORM = VkFormat 124
-
-pattern VK_FORMAT_X8_D24_UNORM_PACK32 = VkFormat 125
-
-pattern VK_FORMAT_D32_SFLOAT = VkFormat 126
-
-pattern VK_FORMAT_S8_UINT = VkFormat 127
-
-pattern VK_FORMAT_D16_UNORM_S8_UINT = VkFormat 128
-
-pattern VK_FORMAT_D24_UNORM_S8_UINT = VkFormat 129
-
-pattern VK_FORMAT_D32_SFLOAT_S8_UINT = VkFormat 130
-
-pattern VK_FORMAT_BC1_RGB_UNORM_BLOCK = VkFormat 131
-
-pattern VK_FORMAT_BC1_RGB_SRGB_BLOCK = VkFormat 132
-
-pattern VK_FORMAT_BC1_RGBA_UNORM_BLOCK = VkFormat 133
-
-pattern VK_FORMAT_BC1_RGBA_SRGB_BLOCK = VkFormat 134
-
-pattern VK_FORMAT_BC2_UNORM_BLOCK = VkFormat 135
-
-pattern VK_FORMAT_BC2_SRGB_BLOCK = VkFormat 136
-
-pattern VK_FORMAT_BC3_UNORM_BLOCK = VkFormat 137
-
-pattern VK_FORMAT_BC3_SRGB_BLOCK = VkFormat 138
-
-pattern VK_FORMAT_BC4_UNORM_BLOCK = VkFormat 139
-
-pattern VK_FORMAT_BC4_SNORM_BLOCK = VkFormat 140
-
-pattern VK_FORMAT_BC5_UNORM_BLOCK = VkFormat 141
-
-pattern VK_FORMAT_BC5_SNORM_BLOCK = VkFormat 142
-
-pattern VK_FORMAT_BC6H_UFLOAT_BLOCK = VkFormat 143
-
-pattern VK_FORMAT_BC6H_SFLOAT_BLOCK = VkFormat 144
-
-pattern VK_FORMAT_BC7_UNORM_BLOCK = VkFormat 145
-
-pattern VK_FORMAT_BC7_SRGB_BLOCK = VkFormat 146
-
-pattern VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = VkFormat 147
-
-pattern VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = VkFormat 148
-
-pattern VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = VkFormat 149
-
-pattern VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = VkFormat 150
-
-pattern VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = VkFormat 151
-
-pattern VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = VkFormat 152
-
-pattern VK_FORMAT_EAC_R11_UNORM_BLOCK = VkFormat 153
-
-pattern VK_FORMAT_EAC_R11_SNORM_BLOCK = VkFormat 154
-
-pattern VK_FORMAT_EAC_R11G11_UNORM_BLOCK = VkFormat 155
-
-pattern VK_FORMAT_EAC_R11G11_SNORM_BLOCK = VkFormat 156
-
-pattern VK_FORMAT_ASTC_4x4_UNORM_BLOCK = VkFormat 157
-
-pattern VK_FORMAT_ASTC_4x4_SRGB_BLOCK = VkFormat 158
-
-pattern VK_FORMAT_ASTC_5x4_UNORM_BLOCK = VkFormat 159
-
-pattern VK_FORMAT_ASTC_5x4_SRGB_BLOCK = VkFormat 160
-
-pattern VK_FORMAT_ASTC_5x5_UNORM_BLOCK = VkFormat 161
-
-pattern VK_FORMAT_ASTC_5x5_SRGB_BLOCK = VkFormat 162
-
-pattern VK_FORMAT_ASTC_6x5_UNORM_BLOCK = VkFormat 163
-
-pattern VK_FORMAT_ASTC_6x5_SRGB_BLOCK = VkFormat 164
-
-pattern VK_FORMAT_ASTC_6x6_UNORM_BLOCK = VkFormat 165
-
-pattern VK_FORMAT_ASTC_6x6_SRGB_BLOCK = VkFormat 166
-
-pattern VK_FORMAT_ASTC_8x5_UNORM_BLOCK = VkFormat 167
-
-pattern VK_FORMAT_ASTC_8x5_SRGB_BLOCK = VkFormat 168
-
-pattern VK_FORMAT_ASTC_8x6_UNORM_BLOCK = VkFormat 169
-
-pattern VK_FORMAT_ASTC_8x6_SRGB_BLOCK = VkFormat 170
-
-pattern VK_FORMAT_ASTC_8x8_UNORM_BLOCK = VkFormat 171
-
-pattern VK_FORMAT_ASTC_8x8_SRGB_BLOCK = VkFormat 172
-
-pattern VK_FORMAT_ASTC_10x5_UNORM_BLOCK = VkFormat 173
-
-pattern VK_FORMAT_ASTC_10x5_SRGB_BLOCK = VkFormat 174
-
-pattern VK_FORMAT_ASTC_10x6_UNORM_BLOCK = VkFormat 175
-
-pattern VK_FORMAT_ASTC_10x6_SRGB_BLOCK = VkFormat 176
-
-pattern VK_FORMAT_ASTC_10x8_UNORM_BLOCK = VkFormat 177
-
-pattern VK_FORMAT_ASTC_10x8_SRGB_BLOCK = VkFormat 178
-
-pattern VK_FORMAT_ASTC_10x10_UNORM_BLOCK = VkFormat 179
-
-pattern VK_FORMAT_ASTC_10x10_SRGB_BLOCK = VkFormat 180
-
-pattern VK_FORMAT_ASTC_12x10_UNORM_BLOCK = VkFormat 181
-
-pattern VK_FORMAT_ASTC_12x10_SRGB_BLOCK = VkFormat 182
-
-pattern VK_FORMAT_ASTC_12x12_UNORM_BLOCK = VkFormat 183
-
-pattern VK_FORMAT_ASTC_12x12_SRGB_BLOCK = VkFormat 184
-
--- ** VkStructureType
--- | Structure type enumerant
-newtype VkStructureType = VkStructureType Int32
-  deriving (Eq, Storable)
-
-pattern VK_STRUCTURE_TYPE_APPLICATION_INFO = VkStructureType 0
-
-pattern VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = VkStructureType 1
-
-pattern VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = VkStructureType 2
-
-pattern VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = VkStructureType 3
-
-pattern VK_STRUCTURE_TYPE_SUBMIT_INFO = VkStructureType 4
-
-pattern VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO = VkStructureType 5
-
-pattern VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = VkStructureType 6
-
-pattern VK_STRUCTURE_TYPE_BIND_SPARSE_INFO = VkStructureType 7
-
-pattern VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = VkStructureType 8
-
-pattern VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = VkStructureType 9
-
-pattern VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = VkStructureType 10
-
-pattern VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = VkStructureType 11
-
-pattern VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = VkStructureType 12
-
-pattern VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = VkStructureType 13
-
-pattern VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = VkStructureType 14
-
-pattern VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = VkStructureType 15
-
-pattern VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = VkStructureType 16
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = VkStructureType 17
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = VkStructureType 18
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = VkStructureType 19
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = VkStructureType 20
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = VkStructureType 21
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = VkStructureType 22
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = VkStructureType 23
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = VkStructureType 24
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = VkStructureType 25
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = VkStructureType 26
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = VkStructureType 27
-
-pattern VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = VkStructureType 28
-
-pattern VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = VkStructureType 29
-
-pattern VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = VkStructureType 30
-
-pattern VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = VkStructureType 31
-
-pattern VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = VkStructureType 32
-
-pattern VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = VkStructureType 33
-
-pattern VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO = VkStructureType 34
-
-pattern VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = VkStructureType 35
-
-pattern VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = VkStructureType 36
-
-pattern VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = VkStructureType 37
-
-pattern VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = VkStructureType 38
-
-pattern VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = VkStructureType 39
-
-pattern VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = VkStructureType 40
-
-pattern VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO = VkStructureType 41
-
-pattern VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = VkStructureType 42
-
-pattern VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = VkStructureType 43
-
-pattern VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = VkStructureType 44
-
-pattern VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = VkStructureType 45
-
-pattern VK_STRUCTURE_TYPE_MEMORY_BARRIER = VkStructureType 46
-
-pattern VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = VkStructureType 47
-
-pattern VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = VkStructureType 48
-
--- ** VkSubpassContents
-
-newtype VkSubpassContents = VkSubpassContents Int32
-  deriving (Eq, Storable)
-
-pattern VK_SUBPASS_CONTENTS_INLINE = VkSubpassContents 0
-
-pattern VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = VkSubpassContents 1
-
--- ** VkResult
--- | Error and return codes
-newtype VkResult = VkResult Int32
-  deriving (Eq, Storable)
--- | Command completed successfully
-pattern VK_SUCCESS = VkResult 0
--- | A fence or query has not yet completed
-pattern VK_NOT_READY = VkResult 1
--- | A wait operation has not completed in the specified time
-pattern VK_TIMEOUT = VkResult 2
--- | An event is signaled
-pattern VK_EVENT_SET = VkResult 3
--- | An event is unsignalled
-pattern VK_EVENT_RESET = VkResult 4
--- | A return array was too small for the resul
-pattern VK_INCOMPLETE = VkResult 5
--- | A host memory allocation has failed
-pattern VK_ERROR_OUT_OF_HOST_MEMORY = VkResult (-1)
--- | A device memory allocation has failed
-pattern VK_ERROR_OUT_OF_DEVICE_MEMORY = VkResult (-2)
--- | The logical device has been lost. See <<devsandqueues-lost-device>>
-pattern VK_ERROR_INITIALIZATION_FAILED = VkResult (-3)
--- | Initialization of a object has failed
-pattern VK_ERROR_DEVICE_LOST = VkResult (-4)
--- | Mapping of a memory object has failed
-pattern VK_ERROR_MEMORY_MAP_FAILED = VkResult (-5)
--- | Layer specified does not exist
-pattern VK_ERROR_LAYER_NOT_PRESENT = VkResult (-6)
--- | Extension specified does not exist
-pattern VK_ERROR_EXTENSION_NOT_PRESENT = VkResult (-7)
--- | Requested feature is not available on this device
-pattern VK_ERROR_FEATURE_NOT_PRESENT = VkResult (-8)
--- | Unable to find a Vulkan driver
-pattern VK_ERROR_INCOMPATIBLE_DRIVER = VkResult (-9)
--- | Too many objects of the type have already been created
-pattern VK_ERROR_TOO_MANY_OBJECTS = VkResult (-10)
--- | Requested format is not supported on this device
-pattern VK_ERROR_FORMAT_NOT_SUPPORTED = VkResult (-11)
-
--- ** VkDynamicState
-
-newtype VkDynamicState = VkDynamicState Int32
-  deriving (Eq, Storable)
-
-pattern VK_DYNAMIC_STATE_VIEWPORT = VkDynamicState 0
-
-pattern VK_DYNAMIC_STATE_SCISSOR = VkDynamicState 1
-
-pattern VK_DYNAMIC_STATE_LINE_WIDTH = VkDynamicState 2
-
-pattern VK_DYNAMIC_STATE_DEPTH_BIAS = VkDynamicState 3
-
-pattern VK_DYNAMIC_STATE_BLEND_CONSTANTS = VkDynamicState 4
-
-pattern VK_DYNAMIC_STATE_DEPTH_BOUNDS = VkDynamicState 5
-
-pattern VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = VkDynamicState 6
-
-pattern VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = VkDynamicState 7
-
-pattern VK_DYNAMIC_STATE_STENCIL_REFERENCE = VkDynamicState 8
-
--- ** VkPresentModeKHR
-
-newtype VkPresentModeKHR = VkPresentModeKHR Int32
-  deriving (Eq, Storable)
-
-pattern VK_PRESENT_MODE_IMMEDIATE_KHR = VkPresentModeKHR 0
-
-pattern VK_PRESENT_MODE_MAILBOX_KHR = VkPresentModeKHR 1
-
-pattern VK_PRESENT_MODE_FIFO_KHR = VkPresentModeKHR 2
-
-pattern VK_PRESENT_MODE_FIFO_RELAXED_KHR = VkPresentModeKHR 3
-
--- ** VkColorSpaceKHR
-
-newtype VkColorSpaceKHR = VkColorSpaceKHR Int32
-  deriving (Eq, Storable)
-
-pattern VK_COLORSPACE_SRGB_NONLINEAR_KHR = VkColorSpaceKHR 0
-
--- ** VkDebugReportObjectTypeEXT
-
-newtype VkDebugReportObjectTypeEXT = VkDebugReportObjectTypeEXT Int32
-  deriving (Eq, Storable)
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT = VkDebugReportObjectTypeEXT 0
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT = VkDebugReportObjectTypeEXT 1
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT = VkDebugReportObjectTypeEXT 2
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT = VkDebugReportObjectTypeEXT 3
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT = VkDebugReportObjectTypeEXT 4
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT = VkDebugReportObjectTypeEXT 5
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT = VkDebugReportObjectTypeEXT 6
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT = VkDebugReportObjectTypeEXT 7
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT = VkDebugReportObjectTypeEXT 8
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT = VkDebugReportObjectTypeEXT 9
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT = VkDebugReportObjectTypeEXT 10
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT = VkDebugReportObjectTypeEXT 11
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT = VkDebugReportObjectTypeEXT 12
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT = VkDebugReportObjectTypeEXT 13
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT = VkDebugReportObjectTypeEXT 14
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT = VkDebugReportObjectTypeEXT 15
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT = VkDebugReportObjectTypeEXT 16
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT = VkDebugReportObjectTypeEXT 17
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT = VkDebugReportObjectTypeEXT 18
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT = VkDebugReportObjectTypeEXT 19
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT = VkDebugReportObjectTypeEXT 20
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT = VkDebugReportObjectTypeEXT 21
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT = VkDebugReportObjectTypeEXT 22
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT = VkDebugReportObjectTypeEXT 23
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT = VkDebugReportObjectTypeEXT 24
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT = VkDebugReportObjectTypeEXT 25
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = VkDebugReportObjectTypeEXT 26
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = VkDebugReportObjectTypeEXT 27
-
-pattern VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = VkDebugReportObjectTypeEXT 28
-
--- ** VkDebugReportErrorEXT
-
-newtype VkDebugReportErrorEXT = VkDebugReportErrorEXT Int32
-  deriving (Eq, Storable)
-
-pattern VK_DEBUG_REPORT_ERROR_NONE_EXT = VkDebugReportErrorEXT 0
-
-pattern VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT = VkDebugReportErrorEXT 1
-
--- * Struct Types
-
-
-data VkOffset2D =
-  VkOffset2D{ vkX :: Int32 
-            , vkY :: Int32 
-            }
-  deriving (Eq)
-
-instance Storable VkOffset2D where
-  sizeOf ~_ = 8
-  alignment ~_ = 4
-  peek ptr = VkOffset2D <$> peek (ptr `plusPtr` 0)
-                        <*> peek (ptr `plusPtr` 4)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkOffset2D))
-                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkOffset2D))
-
-
-
-data VkOffset3D =
-  VkOffset3D{ vkX :: Int32 
-            , vkY :: Int32 
-            , vkZ :: Int32 
-            }
-  deriving (Eq)
-
-instance Storable VkOffset3D where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkOffset3D <$> peek (ptr `plusPtr` 0)
-                        <*> peek (ptr `plusPtr` 4)
-                        <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkOffset3D))
-                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkOffset3D))
-                *> poke (ptr `plusPtr` 8) (vkZ (poked :: VkOffset3D))
-
-
-
-data VkExtent2D =
-  VkExtent2D{ vkWidth :: Word32 
-            , vkHeight :: Word32 
-            }
-  deriving (Eq)
-
-instance Storable VkExtent2D where
-  sizeOf ~_ = 8
-  alignment ~_ = 4
-  peek ptr = VkExtent2D <$> peek (ptr `plusPtr` 0)
-                        <*> peek (ptr `plusPtr` 4)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkWidth (poked :: VkExtent2D))
-                *> poke (ptr `plusPtr` 4) (vkHeight (poked :: VkExtent2D))
-
-
-
-data VkExtent3D =
-  VkExtent3D{ vkWidth :: Word32 
-            , vkHeight :: Word32 
-            , vkDepth :: Word32 
-            }
-  deriving (Eq)
-
-instance Storable VkExtent3D where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkExtent3D <$> peek (ptr `plusPtr` 0)
-                        <*> peek (ptr `plusPtr` 4)
-                        <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkWidth (poked :: VkExtent3D))
-                *> poke (ptr `plusPtr` 4) (vkHeight (poked :: VkExtent3D))
-                *> poke (ptr `plusPtr` 8) (vkDepth (poked :: VkExtent3D))
-
-
-
-data VkViewport =
-  VkViewport{ vkX :: CFloat 
-            , vkY :: CFloat 
-            , vkWidth :: CFloat 
-            , vkHeight :: CFloat 
-            , vkMinDepth :: CFloat 
-            , vkMaxDepth :: CFloat 
-            }
-  deriving (Eq)
-
-instance Storable VkViewport where
-  sizeOf ~_ = 24
-  alignment ~_ = 4
-  peek ptr = VkViewport <$> peek (ptr `plusPtr` 0)
-                        <*> peek (ptr `plusPtr` 4)
-                        <*> peek (ptr `plusPtr` 8)
-                        <*> peek (ptr `plusPtr` 12)
-                        <*> peek (ptr `plusPtr` 16)
-                        <*> peek (ptr `plusPtr` 20)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkViewport))
-                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkViewport))
-                *> poke (ptr `plusPtr` 8) (vkWidth (poked :: VkViewport))
-                *> poke (ptr `plusPtr` 12) (vkHeight (poked :: VkViewport))
-                *> poke (ptr `plusPtr` 16) (vkMinDepth (poked :: VkViewport))
-                *> poke (ptr `plusPtr` 20) (vkMaxDepth (poked :: VkViewport))
-
-
-
-data VkRect2D =
-  VkRect2D{ vkOffset :: VkOffset2D 
-          , vkExtent :: VkExtent2D 
-          }
-  deriving (Eq)
-
-instance Storable VkRect2D where
-  sizeOf ~_ = 16
-  alignment ~_ = 4
-  peek ptr = VkRect2D <$> peek (ptr `plusPtr` 0)
-                      <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkOffset (poked :: VkRect2D))
-                *> poke (ptr `plusPtr` 8) (vkExtent (poked :: VkRect2D))
-
-
-
-data VkRect3D =
-  VkRect3D{ vkOffset :: VkOffset3D 
-          , vkExtent :: VkExtent3D 
-          }
-  deriving (Eq)
-
-instance Storable VkRect3D where
-  sizeOf ~_ = 24
-  alignment ~_ = 4
-  peek ptr = VkRect3D <$> peek (ptr `plusPtr` 0)
-                      <*> peek (ptr `plusPtr` 12)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkOffset (poked :: VkRect3D))
-                *> poke (ptr `plusPtr` 12) (vkExtent (poked :: VkRect3D))
-
-
-
-data VkClearRect =
-  VkClearRect{ vkRect :: VkRect2D 
-             , vkBaseArrayLayer :: Word32 
-             , vkLayerCount :: Word32 
-             }
-  deriving (Eq)
-
-instance Storable VkClearRect where
-  sizeOf ~_ = 24
-  alignment ~_ = 4
-  peek ptr = VkClearRect <$> peek (ptr `plusPtr` 0)
-                         <*> peek (ptr `plusPtr` 16)
-                         <*> peek (ptr `plusPtr` 20)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkRect (poked :: VkClearRect))
-                *> poke (ptr `plusPtr` 16) (vkBaseArrayLayer (poked :: VkClearRect))
-                *> poke (ptr `plusPtr` 20) (vkLayerCount (poked :: VkClearRect))
-
-
-
-data VkComponentMapping =
-  VkComponentMapping{ vkR :: VkComponentSwizzle 
-                    , vkG :: VkComponentSwizzle 
-                    , vkB :: VkComponentSwizzle 
-                    , vkA :: VkComponentSwizzle 
-                    }
-  deriving (Eq)
-
-instance Storable VkComponentMapping where
-  sizeOf ~_ = 16
-  alignment ~_ = 4
-  peek ptr = VkComponentMapping <$> peek (ptr `plusPtr` 0)
-                                <*> peek (ptr `plusPtr` 4)
-                                <*> peek (ptr `plusPtr` 8)
-                                <*> peek (ptr `plusPtr` 12)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkR (poked :: VkComponentMapping))
-                *> poke (ptr `plusPtr` 4) (vkG (poked :: VkComponentMapping))
-                *> poke (ptr `plusPtr` 8) (vkB (poked :: VkComponentMapping))
-                *> poke (ptr `plusPtr` 12) (vkA (poked :: VkComponentMapping))
-
-
-
-data VkPhysicalDeviceProperties =
-  VkPhysicalDeviceProperties{ vkApiVersion :: Word32 
-                            , vkDriverVersion :: Word32 
-                            , vkVendorID :: Word32 
-                            , vkDeviceID :: Word32 
-                            , vkDeviceType :: VkPhysicalDeviceType 
-                            , vkDeviceName :: Vec (ToPeano VK_MAX_PHYSICAL_DEVICE_NAME_SIZE) CChar 
-                            , vkPipelineCacheUUID :: Vec (ToPeano VK_UUID_SIZE) Word8 
-                            , vkLimits :: VkPhysicalDeviceLimits 
-                            , vkSparseProperties :: VkPhysicalDeviceSparseProperties 
-                            }
-  deriving (Eq)
-
-instance Storable VkPhysicalDeviceProperties where
-  sizeOf ~_ = 824
-  alignment ~_ = 8
-  peek ptr = VkPhysicalDeviceProperties <$> peek (ptr `plusPtr` 0)
-                                        <*> peek (ptr `plusPtr` 4)
-                                        <*> peek (ptr `plusPtr` 8)
-                                        <*> peek (ptr `plusPtr` 12)
-                                        <*> peek (ptr `plusPtr` 16)
-                                        <*> peek (ptr `plusPtr` 20)
-                                        <*> peek (ptr `plusPtr` 276)
-                                        <*> peek (ptr `plusPtr` 296)
-                                        <*> peek (ptr `plusPtr` 800)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkApiVersion (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 4) (vkDriverVersion (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 8) (vkVendorID (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 12) (vkDeviceID (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 16) (vkDeviceType (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 20) (vkDeviceName (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 276) (vkPipelineCacheUUID (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 296) (vkLimits (poked :: VkPhysicalDeviceProperties))
-                *> poke (ptr `plusPtr` 800) (vkSparseProperties (poked :: VkPhysicalDeviceProperties))
-
-
-
-data VkExtensionProperties =
-  VkExtensionProperties{ vkExtensionName :: Vec (ToPeano VK_MAX_EXTENSION_NAME_SIZE) CChar 
-                       , vkSpecVersion :: Word32 
-                       }
-  deriving (Eq)
-
-instance Storable VkExtensionProperties where
-  sizeOf ~_ = 260
-  alignment ~_ = 4
-  peek ptr = VkExtensionProperties <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 256)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkExtensionName (poked :: VkExtensionProperties))
-                *> poke (ptr `plusPtr` 256) (vkSpecVersion (poked :: VkExtensionProperties))
-
-
-
-data VkLayerProperties =
-  VkLayerProperties{ vkLayerName :: Vec (ToPeano VK_MAX_EXTENSION_NAME_SIZE) CChar 
-                   , vkSpecVersion :: Word32 
-                   , vkImplementationVersion :: Word32 
-                   , vkDescription :: Vec (ToPeano VK_MAX_DESCRIPTION_SIZE) CChar 
-                   }
-  deriving (Eq)
-
-instance Storable VkLayerProperties where
-  sizeOf ~_ = 520
-  alignment ~_ = 4
-  peek ptr = VkLayerProperties <$> peek (ptr `plusPtr` 0)
-                               <*> peek (ptr `plusPtr` 256)
-                               <*> peek (ptr `plusPtr` 260)
-                               <*> peek (ptr `plusPtr` 264)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkLayerName (poked :: VkLayerProperties))
-                *> poke (ptr `plusPtr` 256) (vkSpecVersion (poked :: VkLayerProperties))
-                *> poke (ptr `plusPtr` 260) (vkImplementationVersion (poked :: VkLayerProperties))
-                *> poke (ptr `plusPtr` 264) (vkDescription (poked :: VkLayerProperties))
-
-
-
-data VkApplicationInfo =
-  VkApplicationInfo{ vkSType :: VkStructureType 
-                   , vkPNext :: Ptr Void 
-                   , vkPApplicationName :: Ptr CChar 
-                   , vkApplicationVersion :: Word32 
-                   , vkPEngineName :: Ptr CChar 
-                   , vkEngineVersion :: Word32 
-                   , vkApiVersion :: Word32 
-                   }
-  deriving (Eq)
-
-instance Storable VkApplicationInfo where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkApplicationInfo <$> peek (ptr `plusPtr` 0)
-                               <*> peek (ptr `plusPtr` 8)
-                               <*> peek (ptr `plusPtr` 16)
-                               <*> peek (ptr `plusPtr` 24)
-                               <*> peek (ptr `plusPtr` 32)
-                               <*> peek (ptr `plusPtr` 40)
-                               <*> peek (ptr `plusPtr` 44)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkApplicationInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkApplicationInfo))
-                *> poke (ptr `plusPtr` 16) (vkPApplicationName (poked :: VkApplicationInfo))
-                *> poke (ptr `plusPtr` 24) (vkApplicationVersion (poked :: VkApplicationInfo))
-                *> poke (ptr `plusPtr` 32) (vkPEngineName (poked :: VkApplicationInfo))
-                *> poke (ptr `plusPtr` 40) (vkEngineVersion (poked :: VkApplicationInfo))
-                *> poke (ptr `plusPtr` 44) (vkApiVersion (poked :: VkApplicationInfo))
-
-
-
-data VkAllocationCallbacks =
-  VkAllocationCallbacks{ vkPUserData :: Ptr Void 
-                       , vkPfnAllocation :: PFN_vkAllocationFunction 
-                       , vkPfnReallocation :: PFN_vkReallocationFunction 
-                       , vkPfnFree :: PFN_vkFreeFunction 
-                       , vkPfnInternalAllocation :: PFN_vkInternalAllocationNotification 
-                       , vkPfnInternalFree :: PFN_vkInternalFreeNotification 
-                       }
-  deriving (Eq)
-
-instance Storable VkAllocationCallbacks where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkAllocationCallbacks <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 16)
-                                   <*> peek (ptr `plusPtr` 24)
-                                   <*> peek (ptr `plusPtr` 32)
-                                   <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkPUserData (poked :: VkAllocationCallbacks))
-                *> poke (ptr `plusPtr` 8) (vkPfnAllocation (poked :: VkAllocationCallbacks))
-                *> poke (ptr `plusPtr` 16) (vkPfnReallocation (poked :: VkAllocationCallbacks))
-                *> poke (ptr `plusPtr` 24) (vkPfnFree (poked :: VkAllocationCallbacks))
-                *> poke (ptr `plusPtr` 32) (vkPfnInternalAllocation (poked :: VkAllocationCallbacks))
-                *> poke (ptr `plusPtr` 40) (vkPfnInternalFree (poked :: VkAllocationCallbacks))
-
-
-
-data VkDeviceQueueCreateInfo =
-  VkDeviceQueueCreateInfo{ vkSType :: VkStructureType 
-                         , vkPNext :: Ptr Void 
-                         , vkFlags :: VkDeviceQueueCreateFlags 
-                         , vkQueueFamilyIndex :: Word32 
-                         , vkQueueCount :: Word32 
-                         , vkPQueuePriorities :: Ptr CFloat 
-                         }
-  deriving (Eq)
-
-instance Storable VkDeviceQueueCreateInfo where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkDeviceQueueCreateInfo <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 8)
-                                     <*> peek (ptr `plusPtr` 16)
-                                     <*> peek (ptr `plusPtr` 20)
-                                     <*> peek (ptr `plusPtr` 24)
-                                     <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDeviceQueueCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDeviceQueueCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDeviceQueueCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkQueueFamilyIndex (poked :: VkDeviceQueueCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkQueueCount (poked :: VkDeviceQueueCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPQueuePriorities (poked :: VkDeviceQueueCreateInfo))
-
-
-
-data VkDeviceCreateInfo =
-  VkDeviceCreateInfo{ vkSType :: VkStructureType 
-                    , vkPNext :: Ptr Void 
-                    , vkFlags :: VkDeviceCreateFlags 
-                    , vkQueueCreateInfoCount :: Word32 
-                    , vkPQueueCreateInfos :: Ptr VkDeviceQueueCreateInfo 
-                    , vkEnabledLayerCount :: Word32 
-                    , vkPpEnabledLayerNames :: Ptr (Ptr CChar) 
-                    , vkEnabledExtensionCount :: Word32 
-                    , vkPpEnabledExtensionNames :: Ptr (Ptr CChar) 
-                    , vkPEnabledFeatures :: Ptr VkPhysicalDeviceFeatures 
-                    }
-  deriving (Eq)
-
-instance Storable VkDeviceCreateInfo where
-  sizeOf ~_ = 72
-  alignment ~_ = 8
-  peek ptr = VkDeviceCreateInfo <$> peek (ptr `plusPtr` 0)
-                                <*> peek (ptr `plusPtr` 8)
-                                <*> peek (ptr `plusPtr` 16)
-                                <*> peek (ptr `plusPtr` 20)
-                                <*> peek (ptr `plusPtr` 24)
-                                <*> peek (ptr `plusPtr` 32)
-                                <*> peek (ptr `plusPtr` 40)
-                                <*> peek (ptr `plusPtr` 48)
-                                <*> peek (ptr `plusPtr` 56)
-                                <*> peek (ptr `plusPtr` 64)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkQueueCreateInfoCount (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPQueueCreateInfos (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkEnabledLayerCount (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPpEnabledLayerNames (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkEnabledExtensionCount (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkPpEnabledExtensionNames (poked :: VkDeviceCreateInfo))
-                *> poke (ptr `plusPtr` 64) (vkPEnabledFeatures (poked :: VkDeviceCreateInfo))
-
-
-
-data VkInstanceCreateInfo =
-  VkInstanceCreateInfo{ vkSType :: VkStructureType 
-                      , vkPNext :: Ptr Void 
-                      , vkFlags :: VkInstanceCreateFlags 
-                      , vkPApplicationInfo :: Ptr VkApplicationInfo 
-                      , vkEnabledLayerCount :: Word32 
-                      , vkPpEnabledLayerNames :: Ptr (Ptr CChar) 
-                      , vkEnabledExtensionCount :: Word32 
-                      , vkPpEnabledExtensionNames :: Ptr (Ptr CChar) 
-                      }
-  deriving (Eq)
-
-instance Storable VkInstanceCreateInfo where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkInstanceCreateInfo <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 8)
-                                  <*> peek (ptr `plusPtr` 16)
-                                  <*> peek (ptr `plusPtr` 24)
-                                  <*> peek (ptr `plusPtr` 32)
-                                  <*> peek (ptr `plusPtr` 40)
-                                  <*> peek (ptr `plusPtr` 48)
-                                  <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkInstanceCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkInstanceCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkInstanceCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPApplicationInfo (poked :: VkInstanceCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkEnabledLayerCount (poked :: VkInstanceCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPpEnabledLayerNames (poked :: VkInstanceCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkEnabledExtensionCount (poked :: VkInstanceCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkPpEnabledExtensionNames (poked :: VkInstanceCreateInfo))
-
-
-
-data VkQueueFamilyProperties =
-  VkQueueFamilyProperties{ vkQueueFlags :: VkQueueFlags 
-                         , vkQueueCount :: Word32 
-                         , vkTimestampValidBits :: Word32 
-                         , vkMinImageTransferGranularity :: VkExtent3D 
-                         }
-  deriving (Eq)
-
-instance Storable VkQueueFamilyProperties where
-  sizeOf ~_ = 24
-  alignment ~_ = 4
-  peek ptr = VkQueueFamilyProperties <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 4)
-                                     <*> peek (ptr `plusPtr` 8)
-                                     <*> peek (ptr `plusPtr` 12)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkQueueFlags (poked :: VkQueueFamilyProperties))
-                *> poke (ptr `plusPtr` 4) (vkQueueCount (poked :: VkQueueFamilyProperties))
-                *> poke (ptr `plusPtr` 8) (vkTimestampValidBits (poked :: VkQueueFamilyProperties))
-                *> poke (ptr `plusPtr` 12) (vkMinImageTransferGranularity (poked :: VkQueueFamilyProperties))
-
-
-
-data VkPhysicalDeviceMemoryProperties =
-  VkPhysicalDeviceMemoryProperties{ vkMemoryTypeCount :: Word32 
-                                  , vkMemoryTypes :: Vec (ToPeano VK_MAX_MEMORY_TYPES) VkMemoryType 
-                                  , vkMemoryHeapCount :: Word32 
-                                  , vkMemoryHeaps :: Vec (ToPeano VK_MAX_MEMORY_HEAPS) VkMemoryHeap 
-                                  }
-  deriving (Eq)
-
-instance Storable VkPhysicalDeviceMemoryProperties where
-  sizeOf ~_ = 520
-  alignment ~_ = 8
-  peek ptr = VkPhysicalDeviceMemoryProperties <$> peek (ptr `plusPtr` 0)
-                                              <*> peek (ptr `plusPtr` 4)
-                                              <*> peek (ptr `plusPtr` 260)
-                                              <*> peek (ptr `plusPtr` 264)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkMemoryTypeCount (poked :: VkPhysicalDeviceMemoryProperties))
-                *> poke (ptr `plusPtr` 4) (vkMemoryTypes (poked :: VkPhysicalDeviceMemoryProperties))
-                *> poke (ptr `plusPtr` 260) (vkMemoryHeapCount (poked :: VkPhysicalDeviceMemoryProperties))
-                *> poke (ptr `plusPtr` 264) (vkMemoryHeaps (poked :: VkPhysicalDeviceMemoryProperties))
-
-
-
-data VkMemoryAllocateInfo =
-  VkMemoryAllocateInfo{ vkSType :: VkStructureType 
-                      , vkPNext :: Ptr Void 
-                      , vkAllocationSize :: VkDeviceSize 
-                      , vkMemoryTypeIndex :: Word32 
-                      }
-  deriving (Eq)
-
-instance Storable VkMemoryAllocateInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkMemoryAllocateInfo <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 8)
-                                  <*> peek (ptr `plusPtr` 16)
-                                  <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkMemoryAllocateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkMemoryAllocateInfo))
-                *> poke (ptr `plusPtr` 16) (vkAllocationSize (poked :: VkMemoryAllocateInfo))
-                *> poke (ptr `plusPtr` 24) (vkMemoryTypeIndex (poked :: VkMemoryAllocateInfo))
-
-
-
-data VkMemoryRequirements =
-  VkMemoryRequirements{ vkSize :: VkDeviceSize 
-                      , vkAlignment :: VkDeviceSize 
-                      , vkMemoryTypeBits :: Word32 
-                      }
-  deriving (Eq)
-
-instance Storable VkMemoryRequirements where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkMemoryRequirements <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 8)
-                                  <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSize (poked :: VkMemoryRequirements))
-                *> poke (ptr `plusPtr` 8) (vkAlignment (poked :: VkMemoryRequirements))
-                *> poke (ptr `plusPtr` 16) (vkMemoryTypeBits (poked :: VkMemoryRequirements))
-
-
-
-data VkSparseImageFormatProperties =
-  VkSparseImageFormatProperties{ vkAspectMask :: VkImageAspectFlags 
-                               , vkImageGranularity :: VkExtent3D 
-                               , vkFlags :: VkSparseImageFormatFlags 
-                               }
-  deriving (Eq)
-
-instance Storable VkSparseImageFormatProperties where
-  sizeOf ~_ = 20
-  alignment ~_ = 4
-  peek ptr = VkSparseImageFormatProperties <$> peek (ptr `plusPtr` 0)
-                                           <*> peek (ptr `plusPtr` 4)
-                                           <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkSparseImageFormatProperties))
-                *> poke (ptr `plusPtr` 4) (vkImageGranularity (poked :: VkSparseImageFormatProperties))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSparseImageFormatProperties))
-
-
-
-data VkSparseImageMemoryRequirements =
-  VkSparseImageMemoryRequirements{ vkFormatProperties :: VkSparseImageFormatProperties 
-                                 , vkImageMipTailFirstLod :: Word32 
-                                 , vkImageMipTailSize :: VkDeviceSize 
-                                 , vkImageMipTailOffset :: VkDeviceSize 
-                                 , vkImageMipTailStride :: VkDeviceSize 
-                                 }
-  deriving (Eq)
-
-instance Storable VkSparseImageMemoryRequirements where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkSparseImageMemoryRequirements <$> peek (ptr `plusPtr` 0)
-                                             <*> peek (ptr `plusPtr` 20)
-                                             <*> peek (ptr `plusPtr` 24)
-                                             <*> peek (ptr `plusPtr` 32)
-                                             <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkFormatProperties (poked :: VkSparseImageMemoryRequirements))
-                *> poke (ptr `plusPtr` 20) (vkImageMipTailFirstLod (poked :: VkSparseImageMemoryRequirements))
-                *> poke (ptr `plusPtr` 24) (vkImageMipTailSize (poked :: VkSparseImageMemoryRequirements))
-                *> poke (ptr `plusPtr` 32) (vkImageMipTailOffset (poked :: VkSparseImageMemoryRequirements))
-                *> poke (ptr `plusPtr` 40) (vkImageMipTailStride (poked :: VkSparseImageMemoryRequirements))
-
-
-
-data VkMemoryType =
-  VkMemoryType{ vkPropertyFlags :: VkMemoryPropertyFlags 
-              , vkHeapIndex :: Word32 
-              }
-  deriving (Eq)
-
-instance Storable VkMemoryType where
-  sizeOf ~_ = 8
-  alignment ~_ = 4
-  peek ptr = VkMemoryType <$> peek (ptr `plusPtr` 0)
-                          <*> peek (ptr `plusPtr` 4)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkPropertyFlags (poked :: VkMemoryType))
-                *> poke (ptr `plusPtr` 4) (vkHeapIndex (poked :: VkMemoryType))
-
-
-
-data VkMemoryHeap =
-  VkMemoryHeap{ vkSize :: VkDeviceSize 
-              , vkFlags :: VkMemoryHeapFlags 
-              }
-  deriving (Eq)
-
-instance Storable VkMemoryHeap where
-  sizeOf ~_ = 16
-  alignment ~_ = 8
-  peek ptr = VkMemoryHeap <$> peek (ptr `plusPtr` 0)
-                          <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSize (poked :: VkMemoryHeap))
-                *> poke (ptr `plusPtr` 8) (vkFlags (poked :: VkMemoryHeap))
-
-
-
-data VkMappedMemoryRange =
-  VkMappedMemoryRange{ vkSType :: VkStructureType 
-                     , vkPNext :: Ptr Void 
-                     , vkMemory :: VkDeviceMemory 
-                     , vkOffset :: VkDeviceSize 
-                     , vkSize :: VkDeviceSize 
-                     }
-  deriving (Eq)
-
-instance Storable VkMappedMemoryRange where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkMappedMemoryRange <$> peek (ptr `plusPtr` 0)
-                                 <*> peek (ptr `plusPtr` 8)
-                                 <*> peek (ptr `plusPtr` 16)
-                                 <*> peek (ptr `plusPtr` 24)
-                                 <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkMappedMemoryRange))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkMappedMemoryRange))
-                *> poke (ptr `plusPtr` 16) (vkMemory (poked :: VkMappedMemoryRange))
-                *> poke (ptr `plusPtr` 24) (vkOffset (poked :: VkMappedMemoryRange))
-                *> poke (ptr `plusPtr` 32) (vkSize (poked :: VkMappedMemoryRange))
-
-
-
-data VkFormatProperties =
-  VkFormatProperties{ vkLinearTilingFeatures :: VkFormatFeatureFlags 
-                    , vkOptimalTilingFeatures :: VkFormatFeatureFlags 
-                    , vkBufferFeatures :: VkFormatFeatureFlags 
-                    }
-  deriving (Eq)
-
-instance Storable VkFormatProperties where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkFormatProperties <$> peek (ptr `plusPtr` 0)
-                                <*> peek (ptr `plusPtr` 4)
-                                <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkLinearTilingFeatures (poked :: VkFormatProperties))
-                *> poke (ptr `plusPtr` 4) (vkOptimalTilingFeatures (poked :: VkFormatProperties))
-                *> poke (ptr `plusPtr` 8) (vkBufferFeatures (poked :: VkFormatProperties))
-
-
-
-data VkImageFormatProperties =
-  VkImageFormatProperties{ vkMaxExtent :: VkExtent3D 
-                         , vkMaxMipLevels :: Word32 
-                         , vkMaxArrayLayers :: Word32 
-                         , vkSampleCounts :: VkSampleCountFlags 
-                         , vkMaxResourceSize :: VkDeviceSize 
-                         }
-  deriving (Eq)
-
-instance Storable VkImageFormatProperties where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkImageFormatProperties <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 12)
-                                     <*> peek (ptr `plusPtr` 16)
-                                     <*> peek (ptr `plusPtr` 20)
-                                     <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkMaxExtent (poked :: VkImageFormatProperties))
-                *> poke (ptr `plusPtr` 12) (vkMaxMipLevels (poked :: VkImageFormatProperties))
-                *> poke (ptr `plusPtr` 16) (vkMaxArrayLayers (poked :: VkImageFormatProperties))
-                *> poke (ptr `plusPtr` 20) (vkSampleCounts (poked :: VkImageFormatProperties))
-                *> poke (ptr `plusPtr` 24) (vkMaxResourceSize (poked :: VkImageFormatProperties))
-
-
-
-data VkDescriptorBufferInfo =
-  VkDescriptorBufferInfo{ vkBuffer :: VkBuffer 
-                        , vkOffset :: VkDeviceSize 
-                        , vkRange :: VkDeviceSize 
-                        }
-  deriving (Eq)
-
-instance Storable VkDescriptorBufferInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkDescriptorBufferInfo <$> peek (ptr `plusPtr` 0)
-                                    <*> peek (ptr `plusPtr` 8)
-                                    <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkBuffer (poked :: VkDescriptorBufferInfo))
-                *> poke (ptr `plusPtr` 8) (vkOffset (poked :: VkDescriptorBufferInfo))
-                *> poke (ptr `plusPtr` 16) (vkRange (poked :: VkDescriptorBufferInfo))
-
-
-
-data VkDescriptorImageInfo =
-  VkDescriptorImageInfo{ vkSampler :: VkSampler 
-                       , vkImageView :: VkImageView 
-                       , vkImageLayout :: VkImageLayout 
-                       }
-  deriving (Eq)
-
-instance Storable VkDescriptorImageInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkDescriptorImageInfo <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSampler (poked :: VkDescriptorImageInfo))
-                *> poke (ptr `plusPtr` 8) (vkImageView (poked :: VkDescriptorImageInfo))
-                *> poke (ptr `plusPtr` 16) (vkImageLayout (poked :: VkDescriptorImageInfo))
-
-
-
-data VkWriteDescriptorSet =
-  VkWriteDescriptorSet{ vkSType :: VkStructureType 
-                      , vkPNext :: Ptr Void 
-                      , vkDstSet :: VkDescriptorSet 
-                      , vkDstBinding :: Word32 
-                      , vkDstArrayElement :: Word32 
-                      , vkDescriptorCount :: Word32 
-                      , vkDescriptorType :: VkDescriptorType 
-                      , vkPImageInfo :: Ptr VkDescriptorImageInfo 
-                      , vkPBufferInfo :: Ptr VkDescriptorBufferInfo 
-                      , vkPTexelBufferView :: Ptr VkBufferView 
-                      }
-  deriving (Eq)
-
-instance Storable VkWriteDescriptorSet where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkWriteDescriptorSet <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 8)
-                                  <*> peek (ptr `plusPtr` 16)
-                                  <*> peek (ptr `plusPtr` 24)
-                                  <*> peek (ptr `plusPtr` 28)
-                                  <*> peek (ptr `plusPtr` 32)
-                                  <*> peek (ptr `plusPtr` 36)
-                                  <*> peek (ptr `plusPtr` 40)
-                                  <*> peek (ptr `plusPtr` 48)
-                                  <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 16) (vkDstSet (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 24) (vkDstBinding (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 28) (vkDstArrayElement (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 32) (vkDescriptorCount (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 36) (vkDescriptorType (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 40) (vkPImageInfo (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 48) (vkPBufferInfo (poked :: VkWriteDescriptorSet))
-                *> poke (ptr `plusPtr` 56) (vkPTexelBufferView (poked :: VkWriteDescriptorSet))
-
-
-
-data VkCopyDescriptorSet =
-  VkCopyDescriptorSet{ vkSType :: VkStructureType 
-                     , vkPNext :: Ptr Void 
-                     , vkSrcSet :: VkDescriptorSet 
-                     , vkSrcBinding :: Word32 
-                     , vkSrcArrayElement :: Word32 
-                     , vkDstSet :: VkDescriptorSet 
-                     , vkDstBinding :: Word32 
-                     , vkDstArrayElement :: Word32 
-                     , vkDescriptorCount :: Word32 
-                     }
-  deriving (Eq)
-
-instance Storable VkCopyDescriptorSet where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkCopyDescriptorSet <$> peek (ptr `plusPtr` 0)
-                                 <*> peek (ptr `plusPtr` 8)
-                                 <*> peek (ptr `plusPtr` 16)
-                                 <*> peek (ptr `plusPtr` 24)
-                                 <*> peek (ptr `plusPtr` 28)
-                                 <*> peek (ptr `plusPtr` 32)
-                                 <*> peek (ptr `plusPtr` 40)
-                                 <*> peek (ptr `plusPtr` 44)
-                                 <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 16) (vkSrcSet (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 24) (vkSrcBinding (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 28) (vkSrcArrayElement (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 32) (vkDstSet (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 40) (vkDstBinding (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 44) (vkDstArrayElement (poked :: VkCopyDescriptorSet))
-                *> poke (ptr `plusPtr` 48) (vkDescriptorCount (poked :: VkCopyDescriptorSet))
-
-
-
-data VkBufferCreateInfo =
-  VkBufferCreateInfo{ vkSType :: VkStructureType 
-                    , vkPNext :: Ptr Void 
-                    , vkFlags :: VkBufferCreateFlags 
-                    , vkSize :: VkDeviceSize 
-                    , vkUsage :: VkBufferUsageFlags 
-                    , vkSharingMode :: VkSharingMode 
-                    , vkQueueFamilyIndexCount :: Word32 
-                    , vkPQueueFamilyIndices :: Ptr Word32 
-                    }
-  deriving (Eq)
-
-instance Storable VkBufferCreateInfo where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkBufferCreateInfo <$> peek (ptr `plusPtr` 0)
-                                <*> peek (ptr `plusPtr` 8)
-                                <*> peek (ptr `plusPtr` 16)
-                                <*> peek (ptr `plusPtr` 24)
-                                <*> peek (ptr `plusPtr` 32)
-                                <*> peek (ptr `plusPtr` 36)
-                                <*> peek (ptr `plusPtr` 40)
-                                <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBufferCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBufferCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkBufferCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkSize (poked :: VkBufferCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkUsage (poked :: VkBufferCreateInfo))
-                *> poke (ptr `plusPtr` 36) (vkSharingMode (poked :: VkBufferCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkQueueFamilyIndexCount (poked :: VkBufferCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkPQueueFamilyIndices (poked :: VkBufferCreateInfo))
-
-
-
-data VkBufferViewCreateInfo =
-  VkBufferViewCreateInfo{ vkSType :: VkStructureType 
-                        , vkPNext :: Ptr Void 
-                        , vkFlags :: VkBufferViewCreateFlags 
-                        , vkBuffer :: VkBuffer 
-                        , vkFormat :: VkFormat 
-                        , vkOffset :: VkDeviceSize 
-                        , vkRange :: VkDeviceSize 
-                        }
-  deriving (Eq)
-
-instance Storable VkBufferViewCreateInfo where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkBufferViewCreateInfo <$> peek (ptr `plusPtr` 0)
-                                    <*> peek (ptr `plusPtr` 8)
-                                    <*> peek (ptr `plusPtr` 16)
-                                    <*> peek (ptr `plusPtr` 24)
-                                    <*> peek (ptr `plusPtr` 32)
-                                    <*> peek (ptr `plusPtr` 40)
-                                    <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBufferViewCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBufferViewCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkBufferViewCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkBuffer (poked :: VkBufferViewCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkFormat (poked :: VkBufferViewCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkOffset (poked :: VkBufferViewCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkRange (poked :: VkBufferViewCreateInfo))
-
-
-
-data VkImageSubresource =
-  VkImageSubresource{ vkAspectMask :: VkImageAspectFlags 
-                    , vkMipLevel :: Word32 
-                    , vkArrayLayer :: Word32 
-                    }
-  deriving (Eq)
-
-instance Storable VkImageSubresource where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkImageSubresource <$> peek (ptr `plusPtr` 0)
-                                <*> peek (ptr `plusPtr` 4)
-                                <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkImageSubresource))
-                *> poke (ptr `plusPtr` 4) (vkMipLevel (poked :: VkImageSubresource))
-                *> poke (ptr `plusPtr` 8) (vkArrayLayer (poked :: VkImageSubresource))
-
-
-
-data VkImageSubresourceLayers =
-  VkImageSubresourceLayers{ vkAspectMask :: VkImageAspectFlags 
-                          , vkMipLevel :: Word32 
-                          , vkBaseArrayLayer :: Word32 
-                          , vkLayerCount :: Word32 
-                          }
-  deriving (Eq)
-
-instance Storable VkImageSubresourceLayers where
-  sizeOf ~_ = 16
-  alignment ~_ = 4
-  peek ptr = VkImageSubresourceLayers <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 4)
-                                      <*> peek (ptr `plusPtr` 8)
-                                      <*> peek (ptr `plusPtr` 12)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkImageSubresourceLayers))
-                *> poke (ptr `plusPtr` 4) (vkMipLevel (poked :: VkImageSubresourceLayers))
-                *> poke (ptr `plusPtr` 8) (vkBaseArrayLayer (poked :: VkImageSubresourceLayers))
-                *> poke (ptr `plusPtr` 12) (vkLayerCount (poked :: VkImageSubresourceLayers))
-
-
-
-data VkImageSubresourceRange =
-  VkImageSubresourceRange{ vkAspectMask :: VkImageAspectFlags 
-                         , vkBaseMipLevel :: Word32 
-                         , vkLevelCount :: Word32 
-                         , vkBaseArrayLayer :: Word32 
-                         , vkLayerCount :: Word32 
-                         }
-  deriving (Eq)
-
-instance Storable VkImageSubresourceRange where
-  sizeOf ~_ = 20
-  alignment ~_ = 4
-  peek ptr = VkImageSubresourceRange <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 4)
-                                     <*> peek (ptr `plusPtr` 8)
-                                     <*> peek (ptr `plusPtr` 12)
-                                     <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkImageSubresourceRange))
-                *> poke (ptr `plusPtr` 4) (vkBaseMipLevel (poked :: VkImageSubresourceRange))
-                *> poke (ptr `plusPtr` 8) (vkLevelCount (poked :: VkImageSubresourceRange))
-                *> poke (ptr `plusPtr` 12) (vkBaseArrayLayer (poked :: VkImageSubresourceRange))
-                *> poke (ptr `plusPtr` 16) (vkLayerCount (poked :: VkImageSubresourceRange))
-
-
-
-data VkMemoryBarrier =
-  VkMemoryBarrier{ vkSType :: VkStructureType 
-                 , vkPNext :: Ptr Void 
-                 , vkSrcAccessMask :: VkAccessFlags 
-                 , vkDstAccessMask :: VkAccessFlags 
-                 }
-  deriving (Eq)
-
-instance Storable VkMemoryBarrier where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkMemoryBarrier <$> peek (ptr `plusPtr` 0)
-                             <*> peek (ptr `plusPtr` 8)
-                             <*> peek (ptr `plusPtr` 16)
-                             <*> peek (ptr `plusPtr` 20)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkMemoryBarrier))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkMemoryBarrier))
-                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkMemoryBarrier))
-                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkMemoryBarrier))
-
-
-
-data VkBufferMemoryBarrier =
-  VkBufferMemoryBarrier{ vkSType :: VkStructureType 
-                       , vkPNext :: Ptr Void 
-                       , vkSrcAccessMask :: VkAccessFlags 
-                       , vkDstAccessMask :: VkAccessFlags 
-                       , vkSrcQueueFamilyIndex :: Word32 
-                       , vkDstQueueFamilyIndex :: Word32 
-                       , vkBuffer :: VkBuffer 
-                       , vkOffset :: VkDeviceSize 
-                       , vkSize :: VkDeviceSize 
-                       }
-  deriving (Eq)
-
-instance Storable VkBufferMemoryBarrier where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkBufferMemoryBarrier <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 16)
-                                   <*> peek (ptr `plusPtr` 20)
-                                   <*> peek (ptr `plusPtr` 24)
-                                   <*> peek (ptr `plusPtr` 28)
-                                   <*> peek (ptr `plusPtr` 32)
-                                   <*> peek (ptr `plusPtr` 40)
-                                   <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 24) (vkSrcQueueFamilyIndex (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 28) (vkDstQueueFamilyIndex (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 32) (vkBuffer (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 40) (vkOffset (poked :: VkBufferMemoryBarrier))
-                *> poke (ptr `plusPtr` 48) (vkSize (poked :: VkBufferMemoryBarrier))
-
-
-
-data VkImageMemoryBarrier =
-  VkImageMemoryBarrier{ vkSType :: VkStructureType 
-                      , vkPNext :: Ptr Void 
-                      , vkSrcAccessMask :: VkAccessFlags 
-                      , vkDstAccessMask :: VkAccessFlags 
-                      , vkOldLayout :: VkImageLayout 
-                      , vkNewLayout :: VkImageLayout 
-                      , vkSrcQueueFamilyIndex :: Word32 
-                      , vkDstQueueFamilyIndex :: Word32 
-                      , vkImage :: VkImage 
-                      , vkSubresourceRange :: VkImageSubresourceRange 
-                      }
-  deriving (Eq)
-
-instance Storable VkImageMemoryBarrier where
-  sizeOf ~_ = 72
-  alignment ~_ = 8
-  peek ptr = VkImageMemoryBarrier <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 8)
-                                  <*> peek (ptr `plusPtr` 16)
-                                  <*> peek (ptr `plusPtr` 20)
-                                  <*> peek (ptr `plusPtr` 24)
-                                  <*> peek (ptr `plusPtr` 28)
-                                  <*> peek (ptr `plusPtr` 32)
-                                  <*> peek (ptr `plusPtr` 36)
-                                  <*> peek (ptr `plusPtr` 40)
-                                  <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 24) (vkOldLayout (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 28) (vkNewLayout (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 32) (vkSrcQueueFamilyIndex (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 36) (vkDstQueueFamilyIndex (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 40) (vkImage (poked :: VkImageMemoryBarrier))
-                *> poke (ptr `plusPtr` 48) (vkSubresourceRange (poked :: VkImageMemoryBarrier))
-
-
-
-data VkImageCreateInfo =
-  VkImageCreateInfo{ vkSType :: VkStructureType 
-                   , vkPNext :: Ptr Void 
-                   , vkFlags :: VkImageCreateFlags 
-                   , vkImageType :: VkImageType 
-                   , vkFormat :: VkFormat 
-                   , vkExtent :: VkExtent3D 
-                   , vkMipLevels :: Word32 
-                   , vkArrayLayers :: Word32 
-                   , vkSamples :: VkSampleCountFlagBits 
-                   , vkTiling :: VkImageTiling 
-                   , vkUsage :: VkImageUsageFlags 
-                   , vkSharingMode :: VkSharingMode 
-                   , vkQueueFamilyIndexCount :: Word32 
-                   , vkPQueueFamilyIndices :: Ptr Word32 
-                   , vkInitialLayout :: VkImageLayout 
-                   }
-  deriving (Eq)
-
-instance Storable VkImageCreateInfo where
-  sizeOf ~_ = 88
-  alignment ~_ = 8
-  peek ptr = VkImageCreateInfo <$> peek (ptr `plusPtr` 0)
-                               <*> peek (ptr `plusPtr` 8)
-                               <*> peek (ptr `plusPtr` 16)
-                               <*> peek (ptr `plusPtr` 20)
-                               <*> peek (ptr `plusPtr` 24)
-                               <*> peek (ptr `plusPtr` 28)
-                               <*> peek (ptr `plusPtr` 40)
-                               <*> peek (ptr `plusPtr` 44)
-                               <*> peek (ptr `plusPtr` 48)
-                               <*> peek (ptr `plusPtr` 52)
-                               <*> peek (ptr `plusPtr` 56)
-                               <*> peek (ptr `plusPtr` 60)
-                               <*> peek (ptr `plusPtr` 64)
-                               <*> peek (ptr `plusPtr` 72)
-                               <*> peek (ptr `plusPtr` 80)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkImageType (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkFormat (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 28) (vkExtent (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkMipLevels (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 44) (vkArrayLayers (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkSamples (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 52) (vkTiling (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkUsage (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 60) (vkSharingMode (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 64) (vkQueueFamilyIndexCount (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 72) (vkPQueueFamilyIndices (poked :: VkImageCreateInfo))
-                *> poke (ptr `plusPtr` 80) (vkInitialLayout (poked :: VkImageCreateInfo))
-
-
-
-data VkSubresourceLayout =
-  VkSubresourceLayout{ vkOffset :: VkDeviceSize 
-                     , vkSize :: VkDeviceSize 
-                     , vkRowPitch :: VkDeviceSize 
-                     , vkArrayPitch :: VkDeviceSize 
-                     , vkDepthPitch :: VkDeviceSize 
-                     }
-  deriving (Eq)
-
-instance Storable VkSubresourceLayout where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkSubresourceLayout <$> peek (ptr `plusPtr` 0)
-                                 <*> peek (ptr `plusPtr` 8)
-                                 <*> peek (ptr `plusPtr` 16)
-                                 <*> peek (ptr `plusPtr` 24)
-                                 <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkOffset (poked :: VkSubresourceLayout))
-                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkSubresourceLayout))
-                *> poke (ptr `plusPtr` 16) (vkRowPitch (poked :: VkSubresourceLayout))
-                *> poke (ptr `plusPtr` 24) (vkArrayPitch (poked :: VkSubresourceLayout))
-                *> poke (ptr `plusPtr` 32) (vkDepthPitch (poked :: VkSubresourceLayout))
-
-
-
-data VkImageViewCreateInfo =
-  VkImageViewCreateInfo{ vkSType :: VkStructureType 
-                       , vkPNext :: Ptr Void 
-                       , vkFlags :: VkImageViewCreateFlags 
-                       , vkImage :: VkImage 
-                       , vkViewType :: VkImageViewType 
-                       , vkFormat :: VkFormat 
-                       , vkComponents :: VkComponentMapping 
-                       , vkSubresourceRange :: VkImageSubresourceRange 
-                       }
-  deriving (Eq)
-
-instance Storable VkImageViewCreateInfo where
-  sizeOf ~_ = 80
-  alignment ~_ = 8
-  peek ptr = VkImageViewCreateInfo <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 16)
-                                   <*> peek (ptr `plusPtr` 24)
-                                   <*> peek (ptr `plusPtr` 32)
-                                   <*> peek (ptr `plusPtr` 36)
-                                   <*> peek (ptr `plusPtr` 40)
-                                   <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkImageViewCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkImageViewCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkImageViewCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkImage (poked :: VkImageViewCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkViewType (poked :: VkImageViewCreateInfo))
-                *> poke (ptr `plusPtr` 36) (vkFormat (poked :: VkImageViewCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkComponents (poked :: VkImageViewCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkSubresourceRange (poked :: VkImageViewCreateInfo))
-
-
-
-data VkBufferCopy =
-  VkBufferCopy{ vkSrcOffset :: VkDeviceSize 
-              , vkDstOffset :: VkDeviceSize 
-              , vkSize :: VkDeviceSize 
-              }
-  deriving (Eq)
-
-instance Storable VkBufferCopy where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkBufferCopy <$> peek (ptr `plusPtr` 0)
-                          <*> peek (ptr `plusPtr` 8)
-                          <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcOffset (poked :: VkBufferCopy))
-                *> poke (ptr `plusPtr` 8) (vkDstOffset (poked :: VkBufferCopy))
-                *> poke (ptr `plusPtr` 16) (vkSize (poked :: VkBufferCopy))
-
-
-
-data VkSparseMemoryBind =
-  VkSparseMemoryBind{ vkResourceOffset :: VkDeviceSize 
-                    , vkSize :: VkDeviceSize 
-                    , vkMemory :: VkDeviceMemory 
-                    , vkMemoryOffset :: VkDeviceSize 
-                    , vkFlags :: VkSparseMemoryBindFlags 
-                    }
-  deriving (Eq)
-
-instance Storable VkSparseMemoryBind where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkSparseMemoryBind <$> peek (ptr `plusPtr` 0)
-                                <*> peek (ptr `plusPtr` 8)
-                                <*> peek (ptr `plusPtr` 16)
-                                <*> peek (ptr `plusPtr` 24)
-                                <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkResourceOffset (poked :: VkSparseMemoryBind))
-                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkSparseMemoryBind))
-                *> poke (ptr `plusPtr` 16) (vkMemory (poked :: VkSparseMemoryBind))
-                *> poke (ptr `plusPtr` 24) (vkMemoryOffset (poked :: VkSparseMemoryBind))
-                *> poke (ptr `plusPtr` 32) (vkFlags (poked :: VkSparseMemoryBind))
-
-
-
-data VkSparseImageMemoryBind =
-  VkSparseImageMemoryBind{ vkSubresource :: VkImageSubresource 
-                         , vkOffset :: VkOffset3D 
-                         , vkExtent :: VkExtent3D 
-                         , vkMemory :: VkDeviceMemory 
-                         , vkMemoryOffset :: VkDeviceSize 
-                         , vkFlags :: VkSparseMemoryBindFlags 
-                         }
-  deriving (Eq)
-
-instance Storable VkSparseImageMemoryBind where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkSparseImageMemoryBind <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 12)
-                                     <*> peek (ptr `plusPtr` 24)
-                                     <*> peek (ptr `plusPtr` 40)
-                                     <*> peek (ptr `plusPtr` 48)
-                                     <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSubresource (poked :: VkSparseImageMemoryBind))
-                *> poke (ptr `plusPtr` 12) (vkOffset (poked :: VkSparseImageMemoryBind))
-                *> poke (ptr `plusPtr` 24) (vkExtent (poked :: VkSparseImageMemoryBind))
-                *> poke (ptr `plusPtr` 40) (vkMemory (poked :: VkSparseImageMemoryBind))
-                *> poke (ptr `plusPtr` 48) (vkMemoryOffset (poked :: VkSparseImageMemoryBind))
-                *> poke (ptr `plusPtr` 56) (vkFlags (poked :: VkSparseImageMemoryBind))
-
-
-
-data VkSparseBufferMemoryBindInfo =
-  VkSparseBufferMemoryBindInfo{ vkBuffer :: VkBuffer 
-                              , vkBindCount :: Word32 
-                              , vkPBinds :: Ptr VkSparseMemoryBind 
-                              }
-  deriving (Eq)
-
-instance Storable VkSparseBufferMemoryBindInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkSparseBufferMemoryBindInfo <$> peek (ptr `plusPtr` 0)
-                                          <*> peek (ptr `plusPtr` 8)
-                                          <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkBuffer (poked :: VkSparseBufferMemoryBindInfo))
-                *> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseBufferMemoryBindInfo))
-                *> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseBufferMemoryBindInfo))
-
-
-
-data VkSparseImageOpaqueMemoryBindInfo =
-  VkSparseImageOpaqueMemoryBindInfo{ vkImage :: VkImage 
-                                   , vkBindCount :: Word32 
-                                   , vkPBinds :: Ptr VkSparseMemoryBind 
-                                   }
-  deriving (Eq)
-
-instance Storable VkSparseImageOpaqueMemoryBindInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkSparseImageOpaqueMemoryBindInfo <$> peek (ptr `plusPtr` 0)
-                                               <*> peek (ptr `plusPtr` 8)
-                                               <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkImage (poked :: VkSparseImageOpaqueMemoryBindInfo))
-                *> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseImageOpaqueMemoryBindInfo))
-                *> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseImageOpaqueMemoryBindInfo))
-
-
-
-data VkSparseImageMemoryBindInfo =
-  VkSparseImageMemoryBindInfo{ vkImage :: VkImage 
-                             , vkBindCount :: Word32 
-                             , vkPBinds :: Ptr VkSparseImageMemoryBind 
-                             }
-  deriving (Eq)
-
-instance Storable VkSparseImageMemoryBindInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkSparseImageMemoryBindInfo <$> peek (ptr `plusPtr` 0)
-                                         <*> peek (ptr `plusPtr` 8)
-                                         <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkImage (poked :: VkSparseImageMemoryBindInfo))
-                *> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseImageMemoryBindInfo))
-                *> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseImageMemoryBindInfo))
-
-
-
-data VkBindSparseInfo =
-  VkBindSparseInfo{ vkSType :: VkStructureType 
-                  , vkPNext :: Ptr Void 
-                  , vkWaitSemaphoreCount :: Word32 
-                  , vkPWaitSemaphores :: Ptr VkSemaphore 
-                  , vkBufferBindCount :: Word32 
-                  , vkPBufferBinds :: Ptr VkSparseBufferMemoryBindInfo 
-                  , vkImageOpaqueBindCount :: Word32 
-                  , vkPImageOpaqueBinds :: Ptr VkSparseImageOpaqueMemoryBindInfo 
-                  , vkImageBindCount :: Word32 
-                  , vkPImageBinds :: Ptr VkSparseImageMemoryBindInfo 
-                  , vkSignalSemaphoreCount :: Word32 
-                  , vkPSignalSemaphores :: Ptr VkSemaphore 
-                  }
-  deriving (Eq)
-
-instance Storable VkBindSparseInfo where
-  sizeOf ~_ = 96
-  alignment ~_ = 8
-  peek ptr = VkBindSparseInfo <$> peek (ptr `plusPtr` 0)
-                              <*> peek (ptr `plusPtr` 8)
-                              <*> peek (ptr `plusPtr` 16)
-                              <*> peek (ptr `plusPtr` 24)
-                              <*> peek (ptr `plusPtr` 32)
-                              <*> peek (ptr `plusPtr` 40)
-                              <*> peek (ptr `plusPtr` 48)
-                              <*> peek (ptr `plusPtr` 56)
-                              <*> peek (ptr `plusPtr` 64)
-                              <*> peek (ptr `plusPtr` 72)
-                              <*> peek (ptr `plusPtr` 80)
-                              <*> peek (ptr `plusPtr` 88)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 16) (vkWaitSemaphoreCount (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 24) (vkPWaitSemaphores (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 32) (vkBufferBindCount (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 40) (vkPBufferBinds (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 48) (vkImageOpaqueBindCount (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 56) (vkPImageOpaqueBinds (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 64) (vkImageBindCount (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 72) (vkPImageBinds (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 80) (vkSignalSemaphoreCount (poked :: VkBindSparseInfo))
-                *> poke (ptr `plusPtr` 88) (vkPSignalSemaphores (poked :: VkBindSparseInfo))
-
-
-
-data VkImageCopy =
-  VkImageCopy{ vkSrcSubresource :: VkImageSubresourceLayers 
-             , vkSrcOffset :: VkOffset3D 
-             , vkDstSubresource :: VkImageSubresourceLayers 
-             , vkDstOffset :: VkOffset3D 
-             , vkExtent :: VkExtent3D 
-             }
-  deriving (Eq)
-
-instance Storable VkImageCopy where
-  sizeOf ~_ = 68
-  alignment ~_ = 4
-  peek ptr = VkImageCopy <$> peek (ptr `plusPtr` 0)
-                         <*> peek (ptr `plusPtr` 16)
-                         <*> peek (ptr `plusPtr` 28)
-                         <*> peek (ptr `plusPtr` 44)
-                         <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubresource (poked :: VkImageCopy))
-                *> poke (ptr `plusPtr` 16) (vkSrcOffset (poked :: VkImageCopy))
-                *> poke (ptr `plusPtr` 28) (vkDstSubresource (poked :: VkImageCopy))
-                *> poke (ptr `plusPtr` 44) (vkDstOffset (poked :: VkImageCopy))
-                *> poke (ptr `plusPtr` 56) (vkExtent (poked :: VkImageCopy))
-
-
-
-data VkImageBlit =
-  VkImageBlit{ vkSrcSubresource :: VkImageSubresourceLayers 
-             , vkSrcOffsets :: Vec (ToPeano 2) VkOffset3D 
-             , vkDstSubresource :: VkImageSubresourceLayers 
-             , vkDstOffsets :: Vec (ToPeano 2) VkOffset3D 
-             }
-  deriving (Eq)
-
-instance Storable VkImageBlit where
-  sizeOf ~_ = 80
-  alignment ~_ = 4
-  peek ptr = VkImageBlit <$> peek (ptr `plusPtr` 0)
-                         <*> peek (ptr `plusPtr` 16)
-                         <*> peek (ptr `plusPtr` 40)
-                         <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubresource (poked :: VkImageBlit))
-                *> poke (ptr `plusPtr` 16) (vkSrcOffsets (poked :: VkImageBlit))
-                *> poke (ptr `plusPtr` 40) (vkDstSubresource (poked :: VkImageBlit))
-                *> poke (ptr `plusPtr` 56) (vkDstOffsets (poked :: VkImageBlit))
-
-
-
-data VkBufferImageCopy =
-  VkBufferImageCopy{ vkBufferOffset :: VkDeviceSize 
-                   , vkBufferRowLength :: Word32 
-                   , vkBufferImageHeight :: Word32 
-                   , vkImageSubresource :: VkImageSubresourceLayers 
-                   , vkImageOffset :: VkOffset3D 
-                   , vkImageExtent :: VkExtent3D 
-                   }
-  deriving (Eq)
-
-instance Storable VkBufferImageCopy where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkBufferImageCopy <$> peek (ptr `plusPtr` 0)
-                               <*> peek (ptr `plusPtr` 8)
-                               <*> peek (ptr `plusPtr` 12)
-                               <*> peek (ptr `plusPtr` 16)
-                               <*> peek (ptr `plusPtr` 32)
-                               <*> peek (ptr `plusPtr` 44)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkBufferOffset (poked :: VkBufferImageCopy))
-                *> poke (ptr `plusPtr` 8) (vkBufferRowLength (poked :: VkBufferImageCopy))
-                *> poke (ptr `plusPtr` 12) (vkBufferImageHeight (poked :: VkBufferImageCopy))
-                *> poke (ptr `plusPtr` 16) (vkImageSubresource (poked :: VkBufferImageCopy))
-                *> poke (ptr `plusPtr` 32) (vkImageOffset (poked :: VkBufferImageCopy))
-                *> poke (ptr `plusPtr` 44) (vkImageExtent (poked :: VkBufferImageCopy))
-
-
-
-data VkImageResolve =
-  VkImageResolve{ vkSrcSubresource :: VkImageSubresourceLayers 
-                , vkSrcOffset :: VkOffset3D 
-                , vkDstSubresource :: VkImageSubresourceLayers 
-                , vkDstOffset :: VkOffset3D 
-                , vkExtent :: VkExtent3D 
-                }
-  deriving (Eq)
-
-instance Storable VkImageResolve where
-  sizeOf ~_ = 68
-  alignment ~_ = 4
-  peek ptr = VkImageResolve <$> peek (ptr `plusPtr` 0)
-                            <*> peek (ptr `plusPtr` 16)
-                            <*> peek (ptr `plusPtr` 28)
-                            <*> peek (ptr `plusPtr` 44)
-                            <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubresource (poked :: VkImageResolve))
-                *> poke (ptr `plusPtr` 16) (vkSrcOffset (poked :: VkImageResolve))
-                *> poke (ptr `plusPtr` 28) (vkDstSubresource (poked :: VkImageResolve))
-                *> poke (ptr `plusPtr` 44) (vkDstOffset (poked :: VkImageResolve))
-                *> poke (ptr `plusPtr` 56) (vkExtent (poked :: VkImageResolve))
-
-
-
-data VkShaderModuleCreateInfo =
-  VkShaderModuleCreateInfo{ vkSType :: VkStructureType 
-                          , vkPNext :: Ptr Void 
-                          , vkFlags :: VkShaderModuleCreateFlags 
-                          , vkCodeSize :: CSize 
-                          , vkPCode :: Ptr Word32 
-                          }
-  deriving (Eq)
-
-instance Storable VkShaderModuleCreateInfo where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkShaderModuleCreateInfo <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 8)
-                                      <*> peek (ptr `plusPtr` 16)
-                                      <*> peek (ptr `plusPtr` 24)
-                                      <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkShaderModuleCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkShaderModuleCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkShaderModuleCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkCodeSize (poked :: VkShaderModuleCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPCode (poked :: VkShaderModuleCreateInfo))
-
-
-
-data VkDescriptorSetLayoutBinding =
-  VkDescriptorSetLayoutBinding{ vkBinding :: Word32 
-                              , vkDescriptorType :: VkDescriptorType 
-                              , vkDescriptorCount :: Word32 
-                              , vkStageFlags :: VkShaderStageFlags 
-                              , vkPImmutableSamplers :: Ptr VkSampler 
-                              }
-  deriving (Eq)
-
-instance Storable VkDescriptorSetLayoutBinding where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkDescriptorSetLayoutBinding <$> peek (ptr `plusPtr` 0)
-                                          <*> peek (ptr `plusPtr` 4)
-                                          <*> peek (ptr `plusPtr` 8)
-                                          <*> peek (ptr `plusPtr` 12)
-                                          <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkBinding (poked :: VkDescriptorSetLayoutBinding))
-                *> poke (ptr `plusPtr` 4) (vkDescriptorType (poked :: VkDescriptorSetLayoutBinding))
-                *> poke (ptr `plusPtr` 8) (vkDescriptorCount (poked :: VkDescriptorSetLayoutBinding))
-                *> poke (ptr `plusPtr` 12) (vkStageFlags (poked :: VkDescriptorSetLayoutBinding))
-                *> poke (ptr `plusPtr` 16) (vkPImmutableSamplers (poked :: VkDescriptorSetLayoutBinding))
-
-
-
-data VkDescriptorSetLayoutCreateInfo =
-  VkDescriptorSetLayoutCreateInfo{ vkSType :: VkStructureType 
-                                 , vkPNext :: Ptr Void 
-                                 , vkFlags :: VkDescriptorSetLayoutCreateFlags 
-                                 , vkBindingCount :: Word32 
-                                 , vkPBindings :: Ptr VkDescriptorSetLayoutBinding 
-                                 }
-  deriving (Eq)
-
-instance Storable VkDescriptorSetLayoutCreateInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkDescriptorSetLayoutCreateInfo <$> peek (ptr `plusPtr` 0)
-                                             <*> peek (ptr `plusPtr` 8)
-                                             <*> peek (ptr `plusPtr` 16)
-                                             <*> peek (ptr `plusPtr` 20)
-                                             <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorSetLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorSetLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDescriptorSetLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkBindingCount (poked :: VkDescriptorSetLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPBindings (poked :: VkDescriptorSetLayoutCreateInfo))
-
-
-
-data VkDescriptorPoolSize =
-  VkDescriptorPoolSize{ vkType :: VkDescriptorType 
-                      , vkDescriptorCount :: Word32 
-                      }
-  deriving (Eq)
-
-instance Storable VkDescriptorPoolSize where
-  sizeOf ~_ = 8
-  alignment ~_ = 4
-  peek ptr = VkDescriptorPoolSize <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 4)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkType (poked :: VkDescriptorPoolSize))
-                *> poke (ptr `plusPtr` 4) (vkDescriptorCount (poked :: VkDescriptorPoolSize))
-
-
-
-data VkDescriptorPoolCreateInfo =
-  VkDescriptorPoolCreateInfo{ vkSType :: VkStructureType 
-                            , vkPNext :: Ptr Void 
-                            , vkFlags :: VkDescriptorPoolCreateFlags 
-                            , vkMaxSets :: Word32 
-                            , vkPoolSizeCount :: Word32 
-                            , vkPPoolSizes :: Ptr VkDescriptorPoolSize 
-                            }
-  deriving (Eq)
-
-instance Storable VkDescriptorPoolCreateInfo where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkDescriptorPoolCreateInfo <$> peek (ptr `plusPtr` 0)
-                                        <*> peek (ptr `plusPtr` 8)
-                                        <*> peek (ptr `plusPtr` 16)
-                                        <*> peek (ptr `plusPtr` 20)
-                                        <*> peek (ptr `plusPtr` 24)
-                                        <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorPoolCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorPoolCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDescriptorPoolCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkMaxSets (poked :: VkDescriptorPoolCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPoolSizeCount (poked :: VkDescriptorPoolCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPPoolSizes (poked :: VkDescriptorPoolCreateInfo))
-
-
-
-data VkDescriptorSetAllocateInfo =
-  VkDescriptorSetAllocateInfo{ vkSType :: VkStructureType 
-                             , vkPNext :: Ptr Void 
-                             , vkDescriptorPool :: VkDescriptorPool 
-                             , vkDescriptorSetCount :: Word32 
-                             , vkPSetLayouts :: Ptr VkDescriptorSetLayout 
-                             }
-  deriving (Eq)
-
-instance Storable VkDescriptorSetAllocateInfo where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkDescriptorSetAllocateInfo <$> peek (ptr `plusPtr` 0)
-                                         <*> peek (ptr `plusPtr` 8)
-                                         <*> peek (ptr `plusPtr` 16)
-                                         <*> peek (ptr `plusPtr` 24)
-                                         <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorSetAllocateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorSetAllocateInfo))
-                *> poke (ptr `plusPtr` 16) (vkDescriptorPool (poked :: VkDescriptorSetAllocateInfo))
-                *> poke (ptr `plusPtr` 24) (vkDescriptorSetCount (poked :: VkDescriptorSetAllocateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPSetLayouts (poked :: VkDescriptorSetAllocateInfo))
-
-
-
-data VkSpecializationMapEntry =
-  VkSpecializationMapEntry{ vkConstantID :: Word32 
-                          , vkOffset :: Word32 
-                          , vkSize :: CSize 
-                          }
-  deriving (Eq)
-
-instance Storable VkSpecializationMapEntry where
-  sizeOf ~_ = 16
-  alignment ~_ = 8
-  peek ptr = VkSpecializationMapEntry <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 4)
-                                      <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkConstantID (poked :: VkSpecializationMapEntry))
-                *> poke (ptr `plusPtr` 4) (vkOffset (poked :: VkSpecializationMapEntry))
-                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkSpecializationMapEntry))
-
-
-
-data VkSpecializationInfo =
-  VkSpecializationInfo{ vkMapEntryCount :: Word32 
-                      , vkPMapEntries :: Ptr VkSpecializationMapEntry 
-                      , vkDataSize :: CSize 
-                      , vkPData :: Ptr Void 
-                      }
-  deriving (Eq)
-
-instance Storable VkSpecializationInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkSpecializationInfo <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 8)
-                                  <*> peek (ptr `plusPtr` 16)
-                                  <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkMapEntryCount (poked :: VkSpecializationInfo))
-                *> poke (ptr `plusPtr` 8) (vkPMapEntries (poked :: VkSpecializationInfo))
-                *> poke (ptr `plusPtr` 16) (vkDataSize (poked :: VkSpecializationInfo))
-                *> poke (ptr `plusPtr` 24) (vkPData (poked :: VkSpecializationInfo))
-
-
-
-data VkPipelineShaderStageCreateInfo =
-  VkPipelineShaderStageCreateInfo{ vkSType :: VkStructureType 
-                                 , vkPNext :: Ptr Void 
-                                 , vkFlags :: VkPipelineShaderStageCreateFlags 
-                                 , vkStage :: VkShaderStageFlagBits 
-                                 , vkModule :: VkShaderModule 
-                                 , vkPName :: Ptr CChar 
-                                 , vkPSpecializationInfo :: Ptr VkSpecializationInfo 
-                                 }
-  deriving (Eq)
-
-instance Storable VkPipelineShaderStageCreateInfo where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkPipelineShaderStageCreateInfo <$> peek (ptr `plusPtr` 0)
-                                             <*> peek (ptr `plusPtr` 8)
-                                             <*> peek (ptr `plusPtr` 16)
-                                             <*> peek (ptr `plusPtr` 20)
-                                             <*> peek (ptr `plusPtr` 24)
-                                             <*> peek (ptr `plusPtr` 32)
-                                             <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineShaderStageCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineShaderStageCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineShaderStageCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkStage (poked :: VkPipelineShaderStageCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkModule (poked :: VkPipelineShaderStageCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPName (poked :: VkPipelineShaderStageCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPSpecializationInfo (poked :: VkPipelineShaderStageCreateInfo))
-
-
-
-data VkComputePipelineCreateInfo =
-  VkComputePipelineCreateInfo{ vkSType :: VkStructureType 
-                             , vkPNext :: Ptr Void 
-                             , vkFlags :: VkPipelineCreateFlags 
-                             , vkStage :: VkPipelineShaderStageCreateInfo 
-                             , vkLayout :: VkPipelineLayout 
-                             , vkBasePipelineHandle :: VkPipeline 
-                             , vkBasePipelineIndex :: Int32 
-                             }
-  deriving (Eq)
-
-instance Storable VkComputePipelineCreateInfo where
-  sizeOf ~_ = 96
-  alignment ~_ = 8
-  peek ptr = VkComputePipelineCreateInfo <$> peek (ptr `plusPtr` 0)
-                                         <*> peek (ptr `plusPtr` 8)
-                                         <*> peek (ptr `plusPtr` 16)
-                                         <*> peek (ptr `plusPtr` 24)
-                                         <*> peek (ptr `plusPtr` 72)
-                                         <*> peek (ptr `plusPtr` 80)
-                                         <*> peek (ptr `plusPtr` 88)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkComputePipelineCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkComputePipelineCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkComputePipelineCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkStage (poked :: VkComputePipelineCreateInfo))
-                *> poke (ptr `plusPtr` 72) (vkLayout (poked :: VkComputePipelineCreateInfo))
-                *> poke (ptr `plusPtr` 80) (vkBasePipelineHandle (poked :: VkComputePipelineCreateInfo))
-                *> poke (ptr `plusPtr` 88) (vkBasePipelineIndex (poked :: VkComputePipelineCreateInfo))
-
-
-
-data VkVertexInputBindingDescription =
-  VkVertexInputBindingDescription{ vkBinding :: Word32 
-                                 , vkStride :: Word32 
-                                 , vkInputRate :: VkVertexInputRate 
-                                 }
-  deriving (Eq)
-
-instance Storable VkVertexInputBindingDescription where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkVertexInputBindingDescription <$> peek (ptr `plusPtr` 0)
-                                             <*> peek (ptr `plusPtr` 4)
-                                             <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkBinding (poked :: VkVertexInputBindingDescription))
-                *> poke (ptr `plusPtr` 4) (vkStride (poked :: VkVertexInputBindingDescription))
-                *> poke (ptr `plusPtr` 8) (vkInputRate (poked :: VkVertexInputBindingDescription))
-
-
-
-data VkVertexInputAttributeDescription =
-  VkVertexInputAttributeDescription{ vkLocation :: Word32 
-                                   , vkBinding :: Word32 
-                                   , vkFormat :: VkFormat 
-                                   , vkOffset :: Word32 
-                                   }
-  deriving (Eq)
-
-instance Storable VkVertexInputAttributeDescription where
-  sizeOf ~_ = 16
-  alignment ~_ = 4
-  peek ptr = VkVertexInputAttributeDescription <$> peek (ptr `plusPtr` 0)
-                                               <*> peek (ptr `plusPtr` 4)
-                                               <*> peek (ptr `plusPtr` 8)
-                                               <*> peek (ptr `plusPtr` 12)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkLocation (poked :: VkVertexInputAttributeDescription))
-                *> poke (ptr `plusPtr` 4) (vkBinding (poked :: VkVertexInputAttributeDescription))
-                *> poke (ptr `plusPtr` 8) (vkFormat (poked :: VkVertexInputAttributeDescription))
-                *> poke (ptr `plusPtr` 12) (vkOffset (poked :: VkVertexInputAttributeDescription))
-
-
-
-data VkPipelineVertexInputStateCreateInfo =
-  VkPipelineVertexInputStateCreateInfo{ vkSType :: VkStructureType 
-                                      , vkPNext :: Ptr Void 
-                                      , vkFlags :: VkPipelineVertexInputStateCreateFlags 
-                                      , vkVertexBindingDescriptionCount :: Word32 
-                                      , vkPVertexBindingDescriptions :: Ptr VkVertexInputBindingDescription 
-                                      , vkVertexAttributeDescriptionCount :: Word32 
-                                      , vkPVertexAttributeDescriptions :: Ptr VkVertexInputAttributeDescription 
-                                      }
-  deriving (Eq)
-
-instance Storable VkPipelineVertexInputStateCreateInfo where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkPipelineVertexInputStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                                  <*> peek (ptr `plusPtr` 8)
-                                                  <*> peek (ptr `plusPtr` 16)
-                                                  <*> peek (ptr `plusPtr` 20)
-                                                  <*> peek (ptr `plusPtr` 24)
-                                                  <*> peek (ptr `plusPtr` 32)
-                                                  <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineVertexInputStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineVertexInputStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineVertexInputStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkVertexBindingDescriptionCount (poked :: VkPipelineVertexInputStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPVertexBindingDescriptions (poked :: VkPipelineVertexInputStateCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkVertexAttributeDescriptionCount (poked :: VkPipelineVertexInputStateCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPVertexAttributeDescriptions (poked :: VkPipelineVertexInputStateCreateInfo))
-
-
-
-data VkPipelineInputAssemblyStateCreateInfo =
-  VkPipelineInputAssemblyStateCreateInfo{ vkSType :: VkStructureType 
-                                        , vkPNext :: Ptr Void 
-                                        , vkFlags :: VkPipelineInputAssemblyStateCreateFlags 
-                                        , vkTopology :: VkPrimitiveTopology 
-                                        , vkPrimitiveRestartEnable :: VkBool32 
-                                        }
-  deriving (Eq)
-
-instance Storable VkPipelineInputAssemblyStateCreateInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkPipelineInputAssemblyStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                                    <*> peek (ptr `plusPtr` 8)
-                                                    <*> peek (ptr `plusPtr` 16)
-                                                    <*> peek (ptr `plusPtr` 20)
-                                                    <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineInputAssemblyStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineInputAssemblyStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineInputAssemblyStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkTopology (poked :: VkPipelineInputAssemblyStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPrimitiveRestartEnable (poked :: VkPipelineInputAssemblyStateCreateInfo))
-
-
-
-data VkPipelineTessellationStateCreateInfo =
-  VkPipelineTessellationStateCreateInfo{ vkSType :: VkStructureType 
-                                       , vkPNext :: Ptr Void 
-                                       , vkFlags :: VkPipelineTessellationStateCreateFlags 
-                                       , vkPatchControlPoints :: Word32 
-                                       }
-  deriving (Eq)
-
-instance Storable VkPipelineTessellationStateCreateInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkPipelineTessellationStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                                   <*> peek (ptr `plusPtr` 8)
-                                                   <*> peek (ptr `plusPtr` 16)
-                                                   <*> peek (ptr `plusPtr` 20)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineTessellationStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineTessellationStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineTessellationStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkPatchControlPoints (poked :: VkPipelineTessellationStateCreateInfo))
-
-
-
-data VkPipelineViewportStateCreateInfo =
-  VkPipelineViewportStateCreateInfo{ vkSType :: VkStructureType 
-                                   , vkPNext :: Ptr Void 
-                                   , vkFlags :: VkPipelineViewportStateCreateFlags 
-                                   , vkViewportCount :: Word32 
-                                   , vkPViewports :: Ptr VkViewport 
-                                   , vkScissorCount :: Word32 
-                                   , vkPScissors :: Ptr VkRect2D 
-                                   }
-  deriving (Eq)
-
-instance Storable VkPipelineViewportStateCreateInfo where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkPipelineViewportStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                               <*> peek (ptr `plusPtr` 8)
-                                               <*> peek (ptr `plusPtr` 16)
-                                               <*> peek (ptr `plusPtr` 20)
-                                               <*> peek (ptr `plusPtr` 24)
-                                               <*> peek (ptr `plusPtr` 32)
-                                               <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineViewportStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineViewportStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineViewportStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkViewportCount (poked :: VkPipelineViewportStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPViewports (poked :: VkPipelineViewportStateCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkScissorCount (poked :: VkPipelineViewportStateCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPScissors (poked :: VkPipelineViewportStateCreateInfo))
-
-
-
-data VkPipelineRasterizationStateCreateInfo =
-  VkPipelineRasterizationStateCreateInfo{ vkSType :: VkStructureType 
-                                        , vkPNext :: Ptr Void 
-                                        , vkFlags :: VkPipelineRasterizationStateCreateFlags 
-                                        , vkDepthClampEnable :: VkBool32 
-                                        , vkRasterizerDiscardEnable :: VkBool32 
-                                        , vkPolygonMode :: VkPolygonMode 
-                                        , vkCullMode :: VkCullModeFlags 
-                                        , vkFrontFace :: VkFrontFace 
-                                        , vkDepthBiasEnable :: VkBool32 
-                                        , vkDepthBiasConstantFactor :: CFloat 
-                                        , vkDepthBiasClamp :: CFloat 
-                                        , vkDepthBiasSlopeFactor :: CFloat 
-                                        , vkLineWidth :: CFloat 
-                                        }
-  deriving (Eq)
-
-instance Storable VkPipelineRasterizationStateCreateInfo where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkPipelineRasterizationStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                                    <*> peek (ptr `plusPtr` 8)
-                                                    <*> peek (ptr `plusPtr` 16)
-                                                    <*> peek (ptr `plusPtr` 20)
-                                                    <*> peek (ptr `plusPtr` 24)
-                                                    <*> peek (ptr `plusPtr` 28)
-                                                    <*> peek (ptr `plusPtr` 32)
-                                                    <*> peek (ptr `plusPtr` 36)
-                                                    <*> peek (ptr `plusPtr` 40)
-                                                    <*> peek (ptr `plusPtr` 44)
-                                                    <*> peek (ptr `plusPtr` 48)
-                                                    <*> peek (ptr `plusPtr` 52)
-                                                    <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkDepthClampEnable (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkRasterizerDiscardEnable (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 28) (vkPolygonMode (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkCullMode (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 36) (vkFrontFace (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkDepthBiasEnable (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 44) (vkDepthBiasConstantFactor (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkDepthBiasClamp (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 52) (vkDepthBiasSlopeFactor (poked :: VkPipelineRasterizationStateCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkLineWidth (poked :: VkPipelineRasterizationStateCreateInfo))
-
-
-
-data VkPipelineMultisampleStateCreateInfo =
-  VkPipelineMultisampleStateCreateInfo{ vkSType :: VkStructureType 
-                                      , vkPNext :: Ptr Void 
-                                      , vkFlags :: VkPipelineMultisampleStateCreateFlags 
-                                      , vkRasterizationSamples :: VkSampleCountFlagBits 
-                                      , vkSampleShadingEnable :: VkBool32 
-                                      , vkMinSampleShading :: CFloat 
-                                      , vkPSampleMask :: Ptr VkSampleMask 
-                                      , vkAlphaToCoverageEnable :: VkBool32 
-                                      , vkAlphaToOneEnable :: VkBool32 
-                                      }
-  deriving (Eq)
-
-instance Storable VkPipelineMultisampleStateCreateInfo where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkPipelineMultisampleStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                                  <*> peek (ptr `plusPtr` 8)
-                                                  <*> peek (ptr `plusPtr` 16)
-                                                  <*> peek (ptr `plusPtr` 20)
-                                                  <*> peek (ptr `plusPtr` 24)
-                                                  <*> peek (ptr `plusPtr` 28)
-                                                  <*> peek (ptr `plusPtr` 32)
-                                                  <*> peek (ptr `plusPtr` 40)
-                                                  <*> peek (ptr `plusPtr` 44)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkRasterizationSamples (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkSampleShadingEnable (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 28) (vkMinSampleShading (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPSampleMask (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkAlphaToCoverageEnable (poked :: VkPipelineMultisampleStateCreateInfo))
-                *> poke (ptr `plusPtr` 44) (vkAlphaToOneEnable (poked :: VkPipelineMultisampleStateCreateInfo))
-
-
-
-data VkPipelineColorBlendAttachmentState =
-  VkPipelineColorBlendAttachmentState{ vkBlendEnable :: VkBool32 
-                                     , vkSrcColorBlendFactor :: VkBlendFactor 
-                                     , vkDstColorBlendFactor :: VkBlendFactor 
-                                     , vkColorBlendOp :: VkBlendOp 
-                                     , vkSrcAlphaBlendFactor :: VkBlendFactor 
-                                     , vkDstAlphaBlendFactor :: VkBlendFactor 
-                                     , vkAlphaBlendOp :: VkBlendOp 
-                                     , vkColorWriteMask :: VkColorComponentFlags 
-                                     }
-  deriving (Eq)
-
-instance Storable VkPipelineColorBlendAttachmentState where
-  sizeOf ~_ = 32
-  alignment ~_ = 4
-  peek ptr = VkPipelineColorBlendAttachmentState <$> peek (ptr `plusPtr` 0)
-                                                 <*> peek (ptr `plusPtr` 4)
-                                                 <*> peek (ptr `plusPtr` 8)
-                                                 <*> peek (ptr `plusPtr` 12)
-                                                 <*> peek (ptr `plusPtr` 16)
-                                                 <*> peek (ptr `plusPtr` 20)
-                                                 <*> peek (ptr `plusPtr` 24)
-                                                 <*> peek (ptr `plusPtr` 28)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkBlendEnable (poked :: VkPipelineColorBlendAttachmentState))
-                *> poke (ptr `plusPtr` 4) (vkSrcColorBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
-                *> poke (ptr `plusPtr` 8) (vkDstColorBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
-                *> poke (ptr `plusPtr` 12) (vkColorBlendOp (poked :: VkPipelineColorBlendAttachmentState))
-                *> poke (ptr `plusPtr` 16) (vkSrcAlphaBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
-                *> poke (ptr `plusPtr` 20) (vkDstAlphaBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
-                *> poke (ptr `plusPtr` 24) (vkAlphaBlendOp (poked :: VkPipelineColorBlendAttachmentState))
-                *> poke (ptr `plusPtr` 28) (vkColorWriteMask (poked :: VkPipelineColorBlendAttachmentState))
-
-
-
-data VkPipelineColorBlendStateCreateInfo =
-  VkPipelineColorBlendStateCreateInfo{ vkSType :: VkStructureType 
-                                     , vkPNext :: Ptr Void 
-                                     , vkFlags :: VkPipelineColorBlendStateCreateFlags 
-                                     , vkLogicOpEnable :: VkBool32 
-                                     , vkLogicOp :: VkLogicOp 
-                                     , vkAttachmentCount :: Word32 
-                                     , vkPAttachments :: Ptr VkPipelineColorBlendAttachmentState 
-                                     , vkBlendConstants :: Vec (ToPeano 4) CFloat 
-                                     }
-  deriving (Eq)
-
-instance Storable VkPipelineColorBlendStateCreateInfo where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkPipelineColorBlendStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                                 <*> peek (ptr `plusPtr` 8)
-                                                 <*> peek (ptr `plusPtr` 16)
-                                                 <*> peek (ptr `plusPtr` 20)
-                                                 <*> peek (ptr `plusPtr` 24)
-                                                 <*> peek (ptr `plusPtr` 28)
-                                                 <*> peek (ptr `plusPtr` 32)
-                                                 <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineColorBlendStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineColorBlendStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineColorBlendStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkLogicOpEnable (poked :: VkPipelineColorBlendStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkLogicOp (poked :: VkPipelineColorBlendStateCreateInfo))
-                *> poke (ptr `plusPtr` 28) (vkAttachmentCount (poked :: VkPipelineColorBlendStateCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPAttachments (poked :: VkPipelineColorBlendStateCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkBlendConstants (poked :: VkPipelineColorBlendStateCreateInfo))
-
-
-
-data VkPipelineDynamicStateCreateInfo =
-  VkPipelineDynamicStateCreateInfo{ vkSType :: VkStructureType 
-                                  , vkPNext :: Ptr Void 
-                                  , vkFlags :: VkPipelineDynamicStateCreateFlags 
-                                  , vkDynamicStateCount :: Word32 
-                                  , vkPDynamicStates :: Ptr VkDynamicState 
-                                  }
-  deriving (Eq)
-
-instance Storable VkPipelineDynamicStateCreateInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkPipelineDynamicStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                              <*> peek (ptr `plusPtr` 8)
-                                              <*> peek (ptr `plusPtr` 16)
-                                              <*> peek (ptr `plusPtr` 20)
-                                              <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineDynamicStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineDynamicStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineDynamicStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkDynamicStateCount (poked :: VkPipelineDynamicStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPDynamicStates (poked :: VkPipelineDynamicStateCreateInfo))
-
-
-
-data VkStencilOpState =
-  VkStencilOpState{ vkFailOp :: VkStencilOp 
-                  , vkPassOp :: VkStencilOp 
-                  , vkDepthFailOp :: VkStencilOp 
-                  , vkCompareOp :: VkCompareOp 
-                  , vkCompareMask :: Word32 
-                  , vkWriteMask :: Word32 
-                  , vkReference :: Word32 
-                  }
-  deriving (Eq)
-
-instance Storable VkStencilOpState where
-  sizeOf ~_ = 28
-  alignment ~_ = 4
-  peek ptr = VkStencilOpState <$> peek (ptr `plusPtr` 0)
-                              <*> peek (ptr `plusPtr` 4)
-                              <*> peek (ptr `plusPtr` 8)
-                              <*> peek (ptr `plusPtr` 12)
-                              <*> peek (ptr `plusPtr` 16)
-                              <*> peek (ptr `plusPtr` 20)
-                              <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkFailOp (poked :: VkStencilOpState))
-                *> poke (ptr `plusPtr` 4) (vkPassOp (poked :: VkStencilOpState))
-                *> poke (ptr `plusPtr` 8) (vkDepthFailOp (poked :: VkStencilOpState))
-                *> poke (ptr `plusPtr` 12) (vkCompareOp (poked :: VkStencilOpState))
-                *> poke (ptr `plusPtr` 16) (vkCompareMask (poked :: VkStencilOpState))
-                *> poke (ptr `plusPtr` 20) (vkWriteMask (poked :: VkStencilOpState))
-                *> poke (ptr `plusPtr` 24) (vkReference (poked :: VkStencilOpState))
-
-
-
-data VkPipelineDepthStencilStateCreateInfo =
-  VkPipelineDepthStencilStateCreateInfo{ vkSType :: VkStructureType 
-                                       , vkPNext :: Ptr Void 
-                                       , vkFlags :: VkPipelineDepthStencilStateCreateFlags 
-                                       , vkDepthTestEnable :: VkBool32 
-                                       , vkDepthWriteEnable :: VkBool32 
-                                       , vkDepthCompareOp :: VkCompareOp 
-                                       , vkDepthBoundsTestEnable :: VkBool32 
-                                       , vkStencilTestEnable :: VkBool32 
-                                       , vkFront :: VkStencilOpState 
-                                       , vkBack :: VkStencilOpState 
-                                       , vkMinDepthBounds :: CFloat 
-                                       , vkMaxDepthBounds :: CFloat 
-                                       }
-  deriving (Eq)
-
-instance Storable VkPipelineDepthStencilStateCreateInfo where
-  sizeOf ~_ = 104
-  alignment ~_ = 8
-  peek ptr = VkPipelineDepthStencilStateCreateInfo <$> peek (ptr `plusPtr` 0)
-                                                   <*> peek (ptr `plusPtr` 8)
-                                                   <*> peek (ptr `plusPtr` 16)
-                                                   <*> peek (ptr `plusPtr` 20)
-                                                   <*> peek (ptr `plusPtr` 24)
-                                                   <*> peek (ptr `plusPtr` 28)
-                                                   <*> peek (ptr `plusPtr` 32)
-                                                   <*> peek (ptr `plusPtr` 36)
-                                                   <*> peek (ptr `plusPtr` 40)
-                                                   <*> peek (ptr `plusPtr` 68)
-                                                   <*> peek (ptr `plusPtr` 96)
-                                                   <*> peek (ptr `plusPtr` 100)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkDepthTestEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkDepthWriteEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 28) (vkDepthCompareOp (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkDepthBoundsTestEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 36) (vkStencilTestEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkFront (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 68) (vkBack (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 96) (vkMinDepthBounds (poked :: VkPipelineDepthStencilStateCreateInfo))
-                *> poke (ptr `plusPtr` 100) (vkMaxDepthBounds (poked :: VkPipelineDepthStencilStateCreateInfo))
-
-
-
-data VkGraphicsPipelineCreateInfo =
-  VkGraphicsPipelineCreateInfo{ vkSType :: VkStructureType 
-                              , vkPNext :: Ptr Void 
-                              , vkFlags :: VkPipelineCreateFlags 
-                              , vkStageCount :: Word32 
-                              , vkPStages :: Ptr VkPipelineShaderStageCreateInfo 
-                              , vkPVertexInputState :: Ptr VkPipelineVertexInputStateCreateInfo 
-                              , vkPInputAssemblyState :: Ptr VkPipelineInputAssemblyStateCreateInfo 
-                              , vkPTessellationState :: Ptr VkPipelineTessellationStateCreateInfo 
-                              , vkPViewportState :: Ptr VkPipelineViewportStateCreateInfo 
-                              , vkPRasterizationState :: Ptr VkPipelineRasterizationStateCreateInfo 
-                              , vkPMultisampleState :: Ptr VkPipelineMultisampleStateCreateInfo 
-                              , vkPDepthStencilState :: Ptr VkPipelineDepthStencilStateCreateInfo 
-                              , vkPColorBlendState :: Ptr VkPipelineColorBlendStateCreateInfo 
-                              , vkPDynamicState :: Ptr VkPipelineDynamicStateCreateInfo 
-                              , vkLayout :: VkPipelineLayout 
-                              , vkRenderPass :: VkRenderPass 
-                              , vkSubpass :: Word32 
-                              , vkBasePipelineHandle :: VkPipeline 
-                              , vkBasePipelineIndex :: Int32 
-                              }
-  deriving (Eq)
-
-instance Storable VkGraphicsPipelineCreateInfo where
-  sizeOf ~_ = 144
-  alignment ~_ = 8
-  peek ptr = VkGraphicsPipelineCreateInfo <$> peek (ptr `plusPtr` 0)
-                                          <*> peek (ptr `plusPtr` 8)
-                                          <*> peek (ptr `plusPtr` 16)
-                                          <*> peek (ptr `plusPtr` 20)
-                                          <*> peek (ptr `plusPtr` 24)
-                                          <*> peek (ptr `plusPtr` 32)
-                                          <*> peek (ptr `plusPtr` 40)
-                                          <*> peek (ptr `plusPtr` 48)
-                                          <*> peek (ptr `plusPtr` 56)
-                                          <*> peek (ptr `plusPtr` 64)
-                                          <*> peek (ptr `plusPtr` 72)
-                                          <*> peek (ptr `plusPtr` 80)
-                                          <*> peek (ptr `plusPtr` 88)
-                                          <*> peek (ptr `plusPtr` 96)
-                                          <*> peek (ptr `plusPtr` 104)
-                                          <*> peek (ptr `plusPtr` 112)
-                                          <*> peek (ptr `plusPtr` 120)
-                                          <*> peek (ptr `plusPtr` 128)
-                                          <*> peek (ptr `plusPtr` 136)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkStageCount (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPStages (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPVertexInputState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPInputAssemblyState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkPTessellationState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkPViewportState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 64) (vkPRasterizationState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 72) (vkPMultisampleState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 80) (vkPDepthStencilState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 88) (vkPColorBlendState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 96) (vkPDynamicState (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 104) (vkLayout (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 112) (vkRenderPass (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 120) (vkSubpass (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 128) (vkBasePipelineHandle (poked :: VkGraphicsPipelineCreateInfo))
-                *> poke (ptr `plusPtr` 136) (vkBasePipelineIndex (poked :: VkGraphicsPipelineCreateInfo))
-
-
-
-data VkPipelineCacheCreateInfo =
-  VkPipelineCacheCreateInfo{ vkSType :: VkStructureType 
-                           , vkPNext :: Ptr Void 
-                           , vkFlags :: VkPipelineCacheCreateFlags 
-                           , vkInitialDataSize :: CSize 
-                           , vkPInitialData :: Ptr Void 
-                           }
-  deriving (Eq)
-
-instance Storable VkPipelineCacheCreateInfo where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkPipelineCacheCreateInfo <$> peek (ptr `plusPtr` 0)
-                                       <*> peek (ptr `plusPtr` 8)
-                                       <*> peek (ptr `plusPtr` 16)
-                                       <*> peek (ptr `plusPtr` 24)
-                                       <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineCacheCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineCacheCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineCacheCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkInitialDataSize (poked :: VkPipelineCacheCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPInitialData (poked :: VkPipelineCacheCreateInfo))
-
-
-
-data VkPushConstantRange =
-  VkPushConstantRange{ vkStageFlags :: VkShaderStageFlags 
-                     , vkOffset :: Word32 
-                     , vkSize :: Word32 
-                     }
-  deriving (Eq)
-
-instance Storable VkPushConstantRange where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkPushConstantRange <$> peek (ptr `plusPtr` 0)
-                                 <*> peek (ptr `plusPtr` 4)
-                                 <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkStageFlags (poked :: VkPushConstantRange))
-                *> poke (ptr `plusPtr` 4) (vkOffset (poked :: VkPushConstantRange))
-                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkPushConstantRange))
-
-
-
-data VkPipelineLayoutCreateInfo =
-  VkPipelineLayoutCreateInfo{ vkSType :: VkStructureType 
-                            , vkPNext :: Ptr Void 
-                            , vkFlags :: VkPipelineLayoutCreateFlags 
-                            , vkSetLayoutCount :: Word32 
-                            , vkPSetLayouts :: Ptr VkDescriptorSetLayout 
-                            , vkPushConstantRangeCount :: Word32 
-                            , vkPPushConstantRanges :: Ptr VkPushConstantRange 
-                            }
-  deriving (Eq)
-
-instance Storable VkPipelineLayoutCreateInfo where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkPipelineLayoutCreateInfo <$> peek (ptr `plusPtr` 0)
-                                        <*> peek (ptr `plusPtr` 8)
-                                        <*> peek (ptr `plusPtr` 16)
-                                        <*> peek (ptr `plusPtr` 20)
-                                        <*> peek (ptr `plusPtr` 24)
-                                        <*> peek (ptr `plusPtr` 32)
-                                        <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkSetLayoutCount (poked :: VkPipelineLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPSetLayouts (poked :: VkPipelineLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkPushConstantRangeCount (poked :: VkPipelineLayoutCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPPushConstantRanges (poked :: VkPipelineLayoutCreateInfo))
-
-
-
-data VkSamplerCreateInfo =
-  VkSamplerCreateInfo{ vkSType :: VkStructureType 
-                     , vkPNext :: Ptr Void 
-                     , vkFlags :: VkSamplerCreateFlags 
-                     , vkMagFilter :: VkFilter 
-                     , vkMinFilter :: VkFilter 
-                     , vkMipmapMode :: VkSamplerMipmapMode 
-                     , vkAddressModeU :: VkSamplerAddressMode 
-                     , vkAddressModeV :: VkSamplerAddressMode 
-                     , vkAddressModeW :: VkSamplerAddressMode 
-                     , vkMipLodBias :: CFloat 
-                     , vkAnisotropyEnable :: VkBool32 
-                     , vkMaxAnisotropy :: CFloat 
-                     , vkCompareEnable :: VkBool32 
-                     , vkCompareOp :: VkCompareOp 
-                     , vkMinLod :: CFloat 
-                     , vkMaxLod :: CFloat 
-                     , vkBorderColor :: VkBorderColor 
-                     , vkUnnormalizedCoordinates :: VkBool32 
-                     }
-  deriving (Eq)
-
-instance Storable VkSamplerCreateInfo where
-  sizeOf ~_ = 80
-  alignment ~_ = 8
-  peek ptr = VkSamplerCreateInfo <$> peek (ptr `plusPtr` 0)
-                                 <*> peek (ptr `plusPtr` 8)
-                                 <*> peek (ptr `plusPtr` 16)
-                                 <*> peek (ptr `plusPtr` 20)
-                                 <*> peek (ptr `plusPtr` 24)
-                                 <*> peek (ptr `plusPtr` 28)
-                                 <*> peek (ptr `plusPtr` 32)
-                                 <*> peek (ptr `plusPtr` 36)
-                                 <*> peek (ptr `plusPtr` 40)
-                                 <*> peek (ptr `plusPtr` 44)
-                                 <*> peek (ptr `plusPtr` 48)
-                                 <*> peek (ptr `plusPtr` 52)
-                                 <*> peek (ptr `plusPtr` 56)
-                                 <*> peek (ptr `plusPtr` 60)
-                                 <*> peek (ptr `plusPtr` 64)
-                                 <*> peek (ptr `plusPtr` 68)
-                                 <*> peek (ptr `plusPtr` 72)
-                                 <*> peek (ptr `plusPtr` 76)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkMagFilter (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkMinFilter (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 28) (vkMipmapMode (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkAddressModeU (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 36) (vkAddressModeV (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkAddressModeW (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 44) (vkMipLodBias (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkAnisotropyEnable (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 52) (vkMaxAnisotropy (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkCompareEnable (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 60) (vkCompareOp (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 64) (vkMinLod (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 68) (vkMaxLod (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 72) (vkBorderColor (poked :: VkSamplerCreateInfo))
-                *> poke (ptr `plusPtr` 76) (vkUnnormalizedCoordinates (poked :: VkSamplerCreateInfo))
-
-
-
-data VkCommandPoolCreateInfo =
-  VkCommandPoolCreateInfo{ vkSType :: VkStructureType 
-                         , vkPNext :: Ptr Void 
-                         , vkFlags :: VkCommandPoolCreateFlags 
-                         , vkQueueFamilyIndex :: Word32 
-                         }
-  deriving (Eq)
-
-instance Storable VkCommandPoolCreateInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkCommandPoolCreateInfo <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 8)
-                                     <*> peek (ptr `plusPtr` 16)
-                                     <*> peek (ptr `plusPtr` 20)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandPoolCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandPoolCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkCommandPoolCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkQueueFamilyIndex (poked :: VkCommandPoolCreateInfo))
-
-
-
-data VkCommandBufferAllocateInfo =
-  VkCommandBufferAllocateInfo{ vkSType :: VkStructureType 
-                             , vkPNext :: Ptr Void 
-                             , vkCommandPool :: VkCommandPool 
-                             , vkLevel :: VkCommandBufferLevel 
-                             , vkCommandBufferCount :: Word32 
-                             }
-  deriving (Eq)
-
-instance Storable VkCommandBufferAllocateInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkCommandBufferAllocateInfo <$> peek (ptr `plusPtr` 0)
-                                         <*> peek (ptr `plusPtr` 8)
-                                         <*> peek (ptr `plusPtr` 16)
-                                         <*> peek (ptr `plusPtr` 24)
-                                         <*> peek (ptr `plusPtr` 28)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandBufferAllocateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandBufferAllocateInfo))
-                *> poke (ptr `plusPtr` 16) (vkCommandPool (poked :: VkCommandBufferAllocateInfo))
-                *> poke (ptr `plusPtr` 24) (vkLevel (poked :: VkCommandBufferAllocateInfo))
-                *> poke (ptr `plusPtr` 28) (vkCommandBufferCount (poked :: VkCommandBufferAllocateInfo))
-
-
-
-data VkCommandBufferInheritanceInfo =
-  VkCommandBufferInheritanceInfo{ vkSType :: VkStructureType 
-                                , vkPNext :: Ptr Void 
-                                , vkRenderPass :: VkRenderPass 
-                                , vkSubpass :: Word32 
-                                , vkFramebuffer :: VkFramebuffer 
-                                , vkOcclusionQueryEnable :: VkBool32 
-                                , vkQueryFlags :: VkQueryControlFlags 
-                                , vkPipelineStatistics :: VkQueryPipelineStatisticFlags 
-                                }
-  deriving (Eq)
-
-instance Storable VkCommandBufferInheritanceInfo where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkCommandBufferInheritanceInfo <$> peek (ptr `plusPtr` 0)
-                                            <*> peek (ptr `plusPtr` 8)
-                                            <*> peek (ptr `plusPtr` 16)
-                                            <*> peek (ptr `plusPtr` 24)
-                                            <*> peek (ptr `plusPtr` 32)
-                                            <*> peek (ptr `plusPtr` 40)
-                                            <*> peek (ptr `plusPtr` 44)
-                                            <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandBufferInheritanceInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandBufferInheritanceInfo))
-                *> poke (ptr `plusPtr` 16) (vkRenderPass (poked :: VkCommandBufferInheritanceInfo))
-                *> poke (ptr `plusPtr` 24) (vkSubpass (poked :: VkCommandBufferInheritanceInfo))
-                *> poke (ptr `plusPtr` 32) (vkFramebuffer (poked :: VkCommandBufferInheritanceInfo))
-                *> poke (ptr `plusPtr` 40) (vkOcclusionQueryEnable (poked :: VkCommandBufferInheritanceInfo))
-                *> poke (ptr `plusPtr` 44) (vkQueryFlags (poked :: VkCommandBufferInheritanceInfo))
-                *> poke (ptr `plusPtr` 48) (vkPipelineStatistics (poked :: VkCommandBufferInheritanceInfo))
-
-
-
-data VkCommandBufferBeginInfo =
-  VkCommandBufferBeginInfo{ vkSType :: VkStructureType 
-                          , vkPNext :: Ptr Void 
-                          , vkFlags :: VkCommandBufferUsageFlags 
-                          , vkPInheritanceInfo :: Ptr VkCommandBufferInheritanceInfo 
-                          }
-  deriving (Eq)
-
-instance Storable VkCommandBufferBeginInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkCommandBufferBeginInfo <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 8)
-                                      <*> peek (ptr `plusPtr` 16)
-                                      <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandBufferBeginInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandBufferBeginInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkCommandBufferBeginInfo))
-                *> poke (ptr `plusPtr` 24) (vkPInheritanceInfo (poked :: VkCommandBufferBeginInfo))
-
-
-
-data VkRenderPassBeginInfo =
-  VkRenderPassBeginInfo{ vkSType :: VkStructureType 
-                       , vkPNext :: Ptr Void 
-                       , vkRenderPass :: VkRenderPass 
-                       , vkFramebuffer :: VkFramebuffer 
-                       , vkRenderArea :: VkRect2D 
-                       , vkClearValueCount :: Word32 
-                       , vkPClearValues :: Ptr VkClearValue 
-                       }
-  deriving (Eq)
-
-instance Storable VkRenderPassBeginInfo where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkRenderPassBeginInfo <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 16)
-                                   <*> peek (ptr `plusPtr` 24)
-                                   <*> peek (ptr `plusPtr` 32)
-                                   <*> peek (ptr `plusPtr` 48)
-                                   <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkRenderPassBeginInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkRenderPassBeginInfo))
-                *> poke (ptr `plusPtr` 16) (vkRenderPass (poked :: VkRenderPassBeginInfo))
-                *> poke (ptr `plusPtr` 24) (vkFramebuffer (poked :: VkRenderPassBeginInfo))
-                *> poke (ptr `plusPtr` 32) (vkRenderArea (poked :: VkRenderPassBeginInfo))
-                *> poke (ptr `plusPtr` 48) (vkClearValueCount (poked :: VkRenderPassBeginInfo))
-                *> poke (ptr `plusPtr` 56) (vkPClearValues (poked :: VkRenderPassBeginInfo))
-
-
-
-data VkClearDepthStencilValue =
-  VkClearDepthStencilValue{ vkDepth :: CFloat 
-                          , vkStencil :: Word32 
-                          }
-  deriving (Eq)
-
-instance Storable VkClearDepthStencilValue where
-  sizeOf ~_ = 8
-  alignment ~_ = 4
-  peek ptr = VkClearDepthStencilValue <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 4)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkDepth (poked :: VkClearDepthStencilValue))
-                *> poke (ptr `plusPtr` 4) (vkStencil (poked :: VkClearDepthStencilValue))
-
-
-
-data VkClearAttachment =
-  VkClearAttachment{ vkAspectMask :: VkImageAspectFlags 
-                   , vkColorAttachment :: Word32 
-                   , vkClearValue :: VkClearValue 
-                   }
-  deriving (Eq)
-
-instance Storable VkClearAttachment where
-  sizeOf ~_ = 24
-  alignment ~_ = 4
-  peek ptr = VkClearAttachment <$> peek (ptr `plusPtr` 0)
-                               <*> peek (ptr `plusPtr` 4)
-                               <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkClearAttachment))
-                *> poke (ptr `plusPtr` 4) (vkColorAttachment (poked :: VkClearAttachment))
-                *> poke (ptr `plusPtr` 8) (vkClearValue (poked :: VkClearAttachment))
-
-
-
-data VkAttachmentDescription =
-  VkAttachmentDescription{ vkFlags :: VkAttachmentDescriptionFlags 
-                         , vkFormat :: VkFormat 
-                         , vkSamples :: VkSampleCountFlagBits 
-                         , vkLoadOp :: VkAttachmentLoadOp 
-                         , vkStoreOp :: VkAttachmentStoreOp 
-                         , vkStencilLoadOp :: VkAttachmentLoadOp 
-                         , vkStencilStoreOp :: VkAttachmentStoreOp 
-                         , vkInitialLayout :: VkImageLayout 
-                         , vkFinalLayout :: VkImageLayout 
-                         }
-  deriving (Eq)
-
-instance Storable VkAttachmentDescription where
-  sizeOf ~_ = 36
-  alignment ~_ = 4
-  peek ptr = VkAttachmentDescription <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 4)
-                                     <*> peek (ptr `plusPtr` 8)
-                                     <*> peek (ptr `plusPtr` 12)
-                                     <*> peek (ptr `plusPtr` 16)
-                                     <*> peek (ptr `plusPtr` 20)
-                                     <*> peek (ptr `plusPtr` 24)
-                                     <*> peek (ptr `plusPtr` 28)
-                                     <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkFlags (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 4) (vkFormat (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 8) (vkSamples (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 12) (vkLoadOp (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 16) (vkStoreOp (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 20) (vkStencilLoadOp (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 24) (vkStencilStoreOp (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 28) (vkInitialLayout (poked :: VkAttachmentDescription))
-                *> poke (ptr `plusPtr` 32) (vkFinalLayout (poked :: VkAttachmentDescription))
-
-
-
-data VkAttachmentReference =
-  VkAttachmentReference{ vkAttachment :: Word32 
-                       , vkLayout :: VkImageLayout 
-                       }
-  deriving (Eq)
-
-instance Storable VkAttachmentReference where
-  sizeOf ~_ = 8
-  alignment ~_ = 4
-  peek ptr = VkAttachmentReference <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 4)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkAttachment (poked :: VkAttachmentReference))
-                *> poke (ptr `plusPtr` 4) (vkLayout (poked :: VkAttachmentReference))
-
-
-
-data VkSubpassDescription =
-  VkSubpassDescription{ vkFlags :: VkSubpassDescriptionFlags 
-                      , vkPipelineBindPoint :: VkPipelineBindPoint 
-                      , vkInputAttachmentCount :: Word32 
-                      , vkPInputAttachments :: Ptr VkAttachmentReference 
-                      , vkColorAttachmentCount :: Word32 
-                      , vkPColorAttachments :: Ptr VkAttachmentReference 
-                      , vkPResolveAttachments :: Ptr VkAttachmentReference 
-                      , vkPDepthStencilAttachment :: Ptr VkAttachmentReference 
-                      , vkPreserveAttachmentCount :: Word32 
-                      , vkPPreserveAttachments :: Ptr Word32 
-                      }
-  deriving (Eq)
-
-instance Storable VkSubpassDescription where
-  sizeOf ~_ = 72
-  alignment ~_ = 8
-  peek ptr = VkSubpassDescription <$> peek (ptr `plusPtr` 0)
-                                  <*> peek (ptr `plusPtr` 4)
-                                  <*> peek (ptr `plusPtr` 8)
-                                  <*> peek (ptr `plusPtr` 16)
-                                  <*> peek (ptr `plusPtr` 24)
-                                  <*> peek (ptr `plusPtr` 32)
-                                  <*> peek (ptr `plusPtr` 40)
-                                  <*> peek (ptr `plusPtr` 48)
-                                  <*> peek (ptr `plusPtr` 56)
-                                  <*> peek (ptr `plusPtr` 64)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkFlags (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 4) (vkPipelineBindPoint (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 8) (vkInputAttachmentCount (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 16) (vkPInputAttachments (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 24) (vkColorAttachmentCount (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 32) (vkPColorAttachments (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 40) (vkPResolveAttachments (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 48) (vkPDepthStencilAttachment (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 56) (vkPreserveAttachmentCount (poked :: VkSubpassDescription))
-                *> poke (ptr `plusPtr` 64) (vkPPreserveAttachments (poked :: VkSubpassDescription))
-
-
-
-data VkSubpassDependency =
-  VkSubpassDependency{ vkSrcSubpass :: Word32 
-                     , vkDstSubpass :: Word32 
-                     , vkSrcStageMask :: VkPipelineStageFlags 
-                     , vkDstStageMask :: VkPipelineStageFlags 
-                     , vkSrcAccessMask :: VkAccessFlags 
-                     , vkDstAccessMask :: VkAccessFlags 
-                     , vkDependencyFlags :: VkDependencyFlags 
-                     }
-  deriving (Eq)
-
-instance Storable VkSubpassDependency where
-  sizeOf ~_ = 28
-  alignment ~_ = 4
-  peek ptr = VkSubpassDependency <$> peek (ptr `plusPtr` 0)
-                                 <*> peek (ptr `plusPtr` 4)
-                                 <*> peek (ptr `plusPtr` 8)
-                                 <*> peek (ptr `plusPtr` 12)
-                                 <*> peek (ptr `plusPtr` 16)
-                                 <*> peek (ptr `plusPtr` 20)
-                                 <*> peek (ptr `plusPtr` 24)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubpass (poked :: VkSubpassDependency))
-                *> poke (ptr `plusPtr` 4) (vkDstSubpass (poked :: VkSubpassDependency))
-                *> poke (ptr `plusPtr` 8) (vkSrcStageMask (poked :: VkSubpassDependency))
-                *> poke (ptr `plusPtr` 12) (vkDstStageMask (poked :: VkSubpassDependency))
-                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkSubpassDependency))
-                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkSubpassDependency))
-                *> poke (ptr `plusPtr` 24) (vkDependencyFlags (poked :: VkSubpassDependency))
-
-
-
-data VkRenderPassCreateInfo =
-  VkRenderPassCreateInfo{ vkSType :: VkStructureType 
-                        , vkPNext :: Ptr Void 
-                        , vkFlags :: VkRenderPassCreateFlags 
-                        , vkAttachmentCount :: Word32 
-                        , vkPAttachments :: Ptr VkAttachmentDescription 
-                        , vkSubpassCount :: Word32 
-                        , vkPSubpasses :: Ptr VkSubpassDescription 
-                        , vkDependencyCount :: Word32 
-                        , vkPDependencies :: Ptr VkSubpassDependency 
-                        }
-  deriving (Eq)
-
-instance Storable VkRenderPassCreateInfo where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkRenderPassCreateInfo <$> peek (ptr `plusPtr` 0)
-                                    <*> peek (ptr `plusPtr` 8)
-                                    <*> peek (ptr `plusPtr` 16)
-                                    <*> peek (ptr `plusPtr` 20)
-                                    <*> peek (ptr `plusPtr` 24)
-                                    <*> peek (ptr `plusPtr` 32)
-                                    <*> peek (ptr `plusPtr` 40)
-                                    <*> peek (ptr `plusPtr` 48)
-                                    <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkAttachmentCount (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkPAttachments (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkSubpassCount (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPSubpasses (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkDependencyCount (poked :: VkRenderPassCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkPDependencies (poked :: VkRenderPassCreateInfo))
-
-
-
-data VkEventCreateInfo =
-  VkEventCreateInfo{ vkSType :: VkStructureType 
-                   , vkPNext :: Ptr Void 
-                   , vkFlags :: VkEventCreateFlags 
-                   }
-  deriving (Eq)
-
-instance Storable VkEventCreateInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkEventCreateInfo <$> peek (ptr `plusPtr` 0)
-                               <*> peek (ptr `plusPtr` 8)
-                               <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkEventCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkEventCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkEventCreateInfo))
-
-
-
-data VkFenceCreateInfo =
-  VkFenceCreateInfo{ vkSType :: VkStructureType 
-                   , vkPNext :: Ptr Void 
-                   , vkFlags :: VkFenceCreateFlags 
-                   }
-  deriving (Eq)
-
-instance Storable VkFenceCreateInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkFenceCreateInfo <$> peek (ptr `plusPtr` 0)
-                               <*> peek (ptr `plusPtr` 8)
-                               <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkFenceCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkFenceCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkFenceCreateInfo))
-
-
-
-data VkPhysicalDeviceFeatures =
-  VkPhysicalDeviceFeatures{ vkRobustBufferAccess :: VkBool32 
-                          , vkFullDrawIndexUint :: VkBool32 
-                          , vkImageCubeArray :: VkBool32 
-                          , vkIndependentBlend :: VkBool32 
-                          , vkGeometryShader :: VkBool32 
-                          , vkTessellationShader :: VkBool32 
-                          , vkSampleRateShading :: VkBool32 
-                          , vkDualSrcBlend :: VkBool32 
-                          , vkLogicOp :: VkBool32 
-                          , vkMultiDrawIndirect :: VkBool32 
-                          , vkDrawIndirectFirstInstance :: VkBool32 
-                          , vkDepthClamp :: VkBool32 
-                          , vkDepthBiasClamp :: VkBool32 
-                          , vkFillModeNonSolid :: VkBool32 
-                          , vkDepthBounds :: VkBool32 
-                          , vkWideLines :: VkBool32 
-                          , vkLargePoints :: VkBool32 
-                          , vkAlphaToOne :: VkBool32 
-                          , vkMultiViewport :: VkBool32 
-                          , vkSamplerAnisotropy :: VkBool32 
-                          , vkTextureCompressionETC :: VkBool32 
-                          , vkTextureCompressionASTC_LDR :: VkBool32 
-                          , vkTextureCompressionBC :: VkBool32 
-                          , vkOcclusionQueryPrecise :: VkBool32 
-                          , vkPipelineStatisticsQuery :: VkBool32 
-                          , vkVertexPipelineStoresAndAtomics :: VkBool32 
-                          , vkFragmentStoresAndAtomics :: VkBool32 
-                          , vkShaderTessellationAndGeometryPointSize :: VkBool32 
-                          , vkShaderImageGatherExtended :: VkBool32 
-                          , vkShaderStorageImageExtendedFormats :: VkBool32 
-                          , vkShaderStorageImageMultisample :: VkBool32 
-                          , vkShaderStorageImageReadWithoutFormat :: VkBool32 
-                          , vkShaderStorageImageWriteWithoutFormat :: VkBool32 
-                          , vkShaderUniformBufferArrayDynamicIndexing :: VkBool32 
-                          , vkShaderSampledImageArrayDynamicIndexing :: VkBool32 
-                          , vkShaderStorageBufferArrayDynamicIndexing :: VkBool32 
-                          , vkShaderStorageImageArrayDynamicIndexing :: VkBool32 
-                          , vkShaderClipDistance :: VkBool32 
-                          , vkShaderCullDistance :: VkBool32 
-                          , vkShaderFloat :: VkBool32 
-                          , vkShaderInt :: VkBool32 
-                          , vkShaderInt :: VkBool32 
-                          , vkShaderResourceResidency :: VkBool32 
-                          , vkShaderResourceMinLod :: VkBool32 
-                          , vkSparseBinding :: VkBool32 
-                          , vkSparseResidencyBuffer :: VkBool32 
-                          , vkSparseResidencyImage :: VkBool32 
-                          , vkSparseResidencyImage :: VkBool32 
-                          , vkSparseResidency :: VkBool32 
-                          , vkSparseResidency :: VkBool32 
-                          , vkSparseResidency :: VkBool32 
-                          , vkSparseResidency :: VkBool32 
-                          , vkSparseResidencyAliased :: VkBool32 
-                          , vkVariableMultisampleRate :: VkBool32 
-                          , vkInheritedQueries :: VkBool32 
-                          }
-  deriving (Eq)
-
-instance Storable VkPhysicalDeviceFeatures where
-  sizeOf ~_ = 220
-  alignment ~_ = 4
-  peek ptr = VkPhysicalDeviceFeatures <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 4)
-                                      <*> peek (ptr `plusPtr` 8)
-                                      <*> peek (ptr `plusPtr` 12)
-                                      <*> peek (ptr `plusPtr` 16)
-                                      <*> peek (ptr `plusPtr` 20)
-                                      <*> peek (ptr `plusPtr` 24)
-                                      <*> peek (ptr `plusPtr` 28)
-                                      <*> peek (ptr `plusPtr` 32)
-                                      <*> peek (ptr `plusPtr` 36)
-                                      <*> peek (ptr `plusPtr` 40)
-                                      <*> peek (ptr `plusPtr` 44)
-                                      <*> peek (ptr `plusPtr` 48)
-                                      <*> peek (ptr `plusPtr` 52)
-                                      <*> peek (ptr `plusPtr` 56)
-                                      <*> peek (ptr `plusPtr` 60)
-                                      <*> peek (ptr `plusPtr` 64)
-                                      <*> peek (ptr `plusPtr` 68)
-                                      <*> peek (ptr `plusPtr` 72)
-                                      <*> peek (ptr `plusPtr` 76)
-                                      <*> peek (ptr `plusPtr` 80)
-                                      <*> peek (ptr `plusPtr` 84)
-                                      <*> peek (ptr `plusPtr` 88)
-                                      <*> peek (ptr `plusPtr` 92)
-                                      <*> peek (ptr `plusPtr` 96)
-                                      <*> peek (ptr `plusPtr` 100)
-                                      <*> peek (ptr `plusPtr` 104)
-                                      <*> peek (ptr `plusPtr` 108)
-                                      <*> peek (ptr `plusPtr` 112)
-                                      <*> peek (ptr `plusPtr` 116)
-                                      <*> peek (ptr `plusPtr` 120)
-                                      <*> peek (ptr `plusPtr` 124)
-                                      <*> peek (ptr `plusPtr` 128)
-                                      <*> peek (ptr `plusPtr` 132)
-                                      <*> peek (ptr `plusPtr` 136)
-                                      <*> peek (ptr `plusPtr` 140)
-                                      <*> peek (ptr `plusPtr` 144)
-                                      <*> peek (ptr `plusPtr` 148)
-                                      <*> peek (ptr `plusPtr` 152)
-                                      <*> peek (ptr `plusPtr` 156)
-                                      <*> peek (ptr `plusPtr` 160)
-                                      <*> peek (ptr `plusPtr` 164)
-                                      <*> peek (ptr `plusPtr` 168)
-                                      <*> peek (ptr `plusPtr` 172)
-                                      <*> peek (ptr `plusPtr` 176)
-                                      <*> peek (ptr `plusPtr` 180)
-                                      <*> peek (ptr `plusPtr` 184)
-                                      <*> peek (ptr `plusPtr` 188)
-                                      <*> peek (ptr `plusPtr` 192)
-                                      <*> peek (ptr `plusPtr` 196)
-                                      <*> peek (ptr `plusPtr` 200)
-                                      <*> peek (ptr `plusPtr` 204)
-                                      <*> peek (ptr `plusPtr` 208)
-                                      <*> peek (ptr `plusPtr` 212)
-                                      <*> peek (ptr `plusPtr` 216)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkRobustBufferAccess (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 4) (vkFullDrawIndexUint (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 8) (vkImageCubeArray (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 12) (vkIndependentBlend (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 16) (vkGeometryShader (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 20) (vkTessellationShader (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 24) (vkSampleRateShading (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 28) (vkDualSrcBlend (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 32) (vkLogicOp (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 36) (vkMultiDrawIndirect (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 40) (vkDrawIndirectFirstInstance (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 44) (vkDepthClamp (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 48) (vkDepthBiasClamp (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 52) (vkFillModeNonSolid (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 56) (vkDepthBounds (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 60) (vkWideLines (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 64) (vkLargePoints (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 68) (vkAlphaToOne (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 72) (vkMultiViewport (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 76) (vkSamplerAnisotropy (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 80) (vkTextureCompressionETC (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 84) (vkTextureCompressionASTC_LDR (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 88) (vkTextureCompressionBC (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 92) (vkOcclusionQueryPrecise (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 96) (vkPipelineStatisticsQuery (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 100) (vkVertexPipelineStoresAndAtomics (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 104) (vkFragmentStoresAndAtomics (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 108) (vkShaderTessellationAndGeometryPointSize (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 112) (vkShaderImageGatherExtended (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 116) (vkShaderStorageImageExtendedFormats (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 120) (vkShaderStorageImageMultisample (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 124) (vkShaderStorageImageReadWithoutFormat (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 128) (vkShaderStorageImageWriteWithoutFormat (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 132) (vkShaderUniformBufferArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 136) (vkShaderSampledImageArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 140) (vkShaderStorageBufferArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 144) (vkShaderStorageImageArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 148) (vkShaderClipDistance (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 152) (vkShaderCullDistance (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 156) (vkShaderFloat (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 160) (vkShaderInt (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 164) (vkShaderInt (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 168) (vkShaderResourceResidency (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 172) (vkShaderResourceMinLod (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 176) (vkSparseBinding (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 180) (vkSparseResidencyBuffer (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 184) (vkSparseResidencyImage (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 188) (vkSparseResidencyImage (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 192) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 196) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 200) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 204) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 208) (vkSparseResidencyAliased (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 212) (vkVariableMultisampleRate (poked :: VkPhysicalDeviceFeatures))
-                *> poke (ptr `plusPtr` 216) (vkInheritedQueries (poked :: VkPhysicalDeviceFeatures))
-
-
-
-data VkPhysicalDeviceSparseProperties =
-  VkPhysicalDeviceSparseProperties{ vkResidencyStandard :: VkBool32 
-                                  , vkResidencyStandard :: VkBool32 
-                                  , vkResidencyStandard :: VkBool32 
-                                  , vkResidencyAlignedMipSize :: VkBool32 
-                                  , vkResidencyNonResidentStrict :: VkBool32 
-                                  }
-  deriving (Eq)
-
-instance Storable VkPhysicalDeviceSparseProperties where
-  sizeOf ~_ = 20
-  alignment ~_ = 4
-  peek ptr = VkPhysicalDeviceSparseProperties <$> peek (ptr `plusPtr` 0)
-                                              <*> peek (ptr `plusPtr` 4)
-                                              <*> peek (ptr `plusPtr` 8)
-                                              <*> peek (ptr `plusPtr` 12)
-                                              <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkResidencyStandard (poked :: VkPhysicalDeviceSparseProperties))
-                *> poke (ptr `plusPtr` 4) (vkResidencyStandard (poked :: VkPhysicalDeviceSparseProperties))
-                *> poke (ptr `plusPtr` 8) (vkResidencyStandard (poked :: VkPhysicalDeviceSparseProperties))
-                *> poke (ptr `plusPtr` 12) (vkResidencyAlignedMipSize (poked :: VkPhysicalDeviceSparseProperties))
-                *> poke (ptr `plusPtr` 16) (vkResidencyNonResidentStrict (poked :: VkPhysicalDeviceSparseProperties))
-
-
-
-data VkPhysicalDeviceLimits =
-  VkPhysicalDeviceLimits{ vkMaxImageDimension :: Word32 
-                        , vkMaxImageDimension :: Word32 
-                        , vkMaxImageDimension :: Word32 
-                        , vkMaxImageDimensionCube :: Word32 
-                        , vkMaxImageArrayLayers :: Word32 
-                        , vkMaxTexelBufferElements :: Word32 
-                        , vkMaxUniformBufferRange :: Word32 
-                        , vkMaxStorageBufferRange :: Word32 
-                        , vkMaxPushConstantsSize :: Word32 
-                        , vkMaxMemoryAllocationCount :: Word32 
-                        , vkMaxSamplerAllocationCount :: Word32 
-                        , vkBufferImageGranularity :: VkDeviceSize 
-                        , vkSparseAddressSpaceSize :: VkDeviceSize 
-                        , vkMaxBoundDescriptorSets :: Word32 
-                        , vkMaxPerStageDescriptorSamplers :: Word32 
-                        , vkMaxPerStageDescriptorUniformBuffers :: Word32 
-                        , vkMaxPerStageDescriptorStorageBuffers :: Word32 
-                        , vkMaxPerStageDescriptorSampledImages :: Word32 
-                        , vkMaxPerStageDescriptorStorageImages :: Word32 
-                        , vkMaxPerStageDescriptorInputAttachments :: Word32 
-                        , vkMaxPerStageResources :: Word32 
-                        , vkMaxDescriptorSetSamplers :: Word32 
-                        , vkMaxDescriptorSetUniformBuffers :: Word32 
-                        , vkMaxDescriptorSetUniformBuffersDynamic :: Word32 
-                        , vkMaxDescriptorSetStorageBuffers :: Word32 
-                        , vkMaxDescriptorSetStorageBuffersDynamic :: Word32 
-                        , vkMaxDescriptorSetSampledImages :: Word32 
-                        , vkMaxDescriptorSetStorageImages :: Word32 
-                        , vkMaxDescriptorSetInputAttachments :: Word32 
-                        , vkMaxVertexInputAttributes :: Word32 
-                        , vkMaxVertexInputBindings :: Word32 
-                        , vkMaxVertexInputAttributeOffset :: Word32 
-                        , vkMaxVertexInputBindingStride :: Word32 
-                        , vkMaxVertexOutputComponents :: Word32 
-                        , vkMaxTessellationGenerationLevel :: Word32 
-                        , vkMaxTessellationPatchSize :: Word32 
-                        , vkMaxTessellationControlPerVertexInputComponents :: Word32 
-                        , vkMaxTessellationControlPerVertexOutputComponents :: Word32 
-                        , vkMaxTessellationControlPerPatchOutputComponents :: Word32 
-                        , vkMaxTessellationControlTotalOutputComponents :: Word32 
-                        , vkMaxTessellationEvaluationInputComponents :: Word32 
-                        , vkMaxTessellationEvaluationOutputComponents :: Word32 
-                        , vkMaxGeometryShaderInvocations :: Word32 
-                        , vkMaxGeometryInputComponents :: Word32 
-                        , vkMaxGeometryOutputComponents :: Word32 
-                        , vkMaxGeometryOutputVertices :: Word32 
-                        , vkMaxGeometryTotalOutputComponents :: Word32 
-                        , vkMaxFragmentInputComponents :: Word32 
-                        , vkMaxFragmentOutputAttachments :: Word32 
-                        , vkMaxFragmentDualSrcAttachments :: Word32 
-                        , vkMaxFragmentCombinedOutputResources :: Word32 
-                        , vkMaxComputeSharedMemorySize :: Word32 
-                        , vkMaxComputeWorkGroupCount :: Vec (ToPeano 3) Word32 
-                        , vkMaxComputeWorkGroupInvocations :: Word32 
-                        , vkMaxComputeWorkGroupSize :: Vec (ToPeano 3) Word32 
-                        , vkSubPixelPrecisionBits :: Word32 
-                        , vkSubTexelPrecisionBits :: Word32 
-                        , vkMipmapPrecisionBits :: Word32 
-                        , vkMaxDrawIndexedIndexValue :: Word32 
-                        , vkMaxDrawIndirectCount :: Word32 
-                        , vkMaxSamplerLodBias :: CFloat 
-                        , vkMaxSamplerAnisotropy :: CFloat 
-                        , vkMaxViewports :: Word32 
-                        , vkMaxViewportDimensions :: Vec (ToPeano 2) Word32 
-                        , vkViewportBoundsRange :: Vec (ToPeano 2) CFloat 
-                        , vkViewportSubPixelBits :: Word32 
-                        , vkMinMemoryMapAlignment :: CSize 
-                        , vkMinTexelBufferOffsetAlignment :: VkDeviceSize 
-                        , vkMinUniformBufferOffsetAlignment :: VkDeviceSize 
-                        , vkMinStorageBufferOffsetAlignment :: VkDeviceSize 
-                        , vkMinTexelOffset :: Int32 
-                        , vkMaxTexelOffset :: Word32 
-                        , vkMinTexelGatherOffset :: Int32 
-                        , vkMaxTexelGatherOffset :: Word32 
-                        , vkMinInterpolationOffset :: CFloat 
-                        , vkMaxInterpolationOffset :: CFloat 
-                        , vkSubPixelInterpolationOffsetBits :: Word32 
-                        , vkMaxFramebufferWidth :: Word32 
-                        , vkMaxFramebufferHeight :: Word32 
-                        , vkMaxFramebufferLayers :: Word32 
-                        , vkFramebufferColorSampleCounts :: VkSampleCountFlags 
-                        , vkFramebufferDepthSampleCounts :: VkSampleCountFlags 
-                        , vkFramebufferStencilSampleCounts :: VkSampleCountFlags 
-                        , vkFramebufferNoAttachmentsSampleCounts :: VkSampleCountFlags 
-                        , vkMaxColorAttachments :: Word32 
-                        , vkSampledImageColorSampleCounts :: VkSampleCountFlags 
-                        , vkSampledImageIntegerSampleCounts :: VkSampleCountFlags 
-                        , vkSampledImageDepthSampleCounts :: VkSampleCountFlags 
-                        , vkSampledImageStencilSampleCounts :: VkSampleCountFlags 
-                        , vkStorageImageSampleCounts :: VkSampleCountFlags 
-                        , vkMaxSampleMaskWords :: Word32 
-                        , vkTimestampComputeAndGraphics :: VkBool32 
-                        , vkTimestampPeriod :: CFloat 
-                        , vkMaxClipDistances :: Word32 
-                        , vkMaxCullDistances :: Word32 
-                        , vkMaxCombinedClipAndCullDistances :: Word32 
-                        , vkDiscreteQueuePriorities :: Word32 
-                        , vkPointSizeRange :: Vec (ToPeano 2) CFloat 
-                        , vkLineWidthRange :: Vec (ToPeano 2) CFloat 
-                        , vkPointSizeGranularity :: CFloat 
-                        , vkLineWidthGranularity :: CFloat 
-                        , vkStrictLines :: VkBool32 
-                        , vkStandardSampleLocations :: VkBool32 
-                        , vkOptimalBufferCopyOffsetAlignment :: VkDeviceSize 
-                        , vkOptimalBufferCopyRowPitchAlignment :: VkDeviceSize 
-                        , vkNonCoherentAtomSize :: VkDeviceSize 
-                        }
-  deriving (Eq)
-
-instance Storable VkPhysicalDeviceLimits where
-  sizeOf ~_ = 504
-  alignment ~_ = 8
-  peek ptr = VkPhysicalDeviceLimits <$> peek (ptr `plusPtr` 0)
-                                    <*> peek (ptr `plusPtr` 4)
-                                    <*> peek (ptr `plusPtr` 8)
-                                    <*> peek (ptr `plusPtr` 12)
-                                    <*> peek (ptr `plusPtr` 16)
-                                    <*> peek (ptr `plusPtr` 20)
-                                    <*> peek (ptr `plusPtr` 24)
-                                    <*> peek (ptr `plusPtr` 28)
-                                    <*> peek (ptr `plusPtr` 32)
-                                    <*> peek (ptr `plusPtr` 36)
-                                    <*> peek (ptr `plusPtr` 40)
-                                    <*> peek (ptr `plusPtr` 48)
-                                    <*> peek (ptr `plusPtr` 56)
-                                    <*> peek (ptr `plusPtr` 64)
-                                    <*> peek (ptr `plusPtr` 68)
-                                    <*> peek (ptr `plusPtr` 72)
-                                    <*> peek (ptr `plusPtr` 76)
-                                    <*> peek (ptr `plusPtr` 80)
-                                    <*> peek (ptr `plusPtr` 84)
-                                    <*> peek (ptr `plusPtr` 88)
-                                    <*> peek (ptr `plusPtr` 92)
-                                    <*> peek (ptr `plusPtr` 96)
-                                    <*> peek (ptr `plusPtr` 100)
-                                    <*> peek (ptr `plusPtr` 104)
-                                    <*> peek (ptr `plusPtr` 108)
-                                    <*> peek (ptr `plusPtr` 112)
-                                    <*> peek (ptr `plusPtr` 116)
-                                    <*> peek (ptr `plusPtr` 120)
-                                    <*> peek (ptr `plusPtr` 124)
-                                    <*> peek (ptr `plusPtr` 128)
-                                    <*> peek (ptr `plusPtr` 132)
-                                    <*> peek (ptr `plusPtr` 136)
-                                    <*> peek (ptr `plusPtr` 140)
-                                    <*> peek (ptr `plusPtr` 144)
-                                    <*> peek (ptr `plusPtr` 148)
-                                    <*> peek (ptr `plusPtr` 152)
-                                    <*> peek (ptr `plusPtr` 156)
-                                    <*> peek (ptr `plusPtr` 160)
-                                    <*> peek (ptr `plusPtr` 164)
-                                    <*> peek (ptr `plusPtr` 168)
-                                    <*> peek (ptr `plusPtr` 172)
-                                    <*> peek (ptr `plusPtr` 176)
-                                    <*> peek (ptr `plusPtr` 180)
-                                    <*> peek (ptr `plusPtr` 184)
-                                    <*> peek (ptr `plusPtr` 188)
-                                    <*> peek (ptr `plusPtr` 192)
-                                    <*> peek (ptr `plusPtr` 196)
-                                    <*> peek (ptr `plusPtr` 200)
-                                    <*> peek (ptr `plusPtr` 204)
-                                    <*> peek (ptr `plusPtr` 208)
-                                    <*> peek (ptr `plusPtr` 212)
-                                    <*> peek (ptr `plusPtr` 216)
-                                    <*> peek (ptr `plusPtr` 220)
-                                    <*> peek (ptr `plusPtr` 232)
-                                    <*> peek (ptr `plusPtr` 236)
-                                    <*> peek (ptr `plusPtr` 248)
-                                    <*> peek (ptr `plusPtr` 252)
-                                    <*> peek (ptr `plusPtr` 256)
-                                    <*> peek (ptr `plusPtr` 260)
-                                    <*> peek (ptr `plusPtr` 264)
-                                    <*> peek (ptr `plusPtr` 268)
-                                    <*> peek (ptr `plusPtr` 272)
-                                    <*> peek (ptr `plusPtr` 276)
-                                    <*> peek (ptr `plusPtr` 280)
-                                    <*> peek (ptr `plusPtr` 288)
-                                    <*> peek (ptr `plusPtr` 296)
-                                    <*> peek (ptr `plusPtr` 304)
-                                    <*> peek (ptr `plusPtr` 312)
-                                    <*> peek (ptr `plusPtr` 320)
-                                    <*> peek (ptr `plusPtr` 328)
-                                    <*> peek (ptr `plusPtr` 336)
-                                    <*> peek (ptr `plusPtr` 340)
-                                    <*> peek (ptr `plusPtr` 344)
-                                    <*> peek (ptr `plusPtr` 348)
-                                    <*> peek (ptr `plusPtr` 352)
-                                    <*> peek (ptr `plusPtr` 356)
-                                    <*> peek (ptr `plusPtr` 360)
-                                    <*> peek (ptr `plusPtr` 364)
-                                    <*> peek (ptr `plusPtr` 368)
-                                    <*> peek (ptr `plusPtr` 372)
-                                    <*> peek (ptr `plusPtr` 376)
-                                    <*> peek (ptr `plusPtr` 380)
-                                    <*> peek (ptr `plusPtr` 384)
-                                    <*> peek (ptr `plusPtr` 388)
-                                    <*> peek (ptr `plusPtr` 392)
-                                    <*> peek (ptr `plusPtr` 396)
-                                    <*> peek (ptr `plusPtr` 400)
-                                    <*> peek (ptr `plusPtr` 404)
-                                    <*> peek (ptr `plusPtr` 408)
-                                    <*> peek (ptr `plusPtr` 412)
-                                    <*> peek (ptr `plusPtr` 416)
-                                    <*> peek (ptr `plusPtr` 420)
-                                    <*> peek (ptr `plusPtr` 424)
-                                    <*> peek (ptr `plusPtr` 428)
-                                    <*> peek (ptr `plusPtr` 432)
-                                    <*> peek (ptr `plusPtr` 436)
-                                    <*> peek (ptr `plusPtr` 440)
-                                    <*> peek (ptr `plusPtr` 444)
-                                    <*> peek (ptr `plusPtr` 452)
-                                    <*> peek (ptr `plusPtr` 460)
-                                    <*> peek (ptr `plusPtr` 464)
-                                    <*> peek (ptr `plusPtr` 468)
-                                    <*> peek (ptr `plusPtr` 472)
-                                    <*> peek (ptr `plusPtr` 480)
-                                    <*> peek (ptr `plusPtr` 488)
-                                    <*> peek (ptr `plusPtr` 496)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkMaxImageDimension (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 4) (vkMaxImageDimension (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 8) (vkMaxImageDimension (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 12) (vkMaxImageDimensionCube (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 16) (vkMaxImageArrayLayers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 20) (vkMaxTexelBufferElements (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 24) (vkMaxUniformBufferRange (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 28) (vkMaxStorageBufferRange (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 32) (vkMaxPushConstantsSize (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 36) (vkMaxMemoryAllocationCount (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 40) (vkMaxSamplerAllocationCount (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 48) (vkBufferImageGranularity (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 56) (vkSparseAddressSpaceSize (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 64) (vkMaxBoundDescriptorSets (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 68) (vkMaxPerStageDescriptorSamplers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 72) (vkMaxPerStageDescriptorUniformBuffers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 76) (vkMaxPerStageDescriptorStorageBuffers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 80) (vkMaxPerStageDescriptorSampledImages (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 84) (vkMaxPerStageDescriptorStorageImages (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 88) (vkMaxPerStageDescriptorInputAttachments (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 92) (vkMaxPerStageResources (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 96) (vkMaxDescriptorSetSamplers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 100) (vkMaxDescriptorSetUniformBuffers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 104) (vkMaxDescriptorSetUniformBuffersDynamic (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 108) (vkMaxDescriptorSetStorageBuffers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 112) (vkMaxDescriptorSetStorageBuffersDynamic (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 116) (vkMaxDescriptorSetSampledImages (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 120) (vkMaxDescriptorSetStorageImages (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 124) (vkMaxDescriptorSetInputAttachments (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 128) (vkMaxVertexInputAttributes (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 132) (vkMaxVertexInputBindings (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 136) (vkMaxVertexInputAttributeOffset (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 140) (vkMaxVertexInputBindingStride (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 144) (vkMaxVertexOutputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 148) (vkMaxTessellationGenerationLevel (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 152) (vkMaxTessellationPatchSize (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 156) (vkMaxTessellationControlPerVertexInputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 160) (vkMaxTessellationControlPerVertexOutputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 164) (vkMaxTessellationControlPerPatchOutputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 168) (vkMaxTessellationControlTotalOutputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 172) (vkMaxTessellationEvaluationInputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 176) (vkMaxTessellationEvaluationOutputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 180) (vkMaxGeometryShaderInvocations (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 184) (vkMaxGeometryInputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 188) (vkMaxGeometryOutputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 192) (vkMaxGeometryOutputVertices (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 196) (vkMaxGeometryTotalOutputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 200) (vkMaxFragmentInputComponents (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 204) (vkMaxFragmentOutputAttachments (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 208) (vkMaxFragmentDualSrcAttachments (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 212) (vkMaxFragmentCombinedOutputResources (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 216) (vkMaxComputeSharedMemorySize (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 220) (vkMaxComputeWorkGroupCount (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 232) (vkMaxComputeWorkGroupInvocations (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 236) (vkMaxComputeWorkGroupSize (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 248) (vkSubPixelPrecisionBits (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 252) (vkSubTexelPrecisionBits (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 256) (vkMipmapPrecisionBits (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 260) (vkMaxDrawIndexedIndexValue (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 264) (vkMaxDrawIndirectCount (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 268) (vkMaxSamplerLodBias (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 272) (vkMaxSamplerAnisotropy (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 276) (vkMaxViewports (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 280) (vkMaxViewportDimensions (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 288) (vkViewportBoundsRange (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 296) (vkViewportSubPixelBits (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 304) (vkMinMemoryMapAlignment (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 312) (vkMinTexelBufferOffsetAlignment (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 320) (vkMinUniformBufferOffsetAlignment (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 328) (vkMinStorageBufferOffsetAlignment (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 336) (vkMinTexelOffset (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 340) (vkMaxTexelOffset (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 344) (vkMinTexelGatherOffset (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 348) (vkMaxTexelGatherOffset (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 352) (vkMinInterpolationOffset (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 356) (vkMaxInterpolationOffset (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 360) (vkSubPixelInterpolationOffsetBits (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 364) (vkMaxFramebufferWidth (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 368) (vkMaxFramebufferHeight (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 372) (vkMaxFramebufferLayers (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 376) (vkFramebufferColorSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 380) (vkFramebufferDepthSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 384) (vkFramebufferStencilSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 388) (vkFramebufferNoAttachmentsSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 392) (vkMaxColorAttachments (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 396) (vkSampledImageColorSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 400) (vkSampledImageIntegerSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 404) (vkSampledImageDepthSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 408) (vkSampledImageStencilSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 412) (vkStorageImageSampleCounts (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 416) (vkMaxSampleMaskWords (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 420) (vkTimestampComputeAndGraphics (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 424) (vkTimestampPeriod (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 428) (vkMaxClipDistances (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 432) (vkMaxCullDistances (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 436) (vkMaxCombinedClipAndCullDistances (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 440) (vkDiscreteQueuePriorities (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 444) (vkPointSizeRange (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 452) (vkLineWidthRange (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 460) (vkPointSizeGranularity (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 464) (vkLineWidthGranularity (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 468) (vkStrictLines (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 472) (vkStandardSampleLocations (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 480) (vkOptimalBufferCopyOffsetAlignment (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 488) (vkOptimalBufferCopyRowPitchAlignment (poked :: VkPhysicalDeviceLimits))
-                *> poke (ptr `plusPtr` 496) (vkNonCoherentAtomSize (poked :: VkPhysicalDeviceLimits))
-
-
-
-data VkSemaphoreCreateInfo =
-  VkSemaphoreCreateInfo{ vkSType :: VkStructureType 
-                       , vkPNext :: Ptr Void 
-                       , vkFlags :: VkSemaphoreCreateFlags 
-                       }
-  deriving (Eq)
-
-instance Storable VkSemaphoreCreateInfo where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkSemaphoreCreateInfo <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkSemaphoreCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkSemaphoreCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSemaphoreCreateInfo))
-
-
-
-data VkQueryPoolCreateInfo =
-  VkQueryPoolCreateInfo{ vkSType :: VkStructureType 
-                       , vkPNext :: Ptr Void 
-                       , vkFlags :: VkQueryPoolCreateFlags 
-                       , vkQueryType :: VkQueryType 
-                       , vkQueryCount :: Word32 
-                       , vkPipelineStatistics :: VkQueryPipelineStatisticFlags 
-                       }
-  deriving (Eq)
-
-instance Storable VkQueryPoolCreateInfo where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkQueryPoolCreateInfo <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 16)
-                                   <*> peek (ptr `plusPtr` 20)
-                                   <*> peek (ptr `plusPtr` 24)
-                                   <*> peek (ptr `plusPtr` 28)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkQueryPoolCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkQueryPoolCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkQueryPoolCreateInfo))
-                *> poke (ptr `plusPtr` 20) (vkQueryType (poked :: VkQueryPoolCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkQueryCount (poked :: VkQueryPoolCreateInfo))
-                *> poke (ptr `plusPtr` 28) (vkPipelineStatistics (poked :: VkQueryPoolCreateInfo))
-
-
-
-data VkFramebufferCreateInfo =
-  VkFramebufferCreateInfo{ vkSType :: VkStructureType 
-                         , vkPNext :: Ptr Void 
-                         , vkFlags :: VkFramebufferCreateFlags 
-                         , vkRenderPass :: VkRenderPass 
-                         , vkAttachmentCount :: Word32 
-                         , vkPAttachments :: Ptr VkImageView 
-                         , vkWidth :: Word32 
-                         , vkHeight :: Word32 
-                         , vkLayers :: Word32 
-                         }
-  deriving (Eq)
-
-instance Storable VkFramebufferCreateInfo where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkFramebufferCreateInfo <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 8)
-                                     <*> peek (ptr `plusPtr` 16)
-                                     <*> peek (ptr `plusPtr` 24)
-                                     <*> peek (ptr `plusPtr` 32)
-                                     <*> peek (ptr `plusPtr` 40)
-                                     <*> peek (ptr `plusPtr` 48)
-                                     <*> peek (ptr `plusPtr` 52)
-                                     <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 24) (vkRenderPass (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 32) (vkAttachmentCount (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 40) (vkPAttachments (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 48) (vkWidth (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 52) (vkHeight (poked :: VkFramebufferCreateInfo))
-                *> poke (ptr `plusPtr` 56) (vkLayers (poked :: VkFramebufferCreateInfo))
-
-
-
-data VkDrawIndirectCommand =
-  VkDrawIndirectCommand{ vkVertexCount :: Word32 
-                       , vkInstanceCount :: Word32 
-                       , vkFirstVertex :: Word32 
-                       , vkFirstInstance :: Word32 
-                       }
-  deriving (Eq)
-
-instance Storable VkDrawIndirectCommand where
-  sizeOf ~_ = 16
-  alignment ~_ = 4
-  peek ptr = VkDrawIndirectCommand <$> peek (ptr `plusPtr` 0)
-                                   <*> peek (ptr `plusPtr` 4)
-                                   <*> peek (ptr `plusPtr` 8)
-                                   <*> peek (ptr `plusPtr` 12)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkVertexCount (poked :: VkDrawIndirectCommand))
-                *> poke (ptr `plusPtr` 4) (vkInstanceCount (poked :: VkDrawIndirectCommand))
-                *> poke (ptr `plusPtr` 8) (vkFirstVertex (poked :: VkDrawIndirectCommand))
-                *> poke (ptr `plusPtr` 12) (vkFirstInstance (poked :: VkDrawIndirectCommand))
-
-
-
-data VkDrawIndexedIndirectCommand =
-  VkDrawIndexedIndirectCommand{ vkIndexCount :: Word32 
-                              , vkInstanceCount :: Word32 
-                              , vkFirstIndex :: Word32 
-                              , vkVertexOffset :: Int32 
-                              , vkFirstInstance :: Word32 
-                              }
-  deriving (Eq)
-
-instance Storable VkDrawIndexedIndirectCommand where
-  sizeOf ~_ = 20
-  alignment ~_ = 4
-  peek ptr = VkDrawIndexedIndirectCommand <$> peek (ptr `plusPtr` 0)
-                                          <*> peek (ptr `plusPtr` 4)
-                                          <*> peek (ptr `plusPtr` 8)
-                                          <*> peek (ptr `plusPtr` 12)
-                                          <*> peek (ptr `plusPtr` 16)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkIndexCount (poked :: VkDrawIndexedIndirectCommand))
-                *> poke (ptr `plusPtr` 4) (vkInstanceCount (poked :: VkDrawIndexedIndirectCommand))
-                *> poke (ptr `plusPtr` 8) (vkFirstIndex (poked :: VkDrawIndexedIndirectCommand))
-                *> poke (ptr `plusPtr` 12) (vkVertexOffset (poked :: VkDrawIndexedIndirectCommand))
-                *> poke (ptr `plusPtr` 16) (vkFirstInstance (poked :: VkDrawIndexedIndirectCommand))
-
-
-
-data VkDispatchIndirectCommand =
-  VkDispatchIndirectCommand{ vkX :: Word32 
-                           , vkY :: Word32 
-                           , vkZ :: Word32 
-                           }
-  deriving (Eq)
-
-instance Storable VkDispatchIndirectCommand where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkDispatchIndirectCommand <$> peek (ptr `plusPtr` 0)
-                                       <*> peek (ptr `plusPtr` 4)
-                                       <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkDispatchIndirectCommand))
-                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkDispatchIndirectCommand))
-                *> poke (ptr `plusPtr` 8) (vkZ (poked :: VkDispatchIndirectCommand))
-
-
-
-data VkSubmitInfo =
-  VkSubmitInfo{ vkSType :: VkStructureType 
-              , vkPNext :: Ptr Void 
-              , vkWaitSemaphoreCount :: Word32 
-              , vkPWaitSemaphores :: Ptr VkSemaphore 
-              , vkPWaitDstStageMask :: Ptr VkPipelineStageFlags 
-              , vkCommandBufferCount :: Word32 
-              , vkPCommandBuffers :: Ptr VkCommandBuffer 
-              , vkSignalSemaphoreCount :: Word32 
-              , vkPSignalSemaphores :: Ptr VkSemaphore 
-              }
-  deriving (Eq)
-
-instance Storable VkSubmitInfo where
-  sizeOf ~_ = 72
-  alignment ~_ = 8
-  peek ptr = VkSubmitInfo <$> peek (ptr `plusPtr` 0)
-                          <*> peek (ptr `plusPtr` 8)
-                          <*> peek (ptr `plusPtr` 16)
-                          <*> peek (ptr `plusPtr` 24)
-                          <*> peek (ptr `plusPtr` 32)
-                          <*> peek (ptr `plusPtr` 40)
-                          <*> peek (ptr `plusPtr` 48)
-                          <*> peek (ptr `plusPtr` 56)
-                          <*> peek (ptr `plusPtr` 64)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 16) (vkWaitSemaphoreCount (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 24) (vkPWaitSemaphores (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 32) (vkPWaitDstStageMask (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 40) (vkCommandBufferCount (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 48) (vkPCommandBuffers (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 56) (vkSignalSemaphoreCount (poked :: VkSubmitInfo))
-                *> poke (ptr `plusPtr` 64) (vkPSignalSemaphores (poked :: VkSubmitInfo))
-
-
-
-data VkDisplayPropertiesKHR =
-  VkDisplayPropertiesKHR{ vkDisplay :: VkDisplayKHR 
-                        , vkDisplayName :: Ptr CChar 
-                        , vkPhysicalDimensions :: VkExtent2D 
-                        , vkPhysicalResolution :: VkExtent2D 
-                        , vkSupportedTransforms :: VkSurfaceTransformFlagsKHR 
-                        , vkPlaneReorderPossible :: VkBool32 
-                        , vkPersistentContent :: VkBool32 
-                        }
-  deriving (Eq)
-
-instance Storable VkDisplayPropertiesKHR where
-  sizeOf ~_ = 48
-  alignment ~_ = 8
-  peek ptr = VkDisplayPropertiesKHR <$> peek (ptr `plusPtr` 0)
-                                    <*> peek (ptr `plusPtr` 8)
-                                    <*> peek (ptr `plusPtr` 16)
-                                    <*> peek (ptr `plusPtr` 24)
-                                    <*> peek (ptr `plusPtr` 32)
-                                    <*> peek (ptr `plusPtr` 36)
-                                    <*> peek (ptr `plusPtr` 40)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkDisplay (poked :: VkDisplayPropertiesKHR))
-                *> poke (ptr `plusPtr` 8) (vkDisplayName (poked :: VkDisplayPropertiesKHR))
-                *> poke (ptr `plusPtr` 16) (vkPhysicalDimensions (poked :: VkDisplayPropertiesKHR))
-                *> poke (ptr `plusPtr` 24) (vkPhysicalResolution (poked :: VkDisplayPropertiesKHR))
-                *> poke (ptr `plusPtr` 32) (vkSupportedTransforms (poked :: VkDisplayPropertiesKHR))
-                *> poke (ptr `plusPtr` 36) (vkPlaneReorderPossible (poked :: VkDisplayPropertiesKHR))
-                *> poke (ptr `plusPtr` 40) (vkPersistentContent (poked :: VkDisplayPropertiesKHR))
-
-
-
-data VkDisplayPlanePropertiesKHR =
-  VkDisplayPlanePropertiesKHR{ vkCurrentDisplay :: VkDisplayKHR 
-                             , vkCurrentStackIndex :: Word32 
-                             }
-  deriving (Eq)
-
-instance Storable VkDisplayPlanePropertiesKHR where
-  sizeOf ~_ = 16
-  alignment ~_ = 8
-  peek ptr = VkDisplayPlanePropertiesKHR <$> peek (ptr `plusPtr` 0)
-                                         <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkCurrentDisplay (poked :: VkDisplayPlanePropertiesKHR))
-                *> poke (ptr `plusPtr` 8) (vkCurrentStackIndex (poked :: VkDisplayPlanePropertiesKHR))
-
-
-
-data VkDisplayModeParametersKHR =
-  VkDisplayModeParametersKHR{ vkVisibleRegion :: VkExtent2D 
-                            , vkRefreshRate :: Word32 
-                            }
-  deriving (Eq)
-
-instance Storable VkDisplayModeParametersKHR where
-  sizeOf ~_ = 12
-  alignment ~_ = 4
-  peek ptr = VkDisplayModeParametersKHR <$> peek (ptr `plusPtr` 0)
-                                        <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkVisibleRegion (poked :: VkDisplayModeParametersKHR))
-                *> poke (ptr `plusPtr` 8) (vkRefreshRate (poked :: VkDisplayModeParametersKHR))
-
-
-
-data VkDisplayModePropertiesKHR =
-  VkDisplayModePropertiesKHR{ vkDisplayMode :: VkDisplayModeKHR 
-                            , vkParameters :: VkDisplayModeParametersKHR 
-                            }
-  deriving (Eq)
-
-instance Storable VkDisplayModePropertiesKHR where
-  sizeOf ~_ = 24
-  alignment ~_ = 8
-  peek ptr = VkDisplayModePropertiesKHR <$> peek (ptr `plusPtr` 0)
-                                        <*> peek (ptr `plusPtr` 8)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkDisplayMode (poked :: VkDisplayModePropertiesKHR))
-                *> poke (ptr `plusPtr` 8) (vkParameters (poked :: VkDisplayModePropertiesKHR))
-
-
-
-data VkDisplayModeCreateInfoKHR =
-  VkDisplayModeCreateInfoKHR{ vkSType :: VkStructureType 
-                            , vkPNext :: Ptr Void 
-                            , vkFlags :: VkDisplayModeCreateFlagsKHR 
-                            , vkParameters :: VkDisplayModeParametersKHR 
-                            }
-  deriving (Eq)
-
-instance Storable VkDisplayModeCreateInfoKHR where
-  sizeOf ~_ = 32
-  alignment ~_ = 8
-  peek ptr = VkDisplayModeCreateInfoKHR <$> peek (ptr `plusPtr` 0)
-                                        <*> peek (ptr `plusPtr` 8)
-                                        <*> peek (ptr `plusPtr` 16)
-                                        <*> peek (ptr `plusPtr` 20)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDisplayModeCreateInfoKHR))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDisplayModeCreateInfoKHR))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDisplayModeCreateInfoKHR))
-                *> poke (ptr `plusPtr` 20) (vkParameters (poked :: VkDisplayModeCreateInfoKHR))
-
-
-
-data VkDisplayPlaneCapabilitiesKHR =
-  VkDisplayPlaneCapabilitiesKHR{ vkSupportedAlpha :: VkDisplayPlaneAlphaFlagsKHR 
-                               , vkMinSrcPosition :: VkOffset2D 
-                               , vkMaxSrcPosition :: VkOffset2D 
-                               , vkMinSrcExtent :: VkExtent2D 
-                               , vkMaxSrcExtent :: VkExtent2D 
-                               , vkMinDstPosition :: VkOffset2D 
-                               , vkMaxDstPosition :: VkOffset2D 
-                               , vkMinDstExtent :: VkExtent2D 
-                               , vkMaxDstExtent :: VkExtent2D 
-                               }
-  deriving (Eq)
-
-instance Storable VkDisplayPlaneCapabilitiesKHR where
-  sizeOf ~_ = 68
-  alignment ~_ = 4
-  peek ptr = VkDisplayPlaneCapabilitiesKHR <$> peek (ptr `plusPtr` 0)
-                                           <*> peek (ptr `plusPtr` 4)
-                                           <*> peek (ptr `plusPtr` 12)
-                                           <*> peek (ptr `plusPtr` 20)
-                                           <*> peek (ptr `plusPtr` 28)
-                                           <*> peek (ptr `plusPtr` 36)
-                                           <*> peek (ptr `plusPtr` 44)
-                                           <*> peek (ptr `plusPtr` 52)
-                                           <*> peek (ptr `plusPtr` 60)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSupportedAlpha (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 4) (vkMinSrcPosition (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 12) (vkMaxSrcPosition (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 20) (vkMinSrcExtent (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 28) (vkMaxSrcExtent (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 36) (vkMinDstPosition (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 44) (vkMaxDstPosition (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 52) (vkMinDstExtent (poked :: VkDisplayPlaneCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 60) (vkMaxDstExtent (poked :: VkDisplayPlaneCapabilitiesKHR))
-
-
-
-data VkDisplaySurfaceCreateInfoKHR =
-  VkDisplaySurfaceCreateInfoKHR{ vkSType :: VkStructureType 
-                               , vkPNext :: Ptr Void 
-                               , vkFlags :: VkDisplaySurfaceCreateFlagsKHR 
-                               , vkDisplayMode :: VkDisplayModeKHR 
-                               , vkPlaneIndex :: Word32 
-                               , vkPlaneStackIndex :: Word32 
-                               , vkTransform :: VkSurfaceTransformFlagBitsKHR 
-                               , vkGlobalAlpha :: CFloat 
-                               , vkAlphaMode :: VkDisplayPlaneAlphaFlagBitsKHR 
-                               , vkImageExtent :: VkExtent2D 
-                               }
-  deriving (Eq)
-
-instance Storable VkDisplaySurfaceCreateInfoKHR where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkDisplaySurfaceCreateInfoKHR <$> peek (ptr `plusPtr` 0)
-                                           <*> peek (ptr `plusPtr` 8)
-                                           <*> peek (ptr `plusPtr` 16)
-                                           <*> peek (ptr `plusPtr` 24)
-                                           <*> peek (ptr `plusPtr` 32)
-                                           <*> peek (ptr `plusPtr` 36)
-                                           <*> peek (ptr `plusPtr` 40)
-                                           <*> peek (ptr `plusPtr` 44)
-                                           <*> peek (ptr `plusPtr` 48)
-                                           <*> peek (ptr `plusPtr` 52)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 24) (vkDisplayMode (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 32) (vkPlaneIndex (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 36) (vkPlaneStackIndex (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 40) (vkTransform (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 44) (vkGlobalAlpha (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 48) (vkAlphaMode (poked :: VkDisplaySurfaceCreateInfoKHR))
-                *> poke (ptr `plusPtr` 52) (vkImageExtent (poked :: VkDisplaySurfaceCreateInfoKHR))
-
-
-
-data VkDisplayPresentInfoKHR =
-  VkDisplayPresentInfoKHR{ vkSType :: VkStructureType 
-                         , vkPNext :: Ptr Void 
-                         , vkSrcRect :: VkRect2D 
-                         , vkDstRect :: VkRect2D 
-                         , vkPersistent :: VkBool32 
-                         }
-  deriving (Eq)
-
-instance Storable VkDisplayPresentInfoKHR where
-  sizeOf ~_ = 56
-  alignment ~_ = 8
-  peek ptr = VkDisplayPresentInfoKHR <$> peek (ptr `plusPtr` 0)
-                                     <*> peek (ptr `plusPtr` 8)
-                                     <*> peek (ptr `plusPtr` 16)
-                                     <*> peek (ptr `plusPtr` 32)
-                                     <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDisplayPresentInfoKHR))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDisplayPresentInfoKHR))
-                *> poke (ptr `plusPtr` 16) (vkSrcRect (poked :: VkDisplayPresentInfoKHR))
-                *> poke (ptr `plusPtr` 32) (vkDstRect (poked :: VkDisplayPresentInfoKHR))
-                *> poke (ptr `plusPtr` 48) (vkPersistent (poked :: VkDisplayPresentInfoKHR))
-
-
-
-data VkSurfaceCapabilitiesKHR =
-  VkSurfaceCapabilitiesKHR{ vkMinImageCount :: Word32 
-                          , vkMaxImageCount :: Word32 
-                          , vkCurrentExtent :: VkExtent2D 
-                          , vkMinImageExtent :: VkExtent2D 
-                          , vkMaxImageExtent :: VkExtent2D 
-                          , vkMaxImageArrayLayers :: Word32 
-                          , vkSupportedTransforms :: VkSurfaceTransformFlagsKHR 
-                          , vkCurrentTransform :: VkSurfaceTransformFlagBitsKHR 
-                          , vkSupportedCompositeAlpha :: VkCompositeAlphaFlagsKHR 
-                          , vkSupportedUsageFlags :: VkImageUsageFlags 
-                          }
-  deriving (Eq)
-
-instance Storable VkSurfaceCapabilitiesKHR where
-  sizeOf ~_ = 52
-  alignment ~_ = 4
-  peek ptr = VkSurfaceCapabilitiesKHR <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 4)
-                                      <*> peek (ptr `plusPtr` 8)
-                                      <*> peek (ptr `plusPtr` 16)
-                                      <*> peek (ptr `plusPtr` 24)
-                                      <*> peek (ptr `plusPtr` 32)
-                                      <*> peek (ptr `plusPtr` 36)
-                                      <*> peek (ptr `plusPtr` 40)
-                                      <*> peek (ptr `plusPtr` 44)
-                                      <*> peek (ptr `plusPtr` 48)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkMinImageCount (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 4) (vkMaxImageCount (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 8) (vkCurrentExtent (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 16) (vkMinImageExtent (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 24) (vkMaxImageExtent (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 32) (vkMaxImageArrayLayers (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 36) (vkSupportedTransforms (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 40) (vkCurrentTransform (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 44) (vkSupportedCompositeAlpha (poked :: VkSurfaceCapabilitiesKHR))
-                *> poke (ptr `plusPtr` 48) (vkSupportedUsageFlags (poked :: VkSurfaceCapabilitiesKHR))
-
-
-
-data VkSurfaceFormatKHR =
-  VkSurfaceFormatKHR{ vkFormat :: VkFormat 
-                    , vkColorSpace :: VkColorSpaceKHR 
-                    }
-  deriving (Eq)
-
-instance Storable VkSurfaceFormatKHR where
-  sizeOf ~_ = 8
-  alignment ~_ = 4
-  peek ptr = VkSurfaceFormatKHR <$> peek (ptr `plusPtr` 0)
-                                <*> peek (ptr `plusPtr` 4)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkFormat (poked :: VkSurfaceFormatKHR))
-                *> poke (ptr `plusPtr` 4) (vkColorSpace (poked :: VkSurfaceFormatKHR))
-
-
-
-data VkSwapchainCreateInfoKHR =
-  VkSwapchainCreateInfoKHR{ vkSType :: VkStructureType 
-                          , vkPNext :: Ptr Void 
-                          , vkFlags :: VkSwapchainCreateFlagsKHR 
-                          , vkSurface :: VkSurfaceKHR 
-                          , vkMinImageCount :: Word32 
-                          , vkImageFormat :: VkFormat 
-                          , vkImageColorSpace :: VkColorSpaceKHR 
-                          , vkImageExtent :: VkExtent2D 
-                          , vkImageArrayLayers :: Word32 
-                          , vkImageUsage :: VkImageUsageFlags 
-                          , vkImageSharingMode :: VkSharingMode 
-                          , vkQueueFamilyIndexCount :: Word32 
-                          , vkPQueueFamilyIndices :: Ptr Word32 
-                          , vkPreTransform :: VkSurfaceTransformFlagBitsKHR 
-                          , vkCompositeAlpha :: VkCompositeAlphaFlagBitsKHR 
-                          , vkPresentMode :: VkPresentModeKHR 
-                          , vkClipped :: VkBool32 
-                          , vkOldSwapchain :: VkSwapchainKHR 
-                          }
-  deriving (Eq)
-
-instance Storable VkSwapchainCreateInfoKHR where
-  sizeOf ~_ = 104
-  alignment ~_ = 8
-  peek ptr = VkSwapchainCreateInfoKHR <$> peek (ptr `plusPtr` 0)
-                                      <*> peek (ptr `plusPtr` 8)
-                                      <*> peek (ptr `plusPtr` 16)
-                                      <*> peek (ptr `plusPtr` 24)
-                                      <*> peek (ptr `plusPtr` 32)
-                                      <*> peek (ptr `plusPtr` 36)
-                                      <*> peek (ptr `plusPtr` 40)
-                                      <*> peek (ptr `plusPtr` 44)
-                                      <*> peek (ptr `plusPtr` 52)
-                                      <*> peek (ptr `plusPtr` 56)
-                                      <*> peek (ptr `plusPtr` 60)
-                                      <*> peek (ptr `plusPtr` 64)
-                                      <*> peek (ptr `plusPtr` 72)
-                                      <*> peek (ptr `plusPtr` 80)
-                                      <*> peek (ptr `plusPtr` 84)
-                                      <*> peek (ptr `plusPtr` 88)
-                                      <*> peek (ptr `plusPtr` 92)
-                                      <*> peek (ptr `plusPtr` 96)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 24) (vkSurface (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 32) (vkMinImageCount (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 36) (vkImageFormat (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 40) (vkImageColorSpace (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 44) (vkImageExtent (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 52) (vkImageArrayLayers (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 56) (vkImageUsage (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 60) (vkImageSharingMode (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 64) (vkQueueFamilyIndexCount (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 72) (vkPQueueFamilyIndices (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 80) (vkPreTransform (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 84) (vkCompositeAlpha (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 88) (vkPresentMode (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 92) (vkClipped (poked :: VkSwapchainCreateInfoKHR))
-                *> poke (ptr `plusPtr` 96) (vkOldSwapchain (poked :: VkSwapchainCreateInfoKHR))
-
-
-
-data VkPresentInfoKHR =
-  VkPresentInfoKHR{ vkSType :: VkStructureType 
-                  , vkPNext :: Ptr Void 
-                  , vkWaitSemaphoreCount :: Word32 
-                  , vkPWaitSemaphores :: Ptr VkSemaphore 
-                  , vkSwapchainCount :: Word32 
-                  , vkPSwapchains :: Ptr VkSwapchainKHR 
-                  , vkPImageIndices :: Ptr Word32 
-                  , vkPResults :: Ptr VkResult 
-                  }
-  deriving (Eq)
-
-instance Storable VkPresentInfoKHR where
-  sizeOf ~_ = 64
-  alignment ~_ = 8
-  peek ptr = VkPresentInfoKHR <$> peek (ptr `plusPtr` 0)
-                              <*> peek (ptr `plusPtr` 8)
-                              <*> peek (ptr `plusPtr` 16)
-                              <*> peek (ptr `plusPtr` 24)
-                              <*> peek (ptr `plusPtr` 32)
-                              <*> peek (ptr `plusPtr` 40)
-                              <*> peek (ptr `plusPtr` 48)
-                              <*> peek (ptr `plusPtr` 56)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPresentInfoKHR))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPresentInfoKHR))
-                *> poke (ptr `plusPtr` 16) (vkWaitSemaphoreCount (poked :: VkPresentInfoKHR))
-                *> poke (ptr `plusPtr` 24) (vkPWaitSemaphores (poked :: VkPresentInfoKHR))
-                *> poke (ptr `plusPtr` 32) (vkSwapchainCount (poked :: VkPresentInfoKHR))
-                *> poke (ptr `plusPtr` 40) (vkPSwapchains (poked :: VkPresentInfoKHR))
-                *> poke (ptr `plusPtr` 48) (vkPImageIndices (poked :: VkPresentInfoKHR))
-                *> poke (ptr `plusPtr` 56) (vkPResults (poked :: VkPresentInfoKHR))
-
-
-
-data VkDebugReportCallbackCreateInfoEXT =
-  VkDebugReportCallbackCreateInfoEXT{ vkSType :: VkStructureType 
-                                    , vkPNext :: Ptr Void 
-                                    , vkFlags :: VkDebugReportFlagsEXT 
-                                    , vkPfnCallback :: PFN_vkDebugReportCallbackEXT 
-                                    , vkPUserData :: Ptr Void 
-                                    }
-  deriving (Eq)
-
-instance Storable VkDebugReportCallbackCreateInfoEXT where
-  sizeOf ~_ = 40
-  alignment ~_ = 8
-  peek ptr = VkDebugReportCallbackCreateInfoEXT <$> peek (ptr `plusPtr` 0)
-                                                <*> peek (ptr `plusPtr` 8)
-                                                <*> peek (ptr `plusPtr` 16)
-                                                <*> peek (ptr `plusPtr` 24)
-                                                <*> peek (ptr `plusPtr` 32)
-  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDebugReportCallbackCreateInfoEXT))
-                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDebugReportCallbackCreateInfoEXT))
-                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDebugReportCallbackCreateInfoEXT))
-                *> poke (ptr `plusPtr` 24) (vkPfnCallback (poked :: VkDebugReportCallbackCreateInfoEXT))
-                *> poke (ptr `plusPtr` 32) (vkPUserData (poked :: VkDebugReportCallbackCreateInfoEXT))
-
-
--- * Union Types
-
--- | // Union allowing specification of floating point, integer, or unsigned integer color data. Actual value selected is based on image/attachment being cleared.
-data VkClearColorValue = VkFloat (Vec (ToPeano 4) CFloat) 
-                       | VkInt (Vec (ToPeano 4) Int32) 
-                       | VkUint (Vec (ToPeano 4) Word32) 
-  deriving (Eq)
-
--- | _Note_: peek is undefined as we wouldn't know which constructor to use
-instance Storable VkClearColorValue where
-  sizeOf ~_ = 16
-  alignment ~_ = 4
-  peek ~_ = error "peek@VkClearColorValue"
-  poke ptr poked = case poked of
-                     VkFloat e -> poke (castPtr ptr) e
-                     VkInt e -> poke (castPtr ptr) e
-                     VkUint e -> poke (castPtr ptr) e
-
-
--- | // Union allowing specification of color or depth and stencil values. Actual value selected is based on attachment being cleared.
-data VkClearValue = VkColor VkClearColorValue 
-                  | VkDepthStencil VkClearDepthStencilValue 
-  deriving (Eq)
-
--- | _Note_: peek is undefined as we wouldn't know which constructor to use
-instance Storable VkClearValue where
-  sizeOf ~_ = 16
-  alignment ~_ = 4
-  peek ~_ = error "peek@VkClearValue"
-  poke ptr poked = case poked of
-                     VkColor e -> poke (castPtr ptr) e
-                     VkDepthStencil e -> poke (castPtr ptr) e
-
-
--- * Commands
-
--- ** vkCreateInstance
-foreign import ccall "vkCreateInstance" vkCreateInstance :: 
-  Ptr VkInstanceCreateInfo ->
-  Ptr VkAllocationCallbacks -> Ptr VkInstance -> IO VkResult
-
--- ** vkDestroyInstance
-foreign import ccall "vkDestroyInstance" vkDestroyInstance :: 
-  VkInstance -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkEnumeratePhysicalDevices
-foreign import ccall "vkEnumeratePhysicalDevices" vkEnumeratePhysicalDevices :: 
-  VkInstance -> Ptr Word32 -> Ptr VkPhysicalDevice -> IO VkResult
-
--- ** vkGetDeviceProcAddr
-foreign import ccall "vkGetDeviceProcAddr" vkGetDeviceProcAddr :: 
-  VkDevice -> Ptr CChar -> IO PFN_vkVoidFunction
-
--- ** vkGetInstanceProcAddr
-foreign import ccall "vkGetInstanceProcAddr" vkGetInstanceProcAddr :: 
-  VkInstance -> Ptr CChar -> IO PFN_vkVoidFunction
-
--- ** vkGetPhysicalDeviceProperties
-foreign import ccall "vkGetPhysicalDeviceProperties" vkGetPhysicalDeviceProperties :: 
-  VkPhysicalDevice -> Ptr VkPhysicalDeviceProperties -> IO ()
-
--- ** vkGetPhysicalDeviceQueueFamilyProperties
-foreign import ccall "vkGetPhysicalDeviceQueueFamilyProperties" vkGetPhysicalDeviceQueueFamilyProperties :: 
-  VkPhysicalDevice ->
-  Ptr Word32 -> Ptr VkQueueFamilyProperties -> IO ()
-
--- ** vkGetPhysicalDeviceMemoryProperties
-foreign import ccall "vkGetPhysicalDeviceMemoryProperties" vkGetPhysicalDeviceMemoryProperties :: 
-  VkPhysicalDevice -> Ptr VkPhysicalDeviceMemoryProperties -> IO ()
-
--- ** vkGetPhysicalDeviceFeatures
-foreign import ccall "vkGetPhysicalDeviceFeatures" vkGetPhysicalDeviceFeatures :: 
-  VkPhysicalDevice -> Ptr VkPhysicalDeviceFeatures -> IO ()
-
--- ** vkGetPhysicalDeviceFormatProperties
-foreign import ccall "vkGetPhysicalDeviceFormatProperties" vkGetPhysicalDeviceFormatProperties :: 
-  VkPhysicalDevice -> VkFormat -> Ptr VkFormatProperties -> IO ()
-
--- ** vkGetPhysicalDeviceImageFormatProperties
-foreign import ccall "vkGetPhysicalDeviceImageFormatProperties" vkGetPhysicalDeviceImageFormatProperties :: 
-  VkPhysicalDevice ->
-  VkFormat ->
-    VkImageType ->
-      VkImageTiling ->
-        VkImageUsageFlags ->
-          VkImageCreateFlags -> Ptr VkImageFormatProperties -> IO VkResult
-
--- ** vkCreateDevice
-foreign import ccall "vkCreateDevice" vkCreateDevice :: 
-  VkPhysicalDevice ->
-  Ptr VkDeviceCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkDevice -> IO VkResult
-
--- ** vkDestroyDevice
-foreign import ccall "vkDestroyDevice" vkDestroyDevice :: 
-  VkDevice -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkEnumerateInstanceLayerProperties
-foreign import ccall "vkEnumerateInstanceLayerProperties" vkEnumerateInstanceLayerProperties :: 
-  Ptr Word32 -> Ptr VkLayerProperties -> IO VkResult
-
--- ** vkEnumerateInstanceExtensionProperties
-foreign import ccall "vkEnumerateInstanceExtensionProperties" vkEnumerateInstanceExtensionProperties :: 
-  Ptr CChar -> Ptr Word32 -> Ptr VkExtensionProperties -> IO VkResult
-
--- ** vkEnumerateDeviceLayerProperties
-foreign import ccall "vkEnumerateDeviceLayerProperties" vkEnumerateDeviceLayerProperties :: 
-  VkPhysicalDevice ->
-  Ptr Word32 -> Ptr VkLayerProperties -> IO VkResult
-
--- ** vkEnumerateDeviceExtensionProperties
-foreign import ccall "vkEnumerateDeviceExtensionProperties" vkEnumerateDeviceExtensionProperties :: 
-  VkPhysicalDevice ->
-  Ptr CChar -> Ptr Word32 -> Ptr VkExtensionProperties -> IO VkResult
-
--- ** vkGetDeviceQueue
-foreign import ccall "vkGetDeviceQueue" vkGetDeviceQueue :: 
-  VkDevice -> Word32 -> Word32 -> Ptr VkQueue -> IO ()
-
--- ** vkQueueSubmit
-foreign import ccall "vkQueueSubmit" vkQueueSubmit :: 
-  VkQueue -> Word32 -> Ptr VkSubmitInfo -> VkFence -> IO VkResult
-
--- ** vkQueueWaitIdle
-foreign import ccall "vkQueueWaitIdle" vkQueueWaitIdle :: 
-  VkQueue -> IO VkResult
-
--- ** vkDeviceWaitIdle
-foreign import ccall "vkDeviceWaitIdle" vkDeviceWaitIdle :: 
-  VkDevice -> IO VkResult
-
--- ** vkAllocateMemory
-foreign import ccall "vkAllocateMemory" vkAllocateMemory :: 
-  VkDevice ->
-  Ptr VkMemoryAllocateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkDeviceMemory -> IO VkResult
-
--- ** vkFreeMemory
-foreign import ccall "vkFreeMemory" vkFreeMemory :: 
-  VkDevice -> VkDeviceMemory -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkMapMemory
-foreign import ccall "vkMapMemory" vkMapMemory :: 
-  VkDevice ->
-  VkDeviceMemory ->
-    VkDeviceSize ->
-      VkDeviceSize -> VkMemoryMapFlags -> Ptr (Ptr Void) -> IO VkResult
-
--- ** vkUnmapMemory
-foreign import ccall "vkUnmapMemory" vkUnmapMemory :: 
-  VkDevice -> VkDeviceMemory -> IO ()
-
--- ** vkFlushMappedMemoryRanges
-foreign import ccall "vkFlushMappedMemoryRanges" vkFlushMappedMemoryRanges :: 
-  VkDevice -> Word32 -> Ptr VkMappedMemoryRange -> IO VkResult
-
--- ** vkInvalidateMappedMemoryRanges
-foreign import ccall "vkInvalidateMappedMemoryRanges" vkInvalidateMappedMemoryRanges :: 
-  VkDevice -> Word32 -> Ptr VkMappedMemoryRange -> IO VkResult
-
--- ** vkGetDeviceMemoryCommitment
-foreign import ccall "vkGetDeviceMemoryCommitment" vkGetDeviceMemoryCommitment :: 
-  VkDevice -> VkDeviceMemory -> Ptr VkDeviceSize -> IO ()
-
--- ** vkGetBufferMemoryRequirements
-foreign import ccall "vkGetBufferMemoryRequirements" vkGetBufferMemoryRequirements :: 
-  VkDevice -> VkBuffer -> Ptr VkMemoryRequirements -> IO ()
-
--- ** vkBindBufferMemory
-foreign import ccall "vkBindBufferMemory" vkBindBufferMemory :: 
-  VkDevice ->
-  VkBuffer -> VkDeviceMemory -> VkDeviceSize -> IO VkResult
-
--- ** vkGetImageMemoryRequirements
-foreign import ccall "vkGetImageMemoryRequirements" vkGetImageMemoryRequirements :: 
-  VkDevice -> VkImage -> Ptr VkMemoryRequirements -> IO ()
-
--- ** vkBindImageMemory
-foreign import ccall "vkBindImageMemory" vkBindImageMemory :: 
-  VkDevice ->
-  VkImage -> VkDeviceMemory -> VkDeviceSize -> IO VkResult
-
--- ** vkGetImageSparseMemoryRequirements
-foreign import ccall "vkGetImageSparseMemoryRequirements" vkGetImageSparseMemoryRequirements :: 
-  VkDevice ->
-  VkImage ->
-    Ptr Word32 -> Ptr VkSparseImageMemoryRequirements -> IO ()
-
--- ** vkGetPhysicalDeviceSparseImageFormatProperties
-foreign import ccall "vkGetPhysicalDeviceSparseImageFormatProperties" vkGetPhysicalDeviceSparseImageFormatProperties :: 
-  VkPhysicalDevice ->
-  VkFormat ->
-    VkImageType ->
-      VkSampleCountFlagBits ->
-        VkImageUsageFlags ->
-          VkImageTiling ->
-            Ptr Word32 -> Ptr VkSparseImageFormatProperties -> IO ()
-
--- ** vkQueueBindSparse
-foreign import ccall "vkQueueBindSparse" vkQueueBindSparse :: 
-  VkQueue -> Word32 -> Ptr VkBindSparseInfo -> VkFence -> IO VkResult
-
--- ** vkCreateFence
-foreign import ccall "vkCreateFence" vkCreateFence :: 
-  VkDevice ->
-  Ptr VkFenceCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkFence -> IO VkResult
-
--- ** vkDestroyFence
-foreign import ccall "vkDestroyFence" vkDestroyFence :: 
-  VkDevice -> VkFence -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkResetFences
-foreign import ccall "vkResetFences" vkResetFences :: 
-  VkDevice -> Word32 -> Ptr VkFence -> IO VkResult
-
--- ** vkGetFenceStatus
-foreign import ccall "vkGetFenceStatus" vkGetFenceStatus :: 
-  VkDevice -> VkFence -> IO VkResult
-
--- ** vkWaitForFences
-foreign import ccall "vkWaitForFences" vkWaitForFences :: 
-  VkDevice ->
-  Word32 -> Ptr VkFence -> VkBool32 -> Word64 -> IO VkResult
-
--- ** vkCreateSemaphore
-foreign import ccall "vkCreateSemaphore" vkCreateSemaphore :: 
-  VkDevice ->
-  Ptr VkSemaphoreCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkSemaphore -> IO VkResult
-
--- ** vkDestroySemaphore
-foreign import ccall "vkDestroySemaphore" vkDestroySemaphore :: 
-  VkDevice -> VkSemaphore -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateEvent
-foreign import ccall "vkCreateEvent" vkCreateEvent :: 
-  VkDevice ->
-  Ptr VkEventCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkEvent -> IO VkResult
-
--- ** vkDestroyEvent
-foreign import ccall "vkDestroyEvent" vkDestroyEvent :: 
-  VkDevice -> VkEvent -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkGetEventStatus
-foreign import ccall "vkGetEventStatus" vkGetEventStatus :: 
-  VkDevice -> VkEvent -> IO VkResult
-
--- ** vkSetEvent
-foreign import ccall "vkSetEvent" vkSetEvent :: 
-  VkDevice -> VkEvent -> IO VkResult
-
--- ** vkResetEvent
-foreign import ccall "vkResetEvent" vkResetEvent :: 
-  VkDevice -> VkEvent -> IO VkResult
-
--- ** vkCreateQueryPool
-foreign import ccall "vkCreateQueryPool" vkCreateQueryPool :: 
-  VkDevice ->
-  Ptr VkQueryPoolCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkQueryPool -> IO VkResult
-
--- ** vkDestroyQueryPool
-foreign import ccall "vkDestroyQueryPool" vkDestroyQueryPool :: 
-  VkDevice -> VkQueryPool -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkGetQueryPoolResults
-foreign import ccall "vkGetQueryPoolResults" vkGetQueryPoolResults :: 
-  VkDevice ->
-  VkQueryPool ->
-    Word32 ->
-      Word32 ->
-        CSize ->
-          Ptr Void -> VkDeviceSize -> VkQueryResultFlags -> IO VkResult
-
--- ** vkCreateBuffer
-foreign import ccall "vkCreateBuffer" vkCreateBuffer :: 
-  VkDevice ->
-  Ptr VkBufferCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkBuffer -> IO VkResult
-
--- ** vkDestroyBuffer
-foreign import ccall "vkDestroyBuffer" vkDestroyBuffer :: 
-  VkDevice -> VkBuffer -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateBufferView
-foreign import ccall "vkCreateBufferView" vkCreateBufferView :: 
-  VkDevice ->
-  Ptr VkBufferViewCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkBufferView -> IO VkResult
-
--- ** vkDestroyBufferView
-foreign import ccall "vkDestroyBufferView" vkDestroyBufferView :: 
-  VkDevice -> VkBufferView -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateImage
-foreign import ccall "vkCreateImage" vkCreateImage :: 
-  VkDevice ->
-  Ptr VkImageCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkImage -> IO VkResult
-
--- ** vkDestroyImage
-foreign import ccall "vkDestroyImage" vkDestroyImage :: 
-  VkDevice -> VkImage -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkGetImageSubresourceLayout
-foreign import ccall "vkGetImageSubresourceLayout" vkGetImageSubresourceLayout :: 
-  VkDevice ->
-  VkImage ->
-    Ptr VkImageSubresource -> Ptr VkSubresourceLayout -> IO ()
-
--- ** vkCreateImageView
-foreign import ccall "vkCreateImageView" vkCreateImageView :: 
-  VkDevice ->
-  Ptr VkImageViewCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkImageView -> IO VkResult
-
--- ** vkDestroyImageView
-foreign import ccall "vkDestroyImageView" vkDestroyImageView :: 
-  VkDevice -> VkImageView -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateShaderModule
-foreign import ccall "vkCreateShaderModule" vkCreateShaderModule :: 
-  VkDevice ->
-  Ptr VkShaderModuleCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkShaderModule -> IO VkResult
-
--- ** vkDestroyShaderModule
-foreign import ccall "vkDestroyShaderModule" vkDestroyShaderModule :: 
-  VkDevice -> VkShaderModule -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreatePipelineCache
-foreign import ccall "vkCreatePipelineCache" vkCreatePipelineCache :: 
-  VkDevice ->
-  Ptr VkPipelineCacheCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkPipelineCache -> IO VkResult
-
--- ** vkDestroyPipelineCache
-foreign import ccall "vkDestroyPipelineCache" vkDestroyPipelineCache :: 
-  VkDevice -> VkPipelineCache -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkGetPipelineCacheData
-foreign import ccall "vkGetPipelineCacheData" vkGetPipelineCacheData :: 
-  VkDevice -> VkPipelineCache -> Ptr CSize -> Ptr Void -> IO VkResult
-
--- ** vkMergePipelineCaches
-foreign import ccall "vkMergePipelineCaches" vkMergePipelineCaches :: 
-  VkDevice ->
-  VkPipelineCache -> Word32 -> Ptr VkPipelineCache -> IO VkResult
-
--- ** vkCreateGraphicsPipelines
-foreign import ccall "vkCreateGraphicsPipelines" vkCreateGraphicsPipelines :: 
-  VkDevice ->
-  VkPipelineCache ->
-    Word32 ->
-      Ptr VkGraphicsPipelineCreateInfo ->
-        Ptr VkAllocationCallbacks -> Ptr VkPipeline -> IO VkResult
-
--- ** vkCreateComputePipelines
-foreign import ccall "vkCreateComputePipelines" vkCreateComputePipelines :: 
-  VkDevice ->
-  VkPipelineCache ->
-    Word32 ->
-      Ptr VkComputePipelineCreateInfo ->
-        Ptr VkAllocationCallbacks -> Ptr VkPipeline -> IO VkResult
-
--- ** vkDestroyPipeline
-foreign import ccall "vkDestroyPipeline" vkDestroyPipeline :: 
-  VkDevice -> VkPipeline -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreatePipelineLayout
-foreign import ccall "vkCreatePipelineLayout" vkCreatePipelineLayout :: 
-  VkDevice ->
-  Ptr VkPipelineLayoutCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkPipelineLayout -> IO VkResult
-
--- ** vkDestroyPipelineLayout
-foreign import ccall "vkDestroyPipelineLayout" vkDestroyPipelineLayout :: 
-  VkDevice -> VkPipelineLayout -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateSampler
-foreign import ccall "vkCreateSampler" vkCreateSampler :: 
-  VkDevice ->
-  Ptr VkSamplerCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkSampler -> IO VkResult
-
--- ** vkDestroySampler
-foreign import ccall "vkDestroySampler" vkDestroySampler :: 
-  VkDevice -> VkSampler -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateDescriptorSetLayout
-foreign import ccall "vkCreateDescriptorSetLayout" vkCreateDescriptorSetLayout :: 
-  VkDevice ->
-  Ptr VkDescriptorSetLayoutCreateInfo ->
-    Ptr VkAllocationCallbacks ->
-      Ptr VkDescriptorSetLayout -> IO VkResult
-
--- ** vkDestroyDescriptorSetLayout
-foreign import ccall "vkDestroyDescriptorSetLayout" vkDestroyDescriptorSetLayout :: 
-  VkDevice ->
-  VkDescriptorSetLayout -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateDescriptorPool
-foreign import ccall "vkCreateDescriptorPool" vkCreateDescriptorPool :: 
-  VkDevice ->
-  Ptr VkDescriptorPoolCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkDescriptorPool -> IO VkResult
-
--- ** vkDestroyDescriptorPool
-foreign import ccall "vkDestroyDescriptorPool" vkDestroyDescriptorPool :: 
-  VkDevice -> VkDescriptorPool -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkResetDescriptorPool
-foreign import ccall "vkResetDescriptorPool" vkResetDescriptorPool :: 
-  VkDevice ->
-  VkDescriptorPool -> VkDescriptorPoolResetFlags -> IO VkResult
-
--- ** vkAllocateDescriptorSets
-foreign import ccall "vkAllocateDescriptorSets" vkAllocateDescriptorSets :: 
-  VkDevice ->
-  Ptr VkDescriptorSetAllocateInfo ->
-    Ptr VkDescriptorSet -> IO VkResult
-
--- ** vkFreeDescriptorSets
-foreign import ccall "vkFreeDescriptorSets" vkFreeDescriptorSets :: 
-  VkDevice ->
-  VkDescriptorPool -> Word32 -> Ptr VkDescriptorSet -> IO VkResult
-
--- ** vkUpdateDescriptorSets
-foreign import ccall "vkUpdateDescriptorSets" vkUpdateDescriptorSets :: 
-  VkDevice ->
-  Word32 ->
-    Ptr VkWriteDescriptorSet ->
-      Word32 -> Ptr VkCopyDescriptorSet -> IO ()
-
--- ** vkCreateFramebuffer
-foreign import ccall "vkCreateFramebuffer" vkCreateFramebuffer :: 
-  VkDevice ->
-  Ptr VkFramebufferCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkFramebuffer -> IO VkResult
-
--- ** vkDestroyFramebuffer
-foreign import ccall "vkDestroyFramebuffer" vkDestroyFramebuffer :: 
-  VkDevice -> VkFramebuffer -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkCreateRenderPass
-foreign import ccall "vkCreateRenderPass" vkCreateRenderPass :: 
-  VkDevice ->
-  Ptr VkRenderPassCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkRenderPass -> IO VkResult
-
--- ** vkDestroyRenderPass
-foreign import ccall "vkDestroyRenderPass" vkDestroyRenderPass :: 
-  VkDevice -> VkRenderPass -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkGetRenderAreaGranularity
-foreign import ccall "vkGetRenderAreaGranularity" vkGetRenderAreaGranularity :: 
-  VkDevice -> VkRenderPass -> Ptr VkExtent2D -> IO ()
-
--- ** vkCreateCommandPool
-foreign import ccall "vkCreateCommandPool" vkCreateCommandPool :: 
-  VkDevice ->
-  Ptr VkCommandPoolCreateInfo ->
-    Ptr VkAllocationCallbacks -> Ptr VkCommandPool -> IO VkResult
-
--- ** vkDestroyCommandPool
-foreign import ccall "vkDestroyCommandPool" vkDestroyCommandPool :: 
-  VkDevice -> VkCommandPool -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkResetCommandPool
-foreign import ccall "vkResetCommandPool" vkResetCommandPool :: 
-  VkDevice -> VkCommandPool -> VkCommandPoolResetFlags -> IO VkResult
-
--- ** vkAllocateCommandBuffers
-foreign import ccall "vkAllocateCommandBuffers" vkAllocateCommandBuffers :: 
-  VkDevice ->
-  Ptr VkCommandBufferAllocateInfo ->
-    Ptr VkCommandBuffer -> IO VkResult
-
--- ** vkFreeCommandBuffers
-foreign import ccall "vkFreeCommandBuffers" vkFreeCommandBuffers :: 
-  VkDevice -> VkCommandPool -> Word32 -> Ptr VkCommandBuffer -> IO ()
-
--- ** vkBeginCommandBuffer
-foreign import ccall "vkBeginCommandBuffer" vkBeginCommandBuffer :: 
-  VkCommandBuffer -> Ptr VkCommandBufferBeginInfo -> IO VkResult
-
--- ** vkEndCommandBuffer
-foreign import ccall "vkEndCommandBuffer" vkEndCommandBuffer :: 
-  VkCommandBuffer -> IO VkResult
-
--- ** vkResetCommandBuffer
-foreign import ccall "vkResetCommandBuffer" vkResetCommandBuffer :: 
-  VkCommandBuffer -> VkCommandBufferResetFlags -> IO VkResult
-
--- ** vkCmdBindPipeline
-foreign import ccall "vkCmdBindPipeline" vkCmdBindPipeline :: 
-  VkCommandBuffer -> VkPipelineBindPoint -> VkPipeline -> IO ()
-
--- ** vkCmdSetViewport
-foreign import ccall "vkCmdSetViewport" vkCmdSetViewport :: 
-  VkCommandBuffer -> Word32 -> Word32 -> Ptr VkViewport -> IO ()
-
--- ** vkCmdSetScissor
-foreign import ccall "vkCmdSetScissor" vkCmdSetScissor :: 
-  VkCommandBuffer -> Word32 -> Word32 -> Ptr VkRect2D -> IO ()
-
--- ** vkCmdSetLineWidth
-foreign import ccall "vkCmdSetLineWidth" vkCmdSetLineWidth :: 
-  VkCommandBuffer -> CFloat -> IO ()
-
--- ** vkCmdSetDepthBias
-foreign import ccall "vkCmdSetDepthBias" vkCmdSetDepthBias :: 
-  VkCommandBuffer -> CFloat -> CFloat -> CFloat -> IO ()
-
--- ** vkCmdSetBlendConstants
-foreign import ccall "vkCmdSetBlendConstants" vkCmdSetBlendConstants :: 
-  VkCommandBuffer -> Ptr CFloat -> IO ()
-
--- ** vkCmdSetDepthBounds
-foreign import ccall "vkCmdSetDepthBounds" vkCmdSetDepthBounds :: 
-  VkCommandBuffer -> CFloat -> CFloat -> IO ()
-
--- ** vkCmdSetStencilCompareMask
-foreign import ccall "vkCmdSetStencilCompareMask" vkCmdSetStencilCompareMask :: 
-  VkCommandBuffer -> VkStencilFaceFlags -> Word32 -> IO ()
-
--- ** vkCmdSetStencilWriteMask
-foreign import ccall "vkCmdSetStencilWriteMask" vkCmdSetStencilWriteMask :: 
-  VkCommandBuffer -> VkStencilFaceFlags -> Word32 -> IO ()
-
--- ** vkCmdSetStencilReference
-foreign import ccall "vkCmdSetStencilReference" vkCmdSetStencilReference :: 
-  VkCommandBuffer -> VkStencilFaceFlags -> Word32 -> IO ()
-
--- ** vkCmdBindDescriptorSets
-foreign import ccall "vkCmdBindDescriptorSets" vkCmdBindDescriptorSets :: 
-  VkCommandBuffer ->
-  VkPipelineBindPoint ->
-    VkPipelineLayout ->
-      Word32 ->
-        Word32 -> Ptr VkDescriptorSet -> Word32 -> Ptr Word32 -> IO ()
-
--- ** vkCmdBindIndexBuffer
-foreign import ccall "vkCmdBindIndexBuffer" vkCmdBindIndexBuffer :: 
-  VkCommandBuffer -> VkBuffer -> VkDeviceSize -> VkIndexType -> IO ()
-
--- ** vkCmdBindVertexBuffers
-foreign import ccall "vkCmdBindVertexBuffers" vkCmdBindVertexBuffers :: 
-  VkCommandBuffer ->
-  Word32 -> Word32 -> Ptr VkBuffer -> Ptr VkDeviceSize -> IO ()
-
--- ** vkCmdDraw
-foreign import ccall "vkCmdDraw" vkCmdDraw :: 
-  VkCommandBuffer -> Word32 -> Word32 -> Word32 -> Word32 -> IO ()
-
--- ** vkCmdDrawIndexed
-foreign import ccall "vkCmdDrawIndexed" vkCmdDrawIndexed :: 
-  VkCommandBuffer ->
-  Word32 -> Word32 -> Word32 -> Int32 -> Word32 -> IO ()
-
--- ** vkCmdDrawIndirect
-foreign import ccall "vkCmdDrawIndirect" vkCmdDrawIndirect :: 
-  VkCommandBuffer ->
-  VkBuffer -> VkDeviceSize -> Word32 -> Word32 -> IO ()
-
--- ** vkCmdDrawIndexedIndirect
-foreign import ccall "vkCmdDrawIndexedIndirect" vkCmdDrawIndexedIndirect :: 
-  VkCommandBuffer ->
-  VkBuffer -> VkDeviceSize -> Word32 -> Word32 -> IO ()
-
--- ** vkCmdDispatch
-foreign import ccall "vkCmdDispatch" vkCmdDispatch :: 
-  VkCommandBuffer -> Word32 -> Word32 -> Word32 -> IO ()
-
--- ** vkCmdDispatchIndirect
-foreign import ccall "vkCmdDispatchIndirect" vkCmdDispatchIndirect :: 
-  VkCommandBuffer -> VkBuffer -> VkDeviceSize -> IO ()
-
--- ** vkCmdCopyBuffer
-foreign import ccall "vkCmdCopyBuffer" vkCmdCopyBuffer :: 
-  VkCommandBuffer ->
-  VkBuffer -> VkBuffer -> Word32 -> Ptr VkBufferCopy -> IO ()
-
--- ** vkCmdCopyImage
-foreign import ccall "vkCmdCopyImage" vkCmdCopyImage :: 
-  VkCommandBuffer ->
-  VkImage ->
-    VkImageLayout ->
-      VkImage -> VkImageLayout -> Word32 -> Ptr VkImageCopy -> IO ()
-
--- ** vkCmdBlitImage
-foreign import ccall "vkCmdBlitImage" vkCmdBlitImage :: 
-  VkCommandBuffer ->
-  VkImage ->
-    VkImageLayout ->
-      VkImage ->
-        VkImageLayout -> Word32 -> Ptr VkImageBlit -> VkFilter -> IO ()
-
--- ** vkCmdCopyBufferToImage
-foreign import ccall "vkCmdCopyBufferToImage" vkCmdCopyBufferToImage :: 
-  VkCommandBuffer ->
-  VkBuffer ->
-    VkImage ->
-      VkImageLayout -> Word32 -> Ptr VkBufferImageCopy -> IO ()
-
--- ** vkCmdCopyImageToBuffer
-foreign import ccall "vkCmdCopyImageToBuffer" vkCmdCopyImageToBuffer :: 
-  VkCommandBuffer ->
-  VkImage ->
-    VkImageLayout ->
-      VkBuffer -> Word32 -> Ptr VkBufferImageCopy -> IO ()
-
--- ** vkCmdUpdateBuffer
-foreign import ccall "vkCmdUpdateBuffer" vkCmdUpdateBuffer :: 
-  VkCommandBuffer ->
-  VkBuffer -> VkDeviceSize -> VkDeviceSize -> Ptr Word32 -> IO ()
-
--- ** vkCmdFillBuffer
-foreign import ccall "vkCmdFillBuffer" vkCmdFillBuffer :: 
-  VkCommandBuffer ->
-  VkBuffer -> VkDeviceSize -> VkDeviceSize -> Word32 -> IO ()
-
--- ** vkCmdClearColorImage
-foreign import ccall "vkCmdClearColorImage" vkCmdClearColorImage :: 
-  VkCommandBuffer ->
-  VkImage ->
-    VkImageLayout ->
-      Ptr VkClearColorValue ->
-        Word32 -> Ptr VkImageSubresourceRange -> IO ()
-
--- ** vkCmdClearDepthStencilImage
-foreign import ccall "vkCmdClearDepthStencilImage" vkCmdClearDepthStencilImage :: 
-  VkCommandBuffer ->
-  VkImage ->
-    VkImageLayout ->
-      Ptr VkClearDepthStencilValue ->
-        Word32 -> Ptr VkImageSubresourceRange -> IO ()
-
--- ** vkCmdClearAttachments
-foreign import ccall "vkCmdClearAttachments" vkCmdClearAttachments :: 
-  VkCommandBuffer ->
-  Word32 ->
-    Ptr VkClearAttachment -> Word32 -> Ptr VkClearRect -> IO ()
-
--- ** vkCmdResolveImage
-foreign import ccall "vkCmdResolveImage" vkCmdResolveImage :: 
-  VkCommandBuffer ->
-  VkImage ->
-    VkImageLayout ->
-      VkImage -> VkImageLayout -> Word32 -> Ptr VkImageResolve -> IO ()
-
--- ** vkCmdSetEvent
-foreign import ccall "vkCmdSetEvent" vkCmdSetEvent :: 
-  VkCommandBuffer -> VkEvent -> VkPipelineStageFlags -> IO ()
-
--- ** vkCmdResetEvent
-foreign import ccall "vkCmdResetEvent" vkCmdResetEvent :: 
-  VkCommandBuffer -> VkEvent -> VkPipelineStageFlags -> IO ()
-
--- ** vkCmdWaitEvents
-foreign import ccall "vkCmdWaitEvents" vkCmdWaitEvents :: 
-  VkCommandBuffer ->
-  Word32 ->
-    Ptr VkEvent ->
-      VkPipelineStageFlags ->
-        VkPipelineStageFlags ->
-          Word32 ->
-            Ptr VkMemoryBarrier ->
-              Word32 ->
-                Ptr VkBufferMemoryBarrier ->
-                  Word32 -> Ptr VkImageMemoryBarrier -> IO ()
-
--- ** vkCmdPipelineBarrier
-foreign import ccall "vkCmdPipelineBarrier" vkCmdPipelineBarrier :: 
-  VkCommandBuffer ->
-  VkPipelineStageFlags ->
-    VkPipelineStageFlags ->
-      VkDependencyFlags ->
-        Word32 ->
-          Ptr VkMemoryBarrier ->
-            Word32 ->
-              Ptr VkBufferMemoryBarrier ->
-                Word32 -> Ptr VkImageMemoryBarrier -> IO ()
-
--- ** vkCmdBeginQuery
-foreign import ccall "vkCmdBeginQuery" vkCmdBeginQuery :: 
-  VkCommandBuffer ->
-  VkQueryPool -> Word32 -> VkQueryControlFlags -> IO ()
-
--- ** vkCmdEndQuery
-foreign import ccall "vkCmdEndQuery" vkCmdEndQuery :: 
-  VkCommandBuffer -> VkQueryPool -> Word32 -> IO ()
-
--- ** vkCmdResetQueryPool
-foreign import ccall "vkCmdResetQueryPool" vkCmdResetQueryPool :: 
-  VkCommandBuffer -> VkQueryPool -> Word32 -> Word32 -> IO ()
-
--- ** vkCmdWriteTimestamp
-foreign import ccall "vkCmdWriteTimestamp" vkCmdWriteTimestamp :: 
-  VkCommandBuffer ->
-  VkPipelineStageFlagBits -> VkQueryPool -> Word32 -> IO ()
-
--- ** vkCmdCopyQueryPoolResults
-foreign import ccall "vkCmdCopyQueryPoolResults" vkCmdCopyQueryPoolResults :: 
-  VkCommandBuffer ->
-  VkQueryPool ->
-    Word32 ->
-      Word32 ->
-        VkBuffer ->
-          VkDeviceSize -> VkDeviceSize -> VkQueryResultFlags -> IO ()
-
--- ** vkCmdPushConstants
-foreign import ccall "vkCmdPushConstants" vkCmdPushConstants :: 
-  VkCommandBuffer ->
-  VkPipelineLayout ->
-    VkShaderStageFlags -> Word32 -> Word32 -> Ptr Void -> IO ()
-
--- ** vkCmdBeginRenderPass
-foreign import ccall "vkCmdBeginRenderPass" vkCmdBeginRenderPass :: 
-  VkCommandBuffer ->
-  Ptr VkRenderPassBeginInfo -> VkSubpassContents -> IO ()
-
--- ** vkCmdNextSubpass
-foreign import ccall "vkCmdNextSubpass" vkCmdNextSubpass :: 
-  VkCommandBuffer -> VkSubpassContents -> IO ()
-
--- ** vkCmdEndRenderPass
-foreign import ccall "vkCmdEndRenderPass" vkCmdEndRenderPass :: 
-  VkCommandBuffer -> IO ()
-
--- ** vkCmdExecuteCommands
-foreign import ccall "vkCmdExecuteCommands" vkCmdExecuteCommands :: 
-  VkCommandBuffer -> Word32 -> Ptr VkCommandBuffer -> IO ()
-
--- ** vkGetPhysicalDeviceDisplayPropertiesKHR
-foreign import ccall "vkGetPhysicalDeviceDisplayPropertiesKHR" vkGetPhysicalDeviceDisplayPropertiesKHR :: 
-  VkPhysicalDevice ->
-  Ptr Word32 -> Ptr VkDisplayPropertiesKHR -> IO VkResult
-
--- ** vkGetPhysicalDeviceDisplayPlanePropertiesKHR
-foreign import ccall "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" vkGetPhysicalDeviceDisplayPlanePropertiesKHR :: 
-  VkPhysicalDevice ->
-  Ptr Word32 -> Ptr VkDisplayPlanePropertiesKHR -> IO VkResult
-
--- ** vkGetDisplayPlaneSupportedDisplaysKHR
-foreign import ccall "vkGetDisplayPlaneSupportedDisplaysKHR" vkGetDisplayPlaneSupportedDisplaysKHR :: 
-  VkPhysicalDevice ->
-  Word32 -> Ptr Word32 -> Ptr VkDisplayKHR -> IO VkResult
-
--- ** vkGetDisplayModePropertiesKHR
-foreign import ccall "vkGetDisplayModePropertiesKHR" vkGetDisplayModePropertiesKHR :: 
-  VkPhysicalDevice ->
-  VkDisplayKHR ->
-    Ptr Word32 -> Ptr VkDisplayModePropertiesKHR -> IO VkResult
-
--- ** vkCreateDisplayModeKHR
-foreign import ccall "vkCreateDisplayModeKHR" vkCreateDisplayModeKHR :: 
-  VkPhysicalDevice ->
-  VkDisplayKHR ->
-    Ptr VkDisplayModeCreateInfoKHR ->
-      Ptr VkAllocationCallbacks -> Ptr VkDisplayModeKHR -> IO VkResult
-
--- ** vkGetDisplayPlaneCapabilitiesKHR
-foreign import ccall "vkGetDisplayPlaneCapabilitiesKHR" vkGetDisplayPlaneCapabilitiesKHR :: 
-  VkPhysicalDevice ->
-  VkDisplayModeKHR ->
-    Word32 -> Ptr VkDisplayPlaneCapabilitiesKHR -> IO VkResult
-
--- ** vkCreateDisplayPlaneSurfaceKHR
-foreign import ccall "vkCreateDisplayPlaneSurfaceKHR" vkCreateDisplayPlaneSurfaceKHR :: 
-  VkInstance ->
-  Ptr VkDisplaySurfaceCreateInfoKHR ->
-    Ptr VkAllocationCallbacks -> Ptr VkSurfaceKHR -> IO VkResult
-
--- ** vkCreateSharedSwapchainsKHR
-foreign import ccall "vkCreateSharedSwapchainsKHR" vkCreateSharedSwapchainsKHR :: 
-  VkDevice ->
-  Word32 ->
-    Ptr VkSwapchainCreateInfoKHR ->
-      Ptr VkAllocationCallbacks -> Ptr VkSwapchainKHR -> IO VkResult
-
--- ** vkDestroySurfaceKHR
-foreign import ccall "vkDestroySurfaceKHR" vkDestroySurfaceKHR :: 
-  VkInstance -> VkSurfaceKHR -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkGetPhysicalDeviceSurfaceSupportKHR
-foreign import ccall "vkGetPhysicalDeviceSurfaceSupportKHR" vkGetPhysicalDeviceSurfaceSupportKHR :: 
-  VkPhysicalDevice ->
-  Word32 -> VkSurfaceKHR -> Ptr VkBool32 -> IO VkResult
-
--- ** vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-foreign import ccall "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" vkGetPhysicalDeviceSurfaceCapabilitiesKHR :: 
-  VkPhysicalDevice ->
-  VkSurfaceKHR -> Ptr VkSurfaceCapabilitiesKHR -> IO VkResult
-
--- ** vkGetPhysicalDeviceSurfaceFormatsKHR
-foreign import ccall "vkGetPhysicalDeviceSurfaceFormatsKHR" vkGetPhysicalDeviceSurfaceFormatsKHR :: 
-  VkPhysicalDevice ->
-  VkSurfaceKHR -> Ptr Word32 -> Ptr VkSurfaceFormatKHR -> IO VkResult
-
--- ** vkGetPhysicalDeviceSurfacePresentModesKHR
-foreign import ccall "vkGetPhysicalDeviceSurfacePresentModesKHR" vkGetPhysicalDeviceSurfacePresentModesKHR :: 
-  VkPhysicalDevice ->
-  VkSurfaceKHR -> Ptr Word32 -> Ptr VkPresentModeKHR -> IO VkResult
-
--- ** vkCreateSwapchainKHR
-foreign import ccall "vkCreateSwapchainKHR" vkCreateSwapchainKHR :: 
-  VkDevice ->
-  Ptr VkSwapchainCreateInfoKHR ->
-    Ptr VkAllocationCallbacks -> Ptr VkSwapchainKHR -> IO VkResult
-
--- ** vkDestroySwapchainKHR
-foreign import ccall "vkDestroySwapchainKHR" vkDestroySwapchainKHR :: 
-  VkDevice -> VkSwapchainKHR -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkGetSwapchainImagesKHR
-foreign import ccall "vkGetSwapchainImagesKHR" vkGetSwapchainImagesKHR :: 
-  VkDevice ->
-  VkSwapchainKHR -> Ptr Word32 -> Ptr VkImage -> IO VkResult
-
--- ** vkAcquireNextImageKHR
-foreign import ccall "vkAcquireNextImageKHR" vkAcquireNextImageKHR :: 
-  VkDevice ->
-  VkSwapchainKHR ->
-    Word64 -> VkSemaphore -> VkFence -> Ptr Word32 -> IO VkResult
-
--- ** vkQueuePresentKHR
-foreign import ccall "vkQueuePresentKHR" vkQueuePresentKHR :: 
-  VkQueue -> Ptr VkPresentInfoKHR -> IO VkResult
-
--- ** vkGetPhysicalDeviceWin32PresentationSupportKHR
-foreign import ccall "vkGetPhysicalDeviceWin32PresentationSupportKHR" vkGetPhysicalDeviceWin32PresentationSupportKHR :: 
-  VkPhysicalDevice -> Word32 -> IO VkBool32
-
--- ** vkCreateDebugReportCallbackEXT
-foreign import ccall "vkCreateDebugReportCallbackEXT" vkCreateDebugReportCallbackEXT :: 
-  VkInstance ->
-  Ptr VkDebugReportCallbackCreateInfoEXT ->
-    Ptr VkAllocationCallbacks ->
-      Ptr VkDebugReportCallbackEXT -> IO VkResult
-
--- ** vkDestroyDebugReportCallbackEXT
-foreign import ccall "vkDestroyDebugReportCallbackEXT" vkDestroyDebugReportCallbackEXT :: 
-  VkInstance ->
-  VkDebugReportCallbackEXT -> Ptr VkAllocationCallbacks -> IO ()
-
--- ** vkDebugReportMessageEXT
-foreign import ccall "vkDebugReportMessageEXT" vkDebugReportMessageEXT :: 
-  VkInstance ->
-  VkDebugReportFlagsEXT ->
-    VkDebugReportObjectTypeEXT ->
-      Word64 -> CSize -> Int32 -> Ptr CChar -> Ptr CChar -> IO ()
-
-
+module Graphics.Vulkan
+  ( module Graphics.Vulkan.Buffer
+  , module Graphics.Vulkan.BufferView
+  , module Graphics.Vulkan.CommandBuffer
+  , module Graphics.Vulkan.CommandBufferBuilding
+  , module Graphics.Vulkan.CommandPool
+  , module Graphics.Vulkan.Constants
+  , module Graphics.Vulkan.Core
+  , module Graphics.Vulkan.DescriptorSet
+  , module Graphics.Vulkan.Device
+  , module Graphics.Vulkan.DeviceInitialization
+  , module Graphics.Vulkan.Event
+  , module Graphics.Vulkan.ExtensionDiscovery
+  , module Graphics.Vulkan.Fence
+  , module Graphics.Vulkan.HeaderBoilerplate
+  , module Graphics.Vulkan.Image
+  , module Graphics.Vulkan.ImageView
+  , module Graphics.Vulkan.KHR.Surface
+  , module Graphics.Vulkan.LayerDiscovery
+  , module Graphics.Vulkan.Memory
+  , module Graphics.Vulkan.MemoryManagement
+  , module Graphics.Vulkan.OtherTypes
+  , module Graphics.Vulkan.Pass
+  , module Graphics.Vulkan.Pipeline
+  , module Graphics.Vulkan.PipelineCache
+  , module Graphics.Vulkan.PipelineLayout
+  , module Graphics.Vulkan.Query
+  , module Graphics.Vulkan.Queue
+  , module Graphics.Vulkan.QueueSemaphore
+  , module Graphics.Vulkan.Sampler
+  , module Graphics.Vulkan.Shader
+  , module Graphics.Vulkan.SparseResourceMemoryManagement
+  , module Graphics.Vulkan.Version
+  ) where
+
+import Graphics.Vulkan.Buffer
+import Graphics.Vulkan.BufferView
+import Graphics.Vulkan.CommandBuffer
+import Graphics.Vulkan.CommandBufferBuilding
+import Graphics.Vulkan.CommandPool
+import Graphics.Vulkan.Constants
+import Graphics.Vulkan.Core
+import Graphics.Vulkan.DescriptorSet
+import Graphics.Vulkan.Device
+import Graphics.Vulkan.DeviceInitialization
+import Graphics.Vulkan.Event
+import Graphics.Vulkan.ExtensionDiscovery
+import Graphics.Vulkan.Fence
+import Graphics.Vulkan.HeaderBoilerplate
+import Graphics.Vulkan.Image
+import Graphics.Vulkan.ImageView
+import Graphics.Vulkan.KHR.Surface
+import Graphics.Vulkan.LayerDiscovery
+import Graphics.Vulkan.Memory
+import Graphics.Vulkan.MemoryManagement
+import Graphics.Vulkan.OtherTypes
+import Graphics.Vulkan.Pass
+import Graphics.Vulkan.Pipeline
+import Graphics.Vulkan.PipelineCache
+import Graphics.Vulkan.PipelineLayout
+import Graphics.Vulkan.Query
+import Graphics.Vulkan.Queue
+import Graphics.Vulkan.QueueSemaphore
+import Graphics.Vulkan.Sampler
+import Graphics.Vulkan.Shader
+import Graphics.Vulkan.SparseResourceMemoryManagement
+import Graphics.Vulkan.Version
diff --git a/src/Graphics/Vulkan/Buffer.hs b/src/Graphics/Vulkan/Buffer.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Buffer.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Buffer where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           , VkSharingMode(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+-- ** vkCreateBuffer
+foreign import ccall "vkCreateBuffer" vkCreateBuffer :: 
+  VkDevice ->
+  Ptr VkBufferCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkBuffer -> IO VkResult
+
+-- ** VkBufferCreateFlags
+
+newtype VkBufferCreateFlagBits = VkBufferCreateFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkBufferCreateFlagBits
+type VkBufferCreateFlags = VkBufferCreateFlagBits
+-- | Buffer should support sparse backing
+pattern VK_BUFFER_CREATE_SPARSE_BINDING_BIT = VkBufferCreateFlagBits 0x1
+-- | Buffer should support sparse backing with partial residency
+pattern VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = VkBufferCreateFlagBits 0x2
+-- | Buffer should support constent data access to physical memory blocks mapped into multiple locations of sparse buffers
+pattern VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = VkBufferCreateFlagBits 0x4
+
+
+-- ** VkBufferUsageFlags
+
+newtype VkBufferUsageFlagBits = VkBufferUsageFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkBufferUsageFlagBits
+type VkBufferUsageFlags = VkBufferUsageFlagBits
+-- | Can be used as a source of transfer operations
+pattern VK_BUFFER_USAGE_TRANSFER_SRC_BIT = VkBufferUsageFlagBits 0x1
+-- | Can be used as a destination of transfer operations
+pattern VK_BUFFER_USAGE_TRANSFER_DST_BIT = VkBufferUsageFlagBits 0x2
+-- | Can be used as TBO
+pattern VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = VkBufferUsageFlagBits 0x4
+-- | Can be used as IBO
+pattern VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = VkBufferUsageFlagBits 0x8
+-- | Can be used as UBO
+pattern VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = VkBufferUsageFlagBits 0x10
+-- | Can be used as SSBO
+pattern VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = VkBufferUsageFlagBits 0x20
+-- | Can be used as source of fixed-function index fetch (index buffer)
+pattern VK_BUFFER_USAGE_INDEX_BUFFER_BIT = VkBufferUsageFlagBits 0x40
+-- | Can be used as source of fixed-function vertex fetch (VBO)
+pattern VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = VkBufferUsageFlagBits 0x80
+-- | Can be the source of indirect parameters (e.g. indirect buffer, parameter buffer)
+pattern VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = VkBufferUsageFlagBits 0x100
+
+
+-- ** vkDestroyBuffer
+foreign import ccall "vkDestroyBuffer" vkDestroyBuffer :: 
+  VkDevice -> VkBuffer -> Ptr VkAllocationCallbacks -> IO ()
+
+newtype VkBuffer = VkBuffer Word64
+  deriving (Eq, Storable)
+
+
+data VkBufferCreateInfo =
+  VkBufferCreateInfo{ vkSType :: VkStructureType 
+                    , vkPNext :: Ptr Void 
+                    , vkFlags :: VkBufferCreateFlags 
+                    , vkSize :: VkDeviceSize 
+                    , vkUsage :: VkBufferUsageFlags 
+                    , vkSharingMode :: VkSharingMode 
+                    , vkQueueFamilyIndexCount :: Word32 
+                    , vkPQueueFamilyIndices :: Ptr Word32 
+                    }
+  deriving (Eq)
+
+instance Storable VkBufferCreateInfo where
+  sizeOf ~_ = 56
+  alignment ~_ = 8
+  peek ptr = VkBufferCreateInfo <$> peek (ptr `plusPtr` 0)
+                                <*> peek (ptr `plusPtr` 8)
+                                <*> peek (ptr `plusPtr` 16)
+                                <*> peek (ptr `plusPtr` 24)
+                                <*> peek (ptr `plusPtr` 32)
+                                <*> peek (ptr `plusPtr` 36)
+                                <*> peek (ptr `plusPtr` 40)
+                                <*> peek (ptr `plusPtr` 48)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBufferCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBufferCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkBufferCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkSize (poked :: VkBufferCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkUsage (poked :: VkBufferCreateInfo))
+                *> poke (ptr `plusPtr` 36) (vkSharingMode (poked :: VkBufferCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkQueueFamilyIndexCount (poked :: VkBufferCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkPQueueFamilyIndices (poked :: VkBufferCreateInfo))
+
+
diff --git a/src/Graphics/Vulkan/BufferView.hs b/src/Graphics/Vulkan/BufferView.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/BufferView.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.BufferView where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Graphics.Vulkan.Buffer( VkBuffer(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkFormat(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+-- ** vkCreateBufferView
+foreign import ccall "vkCreateBufferView" vkCreateBufferView :: 
+  VkDevice ->
+  Ptr VkBufferViewCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkBufferView -> IO VkResult
+
+newtype VkBufferView = VkBufferView Word64
+  deriving (Eq, Storable)
+
+
+data VkBufferViewCreateInfo =
+  VkBufferViewCreateInfo{ vkSType :: VkStructureType 
+                        , vkPNext :: Ptr Void 
+                        , vkFlags :: VkBufferViewCreateFlags 
+                        , vkBuffer :: VkBuffer 
+                        , vkFormat :: VkFormat 
+                        , vkOffset :: VkDeviceSize 
+                        , vkRange :: VkDeviceSize 
+                        }
+  deriving (Eq)
+
+instance Storable VkBufferViewCreateInfo where
+  sizeOf ~_ = 56
+  alignment ~_ = 8
+  peek ptr = VkBufferViewCreateInfo <$> peek (ptr `plusPtr` 0)
+                                    <*> peek (ptr `plusPtr` 8)
+                                    <*> peek (ptr `plusPtr` 16)
+                                    <*> peek (ptr `plusPtr` 24)
+                                    <*> peek (ptr `plusPtr` 32)
+                                    <*> peek (ptr `plusPtr` 40)
+                                    <*> peek (ptr `plusPtr` 48)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBufferViewCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBufferViewCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkBufferViewCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkBuffer (poked :: VkBufferViewCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkFormat (poked :: VkBufferViewCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkOffset (poked :: VkBufferViewCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkRange (poked :: VkBufferViewCreateInfo))
+
+
+-- ** VkBufferViewCreateFlags
+-- | Opaque flag
+newtype VkBufferViewCreateFlags = VkBufferViewCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** vkDestroyBufferView
+foreign import ccall "vkDestroyBufferView" vkDestroyBufferView :: 
+  VkDevice -> VkBufferView -> Ptr VkAllocationCallbacks -> IO ()
+
diff --git a/src/Graphics/Vulkan/CommandBuffer.hs b/src/Graphics/Vulkan/CommandBuffer.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/CommandBuffer.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.CommandBuffer where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Graphics.Vulkan.Pass( VkFramebuffer(..)
+                           , VkRenderPass(..)
+                           )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Graphics.Vulkan.CommandPool( VkCommandPool(..)
+                                  )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Query( VkQueryPipelineStatisticFlags(..)
+                            , VkQueryControlFlagBits(..)
+                            , VkQueryControlFlags(..)
+                            , VkQueryPipelineStatisticFlagBits(..)
+                            )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkBool32(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+-- ** VkCommandBufferLevel
+
+newtype VkCommandBufferLevel = VkCommandBufferLevel Int32
+  deriving (Eq, Storable)
+
+pattern VK_COMMAND_BUFFER_LEVEL_PRIMARY = VkCommandBufferLevel 0
+
+pattern VK_COMMAND_BUFFER_LEVEL_SECONDARY = VkCommandBufferLevel 1
+
+-- ** vkAllocateCommandBuffers
+foreign import ccall "vkAllocateCommandBuffers" vkAllocateCommandBuffers :: 
+  VkDevice ->
+  Ptr VkCommandBufferAllocateInfo ->
+    Ptr VkCommandBuffer -> IO VkResult
+
+-- ** vkResetCommandBuffer
+foreign import ccall "vkResetCommandBuffer" vkResetCommandBuffer :: 
+  VkCommandBuffer -> VkCommandBufferResetFlags -> IO VkResult
+
+-- ** vkFreeCommandBuffers
+foreign import ccall "vkFreeCommandBuffers" vkFreeCommandBuffers :: 
+  VkDevice -> VkCommandPool -> Word32 -> Ptr VkCommandBuffer -> IO ()
+
+-- ** VkCommandBufferUsageFlags
+
+newtype VkCommandBufferUsageFlagBits = VkCommandBufferUsageFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkCommandBufferUsageFlagBits
+type VkCommandBufferUsageFlags = VkCommandBufferUsageFlagBits
+
+pattern VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = VkCommandBufferUsageFlagBits 0x1
+
+pattern VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = VkCommandBufferUsageFlagBits 0x2
+-- | Command buffer may be submitted/executed more than once simultaneously
+pattern VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = VkCommandBufferUsageFlagBits 0x4
+
+
+
+data VkCommandBufferBeginInfo =
+  VkCommandBufferBeginInfo{ vkSType :: VkStructureType 
+                          , vkPNext :: Ptr Void 
+                          , vkFlags :: VkCommandBufferUsageFlags 
+                          , vkPInheritanceInfo :: Ptr VkCommandBufferInheritanceInfo 
+                          }
+  deriving (Eq)
+
+instance Storable VkCommandBufferBeginInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkCommandBufferBeginInfo <$> peek (ptr `plusPtr` 0)
+                                      <*> peek (ptr `plusPtr` 8)
+                                      <*> peek (ptr `plusPtr` 16)
+                                      <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandBufferBeginInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandBufferBeginInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkCommandBufferBeginInfo))
+                *> poke (ptr `plusPtr` 24) (vkPInheritanceInfo (poked :: VkCommandBufferBeginInfo))
+
+
+
+data VkCommandBufferInheritanceInfo =
+  VkCommandBufferInheritanceInfo{ vkSType :: VkStructureType 
+                                , vkPNext :: Ptr Void 
+                                , vkRenderPass :: VkRenderPass 
+                                , vkSubpass :: Word32 
+                                , vkFramebuffer :: VkFramebuffer 
+                                , vkOcclusionQueryEnable :: VkBool32 
+                                , vkQueryFlags :: VkQueryControlFlags 
+                                , vkPipelineStatistics :: VkQueryPipelineStatisticFlags 
+                                }
+  deriving (Eq)
+
+instance Storable VkCommandBufferInheritanceInfo where
+  sizeOf ~_ = 56
+  alignment ~_ = 8
+  peek ptr = VkCommandBufferInheritanceInfo <$> peek (ptr `plusPtr` 0)
+                                            <*> peek (ptr `plusPtr` 8)
+                                            <*> peek (ptr `plusPtr` 16)
+                                            <*> peek (ptr `plusPtr` 24)
+                                            <*> peek (ptr `plusPtr` 32)
+                                            <*> peek (ptr `plusPtr` 40)
+                                            <*> peek (ptr `plusPtr` 44)
+                                            <*> peek (ptr `plusPtr` 48)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandBufferInheritanceInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandBufferInheritanceInfo))
+                *> poke (ptr `plusPtr` 16) (vkRenderPass (poked :: VkCommandBufferInheritanceInfo))
+                *> poke (ptr `plusPtr` 24) (vkSubpass (poked :: VkCommandBufferInheritanceInfo))
+                *> poke (ptr `plusPtr` 32) (vkFramebuffer (poked :: VkCommandBufferInheritanceInfo))
+                *> poke (ptr `plusPtr` 40) (vkOcclusionQueryEnable (poked :: VkCommandBufferInheritanceInfo))
+                *> poke (ptr `plusPtr` 44) (vkQueryFlags (poked :: VkCommandBufferInheritanceInfo))
+                *> poke (ptr `plusPtr` 48) (vkPipelineStatistics (poked :: VkCommandBufferInheritanceInfo))
+
+
+data VkCommandBuffer_T
+type VkCommandBuffer = Ptr VkCommandBuffer_T
+
+-- ** VkCommandBufferResetFlags
+
+newtype VkCommandBufferResetFlagBits = VkCommandBufferResetFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkCommandBufferResetFlagBits
+type VkCommandBufferResetFlags = VkCommandBufferResetFlagBits
+-- | Release resources owned by the buffer
+pattern VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = VkCommandBufferResetFlagBits 0x1
+
+
+-- ** vkEndCommandBuffer
+foreign import ccall "vkEndCommandBuffer" vkEndCommandBuffer :: 
+  VkCommandBuffer -> IO VkResult
+
+-- ** vkBeginCommandBuffer
+foreign import ccall "vkBeginCommandBuffer" vkBeginCommandBuffer :: 
+  VkCommandBuffer -> Ptr VkCommandBufferBeginInfo -> IO VkResult
+
+
+data VkCommandBufferAllocateInfo =
+  VkCommandBufferAllocateInfo{ vkSType :: VkStructureType 
+                             , vkPNext :: Ptr Void 
+                             , vkCommandPool :: VkCommandPool 
+                             , vkLevel :: VkCommandBufferLevel 
+                             , vkCommandBufferCount :: Word32 
+                             }
+  deriving (Eq)
+
+instance Storable VkCommandBufferAllocateInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkCommandBufferAllocateInfo <$> peek (ptr `plusPtr` 0)
+                                         <*> peek (ptr `plusPtr` 8)
+                                         <*> peek (ptr `plusPtr` 16)
+                                         <*> peek (ptr `plusPtr` 24)
+                                         <*> peek (ptr `plusPtr` 28)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandBufferAllocateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandBufferAllocateInfo))
+                *> poke (ptr `plusPtr` 16) (vkCommandPool (poked :: VkCommandBufferAllocateInfo))
+                *> poke (ptr `plusPtr` 24) (vkLevel (poked :: VkCommandBufferAllocateInfo))
+                *> poke (ptr `plusPtr` 28) (vkCommandBufferCount (poked :: VkCommandBufferAllocateInfo))
+
+
diff --git a/src/Graphics/Vulkan/CommandBufferBuilding.hs b/src/Graphics/Vulkan/CommandBufferBuilding.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/CommandBufferBuilding.hs
@@ -0,0 +1,611 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.CommandBufferBuilding where
+import Graphics.Vulkan.Buffer( VkBuffer(..)
+                             )
+import Graphics.Vulkan.Pass( VkDependencyFlagBits(..)
+                           , VkFramebuffer(..)
+                           , VkRenderPass(..)
+                           , VkAccessFlags(..)
+                           , VkDependencyFlags(..)
+                           , VkAccessFlagBits(..)
+                           )
+import Graphics.Vulkan.Event( VkEvent(..)
+                            )
+import Graphics.Vulkan.Pipeline( VkPipelineStageFlagBits(..)
+                               , VkPipelineStageFlags(..)
+                               , VkPipeline(..)
+                               , VkPipelineBindPoint(..)
+                               )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , castPtr
+                  , plusPtr
+                  )
+import Graphics.Vulkan.DescriptorSet( VkDescriptorSet(..)
+                                    )
+import Graphics.Vulkan.CommandBuffer( VkCommandBuffer(..)
+                                    )
+import Data.Int( Int32
+               )
+import Data.Vector.Fixed.Cont( ToPeano
+                             )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.PipelineLayout( VkPipelineLayout(..)
+                                     )
+import Graphics.Vulkan.Shader( VkShaderStageFlagBits(..)
+                             , VkShaderStageFlags(..)
+                             )
+import Graphics.Vulkan.Sampler( VkFilter(..)
+                              )
+import Graphics.Vulkan.Image( VkImage(..)
+                            , VkImageLayout(..)
+                            , VkImageAspectFlagBits(..)
+                            , VkImageSubresourceRange(..)
+                            , VkImageAspectFlags(..)
+                            )
+import Graphics.Vulkan.Query( VkQueryResultFlagBits(..)
+                            , VkQueryControlFlagBits(..)
+                            , VkQueryControlFlags(..)
+                            , VkQueryPool(..)
+                            , VkQueryResultFlags(..)
+                            )
+import Data.Vector.Fixed.Storable( Vec
+                                 )
+import Graphics.Vulkan.OtherTypes( VkImageMemoryBarrier(..)
+                                 , VkMemoryBarrier(..)
+                                 , VkBufferMemoryBarrier(..)
+                                 )
+import Graphics.Vulkan.Core( VkExtent3D(..)
+                           , VkDeviceSize(..)
+                           , VkExtent2D(..)
+                           , VkFlags(..)
+                           , VkOffset2D(..)
+                           , VkOffset3D(..)
+                           , VkRect2D(..)
+                           , VkViewport(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CFloat
+                      , CFloat(..)
+                      )
+-- ** vkCmdPushConstants
+foreign import ccall "vkCmdPushConstants" vkCmdPushConstants :: 
+  VkCommandBuffer ->
+  VkPipelineLayout ->
+    VkShaderStageFlags -> Word32 -> Word32 -> Ptr Void -> IO ()
+
+-- ** vkCmdSetStencilWriteMask
+foreign import ccall "vkCmdSetStencilWriteMask" vkCmdSetStencilWriteMask :: 
+  VkCommandBuffer -> VkStencilFaceFlags -> Word32 -> IO ()
+
+-- ** vkCmdBindIndexBuffer
+foreign import ccall "vkCmdBindIndexBuffer" vkCmdBindIndexBuffer :: 
+  VkCommandBuffer -> VkBuffer -> VkDeviceSize -> VkIndexType -> IO ()
+
+-- ** vkCmdResetQueryPool
+foreign import ccall "vkCmdResetQueryPool" vkCmdResetQueryPool :: 
+  VkCommandBuffer -> VkQueryPool -> Word32 -> Word32 -> IO ()
+
+-- ** vkCmdResolveImage
+foreign import ccall "vkCmdResolveImage" vkCmdResolveImage :: 
+  VkCommandBuffer ->
+  VkImage ->
+    VkImageLayout ->
+      VkImage -> VkImageLayout -> Word32 -> Ptr VkImageResolve -> IO ()
+
+-- ** vkCmdBindPipeline
+foreign import ccall "vkCmdBindPipeline" vkCmdBindPipeline :: 
+  VkCommandBuffer -> VkPipelineBindPoint -> VkPipeline -> IO ()
+
+-- ** vkCmdBindVertexBuffers
+foreign import ccall "vkCmdBindVertexBuffers" vkCmdBindVertexBuffers :: 
+  VkCommandBuffer ->
+  Word32 -> Word32 -> Ptr VkBuffer -> Ptr VkDeviceSize -> IO ()
+
+-- ** vkCmdDraw
+foreign import ccall "vkCmdDraw" vkCmdDraw :: 
+  VkCommandBuffer -> Word32 -> Word32 -> Word32 -> Word32 -> IO ()
+
+
+data VkImageCopy =
+  VkImageCopy{ vkSrcSubresource :: VkImageSubresourceLayers 
+             , vkSrcOffset :: VkOffset3D 
+             , vkDstSubresource :: VkImageSubresourceLayers 
+             , vkDstOffset :: VkOffset3D 
+             , vkExtent :: VkExtent3D 
+             }
+  deriving (Eq)
+
+instance Storable VkImageCopy where
+  sizeOf ~_ = 68
+  alignment ~_ = 4
+  peek ptr = VkImageCopy <$> peek (ptr `plusPtr` 0)
+                         <*> peek (ptr `plusPtr` 16)
+                         <*> peek (ptr `plusPtr` 28)
+                         <*> peek (ptr `plusPtr` 44)
+                         <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubresource (poked :: VkImageCopy))
+                *> poke (ptr `plusPtr` 16) (vkSrcOffset (poked :: VkImageCopy))
+                *> poke (ptr `plusPtr` 28) (vkDstSubresource (poked :: VkImageCopy))
+                *> poke (ptr `plusPtr` 44) (vkDstOffset (poked :: VkImageCopy))
+                *> poke (ptr `plusPtr` 56) (vkExtent (poked :: VkImageCopy))
+
+
+-- ** vkCmdNextSubpass
+foreign import ccall "vkCmdNextSubpass" vkCmdNextSubpass :: 
+  VkCommandBuffer -> VkSubpassContents -> IO ()
+
+-- ** vkCmdEndQuery
+foreign import ccall "vkCmdEndQuery" vkCmdEndQuery :: 
+  VkCommandBuffer -> VkQueryPool -> Word32 -> IO ()
+
+-- ** vkCmdSetScissor
+foreign import ccall "vkCmdSetScissor" vkCmdSetScissor :: 
+  VkCommandBuffer -> Word32 -> Word32 -> Ptr VkRect2D -> IO ()
+
+-- ** vkCmdSetEvent
+foreign import ccall "vkCmdSetEvent" vkCmdSetEvent :: 
+  VkCommandBuffer -> VkEvent -> VkPipelineStageFlags -> IO ()
+
+-- ** vkCmdCopyImageToBuffer
+foreign import ccall "vkCmdCopyImageToBuffer" vkCmdCopyImageToBuffer :: 
+  VkCommandBuffer ->
+  VkImage ->
+    VkImageLayout ->
+      VkBuffer -> Word32 -> Ptr VkBufferImageCopy -> IO ()
+
+-- ** vkCmdDispatchIndirect
+foreign import ccall "vkCmdDispatchIndirect" vkCmdDispatchIndirect :: 
+  VkCommandBuffer -> VkBuffer -> VkDeviceSize -> IO ()
+
+-- ** vkCmdBeginQuery
+foreign import ccall "vkCmdBeginQuery" vkCmdBeginQuery :: 
+  VkCommandBuffer ->
+  VkQueryPool -> Word32 -> VkQueryControlFlags -> IO ()
+
+-- ** vkCmdEndRenderPass
+foreign import ccall "vkCmdEndRenderPass" vkCmdEndRenderPass :: 
+  VkCommandBuffer -> IO ()
+
+-- ** vkCmdFillBuffer
+foreign import ccall "vkCmdFillBuffer" vkCmdFillBuffer :: 
+  VkCommandBuffer ->
+  VkBuffer -> VkDeviceSize -> VkDeviceSize -> Word32 -> IO ()
+
+
+data VkClearRect =
+  VkClearRect{ vkRect :: VkRect2D 
+             , vkBaseArrayLayer :: Word32 
+             , vkLayerCount :: Word32 
+             }
+  deriving (Eq)
+
+instance Storable VkClearRect where
+  sizeOf ~_ = 24
+  alignment ~_ = 4
+  peek ptr = VkClearRect <$> peek (ptr `plusPtr` 0)
+                         <*> peek (ptr `plusPtr` 16)
+                         <*> peek (ptr `plusPtr` 20)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkRect (poked :: VkClearRect))
+                *> poke (ptr `plusPtr` 16) (vkBaseArrayLayer (poked :: VkClearRect))
+                *> poke (ptr `plusPtr` 20) (vkLayerCount (poked :: VkClearRect))
+
+
+-- ** vkCmdWaitEvents
+foreign import ccall "vkCmdWaitEvents" vkCmdWaitEvents :: 
+  VkCommandBuffer ->
+  Word32 ->
+    Ptr VkEvent ->
+      VkPipelineStageFlags ->
+        VkPipelineStageFlags ->
+          Word32 ->
+            Ptr VkMemoryBarrier ->
+              Word32 ->
+                Ptr VkBufferMemoryBarrier ->
+                  Word32 -> Ptr VkImageMemoryBarrier -> IO ()
+
+-- ** vkCmdClearColorImage
+foreign import ccall "vkCmdClearColorImage" vkCmdClearColorImage :: 
+  VkCommandBuffer ->
+  VkImage ->
+    VkImageLayout ->
+      Ptr VkClearColorValue ->
+        Word32 -> Ptr VkImageSubresourceRange -> IO ()
+
+-- ** VkIndexType
+
+newtype VkIndexType = VkIndexType Int32
+  deriving (Eq, Storable)
+
+pattern VK_INDEX_TYPE_UINT16 = VkIndexType 0
+
+pattern VK_INDEX_TYPE_UINT32 = VkIndexType 1
+
+
+data VkBufferImageCopy =
+  VkBufferImageCopy{ vkBufferOffset :: VkDeviceSize 
+                   , vkBufferRowLength :: Word32 
+                   , vkBufferImageHeight :: Word32 
+                   , vkImageSubresource :: VkImageSubresourceLayers 
+                   , vkImageOffset :: VkOffset3D 
+                   , vkImageExtent :: VkExtent3D 
+                   }
+  deriving (Eq)
+
+instance Storable VkBufferImageCopy where
+  sizeOf ~_ = 56
+  alignment ~_ = 8
+  peek ptr = VkBufferImageCopy <$> peek (ptr `plusPtr` 0)
+                               <*> peek (ptr `plusPtr` 8)
+                               <*> peek (ptr `plusPtr` 12)
+                               <*> peek (ptr `plusPtr` 16)
+                               <*> peek (ptr `plusPtr` 32)
+                               <*> peek (ptr `plusPtr` 44)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkBufferOffset (poked :: VkBufferImageCopy))
+                *> poke (ptr `plusPtr` 8) (vkBufferRowLength (poked :: VkBufferImageCopy))
+                *> poke (ptr `plusPtr` 12) (vkBufferImageHeight (poked :: VkBufferImageCopy))
+                *> poke (ptr `plusPtr` 16) (vkImageSubresource (poked :: VkBufferImageCopy))
+                *> poke (ptr `plusPtr` 32) (vkImageOffset (poked :: VkBufferImageCopy))
+                *> poke (ptr `plusPtr` 44) (vkImageExtent (poked :: VkBufferImageCopy))
+
+
+-- ** vkCmdSetDepthBounds
+foreign import ccall "vkCmdSetDepthBounds" vkCmdSetDepthBounds :: 
+  VkCommandBuffer -> CFloat -> CFloat -> IO ()
+
+-- ** vkCmdCopyBufferToImage
+foreign import ccall "vkCmdCopyBufferToImage" vkCmdCopyBufferToImage :: 
+  VkCommandBuffer ->
+  VkBuffer ->
+    VkImage ->
+      VkImageLayout -> Word32 -> Ptr VkBufferImageCopy -> IO ()
+
+-- ** vkCmdDrawIndexedIndirect
+foreign import ccall "vkCmdDrawIndexedIndirect" vkCmdDrawIndexedIndirect :: 
+  VkCommandBuffer ->
+  VkBuffer -> VkDeviceSize -> Word32 -> Word32 -> IO ()
+
+-- ** vkCmdUpdateBuffer
+foreign import ccall "vkCmdUpdateBuffer" vkCmdUpdateBuffer :: 
+  VkCommandBuffer ->
+  VkBuffer -> VkDeviceSize -> VkDeviceSize -> Ptr Word32 -> IO ()
+
+-- ** vkCmdCopyImage
+foreign import ccall "vkCmdCopyImage" vkCmdCopyImage :: 
+  VkCommandBuffer ->
+  VkImage ->
+    VkImageLayout ->
+      VkImage -> VkImageLayout -> Word32 -> Ptr VkImageCopy -> IO ()
+
+-- ** vkCmdWriteTimestamp
+foreign import ccall "vkCmdWriteTimestamp" vkCmdWriteTimestamp :: 
+  VkCommandBuffer ->
+  VkPipelineStageFlagBits -> VkQueryPool -> Word32 -> IO ()
+
+
+data VkImageSubresourceLayers =
+  VkImageSubresourceLayers{ vkAspectMask :: VkImageAspectFlags 
+                          , vkMipLevel :: Word32 
+                          , vkBaseArrayLayer :: Word32 
+                          , vkLayerCount :: Word32 
+                          }
+  deriving (Eq)
+
+instance Storable VkImageSubresourceLayers where
+  sizeOf ~_ = 16
+  alignment ~_ = 4
+  peek ptr = VkImageSubresourceLayers <$> peek (ptr `plusPtr` 0)
+                                      <*> peek (ptr `plusPtr` 4)
+                                      <*> peek (ptr `plusPtr` 8)
+                                      <*> peek (ptr `plusPtr` 12)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkImageSubresourceLayers))
+                *> poke (ptr `plusPtr` 4) (vkMipLevel (poked :: VkImageSubresourceLayers))
+                *> poke (ptr `plusPtr` 8) (vkBaseArrayLayer (poked :: VkImageSubresourceLayers))
+                *> poke (ptr `plusPtr` 12) (vkLayerCount (poked :: VkImageSubresourceLayers))
+
+
+-- ** vkCmdDrawIndexed
+foreign import ccall "vkCmdDrawIndexed" vkCmdDrawIndexed :: 
+  VkCommandBuffer ->
+  Word32 -> Word32 -> Word32 -> Int32 -> Word32 -> IO ()
+
+-- ** vkCmdSetDepthBias
+foreign import ccall "vkCmdSetDepthBias" vkCmdSetDepthBias :: 
+  VkCommandBuffer -> CFloat -> CFloat -> CFloat -> IO ()
+
+-- ** vkCmdDrawIndirect
+foreign import ccall "vkCmdDrawIndirect" vkCmdDrawIndirect :: 
+  VkCommandBuffer ->
+  VkBuffer -> VkDeviceSize -> Word32 -> Word32 -> IO ()
+
+
+data VkClearDepthStencilValue =
+  VkClearDepthStencilValue{ vkDepth :: CFloat 
+                          , vkStencil :: Word32 
+                          }
+  deriving (Eq)
+
+instance Storable VkClearDepthStencilValue where
+  sizeOf ~_ = 8
+  alignment ~_ = 4
+  peek ptr = VkClearDepthStencilValue <$> peek (ptr `plusPtr` 0)
+                                      <*> peek (ptr `plusPtr` 4)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkDepth (poked :: VkClearDepthStencilValue))
+                *> poke (ptr `plusPtr` 4) (vkStencil (poked :: VkClearDepthStencilValue))
+
+
+
+data VkBufferCopy =
+  VkBufferCopy{ vkSrcOffset :: VkDeviceSize 
+              , vkDstOffset :: VkDeviceSize 
+              , vkSize :: VkDeviceSize 
+              }
+  deriving (Eq)
+
+instance Storable VkBufferCopy where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkBufferCopy <$> peek (ptr `plusPtr` 0)
+                          <*> peek (ptr `plusPtr` 8)
+                          <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcOffset (poked :: VkBufferCopy))
+                *> poke (ptr `plusPtr` 8) (vkDstOffset (poked :: VkBufferCopy))
+                *> poke (ptr `plusPtr` 16) (vkSize (poked :: VkBufferCopy))
+
+
+-- ** vkCmdClearAttachments
+foreign import ccall "vkCmdClearAttachments" vkCmdClearAttachments :: 
+  VkCommandBuffer ->
+  Word32 ->
+    Ptr VkClearAttachment -> Word32 -> Ptr VkClearRect -> IO ()
+
+-- ** vkCmdSetViewport
+foreign import ccall "vkCmdSetViewport" vkCmdSetViewport :: 
+  VkCommandBuffer -> Word32 -> Word32 -> Ptr VkViewport -> IO ()
+
+-- ** vkCmdCopyBuffer
+foreign import ccall "vkCmdCopyBuffer" vkCmdCopyBuffer :: 
+  VkCommandBuffer ->
+  VkBuffer -> VkBuffer -> Word32 -> Ptr VkBufferCopy -> IO ()
+
+-- ** vkCmdBindDescriptorSets
+foreign import ccall "vkCmdBindDescriptorSets" vkCmdBindDescriptorSets :: 
+  VkCommandBuffer ->
+  VkPipelineBindPoint ->
+    VkPipelineLayout ->
+      Word32 ->
+        Word32 -> Ptr VkDescriptorSet -> Word32 -> Ptr Word32 -> IO ()
+
+-- ** vkCmdSetLineWidth
+foreign import ccall "vkCmdSetLineWidth" vkCmdSetLineWidth :: 
+  VkCommandBuffer -> CFloat -> IO ()
+
+-- ** vkCmdExecuteCommands
+foreign import ccall "vkCmdExecuteCommands" vkCmdExecuteCommands :: 
+  VkCommandBuffer -> Word32 -> Ptr VkCommandBuffer -> IO ()
+
+
+data VkRenderPassBeginInfo =
+  VkRenderPassBeginInfo{ vkSType :: VkStructureType 
+                       , vkPNext :: Ptr Void 
+                       , vkRenderPass :: VkRenderPass 
+                       , vkFramebuffer :: VkFramebuffer 
+                       , vkRenderArea :: VkRect2D 
+                       , vkClearValueCount :: Word32 
+                       , vkPClearValues :: Ptr VkClearValue 
+                       }
+  deriving (Eq)
+
+instance Storable VkRenderPassBeginInfo where
+  sizeOf ~_ = 64
+  alignment ~_ = 8
+  peek ptr = VkRenderPassBeginInfo <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 16)
+                                   <*> peek (ptr `plusPtr` 24)
+                                   <*> peek (ptr `plusPtr` 32)
+                                   <*> peek (ptr `plusPtr` 48)
+                                   <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkRenderPassBeginInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkRenderPassBeginInfo))
+                *> poke (ptr `plusPtr` 16) (vkRenderPass (poked :: VkRenderPassBeginInfo))
+                *> poke (ptr `plusPtr` 24) (vkFramebuffer (poked :: VkRenderPassBeginInfo))
+                *> poke (ptr `plusPtr` 32) (vkRenderArea (poked :: VkRenderPassBeginInfo))
+                *> poke (ptr `plusPtr` 48) (vkClearValueCount (poked :: VkRenderPassBeginInfo))
+                *> poke (ptr `plusPtr` 56) (vkPClearValues (poked :: VkRenderPassBeginInfo))
+
+
+-- ** vkCmdSetStencilCompareMask
+foreign import ccall "vkCmdSetStencilCompareMask" vkCmdSetStencilCompareMask :: 
+  VkCommandBuffer -> VkStencilFaceFlags -> Word32 -> IO ()
+
+
+data VkImageBlit =
+  VkImageBlit{ vkSrcSubresource :: VkImageSubresourceLayers 
+             , vkSrcOffsets :: Vec (ToPeano 2) VkOffset3D 
+             , vkDstSubresource :: VkImageSubresourceLayers 
+             , vkDstOffsets :: Vec (ToPeano 2) VkOffset3D 
+             }
+  deriving (Eq)
+
+instance Storable VkImageBlit where
+  sizeOf ~_ = 80
+  alignment ~_ = 4
+  peek ptr = VkImageBlit <$> peek (ptr `plusPtr` 0)
+                         <*> peek (ptr `plusPtr` 16)
+                         <*> peek (ptr `plusPtr` 40)
+                         <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubresource (poked :: VkImageBlit))
+                *> poke (ptr `plusPtr` 16) (vkSrcOffsets (poked :: VkImageBlit))
+                *> poke (ptr `plusPtr` 40) (vkDstSubresource (poked :: VkImageBlit))
+                *> poke (ptr `plusPtr` 56) (vkDstOffsets (poked :: VkImageBlit))
+
+
+
+data VkClearAttachment =
+  VkClearAttachment{ vkAspectMask :: VkImageAspectFlags 
+                   , vkColorAttachment :: Word32 
+                   , vkClearValue :: VkClearValue 
+                   }
+  deriving (Eq)
+
+instance Storable VkClearAttachment where
+  sizeOf ~_ = 24
+  alignment ~_ = 4
+  peek ptr = VkClearAttachment <$> peek (ptr `plusPtr` 0)
+                               <*> peek (ptr `plusPtr` 4)
+                               <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkClearAttachment))
+                *> poke (ptr `plusPtr` 4) (vkColorAttachment (poked :: VkClearAttachment))
+                *> poke (ptr `plusPtr` 8) (vkClearValue (poked :: VkClearAttachment))
+
+
+-- | // Union allowing specification of color or depth and stencil values. Actual value selected is based on attachment being cleared.
+data VkClearValue = VkColor VkClearColorValue 
+                  | VkDepthStencil VkClearDepthStencilValue 
+  deriving (Eq)
+
+-- | _Note_: peek is undefined as we wouldn't know which constructor to use
+instance Storable VkClearValue where
+  sizeOf ~_ = 16
+  alignment ~_ = 4
+  peek ~_ = error "peek@VkClearValue"
+  poke ptr poked = case poked of
+                     VkColor e -> poke (castPtr ptr) e
+                     VkDepthStencil e -> poke (castPtr ptr) e
+
+
+-- ** VkStencilFaceFlags
+
+newtype VkStencilFaceFlagBits = VkStencilFaceFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkStencilFaceFlagBits
+type VkStencilFaceFlags = VkStencilFaceFlagBits
+-- | Front face
+pattern VK_STENCIL_FACE_FRONT_BIT = VkStencilFaceFlagBits 0x1
+-- | Back face
+pattern VK_STENCIL_FACE_BACK_BIT = VkStencilFaceFlagBits 0x2
+-- | Front and back faces
+pattern VK_STENCIL_FRONT_AND_BACK = VkStencilFaceFlagBits 0x3
+
+-- | // Union allowing specification of floating point, integer, or unsigned integer color data. Actual value selected is based on image/attachment being cleared.
+data VkClearColorValue = VkFloat (Vec (ToPeano 4) CFloat) 
+                       | VkInt (Vec (ToPeano 4) Int32) 
+                       | VkUint (Vec (ToPeano 4) Word32) 
+  deriving (Eq)
+
+-- | _Note_: peek is undefined as we wouldn't know which constructor to use
+instance Storable VkClearColorValue where
+  sizeOf ~_ = 16
+  alignment ~_ = 4
+  peek ~_ = error "peek@VkClearColorValue"
+  poke ptr poked = case poked of
+                     VkFloat e -> poke (castPtr ptr) e
+                     VkInt e -> poke (castPtr ptr) e
+                     VkUint e -> poke (castPtr ptr) e
+
+
+-- ** VkSubpassContents
+
+newtype VkSubpassContents = VkSubpassContents Int32
+  deriving (Eq, Storable)
+
+pattern VK_SUBPASS_CONTENTS_INLINE = VkSubpassContents 0
+
+pattern VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = VkSubpassContents 1
+
+-- ** vkCmdCopyQueryPoolResults
+foreign import ccall "vkCmdCopyQueryPoolResults" vkCmdCopyQueryPoolResults :: 
+  VkCommandBuffer ->
+  VkQueryPool ->
+    Word32 ->
+      Word32 ->
+        VkBuffer ->
+          VkDeviceSize -> VkDeviceSize -> VkQueryResultFlags -> IO ()
+
+-- ** vkCmdBlitImage
+foreign import ccall "vkCmdBlitImage" vkCmdBlitImage :: 
+  VkCommandBuffer ->
+  VkImage ->
+    VkImageLayout ->
+      VkImage ->
+        VkImageLayout -> Word32 -> Ptr VkImageBlit -> VkFilter -> IO ()
+
+-- ** vkCmdSetBlendConstants
+foreign import ccall "vkCmdSetBlendConstants" vkCmdSetBlendConstants :: 
+  VkCommandBuffer -> Ptr CFloat -> IO ()
+
+-- ** vkCmdClearDepthStencilImage
+foreign import ccall "vkCmdClearDepthStencilImage" vkCmdClearDepthStencilImage :: 
+  VkCommandBuffer ->
+  VkImage ->
+    VkImageLayout ->
+      Ptr VkClearDepthStencilValue ->
+        Word32 -> Ptr VkImageSubresourceRange -> IO ()
+
+
+data VkImageResolve =
+  VkImageResolve{ vkSrcSubresource :: VkImageSubresourceLayers 
+                , vkSrcOffset :: VkOffset3D 
+                , vkDstSubresource :: VkImageSubresourceLayers 
+                , vkDstOffset :: VkOffset3D 
+                , vkExtent :: VkExtent3D 
+                }
+  deriving (Eq)
+
+instance Storable VkImageResolve where
+  sizeOf ~_ = 68
+  alignment ~_ = 4
+  peek ptr = VkImageResolve <$> peek (ptr `plusPtr` 0)
+                            <*> peek (ptr `plusPtr` 16)
+                            <*> peek (ptr `plusPtr` 28)
+                            <*> peek (ptr `plusPtr` 44)
+                            <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubresource (poked :: VkImageResolve))
+                *> poke (ptr `plusPtr` 16) (vkSrcOffset (poked :: VkImageResolve))
+                *> poke (ptr `plusPtr` 28) (vkDstSubresource (poked :: VkImageResolve))
+                *> poke (ptr `plusPtr` 44) (vkDstOffset (poked :: VkImageResolve))
+                *> poke (ptr `plusPtr` 56) (vkExtent (poked :: VkImageResolve))
+
+
+-- ** vkCmdDispatch
+foreign import ccall "vkCmdDispatch" vkCmdDispatch :: 
+  VkCommandBuffer -> Word32 -> Word32 -> Word32 -> IO ()
+
+-- ** vkCmdSetStencilReference
+foreign import ccall "vkCmdSetStencilReference" vkCmdSetStencilReference :: 
+  VkCommandBuffer -> VkStencilFaceFlags -> Word32 -> IO ()
+
+-- ** vkCmdPipelineBarrier
+foreign import ccall "vkCmdPipelineBarrier" vkCmdPipelineBarrier :: 
+  VkCommandBuffer ->
+  VkPipelineStageFlags ->
+    VkPipelineStageFlags ->
+      VkDependencyFlags ->
+        Word32 ->
+          Ptr VkMemoryBarrier ->
+            Word32 ->
+              Ptr VkBufferMemoryBarrier ->
+                Word32 -> Ptr VkImageMemoryBarrier -> IO ()
+
+-- ** vkCmdBeginRenderPass
+foreign import ccall "vkCmdBeginRenderPass" vkCmdBeginRenderPass :: 
+  VkCommandBuffer ->
+  Ptr VkRenderPassBeginInfo -> VkSubpassContents -> IO ()
+
+-- ** vkCmdResetEvent
+foreign import ccall "vkCmdResetEvent" vkCmdResetEvent :: 
+  VkCommandBuffer -> VkEvent -> VkPipelineStageFlags -> IO ()
+
diff --git a/src/Graphics/Vulkan/CommandPool.hs b/src/Graphics/Vulkan/CommandPool.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/CommandPool.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.CommandPool where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+
+data VkCommandPoolCreateInfo =
+  VkCommandPoolCreateInfo{ vkSType :: VkStructureType 
+                         , vkPNext :: Ptr Void 
+                         , vkFlags :: VkCommandPoolCreateFlags 
+                         , vkQueueFamilyIndex :: Word32 
+                         }
+  deriving (Eq)
+
+instance Storable VkCommandPoolCreateInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkCommandPoolCreateInfo <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 8)
+                                     <*> peek (ptr `plusPtr` 16)
+                                     <*> peek (ptr `plusPtr` 20)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCommandPoolCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCommandPoolCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkCommandPoolCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkQueueFamilyIndex (poked :: VkCommandPoolCreateInfo))
+
+
+-- ** vkDestroyCommandPool
+foreign import ccall "vkDestroyCommandPool" vkDestroyCommandPool :: 
+  VkDevice -> VkCommandPool -> Ptr VkAllocationCallbacks -> IO ()
+
+-- ** vkResetCommandPool
+foreign import ccall "vkResetCommandPool" vkResetCommandPool :: 
+  VkDevice -> VkCommandPool -> VkCommandPoolResetFlags -> IO VkResult
+
+-- ** VkCommandPoolCreateFlags
+
+newtype VkCommandPoolCreateFlagBits = VkCommandPoolCreateFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkCommandPoolCreateFlagBits
+type VkCommandPoolCreateFlags = VkCommandPoolCreateFlagBits
+-- | Command buffers have a short lifetime
+pattern VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = VkCommandPoolCreateFlagBits 0x1
+-- | Command buffers may release their memory individually
+pattern VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = VkCommandPoolCreateFlagBits 0x2
+
+
+-- ** vkCreateCommandPool
+foreign import ccall "vkCreateCommandPool" vkCreateCommandPool :: 
+  VkDevice ->
+  Ptr VkCommandPoolCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkCommandPool -> IO VkResult
+
+-- ** VkCommandPoolResetFlags
+
+newtype VkCommandPoolResetFlagBits = VkCommandPoolResetFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkCommandPoolResetFlagBits
+type VkCommandPoolResetFlags = VkCommandPoolResetFlagBits
+-- | Release resources owned by the pool
+pattern VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = VkCommandPoolResetFlagBits 0x1
+
+
+newtype VkCommandPool = VkCommandPool Word64
+  deriving (Eq, Storable)
+
diff --git a/src/Graphics/Vulkan/Constants.hs b/src/Graphics/Vulkan/Constants.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Constants.hs
@@ -0,0 +1,56 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Constants where
+import Data.Word( Word64
+                , Word32
+                )
+import Data.Int( Int32
+               )
+import Foreign.Storable( Storable(..)
+                       )
+
+pattern VK_SUBPASS_EXTERNAL = 0xffffffff :: Word32
+
+pattern VK_UUID_SIZE = 16
+type VK_UUID_SIZE = 16
+
+pattern VK_REMAINING_MIP_LEVELS = 0xffffffff :: Word32
+
+pattern VK_LOD_CLAMP_NONE = 1000.0
+
+pattern VK_MAX_PHYSICAL_DEVICE_NAME_SIZE = 256
+type VK_MAX_PHYSICAL_DEVICE_NAME_SIZE = 256
+
+pattern VK_ATTACHMENT_UNUSED = 0xffffffff :: Word32
+
+pattern VK_MAX_MEMORY_TYPES = 32
+type VK_MAX_MEMORY_TYPES = 32
+
+pattern VK_WHOLE_SIZE = 0xffffffffffffffff :: Word64
+
+pattern VK_REMAINING_ARRAY_LAYERS = 0xffffffff :: Word32
+
+pattern VK_QUEUE_FAMILY_IGNORED = 0xffffffff :: Word32
+
+pattern VK_MAX_MEMORY_HEAPS = 16
+type VK_MAX_MEMORY_HEAPS = 16
+
+pattern VK_FALSE = 0
+type VK_FALSE = 0
+-- ** VkPipelineCacheHeaderVersion
+
+newtype VkPipelineCacheHeaderVersion = VkPipelineCacheHeaderVersion Int32
+  deriving (Eq, Storable)
+
+pattern VK_PIPELINE_CACHE_HEADER_VERSION_ONE = VkPipelineCacheHeaderVersion 1
+
+
+pattern VK_MAX_EXTENSION_NAME_SIZE = 256
+type VK_MAX_EXTENSION_NAME_SIZE = 256
+
+pattern VK_MAX_DESCRIPTION_SIZE = 256
+type VK_MAX_DESCRIPTION_SIZE = 256
+
+pattern VK_TRUE = 1
+type VK_TRUE = 1
diff --git a/src/Graphics/Vulkan/Core.hs b/src/Graphics/Vulkan/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Core.hs
@@ -0,0 +1,681 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Core where
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Foreign.Storable( Storable(..)
+                       )
+import Foreign.C.Types( CFloat
+                      , CFloat(..)
+                      )
+newtype VkDeviceSize = VkDeviceSize Word64
+  deriving (Eq, Storable)
+
+-- ** VkFormat
+-- | Vulkan format definitions
+newtype VkFormat = VkFormat Int32
+  deriving (Eq, Storable)
+
+pattern VK_FORMAT_UNDEFINED = VkFormat 0
+
+pattern VK_FORMAT_R4G4_UNORM_PACK8 = VkFormat 1
+
+pattern VK_FORMAT_R4G4B4A4_UNORM_PACK16 = VkFormat 2
+
+pattern VK_FORMAT_B4G4R4A4_UNORM_PACK16 = VkFormat 3
+
+pattern VK_FORMAT_R5G6B5_UNORM_PACK16 = VkFormat 4
+
+pattern VK_FORMAT_B5G6R5_UNORM_PACK16 = VkFormat 5
+
+pattern VK_FORMAT_R5G5B5A1_UNORM_PACK16 = VkFormat 6
+
+pattern VK_FORMAT_B5G5R5A1_UNORM_PACK16 = VkFormat 7
+
+pattern VK_FORMAT_A1R5G5B5_UNORM_PACK16 = VkFormat 8
+
+pattern VK_FORMAT_R8_UNORM = VkFormat 9
+
+pattern VK_FORMAT_R8_SNORM = VkFormat 10
+
+pattern VK_FORMAT_R8_USCALED = VkFormat 11
+
+pattern VK_FORMAT_R8_SSCALED = VkFormat 12
+
+pattern VK_FORMAT_R8_UINT = VkFormat 13
+
+pattern VK_FORMAT_R8_SINT = VkFormat 14
+
+pattern VK_FORMAT_R8_SRGB = VkFormat 15
+
+pattern VK_FORMAT_R8G8_UNORM = VkFormat 16
+
+pattern VK_FORMAT_R8G8_SNORM = VkFormat 17
+
+pattern VK_FORMAT_R8G8_USCALED = VkFormat 18
+
+pattern VK_FORMAT_R8G8_SSCALED = VkFormat 19
+
+pattern VK_FORMAT_R8G8_UINT = VkFormat 20
+
+pattern VK_FORMAT_R8G8_SINT = VkFormat 21
+
+pattern VK_FORMAT_R8G8_SRGB = VkFormat 22
+
+pattern VK_FORMAT_R8G8B8_UNORM = VkFormat 23
+
+pattern VK_FORMAT_R8G8B8_SNORM = VkFormat 24
+
+pattern VK_FORMAT_R8G8B8_USCALED = VkFormat 25
+
+pattern VK_FORMAT_R8G8B8_SSCALED = VkFormat 26
+
+pattern VK_FORMAT_R8G8B8_UINT = VkFormat 27
+
+pattern VK_FORMAT_R8G8B8_SINT = VkFormat 28
+
+pattern VK_FORMAT_R8G8B8_SRGB = VkFormat 29
+
+pattern VK_FORMAT_B8G8R8_UNORM = VkFormat 30
+
+pattern VK_FORMAT_B8G8R8_SNORM = VkFormat 31
+
+pattern VK_FORMAT_B8G8R8_USCALED = VkFormat 32
+
+pattern VK_FORMAT_B8G8R8_SSCALED = VkFormat 33
+
+pattern VK_FORMAT_B8G8R8_UINT = VkFormat 34
+
+pattern VK_FORMAT_B8G8R8_SINT = VkFormat 35
+
+pattern VK_FORMAT_B8G8R8_SRGB = VkFormat 36
+
+pattern VK_FORMAT_R8G8B8A8_UNORM = VkFormat 37
+
+pattern VK_FORMAT_R8G8B8A8_SNORM = VkFormat 38
+
+pattern VK_FORMAT_R8G8B8A8_USCALED = VkFormat 39
+
+pattern VK_FORMAT_R8G8B8A8_SSCALED = VkFormat 40
+
+pattern VK_FORMAT_R8G8B8A8_UINT = VkFormat 41
+
+pattern VK_FORMAT_R8G8B8A8_SINT = VkFormat 42
+
+pattern VK_FORMAT_R8G8B8A8_SRGB = VkFormat 43
+
+pattern VK_FORMAT_B8G8R8A8_UNORM = VkFormat 44
+
+pattern VK_FORMAT_B8G8R8A8_SNORM = VkFormat 45
+
+pattern VK_FORMAT_B8G8R8A8_USCALED = VkFormat 46
+
+pattern VK_FORMAT_B8G8R8A8_SSCALED = VkFormat 47
+
+pattern VK_FORMAT_B8G8R8A8_UINT = VkFormat 48
+
+pattern VK_FORMAT_B8G8R8A8_SINT = VkFormat 49
+
+pattern VK_FORMAT_B8G8R8A8_SRGB = VkFormat 50
+
+pattern VK_FORMAT_A8B8G8R8_UNORM_PACK32 = VkFormat 51
+
+pattern VK_FORMAT_A8B8G8R8_SNORM_PACK32 = VkFormat 52
+
+pattern VK_FORMAT_A8B8G8R8_USCALED_PACK32 = VkFormat 53
+
+pattern VK_FORMAT_A8B8G8R8_SSCALED_PACK32 = VkFormat 54
+
+pattern VK_FORMAT_A8B8G8R8_UINT_PACK32 = VkFormat 55
+
+pattern VK_FORMAT_A8B8G8R8_SINT_PACK32 = VkFormat 56
+
+pattern VK_FORMAT_A8B8G8R8_SRGB_PACK32 = VkFormat 57
+
+pattern VK_FORMAT_A2R10G10B10_UNORM_PACK32 = VkFormat 58
+
+pattern VK_FORMAT_A2R10G10B10_SNORM_PACK32 = VkFormat 59
+
+pattern VK_FORMAT_A2R10G10B10_USCALED_PACK32 = VkFormat 60
+
+pattern VK_FORMAT_A2R10G10B10_SSCALED_PACK32 = VkFormat 61
+
+pattern VK_FORMAT_A2R10G10B10_UINT_PACK32 = VkFormat 62
+
+pattern VK_FORMAT_A2R10G10B10_SINT_PACK32 = VkFormat 63
+
+pattern VK_FORMAT_A2B10G10R10_UNORM_PACK32 = VkFormat 64
+
+pattern VK_FORMAT_A2B10G10R10_SNORM_PACK32 = VkFormat 65
+
+pattern VK_FORMAT_A2B10G10R10_USCALED_PACK32 = VkFormat 66
+
+pattern VK_FORMAT_A2B10G10R10_SSCALED_PACK32 = VkFormat 67
+
+pattern VK_FORMAT_A2B10G10R10_UINT_PACK32 = VkFormat 68
+
+pattern VK_FORMAT_A2B10G10R10_SINT_PACK32 = VkFormat 69
+
+pattern VK_FORMAT_R16_UNORM = VkFormat 70
+
+pattern VK_FORMAT_R16_SNORM = VkFormat 71
+
+pattern VK_FORMAT_R16_USCALED = VkFormat 72
+
+pattern VK_FORMAT_R16_SSCALED = VkFormat 73
+
+pattern VK_FORMAT_R16_UINT = VkFormat 74
+
+pattern VK_FORMAT_R16_SINT = VkFormat 75
+
+pattern VK_FORMAT_R16_SFLOAT = VkFormat 76
+
+pattern VK_FORMAT_R16G16_UNORM = VkFormat 77
+
+pattern VK_FORMAT_R16G16_SNORM = VkFormat 78
+
+pattern VK_FORMAT_R16G16_USCALED = VkFormat 79
+
+pattern VK_FORMAT_R16G16_SSCALED = VkFormat 80
+
+pattern VK_FORMAT_R16G16_UINT = VkFormat 81
+
+pattern VK_FORMAT_R16G16_SINT = VkFormat 82
+
+pattern VK_FORMAT_R16G16_SFLOAT = VkFormat 83
+
+pattern VK_FORMAT_R16G16B16_UNORM = VkFormat 84
+
+pattern VK_FORMAT_R16G16B16_SNORM = VkFormat 85
+
+pattern VK_FORMAT_R16G16B16_USCALED = VkFormat 86
+
+pattern VK_FORMAT_R16G16B16_SSCALED = VkFormat 87
+
+pattern VK_FORMAT_R16G16B16_UINT = VkFormat 88
+
+pattern VK_FORMAT_R16G16B16_SINT = VkFormat 89
+
+pattern VK_FORMAT_R16G16B16_SFLOAT = VkFormat 90
+
+pattern VK_FORMAT_R16G16B16A16_UNORM = VkFormat 91
+
+pattern VK_FORMAT_R16G16B16A16_SNORM = VkFormat 92
+
+pattern VK_FORMAT_R16G16B16A16_USCALED = VkFormat 93
+
+pattern VK_FORMAT_R16G16B16A16_SSCALED = VkFormat 94
+
+pattern VK_FORMAT_R16G16B16A16_UINT = VkFormat 95
+
+pattern VK_FORMAT_R16G16B16A16_SINT = VkFormat 96
+
+pattern VK_FORMAT_R16G16B16A16_SFLOAT = VkFormat 97
+
+pattern VK_FORMAT_R32_UINT = VkFormat 98
+
+pattern VK_FORMAT_R32_SINT = VkFormat 99
+
+pattern VK_FORMAT_R32_SFLOAT = VkFormat 100
+
+pattern VK_FORMAT_R32G32_UINT = VkFormat 101
+
+pattern VK_FORMAT_R32G32_SINT = VkFormat 102
+
+pattern VK_FORMAT_R32G32_SFLOAT = VkFormat 103
+
+pattern VK_FORMAT_R32G32B32_UINT = VkFormat 104
+
+pattern VK_FORMAT_R32G32B32_SINT = VkFormat 105
+
+pattern VK_FORMAT_R32G32B32_SFLOAT = VkFormat 106
+
+pattern VK_FORMAT_R32G32B32A32_UINT = VkFormat 107
+
+pattern VK_FORMAT_R32G32B32A32_SINT = VkFormat 108
+
+pattern VK_FORMAT_R32G32B32A32_SFLOAT = VkFormat 109
+
+pattern VK_FORMAT_R64_UINT = VkFormat 110
+
+pattern VK_FORMAT_R64_SINT = VkFormat 111
+
+pattern VK_FORMAT_R64_SFLOAT = VkFormat 112
+
+pattern VK_FORMAT_R64G64_UINT = VkFormat 113
+
+pattern VK_FORMAT_R64G64_SINT = VkFormat 114
+
+pattern VK_FORMAT_R64G64_SFLOAT = VkFormat 115
+
+pattern VK_FORMAT_R64G64B64_UINT = VkFormat 116
+
+pattern VK_FORMAT_R64G64B64_SINT = VkFormat 117
+
+pattern VK_FORMAT_R64G64B64_SFLOAT = VkFormat 118
+
+pattern VK_FORMAT_R64G64B64A64_UINT = VkFormat 119
+
+pattern VK_FORMAT_R64G64B64A64_SINT = VkFormat 120
+
+pattern VK_FORMAT_R64G64B64A64_SFLOAT = VkFormat 121
+
+pattern VK_FORMAT_B10G11R11_UFLOAT_PACK32 = VkFormat 122
+
+pattern VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = VkFormat 123
+
+pattern VK_FORMAT_D16_UNORM = VkFormat 124
+
+pattern VK_FORMAT_X8_D24_UNORM_PACK32 = VkFormat 125
+
+pattern VK_FORMAT_D32_SFLOAT = VkFormat 126
+
+pattern VK_FORMAT_S8_UINT = VkFormat 127
+
+pattern VK_FORMAT_D16_UNORM_S8_UINT = VkFormat 128
+
+pattern VK_FORMAT_D24_UNORM_S8_UINT = VkFormat 129
+
+pattern VK_FORMAT_D32_SFLOAT_S8_UINT = VkFormat 130
+
+pattern VK_FORMAT_BC1_RGB_UNORM_BLOCK = VkFormat 131
+
+pattern VK_FORMAT_BC1_RGB_SRGB_BLOCK = VkFormat 132
+
+pattern VK_FORMAT_BC1_RGBA_UNORM_BLOCK = VkFormat 133
+
+pattern VK_FORMAT_BC1_RGBA_SRGB_BLOCK = VkFormat 134
+
+pattern VK_FORMAT_BC2_UNORM_BLOCK = VkFormat 135
+
+pattern VK_FORMAT_BC2_SRGB_BLOCK = VkFormat 136
+
+pattern VK_FORMAT_BC3_UNORM_BLOCK = VkFormat 137
+
+pattern VK_FORMAT_BC3_SRGB_BLOCK = VkFormat 138
+
+pattern VK_FORMAT_BC4_UNORM_BLOCK = VkFormat 139
+
+pattern VK_FORMAT_BC4_SNORM_BLOCK = VkFormat 140
+
+pattern VK_FORMAT_BC5_UNORM_BLOCK = VkFormat 141
+
+pattern VK_FORMAT_BC5_SNORM_BLOCK = VkFormat 142
+
+pattern VK_FORMAT_BC6H_UFLOAT_BLOCK = VkFormat 143
+
+pattern VK_FORMAT_BC6H_SFLOAT_BLOCK = VkFormat 144
+
+pattern VK_FORMAT_BC7_UNORM_BLOCK = VkFormat 145
+
+pattern VK_FORMAT_BC7_SRGB_BLOCK = VkFormat 146
+
+pattern VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = VkFormat 147
+
+pattern VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = VkFormat 148
+
+pattern VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = VkFormat 149
+
+pattern VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = VkFormat 150
+
+pattern VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = VkFormat 151
+
+pattern VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = VkFormat 152
+
+pattern VK_FORMAT_EAC_R11_UNORM_BLOCK = VkFormat 153
+
+pattern VK_FORMAT_EAC_R11_SNORM_BLOCK = VkFormat 154
+
+pattern VK_FORMAT_EAC_R11G11_UNORM_BLOCK = VkFormat 155
+
+pattern VK_FORMAT_EAC_R11G11_SNORM_BLOCK = VkFormat 156
+
+pattern VK_FORMAT_ASTC_4x4_UNORM_BLOCK = VkFormat 157
+
+pattern VK_FORMAT_ASTC_4x4_SRGB_BLOCK = VkFormat 158
+
+pattern VK_FORMAT_ASTC_5x4_UNORM_BLOCK = VkFormat 159
+
+pattern VK_FORMAT_ASTC_5x4_SRGB_BLOCK = VkFormat 160
+
+pattern VK_FORMAT_ASTC_5x5_UNORM_BLOCK = VkFormat 161
+
+pattern VK_FORMAT_ASTC_5x5_SRGB_BLOCK = VkFormat 162
+
+pattern VK_FORMAT_ASTC_6x5_UNORM_BLOCK = VkFormat 163
+
+pattern VK_FORMAT_ASTC_6x5_SRGB_BLOCK = VkFormat 164
+
+pattern VK_FORMAT_ASTC_6x6_UNORM_BLOCK = VkFormat 165
+
+pattern VK_FORMAT_ASTC_6x6_SRGB_BLOCK = VkFormat 166
+
+pattern VK_FORMAT_ASTC_8x5_UNORM_BLOCK = VkFormat 167
+
+pattern VK_FORMAT_ASTC_8x5_SRGB_BLOCK = VkFormat 168
+
+pattern VK_FORMAT_ASTC_8x6_UNORM_BLOCK = VkFormat 169
+
+pattern VK_FORMAT_ASTC_8x6_SRGB_BLOCK = VkFormat 170
+
+pattern VK_FORMAT_ASTC_8x8_UNORM_BLOCK = VkFormat 171
+
+pattern VK_FORMAT_ASTC_8x8_SRGB_BLOCK = VkFormat 172
+
+pattern VK_FORMAT_ASTC_10x5_UNORM_BLOCK = VkFormat 173
+
+pattern VK_FORMAT_ASTC_10x5_SRGB_BLOCK = VkFormat 174
+
+pattern VK_FORMAT_ASTC_10x6_UNORM_BLOCK = VkFormat 175
+
+pattern VK_FORMAT_ASTC_10x6_SRGB_BLOCK = VkFormat 176
+
+pattern VK_FORMAT_ASTC_10x8_UNORM_BLOCK = VkFormat 177
+
+pattern VK_FORMAT_ASTC_10x8_SRGB_BLOCK = VkFormat 178
+
+pattern VK_FORMAT_ASTC_10x10_UNORM_BLOCK = VkFormat 179
+
+pattern VK_FORMAT_ASTC_10x10_SRGB_BLOCK = VkFormat 180
+
+pattern VK_FORMAT_ASTC_12x10_UNORM_BLOCK = VkFormat 181
+
+pattern VK_FORMAT_ASTC_12x10_SRGB_BLOCK = VkFormat 182
+
+pattern VK_FORMAT_ASTC_12x12_UNORM_BLOCK = VkFormat 183
+
+pattern VK_FORMAT_ASTC_12x12_SRGB_BLOCK = VkFormat 184
+
+type VkFlags = Word32
+
+
+data VkExtent2D =
+  VkExtent2D{ vkWidth :: Word32 
+            , vkHeight :: Word32 
+            }
+  deriving (Eq)
+
+instance Storable VkExtent2D where
+  sizeOf ~_ = 8
+  alignment ~_ = 4
+  peek ptr = VkExtent2D <$> peek (ptr `plusPtr` 0)
+                        <*> peek (ptr `plusPtr` 4)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkWidth (poked :: VkExtent2D))
+                *> poke (ptr `plusPtr` 4) (vkHeight (poked :: VkExtent2D))
+
+
+-- ** VkSharingMode
+
+newtype VkSharingMode = VkSharingMode Int32
+  deriving (Eq, Storable)
+
+pattern VK_SHARING_MODE_EXCLUSIVE = VkSharingMode 0
+
+pattern VK_SHARING_MODE_CONCURRENT = VkSharingMode 1
+
+-- ** VkStructureType
+-- | Structure type enumerant
+newtype VkStructureType = VkStructureType Int32
+  deriving (Eq, Storable)
+
+pattern VK_STRUCTURE_TYPE_APPLICATION_INFO = VkStructureType 0
+
+pattern VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = VkStructureType 1
+
+pattern VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = VkStructureType 2
+
+pattern VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = VkStructureType 3
+
+pattern VK_STRUCTURE_TYPE_SUBMIT_INFO = VkStructureType 4
+
+pattern VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO = VkStructureType 5
+
+pattern VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = VkStructureType 6
+
+pattern VK_STRUCTURE_TYPE_BIND_SPARSE_INFO = VkStructureType 7
+
+pattern VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = VkStructureType 8
+
+pattern VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = VkStructureType 9
+
+pattern VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = VkStructureType 10
+
+pattern VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = VkStructureType 11
+
+pattern VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = VkStructureType 12
+
+pattern VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = VkStructureType 13
+
+pattern VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = VkStructureType 14
+
+pattern VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = VkStructureType 15
+
+pattern VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = VkStructureType 16
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = VkStructureType 17
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = VkStructureType 18
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = VkStructureType 19
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = VkStructureType 20
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = VkStructureType 21
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = VkStructureType 22
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = VkStructureType 23
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = VkStructureType 24
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = VkStructureType 25
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = VkStructureType 26
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = VkStructureType 27
+
+pattern VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = VkStructureType 28
+
+pattern VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = VkStructureType 29
+
+pattern VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = VkStructureType 30
+
+pattern VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = VkStructureType 31
+
+pattern VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = VkStructureType 32
+
+pattern VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = VkStructureType 33
+
+pattern VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO = VkStructureType 34
+
+pattern VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = VkStructureType 35
+
+pattern VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = VkStructureType 36
+
+pattern VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = VkStructureType 37
+
+pattern VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = VkStructureType 38
+
+pattern VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = VkStructureType 39
+
+pattern VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = VkStructureType 40
+
+pattern VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO = VkStructureType 41
+
+pattern VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = VkStructureType 42
+
+pattern VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = VkStructureType 43
+
+pattern VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = VkStructureType 44
+
+pattern VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = VkStructureType 45
+
+pattern VK_STRUCTURE_TYPE_MEMORY_BARRIER = VkStructureType 46
+
+pattern VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = VkStructureType 47
+
+pattern VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = VkStructureType 48
+
+newtype VkBool32 = VkBool32 Word32
+  deriving (Eq, Storable)
+
+
+data VkOffset2D =
+  VkOffset2D{ vkX :: Int32 
+            , vkY :: Int32 
+            }
+  deriving (Eq)
+
+instance Storable VkOffset2D where
+  sizeOf ~_ = 8
+  alignment ~_ = 4
+  peek ptr = VkOffset2D <$> peek (ptr `plusPtr` 0)
+                        <*> peek (ptr `plusPtr` 4)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkOffset2D))
+                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkOffset2D))
+
+
+
+data VkOffset3D =
+  VkOffset3D{ vkX :: Int32 
+            , vkY :: Int32 
+            , vkZ :: Int32 
+            }
+  deriving (Eq)
+
+instance Storable VkOffset3D where
+  sizeOf ~_ = 12
+  alignment ~_ = 4
+  peek ptr = VkOffset3D <$> peek (ptr `plusPtr` 0)
+                        <*> peek (ptr `plusPtr` 4)
+                        <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkOffset3D))
+                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkOffset3D))
+                *> poke (ptr `plusPtr` 8) (vkZ (poked :: VkOffset3D))
+
+
+
+data VkExtent3D =
+  VkExtent3D{ vkWidth :: Word32 
+            , vkHeight :: Word32 
+            , vkDepth :: Word32 
+            }
+  deriving (Eq)
+
+instance Storable VkExtent3D where
+  sizeOf ~_ = 12
+  alignment ~_ = 4
+  peek ptr = VkExtent3D <$> peek (ptr `plusPtr` 0)
+                        <*> peek (ptr `plusPtr` 4)
+                        <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkWidth (poked :: VkExtent3D))
+                *> poke (ptr `plusPtr` 4) (vkHeight (poked :: VkExtent3D))
+                *> poke (ptr `plusPtr` 8) (vkDepth (poked :: VkExtent3D))
+
+
+
+data VkRect3D =
+  VkRect3D{ vkOffset :: VkOffset3D 
+          , vkExtent :: VkExtent3D 
+          }
+  deriving (Eq)
+
+instance Storable VkRect3D where
+  sizeOf ~_ = 24
+  alignment ~_ = 4
+  peek ptr = VkRect3D <$> peek (ptr `plusPtr` 0)
+                      <*> peek (ptr `plusPtr` 12)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkOffset (poked :: VkRect3D))
+                *> poke (ptr `plusPtr` 12) (vkExtent (poked :: VkRect3D))
+
+
+-- ** VkResult
+-- | Error and return codes
+newtype VkResult = VkResult Int32
+  deriving (Eq, Storable)
+-- | Command completed successfully
+pattern VK_SUCCESS = VkResult 0
+-- | A fence or query has not yet completed
+pattern VK_NOT_READY = VkResult 1
+-- | A wait operation has not completed in the specified time
+pattern VK_TIMEOUT = VkResult 2
+-- | An event is signaled
+pattern VK_EVENT_SET = VkResult 3
+-- | An event is unsignalled
+pattern VK_EVENT_RESET = VkResult 4
+-- | A return array was too small for the resul
+pattern VK_INCOMPLETE = VkResult 5
+-- | A host memory allocation has failed
+pattern VK_ERROR_OUT_OF_HOST_MEMORY = VkResult (-1)
+-- | A device memory allocation has failed
+pattern VK_ERROR_OUT_OF_DEVICE_MEMORY = VkResult (-2)
+-- | The logical device has been lost. See <<devsandqueues-lost-device>>
+pattern VK_ERROR_INITIALIZATION_FAILED = VkResult (-3)
+-- | Initialization of a object has failed
+pattern VK_ERROR_DEVICE_LOST = VkResult (-4)
+-- | Mapping of a memory object has failed
+pattern VK_ERROR_MEMORY_MAP_FAILED = VkResult (-5)
+-- | Layer specified does not exist
+pattern VK_ERROR_LAYER_NOT_PRESENT = VkResult (-6)
+-- | Extension specified does not exist
+pattern VK_ERROR_EXTENSION_NOT_PRESENT = VkResult (-7)
+-- | Requested feature is not available on this device
+pattern VK_ERROR_FEATURE_NOT_PRESENT = VkResult (-8)
+-- | Unable to find a Vulkan driver
+pattern VK_ERROR_INCOMPATIBLE_DRIVER = VkResult (-9)
+-- | Too many objects of the type have already been created
+pattern VK_ERROR_TOO_MANY_OBJECTS = VkResult (-10)
+-- | Requested format is not supported on this device
+pattern VK_ERROR_FORMAT_NOT_SUPPORTED = VkResult (-11)
+
+
+data VkViewport =
+  VkViewport{ vkX :: CFloat 
+            , vkY :: CFloat 
+            , vkWidth :: CFloat 
+            , vkHeight :: CFloat 
+            , vkMinDepth :: CFloat 
+            , vkMaxDepth :: CFloat 
+            }
+  deriving (Eq)
+
+instance Storable VkViewport where
+  sizeOf ~_ = 24
+  alignment ~_ = 4
+  peek ptr = VkViewport <$> peek (ptr `plusPtr` 0)
+                        <*> peek (ptr `plusPtr` 4)
+                        <*> peek (ptr `plusPtr` 8)
+                        <*> peek (ptr `plusPtr` 12)
+                        <*> peek (ptr `plusPtr` 16)
+                        <*> peek (ptr `plusPtr` 20)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkViewport))
+                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkViewport))
+                *> poke (ptr `plusPtr` 8) (vkWidth (poked :: VkViewport))
+                *> poke (ptr `plusPtr` 12) (vkHeight (poked :: VkViewport))
+                *> poke (ptr `plusPtr` 16) (vkMinDepth (poked :: VkViewport))
+                *> poke (ptr `plusPtr` 20) (vkMaxDepth (poked :: VkViewport))
+
+
+
+data VkRect2D =
+  VkRect2D{ vkOffset :: VkOffset2D 
+          , vkExtent :: VkExtent2D 
+          }
+  deriving (Eq)
+
+instance Storable VkRect2D where
+  sizeOf ~_ = 16
+  alignment ~_ = 4
+  peek ptr = VkRect2D <$> peek (ptr `plusPtr` 0)
+                      <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkOffset (poked :: VkRect2D))
+                *> poke (ptr `plusPtr` 8) (vkExtent (poked :: VkRect2D))
+
+
diff --git a/src/Graphics/Vulkan/DescriptorSet.hs b/src/Graphics/Vulkan/DescriptorSet.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/DescriptorSet.hs
@@ -0,0 +1,386 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.DescriptorSet where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Graphics.Vulkan.Buffer( VkBuffer(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Shader( VkShaderStageFlagBits(..)
+                             , VkShaderStageFlags(..)
+                             )
+import Graphics.Vulkan.Sampler( VkSampler(..)
+                              )
+import Graphics.Vulkan.Image( VkImageLayout(..)
+                            )
+import Graphics.Vulkan.ImageView( VkImageView(..)
+                                )
+import Graphics.Vulkan.BufferView( VkBufferView(..)
+                                 )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+-- ** vkUpdateDescriptorSets
+foreign import ccall "vkUpdateDescriptorSets" vkUpdateDescriptorSets :: 
+  VkDevice ->
+  Word32 ->
+    Ptr VkWriteDescriptorSet ->
+      Word32 -> Ptr VkCopyDescriptorSet -> IO ()
+
+-- ** VkDescriptorPoolResetFlags
+-- | Opaque flag
+newtype VkDescriptorPoolResetFlags = VkDescriptorPoolResetFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** vkAllocateDescriptorSets
+foreign import ccall "vkAllocateDescriptorSets" vkAllocateDescriptorSets :: 
+  VkDevice ->
+  Ptr VkDescriptorSetAllocateInfo ->
+    Ptr VkDescriptorSet -> IO VkResult
+
+
+data VkDescriptorBufferInfo =
+  VkDescriptorBufferInfo{ vkBuffer :: VkBuffer 
+                        , vkOffset :: VkDeviceSize 
+                        , vkRange :: VkDeviceSize 
+                        }
+  deriving (Eq)
+
+instance Storable VkDescriptorBufferInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkDescriptorBufferInfo <$> peek (ptr `plusPtr` 0)
+                                    <*> peek (ptr `plusPtr` 8)
+                                    <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkBuffer (poked :: VkDescriptorBufferInfo))
+                *> poke (ptr `plusPtr` 8) (vkOffset (poked :: VkDescriptorBufferInfo))
+                *> poke (ptr `plusPtr` 16) (vkRange (poked :: VkDescriptorBufferInfo))
+
+
+
+data VkDescriptorImageInfo =
+  VkDescriptorImageInfo{ vkSampler :: VkSampler 
+                       , vkImageView :: VkImageView 
+                       , vkImageLayout :: VkImageLayout 
+                       }
+  deriving (Eq)
+
+instance Storable VkDescriptorImageInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkDescriptorImageInfo <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSampler (poked :: VkDescriptorImageInfo))
+                *> poke (ptr `plusPtr` 8) (vkImageView (poked :: VkDescriptorImageInfo))
+                *> poke (ptr `plusPtr` 16) (vkImageLayout (poked :: VkDescriptorImageInfo))
+
+
+
+data VkCopyDescriptorSet =
+  VkCopyDescriptorSet{ vkSType :: VkStructureType 
+                     , vkPNext :: Ptr Void 
+                     , vkSrcSet :: VkDescriptorSet 
+                     , vkSrcBinding :: Word32 
+                     , vkSrcArrayElement :: Word32 
+                     , vkDstSet :: VkDescriptorSet 
+                     , vkDstBinding :: Word32 
+                     , vkDstArrayElement :: Word32 
+                     , vkDescriptorCount :: Word32 
+                     }
+  deriving (Eq)
+
+instance Storable VkCopyDescriptorSet where
+  sizeOf ~_ = 56
+  alignment ~_ = 8
+  peek ptr = VkCopyDescriptorSet <$> peek (ptr `plusPtr` 0)
+                                 <*> peek (ptr `plusPtr` 8)
+                                 <*> peek (ptr `plusPtr` 16)
+                                 <*> peek (ptr `plusPtr` 24)
+                                 <*> peek (ptr `plusPtr` 28)
+                                 <*> peek (ptr `plusPtr` 32)
+                                 <*> peek (ptr `plusPtr` 40)
+                                 <*> peek (ptr `plusPtr` 44)
+                                 <*> peek (ptr `plusPtr` 48)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 16) (vkSrcSet (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 24) (vkSrcBinding (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 28) (vkSrcArrayElement (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 32) (vkDstSet (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 40) (vkDstBinding (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 44) (vkDstArrayElement (poked :: VkCopyDescriptorSet))
+                *> poke (ptr `plusPtr` 48) (vkDescriptorCount (poked :: VkCopyDescriptorSet))
+
+
+-- ** vkDestroyDescriptorPool
+foreign import ccall "vkDestroyDescriptorPool" vkDestroyDescriptorPool :: 
+  VkDevice -> VkDescriptorPool -> Ptr VkAllocationCallbacks -> IO ()
+
+-- ** vkCreateDescriptorSetLayout
+foreign import ccall "vkCreateDescriptorSetLayout" vkCreateDescriptorSetLayout :: 
+  VkDevice ->
+  Ptr VkDescriptorSetLayoutCreateInfo ->
+    Ptr VkAllocationCallbacks ->
+      Ptr VkDescriptorSetLayout -> IO VkResult
+
+newtype VkDescriptorPool = VkDescriptorPool Word64
+  deriving (Eq, Storable)
+
+-- ** vkResetDescriptorPool
+foreign import ccall "vkResetDescriptorPool" vkResetDescriptorPool :: 
+  VkDevice ->
+  VkDescriptorPool -> VkDescriptorPoolResetFlags -> IO VkResult
+
+newtype VkDescriptorSetLayout = VkDescriptorSetLayout Word64
+  deriving (Eq, Storable)
+
+-- ** vkFreeDescriptorSets
+foreign import ccall "vkFreeDescriptorSets" vkFreeDescriptorSets :: 
+  VkDevice ->
+  VkDescriptorPool -> Word32 -> Ptr VkDescriptorSet -> IO VkResult
+
+
+data VkDescriptorPoolCreateInfo =
+  VkDescriptorPoolCreateInfo{ vkSType :: VkStructureType 
+                            , vkPNext :: Ptr Void 
+                            , vkFlags :: VkDescriptorPoolCreateFlags 
+                            , vkMaxSets :: Word32 
+                            , vkPoolSizeCount :: Word32 
+                            , vkPPoolSizes :: Ptr VkDescriptorPoolSize 
+                            }
+  deriving (Eq)
+
+instance Storable VkDescriptorPoolCreateInfo where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkDescriptorPoolCreateInfo <$> peek (ptr `plusPtr` 0)
+                                        <*> peek (ptr `plusPtr` 8)
+                                        <*> peek (ptr `plusPtr` 16)
+                                        <*> peek (ptr `plusPtr` 20)
+                                        <*> peek (ptr `plusPtr` 24)
+                                        <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorPoolCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorPoolCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDescriptorPoolCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkMaxSets (poked :: VkDescriptorPoolCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPoolSizeCount (poked :: VkDescriptorPoolCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPPoolSizes (poked :: VkDescriptorPoolCreateInfo))
+
+
+-- ** VkDescriptorSetLayoutCreateFlags
+-- | Opaque flag
+newtype VkDescriptorSetLayoutCreateFlags = VkDescriptorSetLayoutCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkDescriptorSetLayoutCreateInfo =
+  VkDescriptorSetLayoutCreateInfo{ vkSType :: VkStructureType 
+                                 , vkPNext :: Ptr Void 
+                                 , vkFlags :: VkDescriptorSetLayoutCreateFlags 
+                                 , vkBindingCount :: Word32 
+                                 , vkPBindings :: Ptr VkDescriptorSetLayoutBinding 
+                                 }
+  deriving (Eq)
+
+instance Storable VkDescriptorSetLayoutCreateInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkDescriptorSetLayoutCreateInfo <$> peek (ptr `plusPtr` 0)
+                                             <*> peek (ptr `plusPtr` 8)
+                                             <*> peek (ptr `plusPtr` 16)
+                                             <*> peek (ptr `plusPtr` 20)
+                                             <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorSetLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorSetLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDescriptorSetLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkBindingCount (poked :: VkDescriptorSetLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPBindings (poked :: VkDescriptorSetLayoutCreateInfo))
+
+
+-- ** VkDescriptorPoolCreateFlags
+
+newtype VkDescriptorPoolCreateFlagBits = VkDescriptorPoolCreateFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkDescriptorPoolCreateFlagBits
+type VkDescriptorPoolCreateFlags = VkDescriptorPoolCreateFlagBits
+-- | Descriptor sets may be freed individually
+pattern VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = VkDescriptorPoolCreateFlagBits 0x1
+
+
+
+data VkDescriptorPoolSize =
+  VkDescriptorPoolSize{ vkType :: VkDescriptorType 
+                      , vkDescriptorCount :: Word32 
+                      }
+  deriving (Eq)
+
+instance Storable VkDescriptorPoolSize where
+  sizeOf ~_ = 8
+  alignment ~_ = 4
+  peek ptr = VkDescriptorPoolSize <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 4)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkType (poked :: VkDescriptorPoolSize))
+                *> poke (ptr `plusPtr` 4) (vkDescriptorCount (poked :: VkDescriptorPoolSize))
+
+
+newtype VkDescriptorSet = VkDescriptorSet Word64
+  deriving (Eq, Storable)
+
+
+data VkWriteDescriptorSet =
+  VkWriteDescriptorSet{ vkSType :: VkStructureType 
+                      , vkPNext :: Ptr Void 
+                      , vkDstSet :: VkDescriptorSet 
+                      , vkDstBinding :: Word32 
+                      , vkDstArrayElement :: Word32 
+                      , vkDescriptorCount :: Word32 
+                      , vkDescriptorType :: VkDescriptorType 
+                      , vkPImageInfo :: Ptr VkDescriptorImageInfo 
+                      , vkPBufferInfo :: Ptr VkDescriptorBufferInfo 
+                      , vkPTexelBufferView :: Ptr VkBufferView 
+                      }
+  deriving (Eq)
+
+instance Storable VkWriteDescriptorSet where
+  sizeOf ~_ = 64
+  alignment ~_ = 8
+  peek ptr = VkWriteDescriptorSet <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 8)
+                                  <*> peek (ptr `plusPtr` 16)
+                                  <*> peek (ptr `plusPtr` 24)
+                                  <*> peek (ptr `plusPtr` 28)
+                                  <*> peek (ptr `plusPtr` 32)
+                                  <*> peek (ptr `plusPtr` 36)
+                                  <*> peek (ptr `plusPtr` 40)
+                                  <*> peek (ptr `plusPtr` 48)
+                                  <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 16) (vkDstSet (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 24) (vkDstBinding (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 28) (vkDstArrayElement (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 32) (vkDescriptorCount (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 36) (vkDescriptorType (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 40) (vkPImageInfo (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 48) (vkPBufferInfo (poked :: VkWriteDescriptorSet))
+                *> poke (ptr `plusPtr` 56) (vkPTexelBufferView (poked :: VkWriteDescriptorSet))
+
+
+-- ** vkCreateDescriptorPool
+foreign import ccall "vkCreateDescriptorPool" vkCreateDescriptorPool :: 
+  VkDevice ->
+  Ptr VkDescriptorPoolCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkDescriptorPool -> IO VkResult
+
+-- ** vkDestroyDescriptorSetLayout
+foreign import ccall "vkDestroyDescriptorSetLayout" vkDestroyDescriptorSetLayout :: 
+  VkDevice ->
+  VkDescriptorSetLayout -> Ptr VkAllocationCallbacks -> IO ()
+
+
+data VkDescriptorSetLayoutBinding =
+  VkDescriptorSetLayoutBinding{ vkBinding :: Word32 
+                              , vkDescriptorType :: VkDescriptorType 
+                              , vkDescriptorCount :: Word32 
+                              , vkStageFlags :: VkShaderStageFlags 
+                              , vkPImmutableSamplers :: Ptr VkSampler 
+                              }
+  deriving (Eq)
+
+instance Storable VkDescriptorSetLayoutBinding where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkDescriptorSetLayoutBinding <$> peek (ptr `plusPtr` 0)
+                                          <*> peek (ptr `plusPtr` 4)
+                                          <*> peek (ptr `plusPtr` 8)
+                                          <*> peek (ptr `plusPtr` 12)
+                                          <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkBinding (poked :: VkDescriptorSetLayoutBinding))
+                *> poke (ptr `plusPtr` 4) (vkDescriptorType (poked :: VkDescriptorSetLayoutBinding))
+                *> poke (ptr `plusPtr` 8) (vkDescriptorCount (poked :: VkDescriptorSetLayoutBinding))
+                *> poke (ptr `plusPtr` 12) (vkStageFlags (poked :: VkDescriptorSetLayoutBinding))
+                *> poke (ptr `plusPtr` 16) (vkPImmutableSamplers (poked :: VkDescriptorSetLayoutBinding))
+
+
+-- ** VkDescriptorType
+
+newtype VkDescriptorType = VkDescriptorType Int32
+  deriving (Eq, Storable)
+
+pattern VK_DESCRIPTOR_TYPE_SAMPLER = VkDescriptorType 0
+
+pattern VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = VkDescriptorType 1
+
+pattern VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = VkDescriptorType 2
+
+pattern VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = VkDescriptorType 3
+
+pattern VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = VkDescriptorType 4
+
+pattern VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = VkDescriptorType 5
+
+pattern VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = VkDescriptorType 6
+
+pattern VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = VkDescriptorType 7
+
+pattern VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = VkDescriptorType 8
+
+pattern VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = VkDescriptorType 9
+
+pattern VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = VkDescriptorType 10
+
+
+data VkDescriptorSetAllocateInfo =
+  VkDescriptorSetAllocateInfo{ vkSType :: VkStructureType 
+                             , vkPNext :: Ptr Void 
+                             , vkDescriptorPool :: VkDescriptorPool 
+                             , vkDescriptorSetCount :: Word32 
+                             , vkPSetLayouts :: Ptr VkDescriptorSetLayout 
+                             }
+  deriving (Eq)
+
+instance Storable VkDescriptorSetAllocateInfo where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkDescriptorSetAllocateInfo <$> peek (ptr `plusPtr` 0)
+                                         <*> peek (ptr `plusPtr` 8)
+                                         <*> peek (ptr `plusPtr` 16)
+                                         <*> peek (ptr `plusPtr` 24)
+                                         <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDescriptorSetAllocateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDescriptorSetAllocateInfo))
+                *> poke (ptr `plusPtr` 16) (vkDescriptorPool (poked :: VkDescriptorSetAllocateInfo))
+                *> poke (ptr `plusPtr` 24) (vkDescriptorSetCount (poked :: VkDescriptorSetAllocateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPSetLayouts (poked :: VkDescriptorSetAllocateInfo))
+
+
diff --git a/src/Graphics/Vulkan/Device.hs b/src/Graphics/Vulkan/Device.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Device.hs
@@ -0,0 +1,301 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Device where
+import Data.Word( Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkBool32(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CFloat
+                      , CFloat(..)
+                      , CChar
+                      , CSize(..)
+                      )
+-- ** vkCreateDevice
+foreign import ccall "vkCreateDevice" vkCreateDevice :: 
+  VkPhysicalDevice ->
+  Ptr VkDeviceCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkDevice -> IO VkResult
+
+
+data VkPhysicalDeviceFeatures =
+  VkPhysicalDeviceFeatures{ vkRobustBufferAccess :: VkBool32 
+                          , vkFullDrawIndexUint :: VkBool32 
+                          , vkImageCubeArray :: VkBool32 
+                          , vkIndependentBlend :: VkBool32 
+                          , vkGeometryShader :: VkBool32 
+                          , vkTessellationShader :: VkBool32 
+                          , vkSampleRateShading :: VkBool32 
+                          , vkDualSrcBlend :: VkBool32 
+                          , vkLogicOp :: VkBool32 
+                          , vkMultiDrawIndirect :: VkBool32 
+                          , vkDrawIndirectFirstInstance :: VkBool32 
+                          , vkDepthClamp :: VkBool32 
+                          , vkDepthBiasClamp :: VkBool32 
+                          , vkFillModeNonSolid :: VkBool32 
+                          , vkDepthBounds :: VkBool32 
+                          , vkWideLines :: VkBool32 
+                          , vkLargePoints :: VkBool32 
+                          , vkAlphaToOne :: VkBool32 
+                          , vkMultiViewport :: VkBool32 
+                          , vkSamplerAnisotropy :: VkBool32 
+                          , vkTextureCompressionETC :: VkBool32 
+                          , vkTextureCompressionASTC_LDR :: VkBool32 
+                          , vkTextureCompressionBC :: VkBool32 
+                          , vkOcclusionQueryPrecise :: VkBool32 
+                          , vkPipelineStatisticsQuery :: VkBool32 
+                          , vkVertexPipelineStoresAndAtomics :: VkBool32 
+                          , vkFragmentStoresAndAtomics :: VkBool32 
+                          , vkShaderTessellationAndGeometryPointSize :: VkBool32 
+                          , vkShaderImageGatherExtended :: VkBool32 
+                          , vkShaderStorageImageExtendedFormats :: VkBool32 
+                          , vkShaderStorageImageMultisample :: VkBool32 
+                          , vkShaderStorageImageReadWithoutFormat :: VkBool32 
+                          , vkShaderStorageImageWriteWithoutFormat :: VkBool32 
+                          , vkShaderUniformBufferArrayDynamicIndexing :: VkBool32 
+                          , vkShaderSampledImageArrayDynamicIndexing :: VkBool32 
+                          , vkShaderStorageBufferArrayDynamicIndexing :: VkBool32 
+                          , vkShaderStorageImageArrayDynamicIndexing :: VkBool32 
+                          , vkShaderClipDistance :: VkBool32 
+                          , vkShaderCullDistance :: VkBool32 
+                          , vkShaderFloat :: VkBool32 
+                          , vkShaderInt :: VkBool32 
+                          , vkShaderInt :: VkBool32 
+                          , vkShaderResourceResidency :: VkBool32 
+                          , vkShaderResourceMinLod :: VkBool32 
+                          , vkSparseBinding :: VkBool32 
+                          , vkSparseResidencyBuffer :: VkBool32 
+                          , vkSparseResidencyImage :: VkBool32 
+                          , vkSparseResidencyImage :: VkBool32 
+                          , vkSparseResidency :: VkBool32 
+                          , vkSparseResidency :: VkBool32 
+                          , vkSparseResidency :: VkBool32 
+                          , vkSparseResidency :: VkBool32 
+                          , vkSparseResidencyAliased :: VkBool32 
+                          , vkVariableMultisampleRate :: VkBool32 
+                          , vkInheritedQueries :: VkBool32 
+                          }
+  deriving (Eq)
+
+instance Storable VkPhysicalDeviceFeatures where
+  sizeOf ~_ = 220
+  alignment ~_ = 4
+  peek ptr = VkPhysicalDeviceFeatures <$> peek (ptr `plusPtr` 0)
+                                      <*> peek (ptr `plusPtr` 4)
+                                      <*> peek (ptr `plusPtr` 8)
+                                      <*> peek (ptr `plusPtr` 12)
+                                      <*> peek (ptr `plusPtr` 16)
+                                      <*> peek (ptr `plusPtr` 20)
+                                      <*> peek (ptr `plusPtr` 24)
+                                      <*> peek (ptr `plusPtr` 28)
+                                      <*> peek (ptr `plusPtr` 32)
+                                      <*> peek (ptr `plusPtr` 36)
+                                      <*> peek (ptr `plusPtr` 40)
+                                      <*> peek (ptr `plusPtr` 44)
+                                      <*> peek (ptr `plusPtr` 48)
+                                      <*> peek (ptr `plusPtr` 52)
+                                      <*> peek (ptr `plusPtr` 56)
+                                      <*> peek (ptr `plusPtr` 60)
+                                      <*> peek (ptr `plusPtr` 64)
+                                      <*> peek (ptr `plusPtr` 68)
+                                      <*> peek (ptr `plusPtr` 72)
+                                      <*> peek (ptr `plusPtr` 76)
+                                      <*> peek (ptr `plusPtr` 80)
+                                      <*> peek (ptr `plusPtr` 84)
+                                      <*> peek (ptr `plusPtr` 88)
+                                      <*> peek (ptr `plusPtr` 92)
+                                      <*> peek (ptr `plusPtr` 96)
+                                      <*> peek (ptr `plusPtr` 100)
+                                      <*> peek (ptr `plusPtr` 104)
+                                      <*> peek (ptr `plusPtr` 108)
+                                      <*> peek (ptr `plusPtr` 112)
+                                      <*> peek (ptr `plusPtr` 116)
+                                      <*> peek (ptr `plusPtr` 120)
+                                      <*> peek (ptr `plusPtr` 124)
+                                      <*> peek (ptr `plusPtr` 128)
+                                      <*> peek (ptr `plusPtr` 132)
+                                      <*> peek (ptr `plusPtr` 136)
+                                      <*> peek (ptr `plusPtr` 140)
+                                      <*> peek (ptr `plusPtr` 144)
+                                      <*> peek (ptr `plusPtr` 148)
+                                      <*> peek (ptr `plusPtr` 152)
+                                      <*> peek (ptr `plusPtr` 156)
+                                      <*> peek (ptr `plusPtr` 160)
+                                      <*> peek (ptr `plusPtr` 164)
+                                      <*> peek (ptr `plusPtr` 168)
+                                      <*> peek (ptr `plusPtr` 172)
+                                      <*> peek (ptr `plusPtr` 176)
+                                      <*> peek (ptr `plusPtr` 180)
+                                      <*> peek (ptr `plusPtr` 184)
+                                      <*> peek (ptr `plusPtr` 188)
+                                      <*> peek (ptr `plusPtr` 192)
+                                      <*> peek (ptr `plusPtr` 196)
+                                      <*> peek (ptr `plusPtr` 200)
+                                      <*> peek (ptr `plusPtr` 204)
+                                      <*> peek (ptr `plusPtr` 208)
+                                      <*> peek (ptr `plusPtr` 212)
+                                      <*> peek (ptr `plusPtr` 216)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkRobustBufferAccess (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 4) (vkFullDrawIndexUint (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 8) (vkImageCubeArray (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 12) (vkIndependentBlend (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 16) (vkGeometryShader (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 20) (vkTessellationShader (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 24) (vkSampleRateShading (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 28) (vkDualSrcBlend (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 32) (vkLogicOp (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 36) (vkMultiDrawIndirect (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 40) (vkDrawIndirectFirstInstance (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 44) (vkDepthClamp (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 48) (vkDepthBiasClamp (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 52) (vkFillModeNonSolid (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 56) (vkDepthBounds (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 60) (vkWideLines (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 64) (vkLargePoints (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 68) (vkAlphaToOne (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 72) (vkMultiViewport (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 76) (vkSamplerAnisotropy (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 80) (vkTextureCompressionETC (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 84) (vkTextureCompressionASTC_LDR (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 88) (vkTextureCompressionBC (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 92) (vkOcclusionQueryPrecise (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 96) (vkPipelineStatisticsQuery (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 100) (vkVertexPipelineStoresAndAtomics (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 104) (vkFragmentStoresAndAtomics (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 108) (vkShaderTessellationAndGeometryPointSize (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 112) (vkShaderImageGatherExtended (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 116) (vkShaderStorageImageExtendedFormats (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 120) (vkShaderStorageImageMultisample (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 124) (vkShaderStorageImageReadWithoutFormat (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 128) (vkShaderStorageImageWriteWithoutFormat (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 132) (vkShaderUniformBufferArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 136) (vkShaderSampledImageArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 140) (vkShaderStorageBufferArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 144) (vkShaderStorageImageArrayDynamicIndexing (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 148) (vkShaderClipDistance (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 152) (vkShaderCullDistance (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 156) (vkShaderFloat (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 160) (vkShaderInt (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 164) (vkShaderInt (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 168) (vkShaderResourceResidency (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 172) (vkShaderResourceMinLod (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 176) (vkSparseBinding (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 180) (vkSparseResidencyBuffer (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 184) (vkSparseResidencyImage (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 188) (vkSparseResidencyImage (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 192) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 196) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 200) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 204) (vkSparseResidency (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 208) (vkSparseResidencyAliased (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 212) (vkVariableMultisampleRate (poked :: VkPhysicalDeviceFeatures))
+                *> poke (ptr `plusPtr` 216) (vkInheritedQueries (poked :: VkPhysicalDeviceFeatures))
+
+
+-- ** VkDeviceCreateFlags
+-- | Opaque flag
+newtype VkDeviceCreateFlags = VkDeviceCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkDeviceQueueCreateInfo =
+  VkDeviceQueueCreateInfo{ vkSType :: VkStructureType 
+                         , vkPNext :: Ptr Void 
+                         , vkFlags :: VkDeviceQueueCreateFlags 
+                         , vkQueueFamilyIndex :: Word32 
+                         , vkQueueCount :: Word32 
+                         , vkPQueuePriorities :: Ptr CFloat 
+                         }
+  deriving (Eq)
+
+instance Storable VkDeviceQueueCreateInfo where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkDeviceQueueCreateInfo <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 8)
+                                     <*> peek (ptr `plusPtr` 16)
+                                     <*> peek (ptr `plusPtr` 20)
+                                     <*> peek (ptr `plusPtr` 24)
+                                     <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDeviceQueueCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDeviceQueueCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDeviceQueueCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkQueueFamilyIndex (poked :: VkDeviceQueueCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkQueueCount (poked :: VkDeviceQueueCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPQueuePriorities (poked :: VkDeviceQueueCreateInfo))
+
+
+-- ** VkDeviceQueueCreateFlags
+-- | Opaque flag
+newtype VkDeviceQueueCreateFlags = VkDeviceQueueCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** vkDestroyDevice
+foreign import ccall "vkDestroyDevice" vkDestroyDevice :: 
+  VkDevice -> Ptr VkAllocationCallbacks -> IO ()
+
+data VkPhysicalDevice_T
+type VkPhysicalDevice = Ptr VkPhysicalDevice_T
+
+data VkDevice_T
+type VkDevice = Ptr VkDevice_T
+
+
+data VkDeviceCreateInfo =
+  VkDeviceCreateInfo{ vkSType :: VkStructureType 
+                    , vkPNext :: Ptr Void 
+                    , vkFlags :: VkDeviceCreateFlags 
+                    , vkQueueCreateInfoCount :: Word32 
+                    , vkPQueueCreateInfos :: Ptr VkDeviceQueueCreateInfo 
+                    , vkEnabledLayerCount :: Word32 
+                    , vkPpEnabledLayerNames :: Ptr (Ptr CChar) 
+                    , vkEnabledExtensionCount :: Word32 
+                    , vkPpEnabledExtensionNames :: Ptr (Ptr CChar) 
+                    , vkPEnabledFeatures :: Ptr VkPhysicalDeviceFeatures 
+                    }
+  deriving (Eq)
+
+instance Storable VkDeviceCreateInfo where
+  sizeOf ~_ = 72
+  alignment ~_ = 8
+  peek ptr = VkDeviceCreateInfo <$> peek (ptr `plusPtr` 0)
+                                <*> peek (ptr `plusPtr` 8)
+                                <*> peek (ptr `plusPtr` 16)
+                                <*> peek (ptr `plusPtr` 20)
+                                <*> peek (ptr `plusPtr` 24)
+                                <*> peek (ptr `plusPtr` 32)
+                                <*> peek (ptr `plusPtr` 40)
+                                <*> peek (ptr `plusPtr` 48)
+                                <*> peek (ptr `plusPtr` 56)
+                                <*> peek (ptr `plusPtr` 64)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkQueueCreateInfoCount (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPQueueCreateInfos (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkEnabledLayerCount (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPpEnabledLayerNames (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkEnabledExtensionCount (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkPpEnabledExtensionNames (poked :: VkDeviceCreateInfo))
+                *> poke (ptr `plusPtr` 64) (vkPEnabledFeatures (poked :: VkDeviceCreateInfo))
+
+
diff --git a/src/Graphics/Vulkan/Device.hs-boot b/src/Graphics/Vulkan/Device.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Device.hs-boot
@@ -0,0 +1,7 @@
+
+module Graphics.Vulkan.Device where
+import Foreign.Ptr( Ptr
+                  )
+data VkDevice_T
+type VkDevice = Ptr VkDevice_T
+
diff --git a/src/Graphics/Vulkan/DeviceInitialization.hs b/src/Graphics/Vulkan/DeviceInitialization.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/DeviceInitialization.hs
@@ -0,0 +1,798 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.DeviceInitialization where
+import Graphics.Vulkan.Device( VkPhysicalDeviceFeatures(..)
+                             , VkPhysicalDevice(..)
+                             , VkDevice(..)
+                             )
+import Data.Word( Word8
+                , Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , FunPtr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Data.Vector.Fixed.Cont( ToPeano
+                             )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Graphics.Vulkan.Constants( VK_MAX_PHYSICAL_DEVICE_NAME_SIZE
+                                , VK_MAX_MEMORY_HEAPS
+                                , VK_UUID_SIZE
+                                , VK_MAX_MEMORY_TYPES
+                                )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Sampler( VkSampleCountFlagBits(..)
+                              , VkSampleCountFlags(..)
+                              )
+import Graphics.Vulkan.Image( VkImageUsageFlags(..)
+                            , VkImageType(..)
+                            , VkImageUsageFlagBits(..)
+                            , VkImageCreateFlags(..)
+                            , VkImageTiling(..)
+                            , VkImageCreateFlagBits(..)
+                            )
+import Data.Vector.Fixed.Storable( Vec
+                                 )
+import Graphics.Vulkan.Core( VkExtent3D(..)
+                           , VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkBool32(..)
+                           , VkFlags(..)
+                           , VkFormat(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize
+                      , CFloat
+                      , CFloat(..)
+                      , CChar
+                      , CSize(..)
+                      )
+-- ** VkPhysicalDeviceType
+
+newtype VkPhysicalDeviceType = VkPhysicalDeviceType Int32
+  deriving (Eq, Storable)
+
+pattern VK_PHYSICAL_DEVICE_TYPE_OTHER = VkPhysicalDeviceType 0
+
+pattern VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = VkPhysicalDeviceType 1
+
+pattern VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = VkPhysicalDeviceType 2
+
+pattern VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = VkPhysicalDeviceType 3
+
+pattern VK_PHYSICAL_DEVICE_TYPE_CPU = VkPhysicalDeviceType 4
+
+
+data VkInstanceCreateInfo =
+  VkInstanceCreateInfo{ vkSType :: VkStructureType 
+                      , vkPNext :: Ptr Void 
+                      , vkFlags :: VkInstanceCreateFlags 
+                      , vkPApplicationInfo :: Ptr VkApplicationInfo 
+                      , vkEnabledLayerCount :: Word32 
+                      , vkPpEnabledLayerNames :: Ptr (Ptr CChar) 
+                      , vkEnabledExtensionCount :: Word32 
+                      , vkPpEnabledExtensionNames :: Ptr (Ptr CChar) 
+                      }
+  deriving (Eq)
+
+instance Storable VkInstanceCreateInfo where
+  sizeOf ~_ = 64
+  alignment ~_ = 8
+  peek ptr = VkInstanceCreateInfo <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 8)
+                                  <*> peek (ptr `plusPtr` 16)
+                                  <*> peek (ptr `plusPtr` 24)
+                                  <*> peek (ptr `plusPtr` 32)
+                                  <*> peek (ptr `plusPtr` 40)
+                                  <*> peek (ptr `plusPtr` 48)
+                                  <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkInstanceCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkInstanceCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkInstanceCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPApplicationInfo (poked :: VkInstanceCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkEnabledLayerCount (poked :: VkInstanceCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPpEnabledLayerNames (poked :: VkInstanceCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkEnabledExtensionCount (poked :: VkInstanceCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkPpEnabledExtensionNames (poked :: VkInstanceCreateInfo))
+
+
+-- ** vkGetPhysicalDeviceImageFormatProperties
+foreign import ccall "vkGetPhysicalDeviceImageFormatProperties" vkGetPhysicalDeviceImageFormatProperties :: 
+  VkPhysicalDevice ->
+  VkFormat ->
+    VkImageType ->
+      VkImageTiling ->
+        VkImageUsageFlags ->
+          VkImageCreateFlags -> Ptr VkImageFormatProperties -> IO VkResult
+
+type PFN_vkVoidFunction = FunPtr (IO ())
+
+
+data VkApplicationInfo =
+  VkApplicationInfo{ vkSType :: VkStructureType 
+                   , vkPNext :: Ptr Void 
+                   , vkPApplicationName :: Ptr CChar 
+                   , vkApplicationVersion :: Word32 
+                   , vkPEngineName :: Ptr CChar 
+                   , vkEngineVersion :: Word32 
+                   , vkApiVersion :: Word32 
+                   }
+  deriving (Eq)
+
+instance Storable VkApplicationInfo where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkApplicationInfo <$> peek (ptr `plusPtr` 0)
+                               <*> peek (ptr `plusPtr` 8)
+                               <*> peek (ptr `plusPtr` 16)
+                               <*> peek (ptr `plusPtr` 24)
+                               <*> peek (ptr `plusPtr` 32)
+                               <*> peek (ptr `plusPtr` 40)
+                               <*> peek (ptr `plusPtr` 44)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkApplicationInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkApplicationInfo))
+                *> poke (ptr `plusPtr` 16) (vkPApplicationName (poked :: VkApplicationInfo))
+                *> poke (ptr `plusPtr` 24) (vkApplicationVersion (poked :: VkApplicationInfo))
+                *> poke (ptr `plusPtr` 32) (vkPEngineName (poked :: VkApplicationInfo))
+                *> poke (ptr `plusPtr` 40) (vkEngineVersion (poked :: VkApplicationInfo))
+                *> poke (ptr `plusPtr` 44) (vkApiVersion (poked :: VkApplicationInfo))
+
+
+
+data VkPhysicalDeviceLimits =
+  VkPhysicalDeviceLimits{ vkMaxImageDimension :: Word32 
+                        , vkMaxImageDimension :: Word32 
+                        , vkMaxImageDimension :: Word32 
+                        , vkMaxImageDimensionCube :: Word32 
+                        , vkMaxImageArrayLayers :: Word32 
+                        , vkMaxTexelBufferElements :: Word32 
+                        , vkMaxUniformBufferRange :: Word32 
+                        , vkMaxStorageBufferRange :: Word32 
+                        , vkMaxPushConstantsSize :: Word32 
+                        , vkMaxMemoryAllocationCount :: Word32 
+                        , vkMaxSamplerAllocationCount :: Word32 
+                        , vkBufferImageGranularity :: VkDeviceSize 
+                        , vkSparseAddressSpaceSize :: VkDeviceSize 
+                        , vkMaxBoundDescriptorSets :: Word32 
+                        , vkMaxPerStageDescriptorSamplers :: Word32 
+                        , vkMaxPerStageDescriptorUniformBuffers :: Word32 
+                        , vkMaxPerStageDescriptorStorageBuffers :: Word32 
+                        , vkMaxPerStageDescriptorSampledImages :: Word32 
+                        , vkMaxPerStageDescriptorStorageImages :: Word32 
+                        , vkMaxPerStageDescriptorInputAttachments :: Word32 
+                        , vkMaxPerStageResources :: Word32 
+                        , vkMaxDescriptorSetSamplers :: Word32 
+                        , vkMaxDescriptorSetUniformBuffers :: Word32 
+                        , vkMaxDescriptorSetUniformBuffersDynamic :: Word32 
+                        , vkMaxDescriptorSetStorageBuffers :: Word32 
+                        , vkMaxDescriptorSetStorageBuffersDynamic :: Word32 
+                        , vkMaxDescriptorSetSampledImages :: Word32 
+                        , vkMaxDescriptorSetStorageImages :: Word32 
+                        , vkMaxDescriptorSetInputAttachments :: Word32 
+                        , vkMaxVertexInputAttributes :: Word32 
+                        , vkMaxVertexInputBindings :: Word32 
+                        , vkMaxVertexInputAttributeOffset :: Word32 
+                        , vkMaxVertexInputBindingStride :: Word32 
+                        , vkMaxVertexOutputComponents :: Word32 
+                        , vkMaxTessellationGenerationLevel :: Word32 
+                        , vkMaxTessellationPatchSize :: Word32 
+                        , vkMaxTessellationControlPerVertexInputComponents :: Word32 
+                        , vkMaxTessellationControlPerVertexOutputComponents :: Word32 
+                        , vkMaxTessellationControlPerPatchOutputComponents :: Word32 
+                        , vkMaxTessellationControlTotalOutputComponents :: Word32 
+                        , vkMaxTessellationEvaluationInputComponents :: Word32 
+                        , vkMaxTessellationEvaluationOutputComponents :: Word32 
+                        , vkMaxGeometryShaderInvocations :: Word32 
+                        , vkMaxGeometryInputComponents :: Word32 
+                        , vkMaxGeometryOutputComponents :: Word32 
+                        , vkMaxGeometryOutputVertices :: Word32 
+                        , vkMaxGeometryTotalOutputComponents :: Word32 
+                        , vkMaxFragmentInputComponents :: Word32 
+                        , vkMaxFragmentOutputAttachments :: Word32 
+                        , vkMaxFragmentDualSrcAttachments :: Word32 
+                        , vkMaxFragmentCombinedOutputResources :: Word32 
+                        , vkMaxComputeSharedMemorySize :: Word32 
+                        , vkMaxComputeWorkGroupCount :: Vec (ToPeano 3) Word32 
+                        , vkMaxComputeWorkGroupInvocations :: Word32 
+                        , vkMaxComputeWorkGroupSize :: Vec (ToPeano 3) Word32 
+                        , vkSubPixelPrecisionBits :: Word32 
+                        , vkSubTexelPrecisionBits :: Word32 
+                        , vkMipmapPrecisionBits :: Word32 
+                        , vkMaxDrawIndexedIndexValue :: Word32 
+                        , vkMaxDrawIndirectCount :: Word32 
+                        , vkMaxSamplerLodBias :: CFloat 
+                        , vkMaxSamplerAnisotropy :: CFloat 
+                        , vkMaxViewports :: Word32 
+                        , vkMaxViewportDimensions :: Vec (ToPeano 2) Word32 
+                        , vkViewportBoundsRange :: Vec (ToPeano 2) CFloat 
+                        , vkViewportSubPixelBits :: Word32 
+                        , vkMinMemoryMapAlignment :: CSize 
+                        , vkMinTexelBufferOffsetAlignment :: VkDeviceSize 
+                        , vkMinUniformBufferOffsetAlignment :: VkDeviceSize 
+                        , vkMinStorageBufferOffsetAlignment :: VkDeviceSize 
+                        , vkMinTexelOffset :: Int32 
+                        , vkMaxTexelOffset :: Word32 
+                        , vkMinTexelGatherOffset :: Int32 
+                        , vkMaxTexelGatherOffset :: Word32 
+                        , vkMinInterpolationOffset :: CFloat 
+                        , vkMaxInterpolationOffset :: CFloat 
+                        , vkSubPixelInterpolationOffsetBits :: Word32 
+                        , vkMaxFramebufferWidth :: Word32 
+                        , vkMaxFramebufferHeight :: Word32 
+                        , vkMaxFramebufferLayers :: Word32 
+                        , vkFramebufferColorSampleCounts :: VkSampleCountFlags 
+                        , vkFramebufferDepthSampleCounts :: VkSampleCountFlags 
+                        , vkFramebufferStencilSampleCounts :: VkSampleCountFlags 
+                        , vkFramebufferNoAttachmentsSampleCounts :: VkSampleCountFlags 
+                        , vkMaxColorAttachments :: Word32 
+                        , vkSampledImageColorSampleCounts :: VkSampleCountFlags 
+                        , vkSampledImageIntegerSampleCounts :: VkSampleCountFlags 
+                        , vkSampledImageDepthSampleCounts :: VkSampleCountFlags 
+                        , vkSampledImageStencilSampleCounts :: VkSampleCountFlags 
+                        , vkStorageImageSampleCounts :: VkSampleCountFlags 
+                        , vkMaxSampleMaskWords :: Word32 
+                        , vkTimestampComputeAndGraphics :: VkBool32 
+                        , vkTimestampPeriod :: CFloat 
+                        , vkMaxClipDistances :: Word32 
+                        , vkMaxCullDistances :: Word32 
+                        , vkMaxCombinedClipAndCullDistances :: Word32 
+                        , vkDiscreteQueuePriorities :: Word32 
+                        , vkPointSizeRange :: Vec (ToPeano 2) CFloat 
+                        , vkLineWidthRange :: Vec (ToPeano 2) CFloat 
+                        , vkPointSizeGranularity :: CFloat 
+                        , vkLineWidthGranularity :: CFloat 
+                        , vkStrictLines :: VkBool32 
+                        , vkStandardSampleLocations :: VkBool32 
+                        , vkOptimalBufferCopyOffsetAlignment :: VkDeviceSize 
+                        , vkOptimalBufferCopyRowPitchAlignment :: VkDeviceSize 
+                        , vkNonCoherentAtomSize :: VkDeviceSize 
+                        }
+  deriving (Eq)
+
+instance Storable VkPhysicalDeviceLimits where
+  sizeOf ~_ = 504
+  alignment ~_ = 8
+  peek ptr = VkPhysicalDeviceLimits <$> peek (ptr `plusPtr` 0)
+                                    <*> peek (ptr `plusPtr` 4)
+                                    <*> peek (ptr `plusPtr` 8)
+                                    <*> peek (ptr `plusPtr` 12)
+                                    <*> peek (ptr `plusPtr` 16)
+                                    <*> peek (ptr `plusPtr` 20)
+                                    <*> peek (ptr `plusPtr` 24)
+                                    <*> peek (ptr `plusPtr` 28)
+                                    <*> peek (ptr `plusPtr` 32)
+                                    <*> peek (ptr `plusPtr` 36)
+                                    <*> peek (ptr `plusPtr` 40)
+                                    <*> peek (ptr `plusPtr` 48)
+                                    <*> peek (ptr `plusPtr` 56)
+                                    <*> peek (ptr `plusPtr` 64)
+                                    <*> peek (ptr `plusPtr` 68)
+                                    <*> peek (ptr `plusPtr` 72)
+                                    <*> peek (ptr `plusPtr` 76)
+                                    <*> peek (ptr `plusPtr` 80)
+                                    <*> peek (ptr `plusPtr` 84)
+                                    <*> peek (ptr `plusPtr` 88)
+                                    <*> peek (ptr `plusPtr` 92)
+                                    <*> peek (ptr `plusPtr` 96)
+                                    <*> peek (ptr `plusPtr` 100)
+                                    <*> peek (ptr `plusPtr` 104)
+                                    <*> peek (ptr `plusPtr` 108)
+                                    <*> peek (ptr `plusPtr` 112)
+                                    <*> peek (ptr `plusPtr` 116)
+                                    <*> peek (ptr `plusPtr` 120)
+                                    <*> peek (ptr `plusPtr` 124)
+                                    <*> peek (ptr `plusPtr` 128)
+                                    <*> peek (ptr `plusPtr` 132)
+                                    <*> peek (ptr `plusPtr` 136)
+                                    <*> peek (ptr `plusPtr` 140)
+                                    <*> peek (ptr `plusPtr` 144)
+                                    <*> peek (ptr `plusPtr` 148)
+                                    <*> peek (ptr `plusPtr` 152)
+                                    <*> peek (ptr `plusPtr` 156)
+                                    <*> peek (ptr `plusPtr` 160)
+                                    <*> peek (ptr `plusPtr` 164)
+                                    <*> peek (ptr `plusPtr` 168)
+                                    <*> peek (ptr `plusPtr` 172)
+                                    <*> peek (ptr `plusPtr` 176)
+                                    <*> peek (ptr `plusPtr` 180)
+                                    <*> peek (ptr `plusPtr` 184)
+                                    <*> peek (ptr `plusPtr` 188)
+                                    <*> peek (ptr `plusPtr` 192)
+                                    <*> peek (ptr `plusPtr` 196)
+                                    <*> peek (ptr `plusPtr` 200)
+                                    <*> peek (ptr `plusPtr` 204)
+                                    <*> peek (ptr `plusPtr` 208)
+                                    <*> peek (ptr `plusPtr` 212)
+                                    <*> peek (ptr `plusPtr` 216)
+                                    <*> peek (ptr `plusPtr` 220)
+                                    <*> peek (ptr `plusPtr` 232)
+                                    <*> peek (ptr `plusPtr` 236)
+                                    <*> peek (ptr `plusPtr` 248)
+                                    <*> peek (ptr `plusPtr` 252)
+                                    <*> peek (ptr `plusPtr` 256)
+                                    <*> peek (ptr `plusPtr` 260)
+                                    <*> peek (ptr `plusPtr` 264)
+                                    <*> peek (ptr `plusPtr` 268)
+                                    <*> peek (ptr `plusPtr` 272)
+                                    <*> peek (ptr `plusPtr` 276)
+                                    <*> peek (ptr `plusPtr` 280)
+                                    <*> peek (ptr `plusPtr` 288)
+                                    <*> peek (ptr `plusPtr` 296)
+                                    <*> peek (ptr `plusPtr` 304)
+                                    <*> peek (ptr `plusPtr` 312)
+                                    <*> peek (ptr `plusPtr` 320)
+                                    <*> peek (ptr `plusPtr` 328)
+                                    <*> peek (ptr `plusPtr` 336)
+                                    <*> peek (ptr `plusPtr` 340)
+                                    <*> peek (ptr `plusPtr` 344)
+                                    <*> peek (ptr `plusPtr` 348)
+                                    <*> peek (ptr `plusPtr` 352)
+                                    <*> peek (ptr `plusPtr` 356)
+                                    <*> peek (ptr `plusPtr` 360)
+                                    <*> peek (ptr `plusPtr` 364)
+                                    <*> peek (ptr `plusPtr` 368)
+                                    <*> peek (ptr `plusPtr` 372)
+                                    <*> peek (ptr `plusPtr` 376)
+                                    <*> peek (ptr `plusPtr` 380)
+                                    <*> peek (ptr `plusPtr` 384)
+                                    <*> peek (ptr `plusPtr` 388)
+                                    <*> peek (ptr `plusPtr` 392)
+                                    <*> peek (ptr `plusPtr` 396)
+                                    <*> peek (ptr `plusPtr` 400)
+                                    <*> peek (ptr `plusPtr` 404)
+                                    <*> peek (ptr `plusPtr` 408)
+                                    <*> peek (ptr `plusPtr` 412)
+                                    <*> peek (ptr `plusPtr` 416)
+                                    <*> peek (ptr `plusPtr` 420)
+                                    <*> peek (ptr `plusPtr` 424)
+                                    <*> peek (ptr `plusPtr` 428)
+                                    <*> peek (ptr `plusPtr` 432)
+                                    <*> peek (ptr `plusPtr` 436)
+                                    <*> peek (ptr `plusPtr` 440)
+                                    <*> peek (ptr `plusPtr` 444)
+                                    <*> peek (ptr `plusPtr` 452)
+                                    <*> peek (ptr `plusPtr` 460)
+                                    <*> peek (ptr `plusPtr` 464)
+                                    <*> peek (ptr `plusPtr` 468)
+                                    <*> peek (ptr `plusPtr` 472)
+                                    <*> peek (ptr `plusPtr` 480)
+                                    <*> peek (ptr `plusPtr` 488)
+                                    <*> peek (ptr `plusPtr` 496)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkMaxImageDimension (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 4) (vkMaxImageDimension (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 8) (vkMaxImageDimension (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 12) (vkMaxImageDimensionCube (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 16) (vkMaxImageArrayLayers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 20) (vkMaxTexelBufferElements (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 24) (vkMaxUniformBufferRange (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 28) (vkMaxStorageBufferRange (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 32) (vkMaxPushConstantsSize (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 36) (vkMaxMemoryAllocationCount (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 40) (vkMaxSamplerAllocationCount (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 48) (vkBufferImageGranularity (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 56) (vkSparseAddressSpaceSize (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 64) (vkMaxBoundDescriptorSets (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 68) (vkMaxPerStageDescriptorSamplers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 72) (vkMaxPerStageDescriptorUniformBuffers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 76) (vkMaxPerStageDescriptorStorageBuffers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 80) (vkMaxPerStageDescriptorSampledImages (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 84) (vkMaxPerStageDescriptorStorageImages (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 88) (vkMaxPerStageDescriptorInputAttachments (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 92) (vkMaxPerStageResources (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 96) (vkMaxDescriptorSetSamplers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 100) (vkMaxDescriptorSetUniformBuffers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 104) (vkMaxDescriptorSetUniformBuffersDynamic (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 108) (vkMaxDescriptorSetStorageBuffers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 112) (vkMaxDescriptorSetStorageBuffersDynamic (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 116) (vkMaxDescriptorSetSampledImages (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 120) (vkMaxDescriptorSetStorageImages (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 124) (vkMaxDescriptorSetInputAttachments (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 128) (vkMaxVertexInputAttributes (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 132) (vkMaxVertexInputBindings (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 136) (vkMaxVertexInputAttributeOffset (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 140) (vkMaxVertexInputBindingStride (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 144) (vkMaxVertexOutputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 148) (vkMaxTessellationGenerationLevel (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 152) (vkMaxTessellationPatchSize (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 156) (vkMaxTessellationControlPerVertexInputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 160) (vkMaxTessellationControlPerVertexOutputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 164) (vkMaxTessellationControlPerPatchOutputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 168) (vkMaxTessellationControlTotalOutputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 172) (vkMaxTessellationEvaluationInputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 176) (vkMaxTessellationEvaluationOutputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 180) (vkMaxGeometryShaderInvocations (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 184) (vkMaxGeometryInputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 188) (vkMaxGeometryOutputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 192) (vkMaxGeometryOutputVertices (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 196) (vkMaxGeometryTotalOutputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 200) (vkMaxFragmentInputComponents (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 204) (vkMaxFragmentOutputAttachments (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 208) (vkMaxFragmentDualSrcAttachments (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 212) (vkMaxFragmentCombinedOutputResources (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 216) (vkMaxComputeSharedMemorySize (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 220) (vkMaxComputeWorkGroupCount (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 232) (vkMaxComputeWorkGroupInvocations (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 236) (vkMaxComputeWorkGroupSize (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 248) (vkSubPixelPrecisionBits (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 252) (vkSubTexelPrecisionBits (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 256) (vkMipmapPrecisionBits (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 260) (vkMaxDrawIndexedIndexValue (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 264) (vkMaxDrawIndirectCount (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 268) (vkMaxSamplerLodBias (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 272) (vkMaxSamplerAnisotropy (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 276) (vkMaxViewports (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 280) (vkMaxViewportDimensions (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 288) (vkViewportBoundsRange (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 296) (vkViewportSubPixelBits (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 304) (vkMinMemoryMapAlignment (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 312) (vkMinTexelBufferOffsetAlignment (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 320) (vkMinUniformBufferOffsetAlignment (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 328) (vkMinStorageBufferOffsetAlignment (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 336) (vkMinTexelOffset (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 340) (vkMaxTexelOffset (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 344) (vkMinTexelGatherOffset (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 348) (vkMaxTexelGatherOffset (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 352) (vkMinInterpolationOffset (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 356) (vkMaxInterpolationOffset (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 360) (vkSubPixelInterpolationOffsetBits (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 364) (vkMaxFramebufferWidth (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 368) (vkMaxFramebufferHeight (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 372) (vkMaxFramebufferLayers (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 376) (vkFramebufferColorSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 380) (vkFramebufferDepthSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 384) (vkFramebufferStencilSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 388) (vkFramebufferNoAttachmentsSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 392) (vkMaxColorAttachments (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 396) (vkSampledImageColorSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 400) (vkSampledImageIntegerSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 404) (vkSampledImageDepthSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 408) (vkSampledImageStencilSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 412) (vkStorageImageSampleCounts (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 416) (vkMaxSampleMaskWords (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 420) (vkTimestampComputeAndGraphics (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 424) (vkTimestampPeriod (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 428) (vkMaxClipDistances (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 432) (vkMaxCullDistances (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 436) (vkMaxCombinedClipAndCullDistances (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 440) (vkDiscreteQueuePriorities (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 444) (vkPointSizeRange (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 452) (vkLineWidthRange (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 460) (vkPointSizeGranularity (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 464) (vkLineWidthGranularity (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 468) (vkStrictLines (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 472) (vkStandardSampleLocations (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 480) (vkOptimalBufferCopyOffsetAlignment (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 488) (vkOptimalBufferCopyRowPitchAlignment (poked :: VkPhysicalDeviceLimits))
+                *> poke (ptr `plusPtr` 496) (vkNonCoherentAtomSize (poked :: VkPhysicalDeviceLimits))
+
+
+
+data VkMemoryHeap =
+  VkMemoryHeap{ vkSize :: VkDeviceSize 
+              , vkFlags :: VkMemoryHeapFlags 
+              }
+  deriving (Eq)
+
+instance Storable VkMemoryHeap where
+  sizeOf ~_ = 16
+  alignment ~_ = 8
+  peek ptr = VkMemoryHeap <$> peek (ptr `plusPtr` 0)
+                          <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSize (poked :: VkMemoryHeap))
+                *> poke (ptr `plusPtr` 8) (vkFlags (poked :: VkMemoryHeap))
+
+
+-- ** vkEnumeratePhysicalDevices
+foreign import ccall "vkEnumeratePhysicalDevices" vkEnumeratePhysicalDevices :: 
+  VkInstance -> Ptr Word32 -> Ptr VkPhysicalDevice -> IO VkResult
+
+-- ** vkGetDeviceProcAddr
+foreign import ccall "vkGetDeviceProcAddr" vkGetDeviceProcAddr :: 
+  VkDevice -> Ptr CChar -> IO PFN_vkVoidFunction
+
+-- ** vkCreateInstance
+foreign import ccall "vkCreateInstance" vkCreateInstance :: 
+  Ptr VkInstanceCreateInfo ->
+  Ptr VkAllocationCallbacks -> Ptr VkInstance -> IO VkResult
+
+-- ** VkFormatFeatureFlags
+
+newtype VkFormatFeatureFlagBits = VkFormatFeatureFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkFormatFeatureFlagBits
+type VkFormatFeatureFlags = VkFormatFeatureFlagBits
+-- | Format can be used for sampled images (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)
+pattern VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = VkFormatFeatureFlagBits 0x1
+-- | Format can be used for storage images (STORAGE_IMAGE descriptor type)
+pattern VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = VkFormatFeatureFlagBits 0x2
+-- | Format supports atomic operations in case it's used for storage images
+pattern VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = VkFormatFeatureFlagBits 0x4
+-- | Format can be used for uniform texel buffers (TBOs)
+pattern VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = VkFormatFeatureFlagBits 0x8
+-- | Format can be used for storage texel buffers (IBOs)
+pattern VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = VkFormatFeatureFlagBits 0x10
+-- | Format supports atomic operations in case it's used for storage texel buffers
+pattern VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = VkFormatFeatureFlagBits 0x20
+-- | Format can be used for vertex buffers (VBOs)
+pattern VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = VkFormatFeatureFlagBits 0x40
+-- | Format can be used for color attachment images
+pattern VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = VkFormatFeatureFlagBits 0x80
+-- | Format supports blending in case it's used for color attachment images
+pattern VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = VkFormatFeatureFlagBits 0x100
+-- | Format can be used for depth/stencil attachment images
+pattern VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = VkFormatFeatureFlagBits 0x200
+-- | Format can be used as the source image of blits with vkCmdBlitImage
+pattern VK_FORMAT_FEATURE_BLIT_SRC_BIT = VkFormatFeatureFlagBits 0x400
+-- | Format can be used as the destination image of blits with vkCmdBlitImage
+pattern VK_FORMAT_FEATURE_BLIT_DST_BIT = VkFormatFeatureFlagBits 0x800
+-- | Format can be filtered with VK_FILTER_LINEAR when being sampled
+pattern VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT = VkFormatFeatureFlagBits 0x1000
+
+
+
+data VkPhysicalDeviceMemoryProperties =
+  VkPhysicalDeviceMemoryProperties{ vkMemoryTypeCount :: Word32 
+                                  , vkMemoryTypes :: Vec (ToPeano VK_MAX_MEMORY_TYPES) VkMemoryType 
+                                  , vkMemoryHeapCount :: Word32 
+                                  , vkMemoryHeaps :: Vec (ToPeano VK_MAX_MEMORY_HEAPS) VkMemoryHeap 
+                                  }
+  deriving (Eq)
+
+instance Storable VkPhysicalDeviceMemoryProperties where
+  sizeOf ~_ = 520
+  alignment ~_ = 8
+  peek ptr = VkPhysicalDeviceMemoryProperties <$> peek (ptr `plusPtr` 0)
+                                              <*> peek (ptr `plusPtr` 4)
+                                              <*> peek (ptr `plusPtr` 260)
+                                              <*> peek (ptr `plusPtr` 264)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkMemoryTypeCount (poked :: VkPhysicalDeviceMemoryProperties))
+                *> poke (ptr `plusPtr` 4) (vkMemoryTypes (poked :: VkPhysicalDeviceMemoryProperties))
+                *> poke (ptr `plusPtr` 260) (vkMemoryHeapCount (poked :: VkPhysicalDeviceMemoryProperties))
+                *> poke (ptr `plusPtr` 264) (vkMemoryHeaps (poked :: VkPhysicalDeviceMemoryProperties))
+
+
+data VkInstance_T
+type VkInstance = Ptr VkInstance_T
+
+-- ** VkMemoryHeapFlags
+
+newtype VkMemoryHeapFlagBits = VkMemoryHeapFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkMemoryHeapFlagBits
+type VkMemoryHeapFlags = VkMemoryHeapFlagBits
+-- | If set, heap represents device memory
+pattern VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = VkMemoryHeapFlagBits 0x1
+
+
+
+data VkQueueFamilyProperties =
+  VkQueueFamilyProperties{ vkQueueFlags :: VkQueueFlags 
+                         , vkQueueCount :: Word32 
+                         , vkTimestampValidBits :: Word32 
+                         , vkMinImageTransferGranularity :: VkExtent3D 
+                         }
+  deriving (Eq)
+
+instance Storable VkQueueFamilyProperties where
+  sizeOf ~_ = 24
+  alignment ~_ = 4
+  peek ptr = VkQueueFamilyProperties <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 4)
+                                     <*> peek (ptr `plusPtr` 8)
+                                     <*> peek (ptr `plusPtr` 12)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkQueueFlags (poked :: VkQueueFamilyProperties))
+                *> poke (ptr `plusPtr` 4) (vkQueueCount (poked :: VkQueueFamilyProperties))
+                *> poke (ptr `plusPtr` 8) (vkTimestampValidBits (poked :: VkQueueFamilyProperties))
+                *> poke (ptr `plusPtr` 12) (vkMinImageTransferGranularity (poked :: VkQueueFamilyProperties))
+
+
+
+data VkImageFormatProperties =
+  VkImageFormatProperties{ vkMaxExtent :: VkExtent3D 
+                         , vkMaxMipLevels :: Word32 
+                         , vkMaxArrayLayers :: Word32 
+                         , vkSampleCounts :: VkSampleCountFlags 
+                         , vkMaxResourceSize :: VkDeviceSize 
+                         }
+  deriving (Eq)
+
+instance Storable VkImageFormatProperties where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkImageFormatProperties <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 12)
+                                     <*> peek (ptr `plusPtr` 16)
+                                     <*> peek (ptr `plusPtr` 20)
+                                     <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkMaxExtent (poked :: VkImageFormatProperties))
+                *> poke (ptr `plusPtr` 12) (vkMaxMipLevels (poked :: VkImageFormatProperties))
+                *> poke (ptr `plusPtr` 16) (vkMaxArrayLayers (poked :: VkImageFormatProperties))
+                *> poke (ptr `plusPtr` 20) (vkSampleCounts (poked :: VkImageFormatProperties))
+                *> poke (ptr `plusPtr` 24) (vkMaxResourceSize (poked :: VkImageFormatProperties))
+
+
+
+data VkPhysicalDeviceSparseProperties =
+  VkPhysicalDeviceSparseProperties{ vkResidencyStandard :: VkBool32 
+                                  , vkResidencyStandard :: VkBool32 
+                                  , vkResidencyStandard :: VkBool32 
+                                  , vkResidencyAlignedMipSize :: VkBool32 
+                                  , vkResidencyNonResidentStrict :: VkBool32 
+                                  }
+  deriving (Eq)
+
+instance Storable VkPhysicalDeviceSparseProperties where
+  sizeOf ~_ = 20
+  alignment ~_ = 4
+  peek ptr = VkPhysicalDeviceSparseProperties <$> peek (ptr `plusPtr` 0)
+                                              <*> peek (ptr `plusPtr` 4)
+                                              <*> peek (ptr `plusPtr` 8)
+                                              <*> peek (ptr `plusPtr` 12)
+                                              <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkResidencyStandard (poked :: VkPhysicalDeviceSparseProperties))
+                *> poke (ptr `plusPtr` 4) (vkResidencyStandard (poked :: VkPhysicalDeviceSparseProperties))
+                *> poke (ptr `plusPtr` 8) (vkResidencyStandard (poked :: VkPhysicalDeviceSparseProperties))
+                *> poke (ptr `plusPtr` 12) (vkResidencyAlignedMipSize (poked :: VkPhysicalDeviceSparseProperties))
+                *> poke (ptr `plusPtr` 16) (vkResidencyNonResidentStrict (poked :: VkPhysicalDeviceSparseProperties))
+
+
+-- ** vkGetPhysicalDeviceFeatures
+foreign import ccall "vkGetPhysicalDeviceFeatures" vkGetPhysicalDeviceFeatures :: 
+  VkPhysicalDevice -> Ptr VkPhysicalDeviceFeatures -> IO ()
+
+-- ** vkGetPhysicalDeviceMemoryProperties
+foreign import ccall "vkGetPhysicalDeviceMemoryProperties" vkGetPhysicalDeviceMemoryProperties :: 
+  VkPhysicalDevice -> Ptr VkPhysicalDeviceMemoryProperties -> IO ()
+
+
+data VkPhysicalDeviceProperties =
+  VkPhysicalDeviceProperties{ vkApiVersion :: Word32 
+                            , vkDriverVersion :: Word32 
+                            , vkVendorID :: Word32 
+                            , vkDeviceID :: Word32 
+                            , vkDeviceType :: VkPhysicalDeviceType 
+                            , vkDeviceName :: Vec (ToPeano VK_MAX_PHYSICAL_DEVICE_NAME_SIZE) CChar 
+                            , vkPipelineCacheUUID :: Vec (ToPeano VK_UUID_SIZE) Word8 
+                            , vkLimits :: VkPhysicalDeviceLimits 
+                            , vkSparseProperties :: VkPhysicalDeviceSparseProperties 
+                            }
+  deriving (Eq)
+
+instance Storable VkPhysicalDeviceProperties where
+  sizeOf ~_ = 824
+  alignment ~_ = 8
+  peek ptr = VkPhysicalDeviceProperties <$> peek (ptr `plusPtr` 0)
+                                        <*> peek (ptr `plusPtr` 4)
+                                        <*> peek (ptr `plusPtr` 8)
+                                        <*> peek (ptr `plusPtr` 12)
+                                        <*> peek (ptr `plusPtr` 16)
+                                        <*> peek (ptr `plusPtr` 20)
+                                        <*> peek (ptr `plusPtr` 276)
+                                        <*> peek (ptr `plusPtr` 296)
+                                        <*> peek (ptr `plusPtr` 800)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkApiVersion (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 4) (vkDriverVersion (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 8) (vkVendorID (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 12) (vkDeviceID (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 16) (vkDeviceType (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 20) (vkDeviceName (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 276) (vkPipelineCacheUUID (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 296) (vkLimits (poked :: VkPhysicalDeviceProperties))
+                *> poke (ptr `plusPtr` 800) (vkSparseProperties (poked :: VkPhysicalDeviceProperties))
+
+
+-- ** vkGetPhysicalDeviceQueueFamilyProperties
+foreign import ccall "vkGetPhysicalDeviceQueueFamilyProperties" vkGetPhysicalDeviceQueueFamilyProperties :: 
+  VkPhysicalDevice ->
+  Ptr Word32 -> Ptr VkQueueFamilyProperties -> IO ()
+
+
+data VkMemoryType =
+  VkMemoryType{ vkPropertyFlags :: VkMemoryPropertyFlags 
+              , vkHeapIndex :: Word32 
+              }
+  deriving (Eq)
+
+instance Storable VkMemoryType where
+  sizeOf ~_ = 8
+  alignment ~_ = 4
+  peek ptr = VkMemoryType <$> peek (ptr `plusPtr` 0)
+                          <*> peek (ptr `plusPtr` 4)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkPropertyFlags (poked :: VkMemoryType))
+                *> poke (ptr `plusPtr` 4) (vkHeapIndex (poked :: VkMemoryType))
+
+
+-- ** vkGetInstanceProcAddr
+foreign import ccall "vkGetInstanceProcAddr" vkGetInstanceProcAddr :: 
+  VkInstance -> Ptr CChar -> IO PFN_vkVoidFunction
+
+-- ** VkMemoryPropertyFlags
+
+newtype VkMemoryPropertyFlagBits = VkMemoryPropertyFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkMemoryPropertyFlagBits
+type VkMemoryPropertyFlags = VkMemoryPropertyFlagBits
+-- | If otherwise stated, then allocate memory on device
+pattern VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT = VkMemoryPropertyFlagBits 0x1
+-- | Memory is mappable by host
+pattern VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = VkMemoryPropertyFlagBits 0x2
+-- | Memory will have i/o coherency. If not set, application may need to use vkFlushMappedMemoryRanges and vkInvalidateMappedMemoryRanges to flush/invalidate host cache
+pattern VK_MEMORY_PROPERTY_HOST_COHERENT_BIT = VkMemoryPropertyFlagBits 0x4
+-- | Memory will be cached by the host
+pattern VK_MEMORY_PROPERTY_HOST_CACHED_BIT = VkMemoryPropertyFlagBits 0x8
+-- | Memory may be allocated by the driver when it is required
+pattern VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = VkMemoryPropertyFlagBits 0x10
+
+
+-- ** vkDestroyInstance
+foreign import ccall "vkDestroyInstance" vkDestroyInstance :: 
+  VkInstance -> Ptr VkAllocationCallbacks -> IO ()
+
+-- ** VkQueueFlags
+
+newtype VkQueueFlagBits = VkQueueFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkQueueFlagBits
+type VkQueueFlags = VkQueueFlagBits
+-- | Queue supports graphics operations
+pattern VK_QUEUE_GRAPHICS_BIT = VkQueueFlagBits 0x1
+-- | Queue supports compute operations
+pattern VK_QUEUE_COMPUTE_BIT = VkQueueFlagBits 0x2
+-- | Queue supports transfer operations
+pattern VK_QUEUE_TRANSFER_BIT = VkQueueFlagBits 0x4
+-- | Queue supports sparse resource memory management operations
+pattern VK_QUEUE_SPARSE_BINDING_BIT = VkQueueFlagBits 0x8
+
+
+-- ** vkGetPhysicalDeviceProperties
+foreign import ccall "vkGetPhysicalDeviceProperties" vkGetPhysicalDeviceProperties :: 
+  VkPhysicalDevice -> Ptr VkPhysicalDeviceProperties -> IO ()
+
+-- ** VkInstanceCreateFlags
+-- | Opaque flag
+newtype VkInstanceCreateFlags = VkInstanceCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** vkGetPhysicalDeviceFormatProperties
+foreign import ccall "vkGetPhysicalDeviceFormatProperties" vkGetPhysicalDeviceFormatProperties :: 
+  VkPhysicalDevice -> VkFormat -> Ptr VkFormatProperties -> IO ()
+
+
+data VkFormatProperties =
+  VkFormatProperties{ vkLinearTilingFeatures :: VkFormatFeatureFlags 
+                    , vkOptimalTilingFeatures :: VkFormatFeatureFlags 
+                    , vkBufferFeatures :: VkFormatFeatureFlags 
+                    }
+  deriving (Eq)
+
+instance Storable VkFormatProperties where
+  sizeOf ~_ = 12
+  alignment ~_ = 4
+  peek ptr = VkFormatProperties <$> peek (ptr `plusPtr` 0)
+                                <*> peek (ptr `plusPtr` 4)
+                                <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkLinearTilingFeatures (poked :: VkFormatProperties))
+                *> poke (ptr `plusPtr` 4) (vkOptimalTilingFeatures (poked :: VkFormatProperties))
+                *> poke (ptr `plusPtr` 8) (vkBufferFeatures (poked :: VkFormatProperties))
+
+
diff --git a/src/Graphics/Vulkan/Event.hs b/src/Graphics/Vulkan/Event.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Event.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Event where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+-- ** vkDestroyEvent
+foreign import ccall "vkDestroyEvent" vkDestroyEvent :: 
+  VkDevice -> VkEvent -> Ptr VkAllocationCallbacks -> IO ()
+
+
+data VkEventCreateInfo =
+  VkEventCreateInfo{ vkSType :: VkStructureType 
+                   , vkPNext :: Ptr Void 
+                   , vkFlags :: VkEventCreateFlags 
+                   }
+  deriving (Eq)
+
+instance Storable VkEventCreateInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkEventCreateInfo <$> peek (ptr `plusPtr` 0)
+                               <*> peek (ptr `plusPtr` 8)
+                               <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkEventCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkEventCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkEventCreateInfo))
+
+
+-- ** vkSetEvent
+foreign import ccall "vkSetEvent" vkSetEvent :: 
+  VkDevice -> VkEvent -> IO VkResult
+
+-- ** vkGetEventStatus
+foreign import ccall "vkGetEventStatus" vkGetEventStatus :: 
+  VkDevice -> VkEvent -> IO VkResult
+
+-- ** vkResetEvent
+foreign import ccall "vkResetEvent" vkResetEvent :: 
+  VkDevice -> VkEvent -> IO VkResult
+
+-- ** vkCreateEvent
+foreign import ccall "vkCreateEvent" vkCreateEvent :: 
+  VkDevice ->
+  Ptr VkEventCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkEvent -> IO VkResult
+
+newtype VkEvent = VkEvent Word64
+  deriving (Eq, Storable)
+
+-- ** VkEventCreateFlags
+-- | Opaque flag
+newtype VkEventCreateFlags = VkEventCreateFlags VkFlags
+  deriving (Eq, Storable)
+
diff --git a/src/Graphics/Vulkan/ExtensionDiscovery.hs b/src/Graphics/Vulkan/ExtensionDiscovery.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/ExtensionDiscovery.hs
@@ -0,0 +1,48 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE Strict #-}
+module Graphics.Vulkan.ExtensionDiscovery where
+import Graphics.Vulkan.Device( VkPhysicalDevice(..)
+                             )
+import Data.Word( Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Vector.Fixed.Cont( ToPeano
+                             )
+import Foreign.Storable( Storable(..)
+                       )
+import Graphics.Vulkan.Constants( VK_MAX_EXTENSION_NAME_SIZE
+                                )
+import Data.Vector.Fixed.Storable( Vec
+                                 )
+import Graphics.Vulkan.Core( VkResult(..)
+                           )
+import Foreign.C.Types( CChar
+                      )
+
+data VkExtensionProperties =
+  VkExtensionProperties{ vkExtensionName :: Vec (ToPeano VK_MAX_EXTENSION_NAME_SIZE) CChar 
+                       , vkSpecVersion :: Word32 
+                       }
+  deriving (Eq)
+
+instance Storable VkExtensionProperties where
+  sizeOf ~_ = 260
+  alignment ~_ = 4
+  peek ptr = VkExtensionProperties <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 256)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkExtensionName (poked :: VkExtensionProperties))
+                *> poke (ptr `plusPtr` 256) (vkSpecVersion (poked :: VkExtensionProperties))
+
+
+-- ** vkEnumerateInstanceExtensionProperties
+foreign import ccall "vkEnumerateInstanceExtensionProperties" vkEnumerateInstanceExtensionProperties :: 
+  Ptr CChar -> Ptr Word32 -> Ptr VkExtensionProperties -> IO VkResult
+
+-- ** vkEnumerateDeviceExtensionProperties
+foreign import ccall "vkEnumerateDeviceExtensionProperties" vkEnumerateDeviceExtensionProperties :: 
+  VkPhysicalDevice ->
+  Ptr CChar -> Ptr Word32 -> Ptr VkExtensionProperties -> IO VkResult
+
diff --git a/src/Graphics/Vulkan/Fence.hs b/src/Graphics/Vulkan/Fence.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Fence.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Fence where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkBool32(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+
+data VkFenceCreateInfo =
+  VkFenceCreateInfo{ vkSType :: VkStructureType 
+                   , vkPNext :: Ptr Void 
+                   , vkFlags :: VkFenceCreateFlags 
+                   }
+  deriving (Eq)
+
+instance Storable VkFenceCreateInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkFenceCreateInfo <$> peek (ptr `plusPtr` 0)
+                               <*> peek (ptr `plusPtr` 8)
+                               <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkFenceCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkFenceCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkFenceCreateInfo))
+
+
+-- ** vkResetFences
+foreign import ccall "vkResetFences" vkResetFences :: 
+  VkDevice -> Word32 -> Ptr VkFence -> IO VkResult
+
+-- ** vkDestroyFence
+foreign import ccall "vkDestroyFence" vkDestroyFence :: 
+  VkDevice -> VkFence -> Ptr VkAllocationCallbacks -> IO ()
+
+-- ** vkWaitForFences
+foreign import ccall "vkWaitForFences" vkWaitForFences :: 
+  VkDevice ->
+  Word32 -> Ptr VkFence -> VkBool32 -> Word64 -> IO VkResult
+
+-- ** vkGetFenceStatus
+foreign import ccall "vkGetFenceStatus" vkGetFenceStatus :: 
+  VkDevice -> VkFence -> IO VkResult
+
+-- ** VkFenceCreateFlags
+
+newtype VkFenceCreateFlagBits = VkFenceCreateFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkFenceCreateFlagBits
+type VkFenceCreateFlags = VkFenceCreateFlagBits
+
+pattern VK_FENCE_CREATE_SIGNALED_BIT = VkFenceCreateFlagBits 0x1
+
+
+-- ** vkCreateFence
+foreign import ccall "vkCreateFence" vkCreateFence :: 
+  VkDevice ->
+  Ptr VkFenceCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkFence -> IO VkResult
+
+newtype VkFence = VkFence Word64
+  deriving (Eq, Storable)
+
diff --git a/src/Graphics/Vulkan/HeaderBoilerplate.hs b/src/Graphics/Vulkan/HeaderBoilerplate.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/HeaderBoilerplate.hs
@@ -0,0 +1,4 @@
+
+module Graphics.Vulkan.HeaderBoilerplate where
+
+
diff --git a/src/Graphics/Vulkan/Image.hs b/src/Graphics/Vulkan/Image.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Image.hs
@@ -0,0 +1,287 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Image where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Sampler( VkSampleCountFlagBits(..)
+                              )
+import Graphics.Vulkan.Core( VkExtent3D(..)
+                           , VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkFormat(..)
+                           , VkStructureType(..)
+                           , VkSharingMode(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+-- ** vkCreateImage
+foreign import ccall "vkCreateImage" vkCreateImage :: 
+  VkDevice ->
+  Ptr VkImageCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkImage -> IO VkResult
+
+-- ** VkImageCreateFlags
+
+newtype VkImageCreateFlagBits = VkImageCreateFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkImageCreateFlagBits
+type VkImageCreateFlags = VkImageCreateFlagBits
+-- | Image should support sparse backing
+pattern VK_IMAGE_CREATE_SPARSE_BINDING_BIT = VkImageCreateFlagBits 0x1
+-- | Image should support sparse backing with partial residency
+pattern VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = VkImageCreateFlagBits 0x2
+-- | Image should support constent data access to physical memory blocks mapped into multiple locations of sparse images
+pattern VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = VkImageCreateFlagBits 0x4
+-- | Allows image views to have different format than the base image
+pattern VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = VkImageCreateFlagBits 0x8
+-- | Allows creating image views with cube type from the created image
+pattern VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = VkImageCreateFlagBits 0x10
+
+
+-- ** VkImageUsageFlags
+
+newtype VkImageUsageFlagBits = VkImageUsageFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkImageUsageFlagBits
+type VkImageUsageFlags = VkImageUsageFlagBits
+-- | Can be used as a source of transfer operations
+pattern VK_IMAGE_USAGE_TRANSFER_SRC_BIT = VkImageUsageFlagBits 0x1
+-- | Can be used as a destination of transfer operations
+pattern VK_IMAGE_USAGE_TRANSFER_DST_BIT = VkImageUsageFlagBits 0x2
+-- | Can be sampled from (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)
+pattern VK_IMAGE_USAGE_SAMPLED_BIT = VkImageUsageFlagBits 0x4
+-- | Can be used as storage image (STORAGE_IMAGE descriptor type)
+pattern VK_IMAGE_USAGE_STORAGE_BIT = VkImageUsageFlagBits 0x8
+-- | Can be used as framebuffer color attachment
+pattern VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = VkImageUsageFlagBits 0x10
+-- | Can be used as framebuffer depth/stencil attachment
+pattern VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = VkImageUsageFlagBits 0x20
+-- | Image data not needed outside of rendering
+pattern VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = VkImageUsageFlagBits 0x40
+-- | Can be used as framebuffer input attachment
+pattern VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = VkImageUsageFlagBits 0x80
+
+
+newtype VkImage = VkImage Word64
+  deriving (Eq, Storable)
+
+-- ** VkImageAspectFlags
+
+newtype VkImageAspectFlagBits = VkImageAspectFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkImageAspectFlagBits
+type VkImageAspectFlags = VkImageAspectFlagBits
+
+pattern VK_IMAGE_ASPECT_COLOR_BIT = VkImageAspectFlagBits 0x1
+
+pattern VK_IMAGE_ASPECT_DEPTH_BIT = VkImageAspectFlagBits 0x2
+
+pattern VK_IMAGE_ASPECT_STENCIL_BIT = VkImageAspectFlagBits 0x4
+
+pattern VK_IMAGE_ASPECT_METADATA_BIT = VkImageAspectFlagBits 0x8
+
+
+
+data VkSubresourceLayout =
+  VkSubresourceLayout{ vkOffset :: VkDeviceSize 
+                     , vkSize :: VkDeviceSize 
+                     , vkRowPitch :: VkDeviceSize 
+                     , vkArrayPitch :: VkDeviceSize 
+                     , vkDepthPitch :: VkDeviceSize 
+                     }
+  deriving (Eq)
+
+instance Storable VkSubresourceLayout where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkSubresourceLayout <$> peek (ptr `plusPtr` 0)
+                                 <*> peek (ptr `plusPtr` 8)
+                                 <*> peek (ptr `plusPtr` 16)
+                                 <*> peek (ptr `plusPtr` 24)
+                                 <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkOffset (poked :: VkSubresourceLayout))
+                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkSubresourceLayout))
+                *> poke (ptr `plusPtr` 16) (vkRowPitch (poked :: VkSubresourceLayout))
+                *> poke (ptr `plusPtr` 24) (vkArrayPitch (poked :: VkSubresourceLayout))
+                *> poke (ptr `plusPtr` 32) (vkDepthPitch (poked :: VkSubresourceLayout))
+
+
+-- ** VkImageTiling
+
+newtype VkImageTiling = VkImageTiling Int32
+  deriving (Eq, Storable)
+
+pattern VK_IMAGE_TILING_OPTIMAL = VkImageTiling 0
+
+pattern VK_IMAGE_TILING_LINEAR = VkImageTiling 1
+
+-- ** VkImageLayout
+
+newtype VkImageLayout = VkImageLayout Int32
+  deriving (Eq, Storable)
+-- | Implicit layout an image is when its contents are undefined due to various reasons (e.g. right after creation)
+pattern VK_IMAGE_LAYOUT_UNDEFINED = VkImageLayout 0
+-- | General layout when image can be used for any kind of access
+pattern VK_IMAGE_LAYOUT_GENERAL = VkImageLayout 1
+-- | Optimal layout when image is only used for color attachment read/write
+pattern VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = VkImageLayout 2
+-- | Optimal layout when image is only used for depth/stencil attachment read/write
+pattern VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = VkImageLayout 3
+-- | Optimal layout when image is used for read only depth/stencil attachment and shader access
+pattern VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = VkImageLayout 4
+-- | Optimal layout when image is used for read only shader access
+pattern VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = VkImageLayout 5
+-- | Optimal layout when image is used only as source of transfer operations
+pattern VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = VkImageLayout 6
+-- | Optimal layout when image is used only as destination of transfer operations
+pattern VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = VkImageLayout 7
+-- | Initial layout used when the data is populated by the CPU
+pattern VK_IMAGE_LAYOUT_PREINITIALIZED = VkImageLayout 8
+
+-- ** VkImageType
+
+newtype VkImageType = VkImageType Int32
+  deriving (Eq, Storable)
+
+pattern VK_IMAGE_TYPE_1D = VkImageType 0
+
+pattern VK_IMAGE_TYPE_2D = VkImageType 1
+
+pattern VK_IMAGE_TYPE_3D = VkImageType 2
+
+-- ** vkDestroyImage
+foreign import ccall "vkDestroyImage" vkDestroyImage :: 
+  VkDevice -> VkImage -> Ptr VkAllocationCallbacks -> IO ()
+
+
+data VkImageSubresource =
+  VkImageSubresource{ vkAspectMask :: VkImageAspectFlags 
+                    , vkMipLevel :: Word32 
+                    , vkArrayLayer :: Word32 
+                    }
+  deriving (Eq)
+
+instance Storable VkImageSubresource where
+  sizeOf ~_ = 12
+  alignment ~_ = 4
+  peek ptr = VkImageSubresource <$> peek (ptr `plusPtr` 0)
+                                <*> peek (ptr `plusPtr` 4)
+                                <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkImageSubresource))
+                *> poke (ptr `plusPtr` 4) (vkMipLevel (poked :: VkImageSubresource))
+                *> poke (ptr `plusPtr` 8) (vkArrayLayer (poked :: VkImageSubresource))
+
+
+
+data VkImageSubresourceRange =
+  VkImageSubresourceRange{ vkAspectMask :: VkImageAspectFlags 
+                         , vkBaseMipLevel :: Word32 
+                         , vkLevelCount :: Word32 
+                         , vkBaseArrayLayer :: Word32 
+                         , vkLayerCount :: Word32 
+                         }
+  deriving (Eq)
+
+instance Storable VkImageSubresourceRange where
+  sizeOf ~_ = 20
+  alignment ~_ = 4
+  peek ptr = VkImageSubresourceRange <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 4)
+                                     <*> peek (ptr `plusPtr` 8)
+                                     <*> peek (ptr `plusPtr` 12)
+                                     <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkImageSubresourceRange))
+                *> poke (ptr `plusPtr` 4) (vkBaseMipLevel (poked :: VkImageSubresourceRange))
+                *> poke (ptr `plusPtr` 8) (vkLevelCount (poked :: VkImageSubresourceRange))
+                *> poke (ptr `plusPtr` 12) (vkBaseArrayLayer (poked :: VkImageSubresourceRange))
+                *> poke (ptr `plusPtr` 16) (vkLayerCount (poked :: VkImageSubresourceRange))
+
+
+-- ** vkGetImageSubresourceLayout
+foreign import ccall "vkGetImageSubresourceLayout" vkGetImageSubresourceLayout :: 
+  VkDevice ->
+  VkImage ->
+    Ptr VkImageSubresource -> Ptr VkSubresourceLayout -> IO ()
+
+
+data VkImageCreateInfo =
+  VkImageCreateInfo{ vkSType :: VkStructureType 
+                   , vkPNext :: Ptr Void 
+                   , vkFlags :: VkImageCreateFlags 
+                   , vkImageType :: VkImageType 
+                   , vkFormat :: VkFormat 
+                   , vkExtent :: VkExtent3D 
+                   , vkMipLevels :: Word32 
+                   , vkArrayLayers :: Word32 
+                   , vkSamples :: VkSampleCountFlagBits 
+                   , vkTiling :: VkImageTiling 
+                   , vkUsage :: VkImageUsageFlags 
+                   , vkSharingMode :: VkSharingMode 
+                   , vkQueueFamilyIndexCount :: Word32 
+                   , vkPQueueFamilyIndices :: Ptr Word32 
+                   , vkInitialLayout :: VkImageLayout 
+                   }
+  deriving (Eq)
+
+instance Storable VkImageCreateInfo where
+  sizeOf ~_ = 88
+  alignment ~_ = 8
+  peek ptr = VkImageCreateInfo <$> peek (ptr `plusPtr` 0)
+                               <*> peek (ptr `plusPtr` 8)
+                               <*> peek (ptr `plusPtr` 16)
+                               <*> peek (ptr `plusPtr` 20)
+                               <*> peek (ptr `plusPtr` 24)
+                               <*> peek (ptr `plusPtr` 28)
+                               <*> peek (ptr `plusPtr` 40)
+                               <*> peek (ptr `plusPtr` 44)
+                               <*> peek (ptr `plusPtr` 48)
+                               <*> peek (ptr `plusPtr` 52)
+                               <*> peek (ptr `plusPtr` 56)
+                               <*> peek (ptr `plusPtr` 60)
+                               <*> peek (ptr `plusPtr` 64)
+                               <*> peek (ptr `plusPtr` 72)
+                               <*> peek (ptr `plusPtr` 80)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkImageType (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkFormat (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 28) (vkExtent (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkMipLevels (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 44) (vkArrayLayers (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkSamples (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 52) (vkTiling (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkUsage (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 60) (vkSharingMode (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 64) (vkQueueFamilyIndexCount (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 72) (vkPQueueFamilyIndices (poked :: VkImageCreateInfo))
+                *> poke (ptr `plusPtr` 80) (vkInitialLayout (poked :: VkImageCreateInfo))
+
+
diff --git a/src/Graphics/Vulkan/ImageView.hs b/src/Graphics/Vulkan/ImageView.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/ImageView.hs
@@ -0,0 +1,152 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.ImageView where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Image( VkImage(..)
+                            , VkImageAspectFlagBits(..)
+                            , VkImageSubresourceRange(..)
+                            , VkImageAspectFlags(..)
+                            )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkFormat(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+
+data VkImageViewCreateInfo =
+  VkImageViewCreateInfo{ vkSType :: VkStructureType 
+                       , vkPNext :: Ptr Void 
+                       , vkFlags :: VkImageViewCreateFlags 
+                       , vkImage :: VkImage 
+                       , vkViewType :: VkImageViewType 
+                       , vkFormat :: VkFormat 
+                       , vkComponents :: VkComponentMapping 
+                       , vkSubresourceRange :: VkImageSubresourceRange 
+                       }
+  deriving (Eq)
+
+instance Storable VkImageViewCreateInfo where
+  sizeOf ~_ = 80
+  alignment ~_ = 8
+  peek ptr = VkImageViewCreateInfo <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 16)
+                                   <*> peek (ptr `plusPtr` 24)
+                                   <*> peek (ptr `plusPtr` 32)
+                                   <*> peek (ptr `plusPtr` 36)
+                                   <*> peek (ptr `plusPtr` 40)
+                                   <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkImageViewCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkImageViewCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkImageViewCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkImage (poked :: VkImageViewCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkViewType (poked :: VkImageViewCreateInfo))
+                *> poke (ptr `plusPtr` 36) (vkFormat (poked :: VkImageViewCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkComponents (poked :: VkImageViewCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkSubresourceRange (poked :: VkImageViewCreateInfo))
+
+
+-- ** vkCreateImageView
+foreign import ccall "vkCreateImageView" vkCreateImageView :: 
+  VkDevice ->
+  Ptr VkImageViewCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkImageView -> IO VkResult
+
+newtype VkImageView = VkImageView Word64
+  deriving (Eq, Storable)
+
+-- ** VkImageViewType
+
+newtype VkImageViewType = VkImageViewType Int32
+  deriving (Eq, Storable)
+
+pattern VK_IMAGE_VIEW_TYPE_1D = VkImageViewType 0
+
+pattern VK_IMAGE_VIEW_TYPE_2D = VkImageViewType 1
+
+pattern VK_IMAGE_VIEW_TYPE_3D = VkImageViewType 2
+
+pattern VK_IMAGE_VIEW_TYPE_CUBE = VkImageViewType 3
+
+pattern VK_IMAGE_VIEW_TYPE_1D_ARRAY = VkImageViewType 4
+
+pattern VK_IMAGE_VIEW_TYPE_2D_ARRAY = VkImageViewType 5
+
+pattern VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = VkImageViewType 6
+
+-- ** VkImageViewCreateFlags
+-- | Opaque flag
+newtype VkImageViewCreateFlags = VkImageViewCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkComponentMapping =
+  VkComponentMapping{ vkR :: VkComponentSwizzle 
+                    , vkG :: VkComponentSwizzle 
+                    , vkB :: VkComponentSwizzle 
+                    , vkA :: VkComponentSwizzle 
+                    }
+  deriving (Eq)
+
+instance Storable VkComponentMapping where
+  sizeOf ~_ = 16
+  alignment ~_ = 4
+  peek ptr = VkComponentMapping <$> peek (ptr `plusPtr` 0)
+                                <*> peek (ptr `plusPtr` 4)
+                                <*> peek (ptr `plusPtr` 8)
+                                <*> peek (ptr `plusPtr` 12)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkR (poked :: VkComponentMapping))
+                *> poke (ptr `plusPtr` 4) (vkG (poked :: VkComponentMapping))
+                *> poke (ptr `plusPtr` 8) (vkB (poked :: VkComponentMapping))
+                *> poke (ptr `plusPtr` 12) (vkA (poked :: VkComponentMapping))
+
+
+-- ** VkComponentSwizzle
+
+newtype VkComponentSwizzle = VkComponentSwizzle Int32
+  deriving (Eq, Storable)
+
+pattern VK_COMPONENT_SWIZZLE_IDENTITY = VkComponentSwizzle 0
+
+pattern VK_COMPONENT_SWIZZLE_ZERO = VkComponentSwizzle 1
+
+pattern VK_COMPONENT_SWIZZLE_ONE = VkComponentSwizzle 2
+
+pattern VK_COMPONENT_SWIZZLE_R = VkComponentSwizzle 3
+
+pattern VK_COMPONENT_SWIZZLE_G = VkComponentSwizzle 4
+
+pattern VK_COMPONENT_SWIZZLE_B = VkComponentSwizzle 5
+
+pattern VK_COMPONENT_SWIZZLE_A = VkComponentSwizzle 6
+
+-- ** vkDestroyImageView
+foreign import ccall "vkDestroyImageView" vkDestroyImageView :: 
+  VkDevice -> VkImageView -> Ptr VkAllocationCallbacks -> IO ()
+
diff --git a/src/Graphics/Vulkan/KHR/Surface.hs b/src/Graphics/Vulkan/KHR/Surface.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/KHR/Surface.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.KHR.Surface where
+import Data.Word( Word64
+                , Word32
+                )
+import Data.Int( Int32
+               )
+import Foreign.Storable( Storable(..)
+                       )
+import Graphics.Vulkan.Core( VkFlags(..)
+                           )
+-- ** VkCompositeAlphaFlagsKHR
+-- | Opaque flag
+newtype VkCompositeAlphaFlagsKHR = VkCompositeAlphaFlagsKHR VkFlags
+  deriving (Eq, Storable)
+
+-- ** VkPresentModeKHR
+
+newtype VkPresentModeKHR = VkPresentModeKHR Int32
+  deriving (Eq, Storable)
+
+pattern VK_PRESENT_MODE_IMMEDIATE_KHR = VkPresentModeKHR 0
+
+pattern VK_PRESENT_MODE_MAILBOX_KHR = VkPresentModeKHR 1
+
+pattern VK_PRESENT_MODE_FIFO_KHR = VkPresentModeKHR 2
+
+pattern VK_PRESENT_MODE_FIFO_RELAXED_KHR = VkPresentModeKHR 3
+
+newtype VkSurfaceKHR = VkSurfaceKHR Word64
+  deriving (Eq, Storable)
+
+-- ** VkColorSpaceKHR
+
+newtype VkColorSpaceKHR = VkColorSpaceKHR Int32
+  deriving (Eq, Storable)
+
+pattern VK_COLORSPACE_SRGB_NONLINEAR_KHR = VkColorSpaceKHR 0
+
+-- ** VkSurfaceTransformFlagsKHR
+-- | Opaque flag
+newtype VkSurfaceTransformFlagsKHR = VkSurfaceTransformFlagsKHR VkFlags
+  deriving (Eq, Storable)
+
diff --git a/src/Graphics/Vulkan/LayerDiscovery.hs b/src/Graphics/Vulkan/LayerDiscovery.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/LayerDiscovery.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE Strict #-}
+module Graphics.Vulkan.LayerDiscovery where
+import Graphics.Vulkan.Device( VkPhysicalDevice(..)
+                             )
+import Data.Word( Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Vector.Fixed.Cont( ToPeano
+                             )
+import Foreign.Storable( Storable(..)
+                       )
+import Graphics.Vulkan.Constants( VK_MAX_EXTENSION_NAME_SIZE
+                                , VK_MAX_DESCRIPTION_SIZE
+                                )
+import Data.Vector.Fixed.Storable( Vec
+                                 )
+import Graphics.Vulkan.Core( VkResult(..)
+                           )
+import Foreign.C.Types( CChar
+                      )
+
+data VkLayerProperties =
+  VkLayerProperties{ vkLayerName :: Vec (ToPeano VK_MAX_EXTENSION_NAME_SIZE) CChar 
+                   , vkSpecVersion :: Word32 
+                   , vkImplementationVersion :: Word32 
+                   , vkDescription :: Vec (ToPeano VK_MAX_DESCRIPTION_SIZE) CChar 
+                   }
+  deriving (Eq)
+
+instance Storable VkLayerProperties where
+  sizeOf ~_ = 520
+  alignment ~_ = 4
+  peek ptr = VkLayerProperties <$> peek (ptr `plusPtr` 0)
+                               <*> peek (ptr `plusPtr` 256)
+                               <*> peek (ptr `plusPtr` 260)
+                               <*> peek (ptr `plusPtr` 264)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkLayerName (poked :: VkLayerProperties))
+                *> poke (ptr `plusPtr` 256) (vkSpecVersion (poked :: VkLayerProperties))
+                *> poke (ptr `plusPtr` 260) (vkImplementationVersion (poked :: VkLayerProperties))
+                *> poke (ptr `plusPtr` 264) (vkDescription (poked :: VkLayerProperties))
+
+
+-- ** vkEnumerateInstanceLayerProperties
+foreign import ccall "vkEnumerateInstanceLayerProperties" vkEnumerateInstanceLayerProperties :: 
+  Ptr Word32 -> Ptr VkLayerProperties -> IO VkResult
+
+-- ** vkEnumerateDeviceLayerProperties
+foreign import ccall "vkEnumerateDeviceLayerProperties" vkEnumerateDeviceLayerProperties :: 
+  VkPhysicalDevice ->
+  Ptr Word32 -> Ptr VkLayerProperties -> IO VkResult
+
diff --git a/src/Graphics/Vulkan/Memory.hs b/src/Graphics/Vulkan/Memory.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Memory.hs
@@ -0,0 +1,187 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Memory where
+import {-# SOURCE #-} Graphics.Vulkan.Device( VkDevice(..)
+                                            )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , FunPtr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize
+                      , CSize(..)
+                      )
+newtype VkDeviceMemory = VkDeviceMemory Word64
+  deriving (Eq, Storable)
+
+-- ** vkMapMemory
+foreign import ccall "vkMapMemory" vkMapMemory :: 
+  VkDevice ->
+  VkDeviceMemory ->
+    VkDeviceSize ->
+      VkDeviceSize -> VkMemoryMapFlags -> Ptr (Ptr Void) -> IO VkResult
+
+type PFN_vkInternalFreeNotification = FunPtr
+  (Ptr Void ->
+     CSize ->
+       VkInternalAllocationType -> VkSystemAllocationScope -> IO ())
+
+
+data VkAllocationCallbacks =
+  VkAllocationCallbacks{ vkPUserData :: Ptr Void 
+                       , vkPfnAllocation :: PFN_vkAllocationFunction 
+                       , vkPfnReallocation :: PFN_vkReallocationFunction 
+                       , vkPfnFree :: PFN_vkFreeFunction 
+                       , vkPfnInternalAllocation :: PFN_vkInternalAllocationNotification 
+                       , vkPfnInternalFree :: PFN_vkInternalFreeNotification 
+                       }
+  deriving (Eq)
+
+instance Storable VkAllocationCallbacks where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkAllocationCallbacks <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 16)
+                                   <*> peek (ptr `plusPtr` 24)
+                                   <*> peek (ptr `plusPtr` 32)
+                                   <*> peek (ptr `plusPtr` 40)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkPUserData (poked :: VkAllocationCallbacks))
+                *> poke (ptr `plusPtr` 8) (vkPfnAllocation (poked :: VkAllocationCallbacks))
+                *> poke (ptr `plusPtr` 16) (vkPfnReallocation (poked :: VkAllocationCallbacks))
+                *> poke (ptr `plusPtr` 24) (vkPfnFree (poked :: VkAllocationCallbacks))
+                *> poke (ptr `plusPtr` 32) (vkPfnInternalAllocation (poked :: VkAllocationCallbacks))
+                *> poke (ptr `plusPtr` 40) (vkPfnInternalFree (poked :: VkAllocationCallbacks))
+
+
+-- ** vkInvalidateMappedMemoryRanges
+foreign import ccall "vkInvalidateMappedMemoryRanges" vkInvalidateMappedMemoryRanges :: 
+  VkDevice -> Word32 -> Ptr VkMappedMemoryRange -> IO VkResult
+
+-- ** VkSystemAllocationScope
+
+newtype VkSystemAllocationScope = VkSystemAllocationScope Int32
+  deriving (Eq, Storable)
+
+pattern VK_SYSTEM_ALLOCATION_SCOPE_COMMAND = VkSystemAllocationScope 0
+
+pattern VK_SYSTEM_ALLOCATION_SCOPE_OBJECT = VkSystemAllocationScope 1
+
+pattern VK_SYSTEM_ALLOCATION_SCOPE_CACHE = VkSystemAllocationScope 2
+
+pattern VK_SYSTEM_ALLOCATION_SCOPE_DEVICE = VkSystemAllocationScope 3
+
+pattern VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE = VkSystemAllocationScope 4
+
+-- ** vkFlushMappedMemoryRanges
+foreign import ccall "vkFlushMappedMemoryRanges" vkFlushMappedMemoryRanges :: 
+  VkDevice -> Word32 -> Ptr VkMappedMemoryRange -> IO VkResult
+
+-- ** VkMemoryMapFlags
+-- | Opaque flag
+newtype VkMemoryMapFlags = VkMemoryMapFlags VkFlags
+  deriving (Eq, Storable)
+
+type PFN_vkInternalAllocationNotification = FunPtr
+  (Ptr Void ->
+     CSize ->
+       VkInternalAllocationType -> VkSystemAllocationScope -> IO ())
+
+-- ** vkFreeMemory
+foreign import ccall "vkFreeMemory" vkFreeMemory :: 
+  VkDevice -> VkDeviceMemory -> Ptr VkAllocationCallbacks -> IO ()
+
+type PFN_vkReallocationFunction = FunPtr
+  (Ptr Void ->
+     Ptr Void ->
+       CSize -> CSize -> VkSystemAllocationScope -> IO (Ptr Void))
+
+-- ** vkUnmapMemory
+foreign import ccall "vkUnmapMemory" vkUnmapMemory :: 
+  VkDevice -> VkDeviceMemory -> IO ()
+
+type PFN_vkAllocationFunction = FunPtr
+  (Ptr Void ->
+     CSize -> CSize -> VkSystemAllocationScope -> IO (Ptr Void))
+
+-- ** VkInternalAllocationType
+
+newtype VkInternalAllocationType = VkInternalAllocationType Int32
+  deriving (Eq, Storable)
+
+pattern VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE = VkInternalAllocationType 0
+
+type PFN_vkFreeFunction = FunPtr (Ptr Void -> Ptr Void -> IO ())
+
+-- ** vkGetDeviceMemoryCommitment
+foreign import ccall "vkGetDeviceMemoryCommitment" vkGetDeviceMemoryCommitment :: 
+  VkDevice -> VkDeviceMemory -> Ptr VkDeviceSize -> IO ()
+
+-- ** vkAllocateMemory
+foreign import ccall "vkAllocateMemory" vkAllocateMemory :: 
+  VkDevice ->
+  Ptr VkMemoryAllocateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkDeviceMemory -> IO VkResult
+
+
+data VkMappedMemoryRange =
+  VkMappedMemoryRange{ vkSType :: VkStructureType 
+                     , vkPNext :: Ptr Void 
+                     , vkMemory :: VkDeviceMemory 
+                     , vkOffset :: VkDeviceSize 
+                     , vkSize :: VkDeviceSize 
+                     }
+  deriving (Eq)
+
+instance Storable VkMappedMemoryRange where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkMappedMemoryRange <$> peek (ptr `plusPtr` 0)
+                                 <*> peek (ptr `plusPtr` 8)
+                                 <*> peek (ptr `plusPtr` 16)
+                                 <*> peek (ptr `plusPtr` 24)
+                                 <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkMappedMemoryRange))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkMappedMemoryRange))
+                *> poke (ptr `plusPtr` 16) (vkMemory (poked :: VkMappedMemoryRange))
+                *> poke (ptr `plusPtr` 24) (vkOffset (poked :: VkMappedMemoryRange))
+                *> poke (ptr `plusPtr` 32) (vkSize (poked :: VkMappedMemoryRange))
+
+
+
+data VkMemoryAllocateInfo =
+  VkMemoryAllocateInfo{ vkSType :: VkStructureType 
+                      , vkPNext :: Ptr Void 
+                      , vkAllocationSize :: VkDeviceSize 
+                      , vkMemoryTypeIndex :: Word32 
+                      }
+  deriving (Eq)
+
+instance Storable VkMemoryAllocateInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkMemoryAllocateInfo <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 8)
+                                  <*> peek (ptr `plusPtr` 16)
+                                  <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkMemoryAllocateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkMemoryAllocateInfo))
+                *> poke (ptr `plusPtr` 16) (vkAllocationSize (poked :: VkMemoryAllocateInfo))
+                *> poke (ptr `plusPtr` 24) (vkMemoryTypeIndex (poked :: VkMemoryAllocateInfo))
+
+
diff --git a/src/Graphics/Vulkan/MemoryManagement.hs b/src/Graphics/Vulkan/MemoryManagement.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/MemoryManagement.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+module Graphics.Vulkan.MemoryManagement where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Graphics.Vulkan.Buffer( VkBuffer(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkDeviceMemory(..)
+                             )
+import Graphics.Vulkan.Image( VkImage(..)
+                            )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkDeviceSize(..)
+                           )
+-- ** vkGetImageMemoryRequirements
+foreign import ccall "vkGetImageMemoryRequirements" vkGetImageMemoryRequirements :: 
+  VkDevice -> VkImage -> Ptr VkMemoryRequirements -> IO ()
+
+
+data VkMemoryRequirements =
+  VkMemoryRequirements{ vkSize :: VkDeviceSize 
+                      , vkAlignment :: VkDeviceSize 
+                      , vkMemoryTypeBits :: Word32 
+                      }
+  deriving (Eq)
+
+instance Storable VkMemoryRequirements where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkMemoryRequirements <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 8)
+                                  <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSize (poked :: VkMemoryRequirements))
+                *> poke (ptr `plusPtr` 8) (vkAlignment (poked :: VkMemoryRequirements))
+                *> poke (ptr `plusPtr` 16) (vkMemoryTypeBits (poked :: VkMemoryRequirements))
+
+
+-- ** vkGetBufferMemoryRequirements
+foreign import ccall "vkGetBufferMemoryRequirements" vkGetBufferMemoryRequirements :: 
+  VkDevice -> VkBuffer -> Ptr VkMemoryRequirements -> IO ()
+
+-- ** vkBindBufferMemory
+foreign import ccall "vkBindBufferMemory" vkBindBufferMemory :: 
+  VkDevice ->
+  VkBuffer -> VkDeviceMemory -> VkDeviceSize -> IO VkResult
+
+-- ** vkBindImageMemory
+foreign import ccall "vkBindImageMemory" vkBindImageMemory :: 
+  VkDevice ->
+  VkImage -> VkDeviceMemory -> VkDeviceSize -> IO VkResult
+
diff --git a/src/Graphics/Vulkan/OtherTypes.hs b/src/Graphics/Vulkan/OtherTypes.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/OtherTypes.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+module Graphics.Vulkan.OtherTypes where
+import Graphics.Vulkan.Buffer( VkBuffer(..)
+                             )
+import Graphics.Vulkan.Pass( VkAccessFlags(..)
+                           , VkAccessFlagBits(..)
+                           )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Image( VkImage(..)
+                            , VkImageLayout(..)
+                            , VkImageAspectFlagBits(..)
+                            , VkImageSubresourceRange(..)
+                            , VkImageAspectFlags(..)
+                            )
+import Graphics.Vulkan.Core( VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+
+data VkBufferMemoryBarrier =
+  VkBufferMemoryBarrier{ vkSType :: VkStructureType 
+                       , vkPNext :: Ptr Void 
+                       , vkSrcAccessMask :: VkAccessFlags 
+                       , vkDstAccessMask :: VkAccessFlags 
+                       , vkSrcQueueFamilyIndex :: Word32 
+                       , vkDstQueueFamilyIndex :: Word32 
+                       , vkBuffer :: VkBuffer 
+                       , vkOffset :: VkDeviceSize 
+                       , vkSize :: VkDeviceSize 
+                       }
+  deriving (Eq)
+
+instance Storable VkBufferMemoryBarrier where
+  sizeOf ~_ = 56
+  alignment ~_ = 8
+  peek ptr = VkBufferMemoryBarrier <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 16)
+                                   <*> peek (ptr `plusPtr` 20)
+                                   <*> peek (ptr `plusPtr` 24)
+                                   <*> peek (ptr `plusPtr` 28)
+                                   <*> peek (ptr `plusPtr` 32)
+                                   <*> peek (ptr `plusPtr` 40)
+                                   <*> peek (ptr `plusPtr` 48)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 24) (vkSrcQueueFamilyIndex (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 28) (vkDstQueueFamilyIndex (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 32) (vkBuffer (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 40) (vkOffset (poked :: VkBufferMemoryBarrier))
+                *> poke (ptr `plusPtr` 48) (vkSize (poked :: VkBufferMemoryBarrier))
+
+
+
+data VkDrawIndexedIndirectCommand =
+  VkDrawIndexedIndirectCommand{ vkIndexCount :: Word32 
+                              , vkInstanceCount :: Word32 
+                              , vkFirstIndex :: Word32 
+                              , vkVertexOffset :: Int32 
+                              , vkFirstInstance :: Word32 
+                              }
+  deriving (Eq)
+
+instance Storable VkDrawIndexedIndirectCommand where
+  sizeOf ~_ = 20
+  alignment ~_ = 4
+  peek ptr = VkDrawIndexedIndirectCommand <$> peek (ptr `plusPtr` 0)
+                                          <*> peek (ptr `plusPtr` 4)
+                                          <*> peek (ptr `plusPtr` 8)
+                                          <*> peek (ptr `plusPtr` 12)
+                                          <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkIndexCount (poked :: VkDrawIndexedIndirectCommand))
+                *> poke (ptr `plusPtr` 4) (vkInstanceCount (poked :: VkDrawIndexedIndirectCommand))
+                *> poke (ptr `plusPtr` 8) (vkFirstIndex (poked :: VkDrawIndexedIndirectCommand))
+                *> poke (ptr `plusPtr` 12) (vkVertexOffset (poked :: VkDrawIndexedIndirectCommand))
+                *> poke (ptr `plusPtr` 16) (vkFirstInstance (poked :: VkDrawIndexedIndirectCommand))
+
+
+
+data VkImageMemoryBarrier =
+  VkImageMemoryBarrier{ vkSType :: VkStructureType 
+                      , vkPNext :: Ptr Void 
+                      , vkSrcAccessMask :: VkAccessFlags 
+                      , vkDstAccessMask :: VkAccessFlags 
+                      , vkOldLayout :: VkImageLayout 
+                      , vkNewLayout :: VkImageLayout 
+                      , vkSrcQueueFamilyIndex :: Word32 
+                      , vkDstQueueFamilyIndex :: Word32 
+                      , vkImage :: VkImage 
+                      , vkSubresourceRange :: VkImageSubresourceRange 
+                      }
+  deriving (Eq)
+
+instance Storable VkImageMemoryBarrier where
+  sizeOf ~_ = 72
+  alignment ~_ = 8
+  peek ptr = VkImageMemoryBarrier <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 8)
+                                  <*> peek (ptr `plusPtr` 16)
+                                  <*> peek (ptr `plusPtr` 20)
+                                  <*> peek (ptr `plusPtr` 24)
+                                  <*> peek (ptr `plusPtr` 28)
+                                  <*> peek (ptr `plusPtr` 32)
+                                  <*> peek (ptr `plusPtr` 36)
+                                  <*> peek (ptr `plusPtr` 40)
+                                  <*> peek (ptr `plusPtr` 48)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 24) (vkOldLayout (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 28) (vkNewLayout (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 32) (vkSrcQueueFamilyIndex (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 36) (vkDstQueueFamilyIndex (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 40) (vkImage (poked :: VkImageMemoryBarrier))
+                *> poke (ptr `plusPtr` 48) (vkSubresourceRange (poked :: VkImageMemoryBarrier))
+
+
+
+data VkMemoryBarrier =
+  VkMemoryBarrier{ vkSType :: VkStructureType 
+                 , vkPNext :: Ptr Void 
+                 , vkSrcAccessMask :: VkAccessFlags 
+                 , vkDstAccessMask :: VkAccessFlags 
+                 }
+  deriving (Eq)
+
+instance Storable VkMemoryBarrier where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkMemoryBarrier <$> peek (ptr `plusPtr` 0)
+                             <*> peek (ptr `plusPtr` 8)
+                             <*> peek (ptr `plusPtr` 16)
+                             <*> peek (ptr `plusPtr` 20)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkMemoryBarrier))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkMemoryBarrier))
+                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkMemoryBarrier))
+                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkMemoryBarrier))
+
+
+
+data VkDrawIndirectCommand =
+  VkDrawIndirectCommand{ vkVertexCount :: Word32 
+                       , vkInstanceCount :: Word32 
+                       , vkFirstVertex :: Word32 
+                       , vkFirstInstance :: Word32 
+                       }
+  deriving (Eq)
+
+instance Storable VkDrawIndirectCommand where
+  sizeOf ~_ = 16
+  alignment ~_ = 4
+  peek ptr = VkDrawIndirectCommand <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 4)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 12)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkVertexCount (poked :: VkDrawIndirectCommand))
+                *> poke (ptr `plusPtr` 4) (vkInstanceCount (poked :: VkDrawIndirectCommand))
+                *> poke (ptr `plusPtr` 8) (vkFirstVertex (poked :: VkDrawIndirectCommand))
+                *> poke (ptr `plusPtr` 12) (vkFirstInstance (poked :: VkDrawIndirectCommand))
+
+
+
+data VkDispatchIndirectCommand =
+  VkDispatchIndirectCommand{ vkX :: Word32 
+                           , vkY :: Word32 
+                           , vkZ :: Word32 
+                           }
+  deriving (Eq)
+
+instance Storable VkDispatchIndirectCommand where
+  sizeOf ~_ = 12
+  alignment ~_ = 4
+  peek ptr = VkDispatchIndirectCommand <$> peek (ptr `plusPtr` 0)
+                                       <*> peek (ptr `plusPtr` 4)
+                                       <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkX (poked :: VkDispatchIndirectCommand))
+                *> poke (ptr `plusPtr` 4) (vkY (poked :: VkDispatchIndirectCommand))
+                *> poke (ptr `plusPtr` 8) (vkZ (poked :: VkDispatchIndirectCommand))
+
+
diff --git a/src/Graphics/Vulkan/Pass.hs b/src/Graphics/Vulkan/Pass.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Pass.hs
@@ -0,0 +1,374 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Pass where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Graphics.Vulkan.Pipeline( VkPipelineStageFlagBits(..)
+                               , VkPipelineStageFlags(..)
+                               , VkPipelineBindPoint(..)
+                               )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Sampler( VkSampleCountFlagBits(..)
+                              )
+import Graphics.Vulkan.Image( VkImageLayout(..)
+                            )
+import Graphics.Vulkan.ImageView( VkImageView(..)
+                                )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkExtent2D(..)
+                           , VkFlags(..)
+                           , VkFormat(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+
+data VkSubpassDependency =
+  VkSubpassDependency{ vkSrcSubpass :: Word32 
+                     , vkDstSubpass :: Word32 
+                     , vkSrcStageMask :: VkPipelineStageFlags 
+                     , vkDstStageMask :: VkPipelineStageFlags 
+                     , vkSrcAccessMask :: VkAccessFlags 
+                     , vkDstAccessMask :: VkAccessFlags 
+                     , vkDependencyFlags :: VkDependencyFlags 
+                     }
+  deriving (Eq)
+
+instance Storable VkSubpassDependency where
+  sizeOf ~_ = 28
+  alignment ~_ = 4
+  peek ptr = VkSubpassDependency <$> peek (ptr `plusPtr` 0)
+                                 <*> peek (ptr `plusPtr` 4)
+                                 <*> peek (ptr `plusPtr` 8)
+                                 <*> peek (ptr `plusPtr` 12)
+                                 <*> peek (ptr `plusPtr` 16)
+                                 <*> peek (ptr `plusPtr` 20)
+                                 <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSrcSubpass (poked :: VkSubpassDependency))
+                *> poke (ptr `plusPtr` 4) (vkDstSubpass (poked :: VkSubpassDependency))
+                *> poke (ptr `plusPtr` 8) (vkSrcStageMask (poked :: VkSubpassDependency))
+                *> poke (ptr `plusPtr` 12) (vkDstStageMask (poked :: VkSubpassDependency))
+                *> poke (ptr `plusPtr` 16) (vkSrcAccessMask (poked :: VkSubpassDependency))
+                *> poke (ptr `plusPtr` 20) (vkDstAccessMask (poked :: VkSubpassDependency))
+                *> poke (ptr `plusPtr` 24) (vkDependencyFlags (poked :: VkSubpassDependency))
+
+
+-- ** VkSubpassDescriptionFlags
+-- | Opaque flag
+newtype VkSubpassDescriptionFlags = VkSubpassDescriptionFlags VkFlags
+  deriving (Eq, Storable)
+
+newtype VkFramebuffer = VkFramebuffer Word64
+  deriving (Eq, Storable)
+
+-- ** VkAttachmentDescriptionFlags
+
+newtype VkAttachmentDescriptionFlagBits = VkAttachmentDescriptionFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkAttachmentDescriptionFlagBits
+type VkAttachmentDescriptionFlags = VkAttachmentDescriptionFlagBits
+-- | The attachment may alias physical memory of another attachment in the same render pass
+pattern VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = VkAttachmentDescriptionFlagBits 0x1
+
+
+-- ** VkDependencyFlags
+
+newtype VkDependencyFlagBits = VkDependencyFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkDependencyFlagBits
+type VkDependencyFlags = VkDependencyFlagBits
+-- | Dependency is per pixel region 
+pattern VK_DEPENDENCY_BY_REGION_BIT = VkDependencyFlagBits 0x1
+
+
+-- ** vkDestroyRenderPass
+foreign import ccall "vkDestroyRenderPass" vkDestroyRenderPass :: 
+  VkDevice -> VkRenderPass -> Ptr VkAllocationCallbacks -> IO ()
+
+-- ** vkCreateFramebuffer
+foreign import ccall "vkCreateFramebuffer" vkCreateFramebuffer :: 
+  VkDevice ->
+  Ptr VkFramebufferCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkFramebuffer -> IO VkResult
+
+
+data VkFramebufferCreateInfo =
+  VkFramebufferCreateInfo{ vkSType :: VkStructureType 
+                         , vkPNext :: Ptr Void 
+                         , vkFlags :: VkFramebufferCreateFlags 
+                         , vkRenderPass :: VkRenderPass 
+                         , vkAttachmentCount :: Word32 
+                         , vkPAttachments :: Ptr VkImageView 
+                         , vkWidth :: Word32 
+                         , vkHeight :: Word32 
+                         , vkLayers :: Word32 
+                         }
+  deriving (Eq)
+
+instance Storable VkFramebufferCreateInfo where
+  sizeOf ~_ = 64
+  alignment ~_ = 8
+  peek ptr = VkFramebufferCreateInfo <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 8)
+                                     <*> peek (ptr `plusPtr` 16)
+                                     <*> peek (ptr `plusPtr` 24)
+                                     <*> peek (ptr `plusPtr` 32)
+                                     <*> peek (ptr `plusPtr` 40)
+                                     <*> peek (ptr `plusPtr` 48)
+                                     <*> peek (ptr `plusPtr` 52)
+                                     <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkRenderPass (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkAttachmentCount (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPAttachments (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkWidth (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 52) (vkHeight (poked :: VkFramebufferCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkLayers (poked :: VkFramebufferCreateInfo))
+
+
+-- ** vkGetRenderAreaGranularity
+foreign import ccall "vkGetRenderAreaGranularity" vkGetRenderAreaGranularity :: 
+  VkDevice -> VkRenderPass -> Ptr VkExtent2D -> IO ()
+
+-- ** VkAttachmentLoadOp
+
+newtype VkAttachmentLoadOp = VkAttachmentLoadOp Int32
+  deriving (Eq, Storable)
+
+pattern VK_ATTACHMENT_LOAD_OP_LOAD = VkAttachmentLoadOp 0
+
+pattern VK_ATTACHMENT_LOAD_OP_CLEAR = VkAttachmentLoadOp 1
+
+pattern VK_ATTACHMENT_LOAD_OP_DONT_CARE = VkAttachmentLoadOp 2
+
+-- ** VkAttachmentStoreOp
+
+newtype VkAttachmentStoreOp = VkAttachmentStoreOp Int32
+  deriving (Eq, Storable)
+
+pattern VK_ATTACHMENT_STORE_OP_STORE = VkAttachmentStoreOp 0
+
+pattern VK_ATTACHMENT_STORE_OP_DONT_CARE = VkAttachmentStoreOp 1
+
+-- ** VkAccessFlags
+
+newtype VkAccessFlagBits = VkAccessFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkAccessFlagBits
+type VkAccessFlags = VkAccessFlagBits
+-- | Controls coherency of indirect command reads
+pattern VK_ACCESS_INDIRECT_COMMAND_READ_BIT = VkAccessFlagBits 0x1
+-- | Controls coherency of index reads
+pattern VK_ACCESS_INDEX_READ_BIT = VkAccessFlagBits 0x2
+-- | Controls coherency of vertex attribute reads
+pattern VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = VkAccessFlagBits 0x4
+-- | Controls coherency of uniform buffer reads
+pattern VK_ACCESS_UNIFORM_READ_BIT = VkAccessFlagBits 0x8
+-- | Controls coherency of input attachment reads
+pattern VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = VkAccessFlagBits 0x10
+-- | Controls coherency of shader reads
+pattern VK_ACCESS_SHADER_READ_BIT = VkAccessFlagBits 0x20
+-- | Controls coherency of shader writes
+pattern VK_ACCESS_SHADER_WRITE_BIT = VkAccessFlagBits 0x40
+-- | Controls coherency of color attachment reads
+pattern VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = VkAccessFlagBits 0x80
+-- | Controls coherency of color attachment writes
+pattern VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = VkAccessFlagBits 0x100
+-- | Controls coherency of depth/stencil attachment reads
+pattern VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = VkAccessFlagBits 0x200
+-- | Controls coherency of depth/stencil attachment writes
+pattern VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = VkAccessFlagBits 0x400
+-- | Controls coherency of transfer reads
+pattern VK_ACCESS_TRANSFER_READ_BIT = VkAccessFlagBits 0x800
+-- | Controls coherency of transfer writes
+pattern VK_ACCESS_TRANSFER_WRITE_BIT = VkAccessFlagBits 0x1000
+-- | Controls coherency of host reads
+pattern VK_ACCESS_HOST_READ_BIT = VkAccessFlagBits 0x2000
+-- | Controls coherency of host writes
+pattern VK_ACCESS_HOST_WRITE_BIT = VkAccessFlagBits 0x4000
+-- | Controls coherency of memory reads
+pattern VK_ACCESS_MEMORY_READ_BIT = VkAccessFlagBits 0x8000
+-- | Controls coherency of memory writes
+pattern VK_ACCESS_MEMORY_WRITE_BIT = VkAccessFlagBits 0x10000
+
+
+newtype VkRenderPass = VkRenderPass Word64
+  deriving (Eq, Storable)
+
+-- ** vkDestroyFramebuffer
+foreign import ccall "vkDestroyFramebuffer" vkDestroyFramebuffer :: 
+  VkDevice -> VkFramebuffer -> Ptr VkAllocationCallbacks -> IO ()
+
+
+data VkAttachmentReference =
+  VkAttachmentReference{ vkAttachment :: Word32 
+                       , vkLayout :: VkImageLayout 
+                       }
+  deriving (Eq)
+
+instance Storable VkAttachmentReference where
+  sizeOf ~_ = 8
+  alignment ~_ = 4
+  peek ptr = VkAttachmentReference <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 4)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkAttachment (poked :: VkAttachmentReference))
+                *> poke (ptr `plusPtr` 4) (vkLayout (poked :: VkAttachmentReference))
+
+
+-- ** VkRenderPassCreateFlags
+-- | Opaque flag
+newtype VkRenderPassCreateFlags = VkRenderPassCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkAttachmentDescription =
+  VkAttachmentDescription{ vkFlags :: VkAttachmentDescriptionFlags 
+                         , vkFormat :: VkFormat 
+                         , vkSamples :: VkSampleCountFlagBits 
+                         , vkLoadOp :: VkAttachmentLoadOp 
+                         , vkStoreOp :: VkAttachmentStoreOp 
+                         , vkStencilLoadOp :: VkAttachmentLoadOp 
+                         , vkStencilStoreOp :: VkAttachmentStoreOp 
+                         , vkInitialLayout :: VkImageLayout 
+                         , vkFinalLayout :: VkImageLayout 
+                         }
+  deriving (Eq)
+
+instance Storable VkAttachmentDescription where
+  sizeOf ~_ = 36
+  alignment ~_ = 4
+  peek ptr = VkAttachmentDescription <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 4)
+                                     <*> peek (ptr `plusPtr` 8)
+                                     <*> peek (ptr `plusPtr` 12)
+                                     <*> peek (ptr `plusPtr` 16)
+                                     <*> peek (ptr `plusPtr` 20)
+                                     <*> peek (ptr `plusPtr` 24)
+                                     <*> peek (ptr `plusPtr` 28)
+                                     <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkFlags (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 4) (vkFormat (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 8) (vkSamples (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 12) (vkLoadOp (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 16) (vkStoreOp (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 20) (vkStencilLoadOp (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 24) (vkStencilStoreOp (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 28) (vkInitialLayout (poked :: VkAttachmentDescription))
+                *> poke (ptr `plusPtr` 32) (vkFinalLayout (poked :: VkAttachmentDescription))
+
+
+
+data VkSubpassDescription =
+  VkSubpassDescription{ vkFlags :: VkSubpassDescriptionFlags 
+                      , vkPipelineBindPoint :: VkPipelineBindPoint 
+                      , vkInputAttachmentCount :: Word32 
+                      , vkPInputAttachments :: Ptr VkAttachmentReference 
+                      , vkColorAttachmentCount :: Word32 
+                      , vkPColorAttachments :: Ptr VkAttachmentReference 
+                      , vkPResolveAttachments :: Ptr VkAttachmentReference 
+                      , vkPDepthStencilAttachment :: Ptr VkAttachmentReference 
+                      , vkPreserveAttachmentCount :: Word32 
+                      , vkPPreserveAttachments :: Ptr Word32 
+                      }
+  deriving (Eq)
+
+instance Storable VkSubpassDescription where
+  sizeOf ~_ = 72
+  alignment ~_ = 8
+  peek ptr = VkSubpassDescription <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 4)
+                                  <*> peek (ptr `plusPtr` 8)
+                                  <*> peek (ptr `plusPtr` 16)
+                                  <*> peek (ptr `plusPtr` 24)
+                                  <*> peek (ptr `plusPtr` 32)
+                                  <*> peek (ptr `plusPtr` 40)
+                                  <*> peek (ptr `plusPtr` 48)
+                                  <*> peek (ptr `plusPtr` 56)
+                                  <*> peek (ptr `plusPtr` 64)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkFlags (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 4) (vkPipelineBindPoint (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 8) (vkInputAttachmentCount (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 16) (vkPInputAttachments (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 24) (vkColorAttachmentCount (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 32) (vkPColorAttachments (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 40) (vkPResolveAttachments (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 48) (vkPDepthStencilAttachment (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 56) (vkPreserveAttachmentCount (poked :: VkSubpassDescription))
+                *> poke (ptr `plusPtr` 64) (vkPPreserveAttachments (poked :: VkSubpassDescription))
+
+
+-- ** vkCreateRenderPass
+foreign import ccall "vkCreateRenderPass" vkCreateRenderPass :: 
+  VkDevice ->
+  Ptr VkRenderPassCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkRenderPass -> IO VkResult
+
+
+data VkRenderPassCreateInfo =
+  VkRenderPassCreateInfo{ vkSType :: VkStructureType 
+                        , vkPNext :: Ptr Void 
+                        , vkFlags :: VkRenderPassCreateFlags 
+                        , vkAttachmentCount :: Word32 
+                        , vkPAttachments :: Ptr VkAttachmentDescription 
+                        , vkSubpassCount :: Word32 
+                        , vkPSubpasses :: Ptr VkSubpassDescription 
+                        , vkDependencyCount :: Word32 
+                        , vkPDependencies :: Ptr VkSubpassDependency 
+                        }
+  deriving (Eq)
+
+instance Storable VkRenderPassCreateInfo where
+  sizeOf ~_ = 64
+  alignment ~_ = 8
+  peek ptr = VkRenderPassCreateInfo <$> peek (ptr `plusPtr` 0)
+                                    <*> peek (ptr `plusPtr` 8)
+                                    <*> peek (ptr `plusPtr` 16)
+                                    <*> peek (ptr `plusPtr` 20)
+                                    <*> peek (ptr `plusPtr` 24)
+                                    <*> peek (ptr `plusPtr` 32)
+                                    <*> peek (ptr `plusPtr` 40)
+                                    <*> peek (ptr `plusPtr` 48)
+                                    <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkAttachmentCount (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPAttachments (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkSubpassCount (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPSubpasses (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkDependencyCount (poked :: VkRenderPassCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkPDependencies (poked :: VkRenderPassCreateInfo))
+
+
+-- ** VkFramebufferCreateFlags
+-- | Opaque flag
+newtype VkFramebufferCreateFlags = VkFramebufferCreateFlags VkFlags
+  deriving (Eq, Storable)
+
diff --git a/src/Graphics/Vulkan/Pass.hs-boot b/src/Graphics/Vulkan/Pass.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Pass.hs-boot
@@ -0,0 +1,11 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Pass where
+import Data.Word( Word64
+                )
+import Foreign.Storable( Storable(..)
+                       )
+newtype VkRenderPass = VkRenderPass Word64
+  
+instance Eq VkRenderPass
+instance Storable VkRenderPass
+
diff --git a/src/Graphics/Vulkan/Pipeline.hs b/src/Graphics/Vulkan/Pipeline.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Pipeline.hs
@@ -0,0 +1,1007 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Pipeline where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import {-# SOURCE #-} Graphics.Vulkan.Pass( VkRenderPass(..)
+                                          )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Graphics.Vulkan.PipelineCache( VkPipelineCache(..)
+                                    )
+import Data.Int( Int32
+               )
+import Data.Vector.Fixed.Cont( ToPeano
+                             )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.PipelineLayout( VkPipelineLayout(..)
+                                     )
+import Graphics.Vulkan.Shader( VkShaderStageFlagBits(..)
+                             , VkShaderModule(..)
+                             )
+import Graphics.Vulkan.Sampler( VkSampleCountFlagBits(..)
+                              , VkCompareOp(..)
+                              )
+import Data.Vector.Fixed.Storable( Vec
+                                 )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkBool32(..)
+                           , VkExtent2D(..)
+                           , VkFlags(..)
+                           , VkFormat(..)
+                           , VkOffset2D(..)
+                           , VkRect2D(..)
+                           , VkViewport(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize
+                      , CFloat
+                      , CFloat(..)
+                      , CChar
+                      , CSize(..)
+                      )
+
+data VkPipelineTessellationStateCreateInfo =
+  VkPipelineTessellationStateCreateInfo{ vkSType :: VkStructureType 
+                                       , vkPNext :: Ptr Void 
+                                       , vkFlags :: VkPipelineTessellationStateCreateFlags 
+                                       , vkPatchControlPoints :: Word32 
+                                       }
+  deriving (Eq)
+
+instance Storable VkPipelineTessellationStateCreateInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkPipelineTessellationStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                                   <*> peek (ptr `plusPtr` 8)
+                                                   <*> peek (ptr `plusPtr` 16)
+                                                   <*> peek (ptr `plusPtr` 20)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineTessellationStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineTessellationStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineTessellationStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkPatchControlPoints (poked :: VkPipelineTessellationStateCreateInfo))
+
+
+
+data VkVertexInputAttributeDescription =
+  VkVertexInputAttributeDescription{ vkLocation :: Word32 
+                                   , vkBinding :: Word32 
+                                   , vkFormat :: VkFormat 
+                                   , vkOffset :: Word32 
+                                   }
+  deriving (Eq)
+
+instance Storable VkVertexInputAttributeDescription where
+  sizeOf ~_ = 16
+  alignment ~_ = 4
+  peek ptr = VkVertexInputAttributeDescription <$> peek (ptr `plusPtr` 0)
+                                               <*> peek (ptr `plusPtr` 4)
+                                               <*> peek (ptr `plusPtr` 8)
+                                               <*> peek (ptr `plusPtr` 12)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkLocation (poked :: VkVertexInputAttributeDescription))
+                *> poke (ptr `plusPtr` 4) (vkBinding (poked :: VkVertexInputAttributeDescription))
+                *> poke (ptr `plusPtr` 8) (vkFormat (poked :: VkVertexInputAttributeDescription))
+                *> poke (ptr `plusPtr` 12) (vkOffset (poked :: VkVertexInputAttributeDescription))
+
+
+
+data VkGraphicsPipelineCreateInfo =
+  VkGraphicsPipelineCreateInfo{ vkSType :: VkStructureType 
+                              , vkPNext :: Ptr Void 
+                              , vkFlags :: VkPipelineCreateFlags 
+                              , vkStageCount :: Word32 
+                              , vkPStages :: Ptr VkPipelineShaderStageCreateInfo 
+                              , vkPVertexInputState :: Ptr VkPipelineVertexInputStateCreateInfo 
+                              , vkPInputAssemblyState :: Ptr VkPipelineInputAssemblyStateCreateInfo 
+                              , vkPTessellationState :: Ptr VkPipelineTessellationStateCreateInfo 
+                              , vkPViewportState :: Ptr VkPipelineViewportStateCreateInfo 
+                              , vkPRasterizationState :: Ptr VkPipelineRasterizationStateCreateInfo 
+                              , vkPMultisampleState :: Ptr VkPipelineMultisampleStateCreateInfo 
+                              , vkPDepthStencilState :: Ptr VkPipelineDepthStencilStateCreateInfo 
+                              , vkPColorBlendState :: Ptr VkPipelineColorBlendStateCreateInfo 
+                              , vkPDynamicState :: Ptr VkPipelineDynamicStateCreateInfo 
+                              , vkLayout :: VkPipelineLayout 
+                              , vkRenderPass :: VkRenderPass 
+                              , vkSubpass :: Word32 
+                              , vkBasePipelineHandle :: VkPipeline 
+                              , vkBasePipelineIndex :: Int32 
+                              }
+  deriving (Eq)
+
+instance Storable VkGraphicsPipelineCreateInfo where
+  sizeOf ~_ = 144
+  alignment ~_ = 8
+  peek ptr = VkGraphicsPipelineCreateInfo <$> peek (ptr `plusPtr` 0)
+                                          <*> peek (ptr `plusPtr` 8)
+                                          <*> peek (ptr `plusPtr` 16)
+                                          <*> peek (ptr `plusPtr` 20)
+                                          <*> peek (ptr `plusPtr` 24)
+                                          <*> peek (ptr `plusPtr` 32)
+                                          <*> peek (ptr `plusPtr` 40)
+                                          <*> peek (ptr `plusPtr` 48)
+                                          <*> peek (ptr `plusPtr` 56)
+                                          <*> peek (ptr `plusPtr` 64)
+                                          <*> peek (ptr `plusPtr` 72)
+                                          <*> peek (ptr `plusPtr` 80)
+                                          <*> peek (ptr `plusPtr` 88)
+                                          <*> peek (ptr `plusPtr` 96)
+                                          <*> peek (ptr `plusPtr` 104)
+                                          <*> peek (ptr `plusPtr` 112)
+                                          <*> peek (ptr `plusPtr` 120)
+                                          <*> peek (ptr `plusPtr` 128)
+                                          <*> peek (ptr `plusPtr` 136)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkStageCount (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPStages (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPVertexInputState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPInputAssemblyState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkPTessellationState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkPViewportState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 64) (vkPRasterizationState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 72) (vkPMultisampleState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 80) (vkPDepthStencilState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 88) (vkPColorBlendState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 96) (vkPDynamicState (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 104) (vkLayout (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 112) (vkRenderPass (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 120) (vkSubpass (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 128) (vkBasePipelineHandle (poked :: VkGraphicsPipelineCreateInfo))
+                *> poke (ptr `plusPtr` 136) (vkBasePipelineIndex (poked :: VkGraphicsPipelineCreateInfo))
+
+
+-- ** VkCullModeFlags
+
+newtype VkCullModeFlagBits = VkCullModeFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkCullModeFlagBits
+type VkCullModeFlags = VkCullModeFlagBits
+
+pattern VK_CULL_MODE_FRONT_BIT = VkCullModeFlagBits 0x1
+
+pattern VK_CULL_MODE_BACK_BIT = VkCullModeFlagBits 0x2
+
+pattern VK_CULL_MODE_NONE = VkCullModeFlagBits 0x0
+
+pattern VK_CULL_MODE_FRONT_AND_BACK = VkCullModeFlagBits 0x3
+
+-- ** VkPipelineDepthStencilStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineDepthStencilStateCreateFlags = VkPipelineDepthStencilStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkPipelineShaderStageCreateInfo =
+  VkPipelineShaderStageCreateInfo{ vkSType :: VkStructureType 
+                                 , vkPNext :: Ptr Void 
+                                 , vkFlags :: VkPipelineShaderStageCreateFlags 
+                                 , vkStage :: VkShaderStageFlagBits 
+                                 , vkModule :: VkShaderModule 
+                                 , vkPName :: Ptr CChar 
+                                 , vkPSpecializationInfo :: Ptr VkSpecializationInfo 
+                                 }
+  deriving (Eq)
+
+instance Storable VkPipelineShaderStageCreateInfo where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkPipelineShaderStageCreateInfo <$> peek (ptr `plusPtr` 0)
+                                             <*> peek (ptr `plusPtr` 8)
+                                             <*> peek (ptr `plusPtr` 16)
+                                             <*> peek (ptr `plusPtr` 20)
+                                             <*> peek (ptr `plusPtr` 24)
+                                             <*> peek (ptr `plusPtr` 32)
+                                             <*> peek (ptr `plusPtr` 40)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineShaderStageCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineShaderStageCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineShaderStageCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkStage (poked :: VkPipelineShaderStageCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkModule (poked :: VkPipelineShaderStageCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPName (poked :: VkPipelineShaderStageCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPSpecializationInfo (poked :: VkPipelineShaderStageCreateInfo))
+
+
+-- ** VkColorComponentFlags
+
+newtype VkColorComponentFlagBits = VkColorComponentFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkColorComponentFlagBits
+type VkColorComponentFlags = VkColorComponentFlagBits
+
+pattern VK_COLOR_COMPONENT_R_BIT = VkColorComponentFlagBits 0x1
+
+pattern VK_COLOR_COMPONENT_G_BIT = VkColorComponentFlagBits 0x2
+
+pattern VK_COLOR_COMPONENT_B_BIT = VkColorComponentFlagBits 0x4
+
+pattern VK_COLOR_COMPONENT_A_BIT = VkColorComponentFlagBits 0x8
+
+
+
+data VkComputePipelineCreateInfo =
+  VkComputePipelineCreateInfo{ vkSType :: VkStructureType 
+                             , vkPNext :: Ptr Void 
+                             , vkFlags :: VkPipelineCreateFlags 
+                             , vkStage :: VkPipelineShaderStageCreateInfo 
+                             , vkLayout :: VkPipelineLayout 
+                             , vkBasePipelineHandle :: VkPipeline 
+                             , vkBasePipelineIndex :: Int32 
+                             }
+  deriving (Eq)
+
+instance Storable VkComputePipelineCreateInfo where
+  sizeOf ~_ = 96
+  alignment ~_ = 8
+  peek ptr = VkComputePipelineCreateInfo <$> peek (ptr `plusPtr` 0)
+                                         <*> peek (ptr `plusPtr` 8)
+                                         <*> peek (ptr `plusPtr` 16)
+                                         <*> peek (ptr `plusPtr` 24)
+                                         <*> peek (ptr `plusPtr` 72)
+                                         <*> peek (ptr `plusPtr` 80)
+                                         <*> peek (ptr `plusPtr` 88)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkComputePipelineCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkComputePipelineCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkComputePipelineCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkStage (poked :: VkComputePipelineCreateInfo))
+                *> poke (ptr `plusPtr` 72) (vkLayout (poked :: VkComputePipelineCreateInfo))
+                *> poke (ptr `plusPtr` 80) (vkBasePipelineHandle (poked :: VkComputePipelineCreateInfo))
+                *> poke (ptr `plusPtr` 88) (vkBasePipelineIndex (poked :: VkComputePipelineCreateInfo))
+
+
+-- ** VkStencilOp
+
+newtype VkStencilOp = VkStencilOp Int32
+  deriving (Eq, Storable)
+
+pattern VK_STENCIL_OP_KEEP = VkStencilOp 0
+
+pattern VK_STENCIL_OP_ZERO = VkStencilOp 1
+
+pattern VK_STENCIL_OP_REPLACE = VkStencilOp 2
+
+pattern VK_STENCIL_OP_INCREMENT_AND_CLAMP = VkStencilOp 3
+
+pattern VK_STENCIL_OP_DECREMENT_AND_CLAMP = VkStencilOp 4
+
+pattern VK_STENCIL_OP_INVERT = VkStencilOp 5
+
+pattern VK_STENCIL_OP_INCREMENT_AND_WRAP = VkStencilOp 6
+
+pattern VK_STENCIL_OP_DECREMENT_AND_WRAP = VkStencilOp 7
+
+
+data VkSpecializationInfo =
+  VkSpecializationInfo{ vkMapEntryCount :: Word32 
+                      , vkPMapEntries :: Ptr VkSpecializationMapEntry 
+                      , vkDataSize :: CSize 
+                      , vkPData :: Ptr Void 
+                      }
+  deriving (Eq)
+
+instance Storable VkSpecializationInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkSpecializationInfo <$> peek (ptr `plusPtr` 0)
+                                  <*> peek (ptr `plusPtr` 8)
+                                  <*> peek (ptr `plusPtr` 16)
+                                  <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkMapEntryCount (poked :: VkSpecializationInfo))
+                *> poke (ptr `plusPtr` 8) (vkPMapEntries (poked :: VkSpecializationInfo))
+                *> poke (ptr `plusPtr` 16) (vkDataSize (poked :: VkSpecializationInfo))
+                *> poke (ptr `plusPtr` 24) (vkPData (poked :: VkSpecializationInfo))
+
+
+-- ** VkPipelineColorBlendStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineColorBlendStateCreateFlags = VkPipelineColorBlendStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+newtype VkPipeline = VkPipeline Word64
+  deriving (Eq, Storable)
+
+-- ** VkPipelineInputAssemblyStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineInputAssemblyStateCreateFlags = VkPipelineInputAssemblyStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** vkCreateGraphicsPipelines
+foreign import ccall "vkCreateGraphicsPipelines" vkCreateGraphicsPipelines :: 
+  VkDevice ->
+  VkPipelineCache ->
+    Word32 ->
+      Ptr VkGraphicsPipelineCreateInfo ->
+        Ptr VkAllocationCallbacks -> Ptr VkPipeline -> IO VkResult
+
+-- ** VkFrontFace
+
+newtype VkFrontFace = VkFrontFace Int32
+  deriving (Eq, Storable)
+
+pattern VK_FRONT_FACE_COUNTER_CLOCKWISE = VkFrontFace 0
+
+pattern VK_FRONT_FACE_CLOCKWISE = VkFrontFace 1
+
+-- ** VkPolygonMode
+
+newtype VkPolygonMode = VkPolygonMode Int32
+  deriving (Eq, Storable)
+
+pattern VK_POLYGON_MODE_FILL = VkPolygonMode 0
+
+pattern VK_POLYGON_MODE_LINE = VkPolygonMode 1
+
+pattern VK_POLYGON_MODE_POINT = VkPolygonMode 2
+
+-- ** VkPipelineViewportStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineViewportStateCreateFlags = VkPipelineViewportStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** VkLogicOp
+
+newtype VkLogicOp = VkLogicOp Int32
+  deriving (Eq, Storable)
+
+pattern VK_LOGIC_OP_CLEAR = VkLogicOp 0
+
+pattern VK_LOGIC_OP_AND = VkLogicOp 1
+
+pattern VK_LOGIC_OP_AND_REVERSE = VkLogicOp 2
+
+pattern VK_LOGIC_OP_COPY = VkLogicOp 3
+
+pattern VK_LOGIC_OP_AND_INVERTED = VkLogicOp 4
+
+pattern VK_LOGIC_OP_NO_OP = VkLogicOp 5
+
+pattern VK_LOGIC_OP_XOR = VkLogicOp 6
+
+pattern VK_LOGIC_OP_OR = VkLogicOp 7
+
+pattern VK_LOGIC_OP_NOR = VkLogicOp 8
+
+pattern VK_LOGIC_OP_EQUIVALENT = VkLogicOp 9
+
+pattern VK_LOGIC_OP_INVERT = VkLogicOp 10
+
+pattern VK_LOGIC_OP_OR_REVERSE = VkLogicOp 11
+
+pattern VK_LOGIC_OP_COPY_INVERTED = VkLogicOp 12
+
+pattern VK_LOGIC_OP_OR_INVERTED = VkLogicOp 13
+
+pattern VK_LOGIC_OP_NAND = VkLogicOp 14
+
+pattern VK_LOGIC_OP_SET = VkLogicOp 15
+
+-- ** VkPipelineCreateFlags
+
+newtype VkPipelineCreateFlagBits = VkPipelineCreateFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkPipelineCreateFlagBits
+type VkPipelineCreateFlags = VkPipelineCreateFlagBits
+
+pattern VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = VkPipelineCreateFlagBits 0x1
+
+pattern VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = VkPipelineCreateFlagBits 0x2
+
+pattern VK_PIPELINE_CREATE_DERIVATIVE_BIT = VkPipelineCreateFlagBits 0x4
+
+
+-- ** VkPipelineRasterizationStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineRasterizationStateCreateFlags = VkPipelineRasterizationStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** VkDynamicState
+
+newtype VkDynamicState = VkDynamicState Int32
+  deriving (Eq, Storable)
+
+pattern VK_DYNAMIC_STATE_VIEWPORT = VkDynamicState 0
+
+pattern VK_DYNAMIC_STATE_SCISSOR = VkDynamicState 1
+
+pattern VK_DYNAMIC_STATE_LINE_WIDTH = VkDynamicState 2
+
+pattern VK_DYNAMIC_STATE_DEPTH_BIAS = VkDynamicState 3
+
+pattern VK_DYNAMIC_STATE_BLEND_CONSTANTS = VkDynamicState 4
+
+pattern VK_DYNAMIC_STATE_DEPTH_BOUNDS = VkDynamicState 5
+
+pattern VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK = VkDynamicState 6
+
+pattern VK_DYNAMIC_STATE_STENCIL_WRITE_MASK = VkDynamicState 7
+
+pattern VK_DYNAMIC_STATE_STENCIL_REFERENCE = VkDynamicState 8
+
+-- ** VkPipelineBindPoint
+
+newtype VkPipelineBindPoint = VkPipelineBindPoint Int32
+  deriving (Eq, Storable)
+
+pattern VK_PIPELINE_BIND_POINT_GRAPHICS = VkPipelineBindPoint 0
+
+pattern VK_PIPELINE_BIND_POINT_COMPUTE = VkPipelineBindPoint 1
+
+-- ** VkPipelineDynamicStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineDynamicStateCreateFlags = VkPipelineDynamicStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkPipelineRasterizationStateCreateInfo =
+  VkPipelineRasterizationStateCreateInfo{ vkSType :: VkStructureType 
+                                        , vkPNext :: Ptr Void 
+                                        , vkFlags :: VkPipelineRasterizationStateCreateFlags 
+                                        , vkDepthClampEnable :: VkBool32 
+                                        , vkRasterizerDiscardEnable :: VkBool32 
+                                        , vkPolygonMode :: VkPolygonMode 
+                                        , vkCullMode :: VkCullModeFlags 
+                                        , vkFrontFace :: VkFrontFace 
+                                        , vkDepthBiasEnable :: VkBool32 
+                                        , vkDepthBiasConstantFactor :: CFloat 
+                                        , vkDepthBiasClamp :: CFloat 
+                                        , vkDepthBiasSlopeFactor :: CFloat 
+                                        , vkLineWidth :: CFloat 
+                                        }
+  deriving (Eq)
+
+instance Storable VkPipelineRasterizationStateCreateInfo where
+  sizeOf ~_ = 64
+  alignment ~_ = 8
+  peek ptr = VkPipelineRasterizationStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                                    <*> peek (ptr `plusPtr` 8)
+                                                    <*> peek (ptr `plusPtr` 16)
+                                                    <*> peek (ptr `plusPtr` 20)
+                                                    <*> peek (ptr `plusPtr` 24)
+                                                    <*> peek (ptr `plusPtr` 28)
+                                                    <*> peek (ptr `plusPtr` 32)
+                                                    <*> peek (ptr `plusPtr` 36)
+                                                    <*> peek (ptr `plusPtr` 40)
+                                                    <*> peek (ptr `plusPtr` 44)
+                                                    <*> peek (ptr `plusPtr` 48)
+                                                    <*> peek (ptr `plusPtr` 52)
+                                                    <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkDepthClampEnable (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkRasterizerDiscardEnable (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 28) (vkPolygonMode (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkCullMode (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 36) (vkFrontFace (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkDepthBiasEnable (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 44) (vkDepthBiasConstantFactor (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkDepthBiasClamp (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 52) (vkDepthBiasSlopeFactor (poked :: VkPipelineRasterizationStateCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkLineWidth (poked :: VkPipelineRasterizationStateCreateInfo))
+
+
+-- ** VkBlendOp
+
+newtype VkBlendOp = VkBlendOp Int32
+  deriving (Eq, Storable)
+
+pattern VK_BLEND_OP_ADD = VkBlendOp 0
+
+pattern VK_BLEND_OP_SUBTRACT = VkBlendOp 1
+
+pattern VK_BLEND_OP_REVERSE_SUBTRACT = VkBlendOp 2
+
+pattern VK_BLEND_OP_MIN = VkBlendOp 3
+
+pattern VK_BLEND_OP_MAX = VkBlendOp 4
+
+-- ** vkDestroyPipeline
+foreign import ccall "vkDestroyPipeline" vkDestroyPipeline :: 
+  VkDevice -> VkPipeline -> Ptr VkAllocationCallbacks -> IO ()
+
+-- ** VkPipelineShaderStageCreateFlags
+-- | Opaque flag
+newtype VkPipelineShaderStageCreateFlags = VkPipelineShaderStageCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkPipelineViewportStateCreateInfo =
+  VkPipelineViewportStateCreateInfo{ vkSType :: VkStructureType 
+                                   , vkPNext :: Ptr Void 
+                                   , vkFlags :: VkPipelineViewportStateCreateFlags 
+                                   , vkViewportCount :: Word32 
+                                   , vkPViewports :: Ptr VkViewport 
+                                   , vkScissorCount :: Word32 
+                                   , vkPScissors :: Ptr VkRect2D 
+                                   }
+  deriving (Eq)
+
+instance Storable VkPipelineViewportStateCreateInfo where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkPipelineViewportStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                               <*> peek (ptr `plusPtr` 8)
+                                               <*> peek (ptr `plusPtr` 16)
+                                               <*> peek (ptr `plusPtr` 20)
+                                               <*> peek (ptr `plusPtr` 24)
+                                               <*> peek (ptr `plusPtr` 32)
+                                               <*> peek (ptr `plusPtr` 40)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineViewportStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineViewportStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineViewportStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkViewportCount (poked :: VkPipelineViewportStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPViewports (poked :: VkPipelineViewportStateCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkScissorCount (poked :: VkPipelineViewportStateCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPScissors (poked :: VkPipelineViewportStateCreateInfo))
+
+
+-- ** VkPipelineTessellationStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineTessellationStateCreateFlags = VkPipelineTessellationStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkPipelineVertexInputStateCreateInfo =
+  VkPipelineVertexInputStateCreateInfo{ vkSType :: VkStructureType 
+                                      , vkPNext :: Ptr Void 
+                                      , vkFlags :: VkPipelineVertexInputStateCreateFlags 
+                                      , vkVertexBindingDescriptionCount :: Word32 
+                                      , vkPVertexBindingDescriptions :: Ptr VkVertexInputBindingDescription 
+                                      , vkVertexAttributeDescriptionCount :: Word32 
+                                      , vkPVertexAttributeDescriptions :: Ptr VkVertexInputAttributeDescription 
+                                      }
+  deriving (Eq)
+
+instance Storable VkPipelineVertexInputStateCreateInfo where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkPipelineVertexInputStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                                  <*> peek (ptr `plusPtr` 8)
+                                                  <*> peek (ptr `plusPtr` 16)
+                                                  <*> peek (ptr `plusPtr` 20)
+                                                  <*> peek (ptr `plusPtr` 24)
+                                                  <*> peek (ptr `plusPtr` 32)
+                                                  <*> peek (ptr `plusPtr` 40)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineVertexInputStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineVertexInputStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineVertexInputStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkVertexBindingDescriptionCount (poked :: VkPipelineVertexInputStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPVertexBindingDescriptions (poked :: VkPipelineVertexInputStateCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkVertexAttributeDescriptionCount (poked :: VkPipelineVertexInputStateCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPVertexAttributeDescriptions (poked :: VkPipelineVertexInputStateCreateInfo))
+
+
+-- ** VkPrimitiveTopology
+
+newtype VkPrimitiveTopology = VkPrimitiveTopology Int32
+  deriving (Eq, Storable)
+
+pattern VK_PRIMITIVE_TOPOLOGY_POINT_LIST = VkPrimitiveTopology 0
+
+pattern VK_PRIMITIVE_TOPOLOGY_LINE_LIST = VkPrimitiveTopology 1
+
+pattern VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = VkPrimitiveTopology 2
+
+pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = VkPrimitiveTopology 3
+
+pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = VkPrimitiveTopology 4
+
+pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = VkPrimitiveTopology 5
+
+pattern VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY = VkPrimitiveTopology 6
+
+pattern VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY = VkPrimitiveTopology 7
+
+pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY = VkPrimitiveTopology 8
+
+pattern VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY = VkPrimitiveTopology 9
+
+pattern VK_PRIMITIVE_TOPOLOGY_PATCH_LIST = VkPrimitiveTopology 10
+
+
+data VkPipelineInputAssemblyStateCreateInfo =
+  VkPipelineInputAssemblyStateCreateInfo{ vkSType :: VkStructureType 
+                                        , vkPNext :: Ptr Void 
+                                        , vkFlags :: VkPipelineInputAssemblyStateCreateFlags 
+                                        , vkTopology :: VkPrimitiveTopology 
+                                        , vkPrimitiveRestartEnable :: VkBool32 
+                                        }
+  deriving (Eq)
+
+instance Storable VkPipelineInputAssemblyStateCreateInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkPipelineInputAssemblyStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                                    <*> peek (ptr `plusPtr` 8)
+                                                    <*> peek (ptr `plusPtr` 16)
+                                                    <*> peek (ptr `plusPtr` 20)
+                                                    <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineInputAssemblyStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineInputAssemblyStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineInputAssemblyStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkTopology (poked :: VkPipelineInputAssemblyStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPrimitiveRestartEnable (poked :: VkPipelineInputAssemblyStateCreateInfo))
+
+
+
+data VkPipelineColorBlendStateCreateInfo =
+  VkPipelineColorBlendStateCreateInfo{ vkSType :: VkStructureType 
+                                     , vkPNext :: Ptr Void 
+                                     , vkFlags :: VkPipelineColorBlendStateCreateFlags 
+                                     , vkLogicOpEnable :: VkBool32 
+                                     , vkLogicOp :: VkLogicOp 
+                                     , vkAttachmentCount :: Word32 
+                                     , vkPAttachments :: Ptr VkPipelineColorBlendAttachmentState 
+                                     , vkBlendConstants :: Vec (ToPeano 4) CFloat 
+                                     }
+  deriving (Eq)
+
+instance Storable VkPipelineColorBlendStateCreateInfo where
+  sizeOf ~_ = 56
+  alignment ~_ = 8
+  peek ptr = VkPipelineColorBlendStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                                 <*> peek (ptr `plusPtr` 8)
+                                                 <*> peek (ptr `plusPtr` 16)
+                                                 <*> peek (ptr `plusPtr` 20)
+                                                 <*> peek (ptr `plusPtr` 24)
+                                                 <*> peek (ptr `plusPtr` 28)
+                                                 <*> peek (ptr `plusPtr` 32)
+                                                 <*> peek (ptr `plusPtr` 40)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineColorBlendStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineColorBlendStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineColorBlendStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkLogicOpEnable (poked :: VkPipelineColorBlendStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkLogicOp (poked :: VkPipelineColorBlendStateCreateInfo))
+                *> poke (ptr `plusPtr` 28) (vkAttachmentCount (poked :: VkPipelineColorBlendStateCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPAttachments (poked :: VkPipelineColorBlendStateCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkBlendConstants (poked :: VkPipelineColorBlendStateCreateInfo))
+
+
+
+data VkPipelineDynamicStateCreateInfo =
+  VkPipelineDynamicStateCreateInfo{ vkSType :: VkStructureType 
+                                  , vkPNext :: Ptr Void 
+                                  , vkFlags :: VkPipelineDynamicStateCreateFlags 
+                                  , vkDynamicStateCount :: Word32 
+                                  , vkPDynamicStates :: Ptr VkDynamicState 
+                                  }
+  deriving (Eq)
+
+instance Storable VkPipelineDynamicStateCreateInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkPipelineDynamicStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                              <*> peek (ptr `plusPtr` 8)
+                                              <*> peek (ptr `plusPtr` 16)
+                                              <*> peek (ptr `plusPtr` 20)
+                                              <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineDynamicStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineDynamicStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineDynamicStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkDynamicStateCount (poked :: VkPipelineDynamicStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPDynamicStates (poked :: VkPipelineDynamicStateCreateInfo))
+
+
+
+data VkSpecializationMapEntry =
+  VkSpecializationMapEntry{ vkConstantID :: Word32 
+                          , vkOffset :: Word32 
+                          , vkSize :: CSize 
+                          }
+  deriving (Eq)
+
+instance Storable VkSpecializationMapEntry where
+  sizeOf ~_ = 16
+  alignment ~_ = 8
+  peek ptr = VkSpecializationMapEntry <$> peek (ptr `plusPtr` 0)
+                                      <*> peek (ptr `plusPtr` 4)
+                                      <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkConstantID (poked :: VkSpecializationMapEntry))
+                *> poke (ptr `plusPtr` 4) (vkOffset (poked :: VkSpecializationMapEntry))
+                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkSpecializationMapEntry))
+
+
+-- ** VkPipelineVertexInputStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineVertexInputStateCreateFlags = VkPipelineVertexInputStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** VkVertexInputRate
+
+newtype VkVertexInputRate = VkVertexInputRate Int32
+  deriving (Eq, Storable)
+
+pattern VK_VERTEX_INPUT_RATE_VERTEX = VkVertexInputRate 0
+
+pattern VK_VERTEX_INPUT_RATE_INSTANCE = VkVertexInputRate 1
+
+-- ** VkPipelineStageFlags
+
+newtype VkPipelineStageFlagBits = VkPipelineStageFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkPipelineStageFlagBits
+type VkPipelineStageFlags = VkPipelineStageFlagBits
+-- | Before subsequent commands are processed
+pattern VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = VkPipelineStageFlagBits 0x1
+-- | Draw/DispatchIndirect command fetch
+pattern VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = VkPipelineStageFlagBits 0x2
+-- | Vertex/index fetch
+pattern VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = VkPipelineStageFlagBits 0x4
+-- | Vertex shading
+pattern VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = VkPipelineStageFlagBits 0x8
+-- | Tessellation control shading
+pattern VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = VkPipelineStageFlagBits 0x10
+-- | Tessellation evaluation shading
+pattern VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = VkPipelineStageFlagBits 0x20
+-- | Geometry shading
+pattern VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = VkPipelineStageFlagBits 0x40
+-- | Fragment shading
+pattern VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = VkPipelineStageFlagBits 0x80
+-- | Early fragment (depth and stencil) tests
+pattern VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = VkPipelineStageFlagBits 0x100
+-- | Late fragment (depth and stencil) tests
+pattern VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = VkPipelineStageFlagBits 0x200
+-- | Color attachment writes
+pattern VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = VkPipelineStageFlagBits 0x400
+-- | Compute shading
+pattern VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = VkPipelineStageFlagBits 0x800
+-- | Transfer/copy operations
+pattern VK_PIPELINE_STAGE_TRANSFER_BIT = VkPipelineStageFlagBits 0x1000
+-- | After previous commands have completed
+pattern VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = VkPipelineStageFlagBits 0x2000
+-- | Indicates host (CPU) is a source/sink of the dependency
+pattern VK_PIPELINE_STAGE_HOST_BIT = VkPipelineStageFlagBits 0x4000
+-- | All stages of the graphics pipeline
+pattern VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = VkPipelineStageFlagBits 0x8000
+-- | All stages supported on the queue
+pattern VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = VkPipelineStageFlagBits 0x10000
+
+
+
+data VkPipelineColorBlendAttachmentState =
+  VkPipelineColorBlendAttachmentState{ vkBlendEnable :: VkBool32 
+                                     , vkSrcColorBlendFactor :: VkBlendFactor 
+                                     , vkDstColorBlendFactor :: VkBlendFactor 
+                                     , vkColorBlendOp :: VkBlendOp 
+                                     , vkSrcAlphaBlendFactor :: VkBlendFactor 
+                                     , vkDstAlphaBlendFactor :: VkBlendFactor 
+                                     , vkAlphaBlendOp :: VkBlendOp 
+                                     , vkColorWriteMask :: VkColorComponentFlags 
+                                     }
+  deriving (Eq)
+
+instance Storable VkPipelineColorBlendAttachmentState where
+  sizeOf ~_ = 32
+  alignment ~_ = 4
+  peek ptr = VkPipelineColorBlendAttachmentState <$> peek (ptr `plusPtr` 0)
+                                                 <*> peek (ptr `plusPtr` 4)
+                                                 <*> peek (ptr `plusPtr` 8)
+                                                 <*> peek (ptr `plusPtr` 12)
+                                                 <*> peek (ptr `plusPtr` 16)
+                                                 <*> peek (ptr `plusPtr` 20)
+                                                 <*> peek (ptr `plusPtr` 24)
+                                                 <*> peek (ptr `plusPtr` 28)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkBlendEnable (poked :: VkPipelineColorBlendAttachmentState))
+                *> poke (ptr `plusPtr` 4) (vkSrcColorBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
+                *> poke (ptr `plusPtr` 8) (vkDstColorBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
+                *> poke (ptr `plusPtr` 12) (vkColorBlendOp (poked :: VkPipelineColorBlendAttachmentState))
+                *> poke (ptr `plusPtr` 16) (vkSrcAlphaBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
+                *> poke (ptr `plusPtr` 20) (vkDstAlphaBlendFactor (poked :: VkPipelineColorBlendAttachmentState))
+                *> poke (ptr `plusPtr` 24) (vkAlphaBlendOp (poked :: VkPipelineColorBlendAttachmentState))
+                *> poke (ptr `plusPtr` 28) (vkColorWriteMask (poked :: VkPipelineColorBlendAttachmentState))
+
+
+-- ** VkBlendFactor
+
+newtype VkBlendFactor = VkBlendFactor Int32
+  deriving (Eq, Storable)
+
+pattern VK_BLEND_FACTOR_ZERO = VkBlendFactor 0
+
+pattern VK_BLEND_FACTOR_ONE = VkBlendFactor 1
+
+pattern VK_BLEND_FACTOR_SRC_COLOR = VkBlendFactor 2
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = VkBlendFactor 3
+
+pattern VK_BLEND_FACTOR_DST_COLOR = VkBlendFactor 4
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR = VkBlendFactor 5
+
+pattern VK_BLEND_FACTOR_SRC_ALPHA = VkBlendFactor 6
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = VkBlendFactor 7
+
+pattern VK_BLEND_FACTOR_DST_ALPHA = VkBlendFactor 8
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = VkBlendFactor 9
+
+pattern VK_BLEND_FACTOR_CONSTANT_COLOR = VkBlendFactor 10
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = VkBlendFactor 11
+
+pattern VK_BLEND_FACTOR_CONSTANT_ALPHA = VkBlendFactor 12
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = VkBlendFactor 13
+
+pattern VK_BLEND_FACTOR_SRC_ALPHA_SATURATE = VkBlendFactor 14
+
+pattern VK_BLEND_FACTOR_SRC1_COLOR = VkBlendFactor 15
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR = VkBlendFactor 16
+
+pattern VK_BLEND_FACTOR_SRC1_ALPHA = VkBlendFactor 17
+
+pattern VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA = VkBlendFactor 18
+
+newtype VkSampleMask = VkSampleMask Word32
+  deriving (Eq, Storable)
+
+-- ** VkPipelineMultisampleStateCreateFlags
+-- | Opaque flag
+newtype VkPipelineMultisampleStateCreateFlags = VkPipelineMultisampleStateCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+
+data VkPipelineMultisampleStateCreateInfo =
+  VkPipelineMultisampleStateCreateInfo{ vkSType :: VkStructureType 
+                                      , vkPNext :: Ptr Void 
+                                      , vkFlags :: VkPipelineMultisampleStateCreateFlags 
+                                      , vkRasterizationSamples :: VkSampleCountFlagBits 
+                                      , vkSampleShadingEnable :: VkBool32 
+                                      , vkMinSampleShading :: CFloat 
+                                      , vkPSampleMask :: Ptr VkSampleMask 
+                                      , vkAlphaToCoverageEnable :: VkBool32 
+                                      , vkAlphaToOneEnable :: VkBool32 
+                                      }
+  deriving (Eq)
+
+instance Storable VkPipelineMultisampleStateCreateInfo where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkPipelineMultisampleStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                                  <*> peek (ptr `plusPtr` 8)
+                                                  <*> peek (ptr `plusPtr` 16)
+                                                  <*> peek (ptr `plusPtr` 20)
+                                                  <*> peek (ptr `plusPtr` 24)
+                                                  <*> peek (ptr `plusPtr` 28)
+                                                  <*> peek (ptr `plusPtr` 32)
+                                                  <*> peek (ptr `plusPtr` 40)
+                                                  <*> peek (ptr `plusPtr` 44)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkRasterizationSamples (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkSampleShadingEnable (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 28) (vkMinSampleShading (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPSampleMask (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkAlphaToCoverageEnable (poked :: VkPipelineMultisampleStateCreateInfo))
+                *> poke (ptr `plusPtr` 44) (vkAlphaToOneEnable (poked :: VkPipelineMultisampleStateCreateInfo))
+
+
+
+data VkVertexInputBindingDescription =
+  VkVertexInputBindingDescription{ vkBinding :: Word32 
+                                 , vkStride :: Word32 
+                                 , vkInputRate :: VkVertexInputRate 
+                                 }
+  deriving (Eq)
+
+instance Storable VkVertexInputBindingDescription where
+  sizeOf ~_ = 12
+  alignment ~_ = 4
+  peek ptr = VkVertexInputBindingDescription <$> peek (ptr `plusPtr` 0)
+                                             <*> peek (ptr `plusPtr` 4)
+                                             <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkBinding (poked :: VkVertexInputBindingDescription))
+                *> poke (ptr `plusPtr` 4) (vkStride (poked :: VkVertexInputBindingDescription))
+                *> poke (ptr `plusPtr` 8) (vkInputRate (poked :: VkVertexInputBindingDescription))
+
+
+
+data VkPipelineDepthStencilStateCreateInfo =
+  VkPipelineDepthStencilStateCreateInfo{ vkSType :: VkStructureType 
+                                       , vkPNext :: Ptr Void 
+                                       , vkFlags :: VkPipelineDepthStencilStateCreateFlags 
+                                       , vkDepthTestEnable :: VkBool32 
+                                       , vkDepthWriteEnable :: VkBool32 
+                                       , vkDepthCompareOp :: VkCompareOp 
+                                       , vkDepthBoundsTestEnable :: VkBool32 
+                                       , vkStencilTestEnable :: VkBool32 
+                                       , vkFront :: VkStencilOpState 
+                                       , vkBack :: VkStencilOpState 
+                                       , vkMinDepthBounds :: CFloat 
+                                       , vkMaxDepthBounds :: CFloat 
+                                       }
+  deriving (Eq)
+
+instance Storable VkPipelineDepthStencilStateCreateInfo where
+  sizeOf ~_ = 104
+  alignment ~_ = 8
+  peek ptr = VkPipelineDepthStencilStateCreateInfo <$> peek (ptr `plusPtr` 0)
+                                                   <*> peek (ptr `plusPtr` 8)
+                                                   <*> peek (ptr `plusPtr` 16)
+                                                   <*> peek (ptr `plusPtr` 20)
+                                                   <*> peek (ptr `plusPtr` 24)
+                                                   <*> peek (ptr `plusPtr` 28)
+                                                   <*> peek (ptr `plusPtr` 32)
+                                                   <*> peek (ptr `plusPtr` 36)
+                                                   <*> peek (ptr `plusPtr` 40)
+                                                   <*> peek (ptr `plusPtr` 68)
+                                                   <*> peek (ptr `plusPtr` 96)
+                                                   <*> peek (ptr `plusPtr` 100)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkDepthTestEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkDepthWriteEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 28) (vkDepthCompareOp (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkDepthBoundsTestEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 36) (vkStencilTestEnable (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkFront (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 68) (vkBack (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 96) (vkMinDepthBounds (poked :: VkPipelineDepthStencilStateCreateInfo))
+                *> poke (ptr `plusPtr` 100) (vkMaxDepthBounds (poked :: VkPipelineDepthStencilStateCreateInfo))
+
+
+-- ** vkCreateComputePipelines
+foreign import ccall "vkCreateComputePipelines" vkCreateComputePipelines :: 
+  VkDevice ->
+  VkPipelineCache ->
+    Word32 ->
+      Ptr VkComputePipelineCreateInfo ->
+        Ptr VkAllocationCallbacks -> Ptr VkPipeline -> IO VkResult
+
+
+data VkStencilOpState =
+  VkStencilOpState{ vkFailOp :: VkStencilOp 
+                  , vkPassOp :: VkStencilOp 
+                  , vkDepthFailOp :: VkStencilOp 
+                  , vkCompareOp :: VkCompareOp 
+                  , vkCompareMask :: Word32 
+                  , vkWriteMask :: Word32 
+                  , vkReference :: Word32 
+                  }
+  deriving (Eq)
+
+instance Storable VkStencilOpState where
+  sizeOf ~_ = 28
+  alignment ~_ = 4
+  peek ptr = VkStencilOpState <$> peek (ptr `plusPtr` 0)
+                              <*> peek (ptr `plusPtr` 4)
+                              <*> peek (ptr `plusPtr` 8)
+                              <*> peek (ptr `plusPtr` 12)
+                              <*> peek (ptr `plusPtr` 16)
+                              <*> peek (ptr `plusPtr` 20)
+                              <*> peek (ptr `plusPtr` 24)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkFailOp (poked :: VkStencilOpState))
+                *> poke (ptr `plusPtr` 4) (vkPassOp (poked :: VkStencilOpState))
+                *> poke (ptr `plusPtr` 8) (vkDepthFailOp (poked :: VkStencilOpState))
+                *> poke (ptr `plusPtr` 12) (vkCompareOp (poked :: VkStencilOpState))
+                *> poke (ptr `plusPtr` 16) (vkCompareMask (poked :: VkStencilOpState))
+                *> poke (ptr `plusPtr` 20) (vkWriteMask (poked :: VkStencilOpState))
+                *> poke (ptr `plusPtr` 24) (vkReference (poked :: VkStencilOpState))
+
+
diff --git a/src/Graphics/Vulkan/PipelineCache.hs b/src/Graphics/Vulkan/PipelineCache.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/PipelineCache.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.PipelineCache where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize
+                      , CSize(..)
+                      )
+-- ** vkCreatePipelineCache
+foreign import ccall "vkCreatePipelineCache" vkCreatePipelineCache :: 
+  VkDevice ->
+  Ptr VkPipelineCacheCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkPipelineCache -> IO VkResult
+
+-- ** vkGetPipelineCacheData
+foreign import ccall "vkGetPipelineCacheData" vkGetPipelineCacheData :: 
+  VkDevice -> VkPipelineCache -> Ptr CSize -> Ptr Void -> IO VkResult
+
+newtype VkPipelineCache = VkPipelineCache Word64
+  deriving (Eq, Storable)
+
+
+data VkPipelineCacheCreateInfo =
+  VkPipelineCacheCreateInfo{ vkSType :: VkStructureType 
+                           , vkPNext :: Ptr Void 
+                           , vkFlags :: VkPipelineCacheCreateFlags 
+                           , vkInitialDataSize :: CSize 
+                           , vkPInitialData :: Ptr Void 
+                           }
+  deriving (Eq)
+
+instance Storable VkPipelineCacheCreateInfo where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkPipelineCacheCreateInfo <$> peek (ptr `plusPtr` 0)
+                                       <*> peek (ptr `plusPtr` 8)
+                                       <*> peek (ptr `plusPtr` 16)
+                                       <*> peek (ptr `plusPtr` 24)
+                                       <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineCacheCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineCacheCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineCacheCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkInitialDataSize (poked :: VkPipelineCacheCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPInitialData (poked :: VkPipelineCacheCreateInfo))
+
+
+-- ** vkMergePipelineCaches
+foreign import ccall "vkMergePipelineCaches" vkMergePipelineCaches :: 
+  VkDevice ->
+  VkPipelineCache -> Word32 -> Ptr VkPipelineCache -> IO VkResult
+
+-- ** VkPipelineCacheCreateFlags
+-- | Opaque flag
+newtype VkPipelineCacheCreateFlags = VkPipelineCacheCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** vkDestroyPipelineCache
+foreign import ccall "vkDestroyPipelineCache" vkDestroyPipelineCache :: 
+  VkDevice -> VkPipelineCache -> Ptr VkAllocationCallbacks -> IO ()
+
diff --git a/src/Graphics/Vulkan/PipelineLayout.hs b/src/Graphics/Vulkan/PipelineLayout.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/PipelineLayout.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.PipelineLayout where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Graphics.Vulkan.DescriptorSet( VkDescriptorSetLayout(..)
+                                    )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Shader( VkShaderStageFlagBits(..)
+                             , VkShaderStageFlags(..)
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+-- ** VkPipelineLayoutCreateFlags
+-- | Opaque flag
+newtype VkPipelineLayoutCreateFlags = VkPipelineLayoutCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+newtype VkPipelineLayout = VkPipelineLayout Word64
+  deriving (Eq, Storable)
+
+-- ** vkDestroyPipelineLayout
+foreign import ccall "vkDestroyPipelineLayout" vkDestroyPipelineLayout :: 
+  VkDevice -> VkPipelineLayout -> Ptr VkAllocationCallbacks -> IO ()
+
+
+data VkPushConstantRange =
+  VkPushConstantRange{ vkStageFlags :: VkShaderStageFlags 
+                     , vkOffset :: Word32 
+                     , vkSize :: Word32 
+                     }
+  deriving (Eq)
+
+instance Storable VkPushConstantRange where
+  sizeOf ~_ = 12
+  alignment ~_ = 4
+  peek ptr = VkPushConstantRange <$> peek (ptr `plusPtr` 0)
+                                 <*> peek (ptr `plusPtr` 4)
+                                 <*> peek (ptr `plusPtr` 8)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkStageFlags (poked :: VkPushConstantRange))
+                *> poke (ptr `plusPtr` 4) (vkOffset (poked :: VkPushConstantRange))
+                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkPushConstantRange))
+
+
+
+data VkPipelineLayoutCreateInfo =
+  VkPipelineLayoutCreateInfo{ vkSType :: VkStructureType 
+                            , vkPNext :: Ptr Void 
+                            , vkFlags :: VkPipelineLayoutCreateFlags 
+                            , vkSetLayoutCount :: Word32 
+                            , vkPSetLayouts :: Ptr VkDescriptorSetLayout 
+                            , vkPushConstantRangeCount :: Word32 
+                            , vkPPushConstantRanges :: Ptr VkPushConstantRange 
+                            }
+  deriving (Eq)
+
+instance Storable VkPipelineLayoutCreateInfo where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkPipelineLayoutCreateInfo <$> peek (ptr `plusPtr` 0)
+                                        <*> peek (ptr `plusPtr` 8)
+                                        <*> peek (ptr `plusPtr` 16)
+                                        <*> peek (ptr `plusPtr` 20)
+                                        <*> peek (ptr `plusPtr` 24)
+                                        <*> peek (ptr `plusPtr` 32)
+                                        <*> peek (ptr `plusPtr` 40)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkPipelineLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkPipelineLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkPipelineLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkSetLayoutCount (poked :: VkPipelineLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkPSetLayouts (poked :: VkPipelineLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPushConstantRangeCount (poked :: VkPipelineLayoutCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkPPushConstantRanges (poked :: VkPipelineLayoutCreateInfo))
+
+
+-- ** vkCreatePipelineLayout
+foreign import ccall "vkCreatePipelineLayout" vkCreatePipelineLayout :: 
+  VkDevice ->
+  Ptr VkPipelineLayoutCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkPipelineLayout -> IO VkResult
+
diff --git a/src/Graphics/Vulkan/Query.hs b/src/Graphics/Vulkan/Query.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Query.hs
@@ -0,0 +1,161 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Query where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize
+                      , CSize(..)
+                      )
+-- ** vkGetQueryPoolResults
+foreign import ccall "vkGetQueryPoolResults" vkGetQueryPoolResults :: 
+  VkDevice ->
+  VkQueryPool ->
+    Word32 ->
+      Word32 ->
+        CSize ->
+          Ptr Void -> VkDeviceSize -> VkQueryResultFlags -> IO VkResult
+
+-- ** vkDestroyQueryPool
+foreign import ccall "vkDestroyQueryPool" vkDestroyQueryPool :: 
+  VkDevice -> VkQueryPool -> Ptr VkAllocationCallbacks -> IO ()
+
+
+data VkQueryPoolCreateInfo =
+  VkQueryPoolCreateInfo{ vkSType :: VkStructureType 
+                       , vkPNext :: Ptr Void 
+                       , vkFlags :: VkQueryPoolCreateFlags 
+                       , vkQueryType :: VkQueryType 
+                       , vkQueryCount :: Word32 
+                       , vkPipelineStatistics :: VkQueryPipelineStatisticFlags 
+                       }
+  deriving (Eq)
+
+instance Storable VkQueryPoolCreateInfo where
+  sizeOf ~_ = 32
+  alignment ~_ = 8
+  peek ptr = VkQueryPoolCreateInfo <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 16)
+                                   <*> peek (ptr `plusPtr` 20)
+                                   <*> peek (ptr `plusPtr` 24)
+                                   <*> peek (ptr `plusPtr` 28)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkQueryPoolCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkQueryPoolCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkQueryPoolCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkQueryType (poked :: VkQueryPoolCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkQueryCount (poked :: VkQueryPoolCreateInfo))
+                *> poke (ptr `plusPtr` 28) (vkPipelineStatistics (poked :: VkQueryPoolCreateInfo))
+
+
+-- ** VkQueryResultFlags
+
+newtype VkQueryResultFlagBits = VkQueryResultFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkQueryResultFlagBits
+type VkQueryResultFlags = VkQueryResultFlagBits
+-- | Results of the queries are written to the destination buffer as 64-bit values
+pattern VK_QUERY_RESULT_64_BIT = VkQueryResultFlagBits 0x1
+-- | Results of the queries are waited on before proceeding with the result copy
+pattern VK_QUERY_RESULT_WAIT_BIT = VkQueryResultFlagBits 0x2
+-- | Besides the results of the query, the availability of the results is also written
+pattern VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = VkQueryResultFlagBits 0x4
+-- | Copy the partial results of the query even if the final results aren't available
+pattern VK_QUERY_RESULT_PARTIAL_BIT = VkQueryResultFlagBits 0x8
+
+
+-- ** VkQueryType
+
+newtype VkQueryType = VkQueryType Int32
+  deriving (Eq, Storable)
+
+pattern VK_QUERY_TYPE_OCCLUSION = VkQueryType 0
+-- | Optional
+pattern VK_QUERY_TYPE_PIPELINE_STATISTICS = VkQueryType 1
+
+pattern VK_QUERY_TYPE_TIMESTAMP = VkQueryType 2
+
+newtype VkQueryPool = VkQueryPool Word64
+  deriving (Eq, Storable)
+
+-- ** vkCreateQueryPool
+foreign import ccall "vkCreateQueryPool" vkCreateQueryPool :: 
+  VkDevice ->
+  Ptr VkQueryPoolCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkQueryPool -> IO VkResult
+
+-- ** VkQueryControlFlags
+
+newtype VkQueryControlFlagBits = VkQueryControlFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkQueryControlFlagBits
+type VkQueryControlFlags = VkQueryControlFlagBits
+-- | Require precise results to be collected by the query
+pattern VK_QUERY_CONTROL_PRECISE_BIT = VkQueryControlFlagBits 0x1
+
+
+-- ** VkQueryPoolCreateFlags
+-- | Opaque flag
+newtype VkQueryPoolCreateFlags = VkQueryPoolCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** VkQueryPipelineStatisticFlags
+
+newtype VkQueryPipelineStatisticFlagBits = VkQueryPipelineStatisticFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkQueryPipelineStatisticFlagBits
+type VkQueryPipelineStatisticFlags = VkQueryPipelineStatisticFlagBits
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = VkQueryPipelineStatisticFlagBits 0x1
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = VkQueryPipelineStatisticFlagBits 0x2
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x4
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x8
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = VkQueryPipelineStatisticFlagBits 0x10
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x20
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = VkQueryPipelineStatisticFlagBits 0x40
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x80
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = VkQueryPipelineStatisticFlagBits 0x100
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x200
+-- | Optional
+pattern VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = VkQueryPipelineStatisticFlagBits 0x400
+
+
diff --git a/src/Graphics/Vulkan/Queue.hs b/src/Graphics/Vulkan/Queue.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Queue.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+module Graphics.Vulkan.Queue where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Graphics.Vulkan.Pipeline( VkPipelineStageFlagBits(..)
+                               , VkPipelineStageFlags(..)
+                               )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Graphics.Vulkan.CommandBuffer( VkCommandBuffer(..)
+                                    )
+import Foreign.Storable( Storable(..)
+                       )
+import Graphics.Vulkan.Fence( VkFence(..)
+                            )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.QueueSemaphore( VkSemaphore(..)
+                                     )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+data VkQueue_T
+type VkQueue = Ptr VkQueue_T
+
+-- ** vkDeviceWaitIdle
+foreign import ccall "vkDeviceWaitIdle" vkDeviceWaitIdle :: 
+  VkDevice -> IO VkResult
+
+-- ** vkQueueSubmit
+foreign import ccall "vkQueueSubmit" vkQueueSubmit :: 
+  VkQueue -> Word32 -> Ptr VkSubmitInfo -> VkFence -> IO VkResult
+
+-- ** vkQueueWaitIdle
+foreign import ccall "vkQueueWaitIdle" vkQueueWaitIdle :: 
+  VkQueue -> IO VkResult
+
+-- ** vkGetDeviceQueue
+foreign import ccall "vkGetDeviceQueue" vkGetDeviceQueue :: 
+  VkDevice -> Word32 -> Word32 -> Ptr VkQueue -> IO ()
+
+
+data VkSubmitInfo =
+  VkSubmitInfo{ vkSType :: VkStructureType 
+              , vkPNext :: Ptr Void 
+              , vkWaitSemaphoreCount :: Word32 
+              , vkPWaitSemaphores :: Ptr VkSemaphore 
+              , vkPWaitDstStageMask :: Ptr VkPipelineStageFlags 
+              , vkCommandBufferCount :: Word32 
+              , vkPCommandBuffers :: Ptr VkCommandBuffer 
+              , vkSignalSemaphoreCount :: Word32 
+              , vkPSignalSemaphores :: Ptr VkSemaphore 
+              }
+  deriving (Eq)
+
+instance Storable VkSubmitInfo where
+  sizeOf ~_ = 72
+  alignment ~_ = 8
+  peek ptr = VkSubmitInfo <$> peek (ptr `plusPtr` 0)
+                          <*> peek (ptr `plusPtr` 8)
+                          <*> peek (ptr `plusPtr` 16)
+                          <*> peek (ptr `plusPtr` 24)
+                          <*> peek (ptr `plusPtr` 32)
+                          <*> peek (ptr `plusPtr` 40)
+                          <*> peek (ptr `plusPtr` 48)
+                          <*> peek (ptr `plusPtr` 56)
+                          <*> peek (ptr `plusPtr` 64)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 16) (vkWaitSemaphoreCount (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 24) (vkPWaitSemaphores (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 32) (vkPWaitDstStageMask (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 40) (vkCommandBufferCount (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 48) (vkPCommandBuffers (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 56) (vkSignalSemaphoreCount (poked :: VkSubmitInfo))
+                *> poke (ptr `plusPtr` 64) (vkPSignalSemaphores (poked :: VkSubmitInfo))
+
+
diff --git a/src/Graphics/Vulkan/QueueSemaphore.hs b/src/Graphics/Vulkan/QueueSemaphore.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/QueueSemaphore.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.QueueSemaphore where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize(..)
+                      )
+-- ** VkSemaphoreCreateFlags
+-- | Opaque flag
+newtype VkSemaphoreCreateFlags = VkSemaphoreCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** vkDestroySemaphore
+foreign import ccall "vkDestroySemaphore" vkDestroySemaphore :: 
+  VkDevice -> VkSemaphore -> Ptr VkAllocationCallbacks -> IO ()
+
+newtype VkSemaphore = VkSemaphore Word64
+  deriving (Eq, Storable)
+
+
+data VkSemaphoreCreateInfo =
+  VkSemaphoreCreateInfo{ vkSType :: VkStructureType 
+                       , vkPNext :: Ptr Void 
+                       , vkFlags :: VkSemaphoreCreateFlags 
+                       }
+  deriving (Eq)
+
+instance Storable VkSemaphoreCreateInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkSemaphoreCreateInfo <$> peek (ptr `plusPtr` 0)
+                                   <*> peek (ptr `plusPtr` 8)
+                                   <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkSemaphoreCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkSemaphoreCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSemaphoreCreateInfo))
+
+
+-- ** vkCreateSemaphore
+foreign import ccall "vkCreateSemaphore" vkCreateSemaphore :: 
+  VkDevice ->
+  Ptr VkSemaphoreCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkSemaphore -> IO VkResult
+
diff --git a/src/Graphics/Vulkan/Sampler.hs b/src/Graphics/Vulkan/Sampler.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Sampler.hs
@@ -0,0 +1,215 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Sampler where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Int( Int32
+               )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkBool32(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CFloat
+                      , CFloat(..)
+                      , CSize(..)
+                      )
+-- ** VkSamplerAddressMode
+
+newtype VkSamplerAddressMode = VkSamplerAddressMode Int32
+  deriving (Eq, Storable)
+
+pattern VK_SAMPLER_ADDRESS_MODE_REPEAT = VkSamplerAddressMode 0
+
+pattern VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = VkSamplerAddressMode 1
+
+pattern VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = VkSamplerAddressMode 2
+
+pattern VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = VkSamplerAddressMode 3
+
+pattern VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = VkSamplerAddressMode 4
+
+-- ** VkFilter
+
+newtype VkFilter = VkFilter Int32
+  deriving (Eq, Storable)
+
+pattern VK_FILTER_NEAREST = VkFilter 0
+
+pattern VK_FILTER_LINEAR = VkFilter 1
+
+-- ** VkBorderColor
+
+newtype VkBorderColor = VkBorderColor Int32
+  deriving (Eq, Storable)
+
+pattern VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = VkBorderColor 0
+
+pattern VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = VkBorderColor 1
+
+pattern VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = VkBorderColor 2
+
+pattern VK_BORDER_COLOR_INT_OPAQUE_BLACK = VkBorderColor 3
+
+pattern VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = VkBorderColor 4
+
+pattern VK_BORDER_COLOR_INT_OPAQUE_WHITE = VkBorderColor 5
+
+-- ** VkCompareOp
+
+newtype VkCompareOp = VkCompareOp Int32
+  deriving (Eq, Storable)
+
+pattern VK_COMPARE_OP_NEVER = VkCompareOp 0
+
+pattern VK_COMPARE_OP_LESS = VkCompareOp 1
+
+pattern VK_COMPARE_OP_EQUAL = VkCompareOp 2
+
+pattern VK_COMPARE_OP_LESS_OR_EQUAL = VkCompareOp 3
+
+pattern VK_COMPARE_OP_GREATER = VkCompareOp 4
+
+pattern VK_COMPARE_OP_NOT_EQUAL = VkCompareOp 5
+
+pattern VK_COMPARE_OP_GREATER_OR_EQUAL = VkCompareOp 6
+
+pattern VK_COMPARE_OP_ALWAYS = VkCompareOp 7
+
+newtype VkSampler = VkSampler Word64
+  deriving (Eq, Storable)
+
+
+data VkSamplerCreateInfo =
+  VkSamplerCreateInfo{ vkSType :: VkStructureType 
+                     , vkPNext :: Ptr Void 
+                     , vkFlags :: VkSamplerCreateFlags 
+                     , vkMagFilter :: VkFilter 
+                     , vkMinFilter :: VkFilter 
+                     , vkMipmapMode :: VkSamplerMipmapMode 
+                     , vkAddressModeU :: VkSamplerAddressMode 
+                     , vkAddressModeV :: VkSamplerAddressMode 
+                     , vkAddressModeW :: VkSamplerAddressMode 
+                     , vkMipLodBias :: CFloat 
+                     , vkAnisotropyEnable :: VkBool32 
+                     , vkMaxAnisotropy :: CFloat 
+                     , vkCompareEnable :: VkBool32 
+                     , vkCompareOp :: VkCompareOp 
+                     , vkMinLod :: CFloat 
+                     , vkMaxLod :: CFloat 
+                     , vkBorderColor :: VkBorderColor 
+                     , vkUnnormalizedCoordinates :: VkBool32 
+                     }
+  deriving (Eq)
+
+instance Storable VkSamplerCreateInfo where
+  sizeOf ~_ = 80
+  alignment ~_ = 8
+  peek ptr = VkSamplerCreateInfo <$> peek (ptr `plusPtr` 0)
+                                 <*> peek (ptr `plusPtr` 8)
+                                 <*> peek (ptr `plusPtr` 16)
+                                 <*> peek (ptr `plusPtr` 20)
+                                 <*> peek (ptr `plusPtr` 24)
+                                 <*> peek (ptr `plusPtr` 28)
+                                 <*> peek (ptr `plusPtr` 32)
+                                 <*> peek (ptr `plusPtr` 36)
+                                 <*> peek (ptr `plusPtr` 40)
+                                 <*> peek (ptr `plusPtr` 44)
+                                 <*> peek (ptr `plusPtr` 48)
+                                 <*> peek (ptr `plusPtr` 52)
+                                 <*> peek (ptr `plusPtr` 56)
+                                 <*> peek (ptr `plusPtr` 60)
+                                 <*> peek (ptr `plusPtr` 64)
+                                 <*> peek (ptr `plusPtr` 68)
+                                 <*> peek (ptr `plusPtr` 72)
+                                 <*> peek (ptr `plusPtr` 76)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 20) (vkMagFilter (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkMinFilter (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 28) (vkMipmapMode (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkAddressModeU (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 36) (vkAddressModeV (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 40) (vkAddressModeW (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 44) (vkMipLodBias (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 48) (vkAnisotropyEnable (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 52) (vkMaxAnisotropy (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 56) (vkCompareEnable (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 60) (vkCompareOp (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 64) (vkMinLod (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 68) (vkMaxLod (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 72) (vkBorderColor (poked :: VkSamplerCreateInfo))
+                *> poke (ptr `plusPtr` 76) (vkUnnormalizedCoordinates (poked :: VkSamplerCreateInfo))
+
+
+-- ** VkSamplerCreateFlags
+-- | Opaque flag
+newtype VkSamplerCreateFlags = VkSamplerCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** VkSamplerMipmapMode
+
+newtype VkSamplerMipmapMode = VkSamplerMipmapMode Int32
+  deriving (Eq, Storable)
+-- | Choose nearest mip level
+pattern VK_SAMPLER_MIPMAP_MODE_NEAREST = VkSamplerMipmapMode 0
+-- | Linear filter between mip levels
+pattern VK_SAMPLER_MIPMAP_MODE_LINEAR = VkSamplerMipmapMode 1
+
+-- ** vkCreateSampler
+foreign import ccall "vkCreateSampler" vkCreateSampler :: 
+  VkDevice ->
+  Ptr VkSamplerCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkSampler -> IO VkResult
+
+-- ** VkSampleCountFlags
+
+newtype VkSampleCountFlagBits = VkSampleCountFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkSampleCountFlagBits
+type VkSampleCountFlags = VkSampleCountFlagBits
+-- | Sample count 1 supported
+pattern VK_SAMPLE_COUNT_1_BIT = VkSampleCountFlagBits 0x1
+-- | Sample count 2 supported
+pattern VK_SAMPLE_COUNT_2_BIT = VkSampleCountFlagBits 0x2
+-- | Sample count 4 supported
+pattern VK_SAMPLE_COUNT_4_BIT = VkSampleCountFlagBits 0x4
+-- | Sample count 8 supported
+pattern VK_SAMPLE_COUNT_8_BIT = VkSampleCountFlagBits 0x8
+-- | Sample count 16 supported
+pattern VK_SAMPLE_COUNT_16_BIT = VkSampleCountFlagBits 0x10
+-- | Sample count 32 supported
+pattern VK_SAMPLE_COUNT_32_BIT = VkSampleCountFlagBits 0x20
+-- | Sample count 64 supported
+pattern VK_SAMPLE_COUNT_64_BIT = VkSampleCountFlagBits 0x40
+
+
+-- ** vkDestroySampler
+foreign import ccall "vkDestroySampler" vkDestroySampler :: 
+  VkDevice -> VkSampler -> Ptr VkAllocationCallbacks -> IO ()
+
diff --git a/src/Graphics/Vulkan/Shader.hs b/src/Graphics/Vulkan/Shader.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Shader.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.Shader where
+import Graphics.Vulkan.Device( VkDevice(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkInternalAllocationType(..)
+                             , PFN_vkAllocationFunction
+                             , PFN_vkReallocationFunction
+                             , PFN_vkInternalAllocationNotification
+                             , VkAllocationCallbacks(..)
+                             , VkSystemAllocationScope(..)
+                             , PFN_vkFreeFunction
+                             , PFN_vkInternalFreeNotification
+                             )
+import Graphics.Vulkan.Core( VkResult(..)
+                           , VkFlags(..)
+                           , VkStructureType(..)
+                           )
+import Foreign.C.Types( CSize
+                      , CSize(..)
+                      )
+
+data VkShaderModuleCreateInfo =
+  VkShaderModuleCreateInfo{ vkSType :: VkStructureType 
+                          , vkPNext :: Ptr Void 
+                          , vkFlags :: VkShaderModuleCreateFlags 
+                          , vkCodeSize :: CSize 
+                          , vkPCode :: Ptr Word32 
+                          }
+  deriving (Eq)
+
+instance Storable VkShaderModuleCreateInfo where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkShaderModuleCreateInfo <$> peek (ptr `plusPtr` 0)
+                                      <*> peek (ptr `plusPtr` 8)
+                                      <*> peek (ptr `plusPtr` 16)
+                                      <*> peek (ptr `plusPtr` 24)
+                                      <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkShaderModuleCreateInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkShaderModuleCreateInfo))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkShaderModuleCreateInfo))
+                *> poke (ptr `plusPtr` 24) (vkCodeSize (poked :: VkShaderModuleCreateInfo))
+                *> poke (ptr `plusPtr` 32) (vkPCode (poked :: VkShaderModuleCreateInfo))
+
+
+-- ** vkDestroyShaderModule
+foreign import ccall "vkDestroyShaderModule" vkDestroyShaderModule :: 
+  VkDevice -> VkShaderModule -> Ptr VkAllocationCallbacks -> IO ()
+
+-- ** VkShaderModuleCreateFlags
+-- | Opaque flag
+newtype VkShaderModuleCreateFlags = VkShaderModuleCreateFlags VkFlags
+  deriving (Eq, Storable)
+
+-- ** VkShaderStageFlags
+
+newtype VkShaderStageFlagBits = VkShaderStageFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkShaderStageFlagBits
+type VkShaderStageFlags = VkShaderStageFlagBits
+
+pattern VK_SHADER_STAGE_VERTEX_BIT = VkShaderStageFlagBits 0x1
+
+pattern VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = VkShaderStageFlagBits 0x2
+
+pattern VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = VkShaderStageFlagBits 0x4
+
+pattern VK_SHADER_STAGE_GEOMETRY_BIT = VkShaderStageFlagBits 0x8
+
+pattern VK_SHADER_STAGE_FRAGMENT_BIT = VkShaderStageFlagBits 0x10
+
+pattern VK_SHADER_STAGE_COMPUTE_BIT = VkShaderStageFlagBits 0x20
+
+pattern VK_SHADER_STAGE_ALL_GRAPHICS = VkShaderStageFlagBits 0x1f
+
+pattern VK_SHADER_STAGE_ALL = VkShaderStageFlagBits 0x7fffffff
+
+newtype VkShaderModule = VkShaderModule Word64
+  deriving (Eq, Storable)
+
+-- ** vkCreateShaderModule
+foreign import ccall "vkCreateShaderModule" vkCreateShaderModule :: 
+  VkDevice ->
+  Ptr VkShaderModuleCreateInfo ->
+    Ptr VkAllocationCallbacks -> Ptr VkShaderModule -> IO VkResult
+
diff --git a/src/Graphics/Vulkan/SparseResourceMemoryManagement.hs b/src/Graphics/Vulkan/SparseResourceMemoryManagement.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/SparseResourceMemoryManagement.hs
@@ -0,0 +1,296 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE Strict #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Graphics.Vulkan.SparseResourceMemoryManagement where
+import Graphics.Vulkan.Device( VkPhysicalDevice(..)
+                             , VkDevice(..)
+                             )
+import Graphics.Vulkan.Buffer( VkBuffer(..)
+                             )
+import Data.Word( Word64
+                , Word32
+                )
+import Foreign.Ptr( Ptr
+                  , plusPtr
+                  )
+import Graphics.Vulkan.Queue( VkQueue(..)
+                            )
+import Data.Int( Int32
+               )
+import Data.Bits( Bits
+                , FiniteBits
+                )
+import Foreign.Storable( Storable(..)
+                       )
+import Graphics.Vulkan.Fence( VkFence(..)
+                            )
+import Data.Void( Void
+                )
+import Graphics.Vulkan.Memory( VkDeviceMemory(..)
+                             )
+import Graphics.Vulkan.Sampler( VkSampleCountFlagBits(..)
+                              )
+import Graphics.Vulkan.Image( VkImageUsageFlags(..)
+                            , VkImage(..)
+                            , VkImageSubresource(..)
+                            , VkImageType(..)
+                            , VkImageAspectFlagBits(..)
+                            , VkImageUsageFlagBits(..)
+                            , VkImageTiling(..)
+                            , VkImageAspectFlags(..)
+                            )
+import Graphics.Vulkan.QueueSemaphore( VkSemaphore(..)
+                                     )
+import Graphics.Vulkan.Core( VkExtent3D(..)
+                           , VkResult(..)
+                           , VkDeviceSize(..)
+                           , VkFlags(..)
+                           , VkFormat(..)
+                           , VkOffset3D(..)
+                           , VkStructureType(..)
+                           )
+
+data VkSparseImageMemoryRequirements =
+  VkSparseImageMemoryRequirements{ vkFormatProperties :: VkSparseImageFormatProperties 
+                                 , vkImageMipTailFirstLod :: Word32 
+                                 , vkImageMipTailSize :: VkDeviceSize 
+                                 , vkImageMipTailOffset :: VkDeviceSize 
+                                 , vkImageMipTailStride :: VkDeviceSize 
+                                 }
+  deriving (Eq)
+
+instance Storable VkSparseImageMemoryRequirements where
+  sizeOf ~_ = 48
+  alignment ~_ = 8
+  peek ptr = VkSparseImageMemoryRequirements <$> peek (ptr `plusPtr` 0)
+                                             <*> peek (ptr `plusPtr` 20)
+                                             <*> peek (ptr `plusPtr` 24)
+                                             <*> peek (ptr `plusPtr` 32)
+                                             <*> peek (ptr `plusPtr` 40)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkFormatProperties (poked :: VkSparseImageMemoryRequirements))
+                *> poke (ptr `plusPtr` 20) (vkImageMipTailFirstLod (poked :: VkSparseImageMemoryRequirements))
+                *> poke (ptr `plusPtr` 24) (vkImageMipTailSize (poked :: VkSparseImageMemoryRequirements))
+                *> poke (ptr `plusPtr` 32) (vkImageMipTailOffset (poked :: VkSparseImageMemoryRequirements))
+                *> poke (ptr `plusPtr` 40) (vkImageMipTailStride (poked :: VkSparseImageMemoryRequirements))
+
+
+
+data VkSparseMemoryBind =
+  VkSparseMemoryBind{ vkResourceOffset :: VkDeviceSize 
+                    , vkSize :: VkDeviceSize 
+                    , vkMemory :: VkDeviceMemory 
+                    , vkMemoryOffset :: VkDeviceSize 
+                    , vkFlags :: VkSparseMemoryBindFlags 
+                    }
+  deriving (Eq)
+
+instance Storable VkSparseMemoryBind where
+  sizeOf ~_ = 40
+  alignment ~_ = 8
+  peek ptr = VkSparseMemoryBind <$> peek (ptr `plusPtr` 0)
+                                <*> peek (ptr `plusPtr` 8)
+                                <*> peek (ptr `plusPtr` 16)
+                                <*> peek (ptr `plusPtr` 24)
+                                <*> peek (ptr `plusPtr` 32)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkResourceOffset (poked :: VkSparseMemoryBind))
+                *> poke (ptr `plusPtr` 8) (vkSize (poked :: VkSparseMemoryBind))
+                *> poke (ptr `plusPtr` 16) (vkMemory (poked :: VkSparseMemoryBind))
+                *> poke (ptr `plusPtr` 24) (vkMemoryOffset (poked :: VkSparseMemoryBind))
+                *> poke (ptr `plusPtr` 32) (vkFlags (poked :: VkSparseMemoryBind))
+
+
+
+data VkSparseImageMemoryBind =
+  VkSparseImageMemoryBind{ vkSubresource :: VkImageSubresource 
+                         , vkOffset :: VkOffset3D 
+                         , vkExtent :: VkExtent3D 
+                         , vkMemory :: VkDeviceMemory 
+                         , vkMemoryOffset :: VkDeviceSize 
+                         , vkFlags :: VkSparseMemoryBindFlags 
+                         }
+  deriving (Eq)
+
+instance Storable VkSparseImageMemoryBind where
+  sizeOf ~_ = 64
+  alignment ~_ = 8
+  peek ptr = VkSparseImageMemoryBind <$> peek (ptr `plusPtr` 0)
+                                     <*> peek (ptr `plusPtr` 12)
+                                     <*> peek (ptr `plusPtr` 24)
+                                     <*> peek (ptr `plusPtr` 40)
+                                     <*> peek (ptr `plusPtr` 48)
+                                     <*> peek (ptr `plusPtr` 56)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSubresource (poked :: VkSparseImageMemoryBind))
+                *> poke (ptr `plusPtr` 12) (vkOffset (poked :: VkSparseImageMemoryBind))
+                *> poke (ptr `plusPtr` 24) (vkExtent (poked :: VkSparseImageMemoryBind))
+                *> poke (ptr `plusPtr` 40) (vkMemory (poked :: VkSparseImageMemoryBind))
+                *> poke (ptr `plusPtr` 48) (vkMemoryOffset (poked :: VkSparseImageMemoryBind))
+                *> poke (ptr `plusPtr` 56) (vkFlags (poked :: VkSparseImageMemoryBind))
+
+
+
+data VkSparseImageMemoryBindInfo =
+  VkSparseImageMemoryBindInfo{ vkImage :: VkImage 
+                             , vkBindCount :: Word32 
+                             , vkPBinds :: Ptr VkSparseImageMemoryBind 
+                             }
+  deriving (Eq)
+
+instance Storable VkSparseImageMemoryBindInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkSparseImageMemoryBindInfo <$> peek (ptr `plusPtr` 0)
+                                         <*> peek (ptr `plusPtr` 8)
+                                         <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkImage (poked :: VkSparseImageMemoryBindInfo))
+                *> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseImageMemoryBindInfo))
+                *> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseImageMemoryBindInfo))
+
+
+-- ** vkGetImageSparseMemoryRequirements
+foreign import ccall "vkGetImageSparseMemoryRequirements" vkGetImageSparseMemoryRequirements :: 
+  VkDevice ->
+  VkImage ->
+    Ptr Word32 -> Ptr VkSparseImageMemoryRequirements -> IO ()
+
+-- ** vkQueueBindSparse
+foreign import ccall "vkQueueBindSparse" vkQueueBindSparse :: 
+  VkQueue -> Word32 -> Ptr VkBindSparseInfo -> VkFence -> IO VkResult
+
+
+data VkBindSparseInfo =
+  VkBindSparseInfo{ vkSType :: VkStructureType 
+                  , vkPNext :: Ptr Void 
+                  , vkWaitSemaphoreCount :: Word32 
+                  , vkPWaitSemaphores :: Ptr VkSemaphore 
+                  , vkBufferBindCount :: Word32 
+                  , vkPBufferBinds :: Ptr VkSparseBufferMemoryBindInfo 
+                  , vkImageOpaqueBindCount :: Word32 
+                  , vkPImageOpaqueBinds :: Ptr VkSparseImageOpaqueMemoryBindInfo 
+                  , vkImageBindCount :: Word32 
+                  , vkPImageBinds :: Ptr VkSparseImageMemoryBindInfo 
+                  , vkSignalSemaphoreCount :: Word32 
+                  , vkPSignalSemaphores :: Ptr VkSemaphore 
+                  }
+  deriving (Eq)
+
+instance Storable VkBindSparseInfo where
+  sizeOf ~_ = 96
+  alignment ~_ = 8
+  peek ptr = VkBindSparseInfo <$> peek (ptr `plusPtr` 0)
+                              <*> peek (ptr `plusPtr` 8)
+                              <*> peek (ptr `plusPtr` 16)
+                              <*> peek (ptr `plusPtr` 24)
+                              <*> peek (ptr `plusPtr` 32)
+                              <*> peek (ptr `plusPtr` 40)
+                              <*> peek (ptr `plusPtr` 48)
+                              <*> peek (ptr `plusPtr` 56)
+                              <*> peek (ptr `plusPtr` 64)
+                              <*> peek (ptr `plusPtr` 72)
+                              <*> peek (ptr `plusPtr` 80)
+                              <*> peek (ptr `plusPtr` 88)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkSType (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 8) (vkPNext (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 16) (vkWaitSemaphoreCount (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 24) (vkPWaitSemaphores (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 32) (vkBufferBindCount (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 40) (vkPBufferBinds (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 48) (vkImageOpaqueBindCount (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 56) (vkPImageOpaqueBinds (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 64) (vkImageBindCount (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 72) (vkPImageBinds (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 80) (vkSignalSemaphoreCount (poked :: VkBindSparseInfo))
+                *> poke (ptr `plusPtr` 88) (vkPSignalSemaphores (poked :: VkBindSparseInfo))
+
+
+
+data VkSparseBufferMemoryBindInfo =
+  VkSparseBufferMemoryBindInfo{ vkBuffer :: VkBuffer 
+                              , vkBindCount :: Word32 
+                              , vkPBinds :: Ptr VkSparseMemoryBind 
+                              }
+  deriving (Eq)
+
+instance Storable VkSparseBufferMemoryBindInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkSparseBufferMemoryBindInfo <$> peek (ptr `plusPtr` 0)
+                                          <*> peek (ptr `plusPtr` 8)
+                                          <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkBuffer (poked :: VkSparseBufferMemoryBindInfo))
+                *> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseBufferMemoryBindInfo))
+                *> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseBufferMemoryBindInfo))
+
+
+-- ** VkSparseImageFormatFlags
+
+newtype VkSparseImageFormatFlagBits = VkSparseImageFormatFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkSparseImageFormatFlagBits
+type VkSparseImageFormatFlags = VkSparseImageFormatFlagBits
+-- | Image uses a single miptail region for all array layers
+pattern VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = VkSparseImageFormatFlagBits 0x1
+-- | Image requires mip levels to be an exact multiple of the sparse image block size for non-miptail levels.
+pattern VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT = VkSparseImageFormatFlagBits 0x2
+-- | Image uses a non-standard sparse block size
+pattern VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT = VkSparseImageFormatFlagBits 0x4
+
+
+-- ** vkGetPhysicalDeviceSparseImageFormatProperties
+foreign import ccall "vkGetPhysicalDeviceSparseImageFormatProperties" vkGetPhysicalDeviceSparseImageFormatProperties :: 
+  VkPhysicalDevice ->
+  VkFormat ->
+    VkImageType ->
+      VkSampleCountFlagBits ->
+        VkImageUsageFlags ->
+          VkImageTiling ->
+            Ptr Word32 -> Ptr VkSparseImageFormatProperties -> IO ()
+
+-- ** VkSparseMemoryBindFlags
+
+newtype VkSparseMemoryBindFlagBits = VkSparseMemoryBindFlagBits VkFlags
+  deriving (Eq, Storable, Bits, FiniteBits)
+-- | Alias for VkSparseMemoryBindFlagBits
+type VkSparseMemoryBindFlags = VkSparseMemoryBindFlagBits
+-- | Operation binds resource metadata to memory
+pattern VK_SPARSE_MEMORY_BIND_METADATA_BIT = VkSparseMemoryBindFlagBits 0x1
+
+
+
+data VkSparseImageOpaqueMemoryBindInfo =
+  VkSparseImageOpaqueMemoryBindInfo{ vkImage :: VkImage 
+                                   , vkBindCount :: Word32 
+                                   , vkPBinds :: Ptr VkSparseMemoryBind 
+                                   }
+  deriving (Eq)
+
+instance Storable VkSparseImageOpaqueMemoryBindInfo where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek ptr = VkSparseImageOpaqueMemoryBindInfo <$> peek (ptr `plusPtr` 0)
+                                               <*> peek (ptr `plusPtr` 8)
+                                               <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkImage (poked :: VkSparseImageOpaqueMemoryBindInfo))
+                *> poke (ptr `plusPtr` 8) (vkBindCount (poked :: VkSparseImageOpaqueMemoryBindInfo))
+                *> poke (ptr `plusPtr` 16) (vkPBinds (poked :: VkSparseImageOpaqueMemoryBindInfo))
+
+
+
+data VkSparseImageFormatProperties =
+  VkSparseImageFormatProperties{ vkAspectMask :: VkImageAspectFlags 
+                               , vkImageGranularity :: VkExtent3D 
+                               , vkFlags :: VkSparseImageFormatFlags 
+                               }
+  deriving (Eq)
+
+instance Storable VkSparseImageFormatProperties where
+  sizeOf ~_ = 20
+  alignment ~_ = 4
+  peek ptr = VkSparseImageFormatProperties <$> peek (ptr `plusPtr` 0)
+                                           <*> peek (ptr `plusPtr` 4)
+                                           <*> peek (ptr `plusPtr` 16)
+  poke ptr poked = poke (ptr `plusPtr` 0) (vkAspectMask (poked :: VkSparseImageFormatProperties))
+                *> poke (ptr `plusPtr` 4) (vkImageGranularity (poked :: VkSparseImageFormatProperties))
+                *> poke (ptr `plusPtr` 16) (vkFlags (poked :: VkSparseImageFormatProperties))
+
+
diff --git a/src/Graphics/Vulkan/Version.hs b/src/Graphics/Vulkan/Version.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Vulkan/Version.hs
@@ -0,0 +1,4 @@
+
+module Graphics.Vulkan.Version where
+
+
diff --git a/vulkan.cabal b/vulkan.cabal
--- a/vulkan.cabal
+++ b/vulkan.cabal
@@ -1,5 +1,5 @@
 name:                vulkan
-version:             0.2.0.0
+version:             1.0.0.0
 synopsis:            Bindings to the Vulkan graphics API.
 description:         Please see readme.md
 homepage:            http://github.com/expipiplus1/vulkan#readme
@@ -10,16 +10,49 @@
 copyright:           2016 Joe Hermaszewski
 category:            Graphics
 build-type:          Simple
-extra-source-files:  readme.md
+extra-source-files:  readme.md,
+                     changelog.md
 cabal-version:       >=1.10
 
 library
   hs-source-dirs:      src
   exposed-modules:     Graphics.Vulkan
+                       Graphics.Vulkan.Buffer
+                       Graphics.Vulkan.BufferView
+                       Graphics.Vulkan.CommandBuffer
+                       Graphics.Vulkan.CommandBufferBuilding
+                       Graphics.Vulkan.CommandPool
+                       Graphics.Vulkan.Constants
+                       Graphics.Vulkan.Core
+                       Graphics.Vulkan.DescriptorSet
+                       Graphics.Vulkan.Device
+                       Graphics.Vulkan.DeviceInitialization
+                       Graphics.Vulkan.Event
+                       Graphics.Vulkan.ExtensionDiscovery
+                       Graphics.Vulkan.Fence
+                       Graphics.Vulkan.HeaderBoilerplate
+                       Graphics.Vulkan.Image
+                       Graphics.Vulkan.ImageView
+                       Graphics.Vulkan.KHR.Surface
+                       Graphics.Vulkan.LayerDiscovery
+                       Graphics.Vulkan.Memory
+                       Graphics.Vulkan.MemoryManagement
+                       Graphics.Vulkan.OtherTypes
+                       Graphics.Vulkan.Pass
+                       Graphics.Vulkan.Pipeline
+                       Graphics.Vulkan.PipelineCache
+                       Graphics.Vulkan.PipelineLayout
+                       Graphics.Vulkan.Query
+                       Graphics.Vulkan.Queue
+                       Graphics.Vulkan.QueueSemaphore
+                       Graphics.Vulkan.Sampler
+                       Graphics.Vulkan.Shader
+                       Graphics.Vulkan.SparseResourceMemoryManagement
+                       Graphics.Vulkan.Version
   build-depends:       base >= 4.9 && < 5
                      , fixed-vector >= 0.8 && < 0.9
   default-language:    Haskell2010
-  ghc-options:         -freduction-depth=0 
+  ghc-options:         -freduction-depth=0
 
 source-repository head
   type:     git
