diff --git a/gpu-vulkan-core.cabal b/gpu-vulkan-core.cabal
--- a/gpu-vulkan-core.cabal
+++ b/gpu-vulkan-core.cabal
@@ -5,14 +5,14 @@
 -- see: https://github.com/sol/hpack
 
 name:           gpu-vulkan-core
-version:        0.1.0.8
+version:        0.1.0.11
 synopsis:       Thin wrapper for Vulkan API
 description:    Please see the README on GitHub at <https://github.com/YoshikuniJujo/gpu-vulkan-core#readme>
 category:       GPU
 homepage:       https://github.com/YoshikuniJujo/gpu-vulkan-core#readme
 bug-reports:    https://github.com/YoshikuniJujo/gpu-vulkan-core/issues
 author:         Yoshikuni Jujo
-maintainer:     example@example.com
+maintainer:     yoshikuni.jujo@gmail.com
 copyright:      2022 Yoshikuni Jujo
 license:        BSD3
 license-file:   LICENSE
@@ -78,6 +78,9 @@
       Gpu.Vulkan.Subpass.Core
       Gpu.Vulkan.VertexInput.Core
       Gpu.Vulkan.TypeSynonyms.Core
+      Gpu.Vulkan.Sparse.Core
+      Gpu.Vulkan.Sparse.Buffer.Core
+      Gpu.Vulkan.Sparse.Image.Core
   other-modules:
       Data.Text.Tools
       Paths_gpu_vulkan_core
diff --git a/src/Gpu/Vulkan/Buffer/Core.hsc b/src/Gpu/Vulkan/Buffer/Core.hsc
--- a/src/Gpu/Vulkan/Buffer/Core.hsc
+++ b/src/Gpu/Vulkan/Buffer/Core.hsc
@@ -44,7 +44,7 @@
 import Gpu.Vulkan.Core
 import Gpu.Vulkan.TypeSynonyms.Core
 import Gpu.Vulkan.AllocationCallbacks.Core qualified as AllocationCallbacks
-import Gpu.Vulkan.Device.Core qualified as Device
+import {-# SOURCE #-} Gpu.Vulkan.Device.Core qualified as Device
 import Gpu.Vulkan.Memory.Core qualified as Memory
 import Gpu.Vulkan.Image.Core qualified as Image
 
diff --git a/src/Gpu/Vulkan/Image/Core.hsc b/src/Gpu/Vulkan/Image/Core.hsc
--- a/src/Gpu/Vulkan/Image/Core.hsc
+++ b/src/Gpu/Vulkan/Image/Core.hsc
@@ -46,6 +46,12 @@
 	subresourceLayersAspectMask, subresourceLayersMipLevel,
 	subresourceLayersBaseArrayLayer, subresourceLayersLayerCount,
 
+	-- * Subresource
+
+	Subresource, pattern Subresource,
+	subresourceAspectMask, subresourceMipLevel,
+	subresourceArrayLayer
+
 	) where
 
 import Foreign.Ptr
@@ -59,7 +65,7 @@
 import Gpu.Vulkan.Core
 import Gpu.Vulkan.TypeSynonyms.Core
 import Gpu.Vulkan.AllocationCallbacks.Core qualified as AllocationCallbacks
-import Gpu.Vulkan.Device.Core qualified as Device
+import {-# SOURCE #-} Gpu.Vulkan.Device.Core qualified as Device
 import Gpu.Vulkan.Memory.Core qualified as Memory
 
 #include <vulkan/vulkan.h>
@@ -217,4 +223,17 @@
 		[| \p -> peekArray 2 (#{ptr VkImageBlit, dstOffsets} p) |],
 		[| \p os -> pokeArray
 			(#{ptr VkImageBlit, dstOffsets} p) $ take 2 os |]) ]
+	[''Show, ''Storable]
+
+struct "Subresource" #{size VkImageSubresource}
+	#{alignment VkImageSubresource} [
+	("aspectMask", ''#{type VkImageAspectFlags},
+		[| #{peek VkImageSubresource, aspectMask} |],
+		[| #{poke VkImageSubresource, aspectMask} |]),
+	("mipLevel", ''#{type uint32_t},
+		[| #{peek VkImageSubresource, mipLevel} |],
+		[| #{poke VkImageSubresource, mipLevel} |]),
+	("arrayLayer", ''#{type uint32_t},
+		[| #{peek VkImageSubresource, arrayLayer} |],
+		[| #{poke VkImageSubresource, arrayLayer} |]) ]
 	[''Show, ''Storable]
diff --git a/src/Gpu/Vulkan/Queue/Core.hsc b/src/Gpu/Vulkan/Queue/Core.hsc
--- a/src/Gpu/Vulkan/Queue/Core.hsc
+++ b/src/Gpu/Vulkan/Queue/Core.hsc
@@ -1,21 +1,42 @@
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+{-# LAnGUAGE PatternSynonyms, ViewPatterns #-}
 {-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
 
 module Gpu.Vulkan.Queue.Core (
 
-	-- SUBMIT AND WAIT IDLE
+	-- * SUBMIT AND WAIT IDLE
 
-	Q, submit, waitIdle
+	Q, submit, waitIdle,
 
+	-- * BIND SPARSE
+
+	bindSparse, BindSparseInfo, pattern BindSparseInfo,
+	bindSparseInfoSType, bindSparseInfoPNext,
+	bindSparseInfoWaitSemaphoreCount, bindSparseInfoPWaitSemaphores,
+	bindSparseInfoBufferBindCount, bindSparseInfoPBufferBinds,
+	bindSparseInfoImageOpaqueBindCount, bindSparseInfoPImageOpaqueBinds,
+	bindSparseInfoImageBindCount, bindSparseInfoPImageBinds,
+	bindSparseInfoSignalSemaphoreCount, bindSparseInfoPSignalSemaphores
+
 	) where
 
 import Foreign.Ptr
+import Foreign.Storable
+import Foreign.C.Struct
+import Foreign.C.Struct.TypeSynonyms
 import Data.Word
 import Data.Int
 
 import Gpu.Vulkan.Core
 
 import {-# SOURCE #-} qualified Gpu.Vulkan.Fence.Core as Fence
+import {-# SOURCE #-} Gpu.Vulkan.Semaphore.Core qualified as Semaphore
 
+import Gpu.Vulkan.Sparse.Buffer.Core qualified as Spr.Bffr
+import Gpu.Vulkan.Sparse.Image.Core qualified as Spr.Img
+
 #include <vulkan/vulkan.h>
 
 data QTag
@@ -26,3 +47,47 @@
 	IO #{type VkResult}
 
 foreign import ccall "vkQueueWaitIdle" waitIdle :: Q -> IO #{type VkResult}
+
+struct "BindSparseInfo" #{size VkBindSparseInfo} #{alignment VkBindSparseInfo} [
+	("sType", ''(), [| const $ pure () |],
+		[| \p _ -> #{poke VkBufferCreateInfo, sType } p
+			(#{const VK_STRUCTURE_TYPE_BIND_SPARSE_INFO} ::
+				#{type VkStructureType}) |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkBindSparseInfo, pNext} |],
+		[| #{poke VkBindSparseInfo, pNext} |]),
+	("waitSemaphoreCount", ''#{type uint32_t},
+		[| #{peek VkBindSparseInfo, waitSemaphoreCount} |],
+		[| #{poke VkBindSparseInfo, waitSemaphoreCount} |]),
+	("pWaitSemaphores", ''Semaphore.PtrS,
+		[| #{peek VkBindSparseInfo, pWaitSemaphores} |],
+		[| #{poke VkBindSparseInfo, pWaitSemaphores} |]),
+	("bufferBindCount", ''#{type uint32_t},
+		[| #{peek VkBindSparseInfo, bufferBindCount} |],
+		[| #{poke VkBindSparseInfo, bufferBindCount} |]),
+	("pBufferBinds", ''Spr.Bffr.PtrMemoryBindInfo,
+		[| #{peek VkBindSparseInfo, pBufferBinds} |],
+		[| #{poke VkBindSparseInfo, pBufferBinds} |]),
+	("imageOpaqueBindCount", ''#{type uint32_t},
+		[| #{peek VkBindSparseInfo, imageOpaqueBindCount} |],
+		[| #{poke VkBindSparseInfo, imageOpaqueBindCount} |]),
+	("pImageOpaqueBinds", ''Spr.Img.PtrOpaqueMemoryBindInfo,
+		[| #{peek VkBindSparseInfo, pImageOpaqueBinds} |],
+		[| #{poke VkBindSparseInfo, pImageOpaqueBinds} |]),
+	("imageBindCount", ''#{type uint32_t},
+		[| #{peek VkBindSparseInfo, imageBindCount} |],
+		[| #{poke VkBindSparseInfo, imageBindCount} |]),
+	("pImageBinds", ''Spr.Img.PtrMemoryBindInfo,
+		[| #{peek VkBindSparseInfo, pImageBinds} |],
+		[| #{poke VkBindSparseInfo, pImageBinds} |]),
+	("signalSemaphoreCount", ''#{type uint32_t},
+		[| #{peek VkBindSparseInfo, signalSemaphoreCount} |],
+		[| #{poke VkBindSparseInfo, signalSemaphoreCount} |]),
+	("pSignalSemaphores", ''Semaphore.PtrS,
+		[| #{peek VkBindSparseInfo, pSignalSemaphores} |],
+		[| #{poke VkBindSparseInfo, pSignalSemaphores} |]) ]
+	[''Show, ''Storable]
+
+foreign import ccall "vkQueueBindSparse" bindSparse ::
+	Q -> #{type uint32_t} -> Ptr BindSparseInfo -> Fence.F ->
+	IO #{type VkResult}
diff --git a/src/Gpu/Vulkan/Sparse/Buffer/Core.hsc b/src/Gpu/Vulkan/Sparse/Buffer/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/Gpu/Vulkan/Sparse/Buffer/Core.hsc
@@ -0,0 +1,32 @@
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
+{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
+
+module Gpu.Vulkan.Sparse.Buffer.Core where
+
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.C.Struct
+import Data.Word
+
+import Gpu.Vulkan.Buffer.Core qualified as Buffer
+import Gpu.Vulkan.Sparse.Core
+
+#include <vulkan/vulkan.h>
+
+struct "MemoryBindInfo" #{size VkSparseBufferMemoryBindInfo}
+	#{alignment VkSparseBufferMemoryBindInfo} [
+	("buffer", ''Buffer.B,
+		[| #{peek VkSparseBufferMemoryBindInfo, buffer} |],
+		[| #{poke VkSparseBufferMemoryBindInfo, buffer} |]),
+	("bindCount", ''#{type uint32_t},
+		[| #{peek VkSparseBufferMemoryBindInfo, bindCount} |],
+		[| #{poke VkSparseBufferMemoryBindInfo, bindCount} |]),
+	("pBinds", ''PtrMemoryBind,
+		[| #{peek VkSparseBufferMemoryBindInfo, pBinds} |],
+		[| #{poke VkSparseBufferMemoryBindInfo, pBinds} |]) ]
+	[''Show, ''Storable]
+
+type PtrMemoryBindInfo = Ptr MemoryBindInfo
diff --git a/src/Gpu/Vulkan/Sparse/Core.hsc b/src/Gpu/Vulkan/Sparse/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/Gpu/Vulkan/Sparse/Core.hsc
@@ -0,0 +1,36 @@
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
+{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
+
+module Gpu.Vulkan.Sparse.Core where
+
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.C.Struct
+import Data.Word
+
+import Gpu.Vulkan.Memory.Core qualified as Memory
+
+#include <vulkan/vulkan.h>
+
+struct "MemoryBind" #{size VkSparseMemoryBind} #{alignment VkSparseMemoryBind} [
+	("resourceOffset", ''#{type VkDeviceSize},
+		[| #{peek VkSparseMemoryBind, resourceOffset} |],
+		[| #{poke VkSparseMemoryBind, resourceOffset} |]),
+	("size", ''#{type VkDeviceSize},
+		[| #{peek VkSparseMemoryBind, size} |],
+		[| #{poke VkSparseMemoryBind, size} |]),
+	("memory", ''Memory.M,
+		[| #{peek VkSparseMemoryBind, memory} |],
+		[| #{poke VkSparseMemoryBind, memory} |]),
+	("memoryOffset", ''#{type VkDeviceSize},
+		[| #{peek VkSparseMemoryBind, memoryOffset} |],
+		[| #{poke VkSparseMemoryBind, memoryOffset} |]),
+	("flags", ''#{type VkSparseMemoryBindFlags},
+		[| #{peek VkSparseMemoryBind, flags} |],
+		[| #{poke VkSparseMemoryBind, flags} |]) ]
+	[''Show, ''Storable]
+
+type PtrMemoryBind = Ptr MemoryBind
diff --git a/src/Gpu/Vulkan/Sparse/Image/Core.hsc b/src/Gpu/Vulkan/Sparse/Image/Core.hsc
new file mode 100644
--- /dev/null
+++ b/src/Gpu/Vulkan/Sparse/Image/Core.hsc
@@ -0,0 +1,73 @@
+{-# LANGUAGE ImportQualifiedPost #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
+{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
+
+module Gpu.Vulkan.Sparse.Image.Core where
+
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.C.Struct
+import Data.Word
+
+import Gpu.Vulkan.Core
+import Gpu.Vulkan.Memory.Core qualified as Memory
+import Gpu.Vulkan.Image.Core qualified as Image
+import Gpu.Vulkan.Sparse.Core qualified as S
+
+#include <vulkan/vulkan.h>
+
+struct "OpaqueMemoryBindInfo" #{size VkSparseImageOpaqueMemoryBindInfo}
+	#{alignment VkSparseImageOpaqueMemoryBindInfo} [
+	("image", ''Image.I,
+		[| #{peek VkSparseImageOpaqueMemoryBindInfo, image} |],
+		[| #{poke VkSparseImageOpaqueMemoryBindInfo, image} |]),
+	("bindCount", ''#{type uint32_t},
+		[| #{peek VkSparseImageOpaqueMemoryBindInfo, bindCount} |],
+		[| #{poke VkSparseImageOpaqueMemoryBindInfo, bindCount} |]),
+	("pBinds", ''S.PtrMemoryBind,
+		[| #{peek VkSparseImageOpaqueMemoryBindInfo, pBinds} |],
+		[| #{poke VkSparseImageOpaqueMemoryBindInfo, pBinds} |]) ]
+	[''Show, ''Storable]
+
+type PtrOpaqueMemoryBindInfo = Ptr OpaqueMemoryBindInfo
+
+struct "MemoryBind" #{size VkSparseImageMemoryBind}
+	#{alignment VkSparseImageMemoryBind} [
+	("subresource", ''Image.Subresource,
+		[| #{peek VkSparseImageMemoryBind, subresource} |],
+		[| #{poke VkSparseImageMemoryBind, subresource} |]),
+	("offset", ''Offset3d,
+		[| #{peek VkSparseImageMemoryBind, offset} |],
+		[| #{poke VkSparseImageMemoryBind, offset} |]),
+	("extent", ''Extent3d,
+		[| #{peek VkSparseImageMemoryBind, extent} |],
+		[| #{poke VkSparseImageMemoryBind, extent} |]),
+	("memory", ''Memory.M,
+		[| #{peek VkSparseImageMemoryBind, memory} |],
+		[| #{poke VkSparseImageMemoryBind, memory} |]),
+	("memoryOffset", ''#{type VkDeviceSize},
+		[| #{peek VkSparseImageMemoryBind, memoryOffset} |],
+		[| #{poke VkSparseImageMemoryBind, memoryOffset} |]),
+	("flags", ''#{type VkSparseMemoryBindFlags},
+		[| #{peek VkSparseImageMemoryBind, flags} |],
+		[| #{poke VkSparseImageMemoryBind, flags} |]) ]
+	[''Show, ''Storable]
+
+type PtrMemoryBind = Ptr MemoryBind
+
+struct "MemoryBindInfo" #{size VkSparseImageMemoryBindInfo}
+	#{alignment VkSparseImageMemoryBindInfo} [
+	("image", ''Image.I,
+		[| #{peek VkSparseImageMemoryBindInfo, image} |],
+		[| #{poke VkSparseImageMemoryBindInfo, image} |]),
+	("bindCount", ''#{type uint32_t},
+		[| #{peek VkSparseImageMemoryBindInfo, bindCount} |],
+		[| #{poke VkSparseImageMemoryBindInfo, bindCount} |]),
+	("pBinds", ''PtrMemoryBind,
+		[| #{peek VkSparseImageMemoryBindInfo, pBinds} |],
+		[| #{poke VkSparseImageMemoryBindInfo, pBinds} |]) ]
+	[''Show, ''Storable]
+
+type PtrMemoryBindInfo = Ptr MemoryBindInfo
