diff --git a/gpu-vulkan-core.cabal b/gpu-vulkan-core.cabal
--- a/gpu-vulkan-core.cabal
+++ b/gpu-vulkan-core.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           gpu-vulkan-core
-version:        0.1.0.18
+version:        0.1.0.19
 synopsis:       Thin wrapper for Vulkan API
 description:    Please see the README on GitHub at <https://github.com/YoshikuniJujo/gpu-vulkan-core#readme>
 category:       GPU
diff --git a/src/Gpu/Vulkan/CommandBuffer/Core.hs-boot b/src/Gpu/Vulkan/CommandBuffer/Core.hs-boot
--- a/src/Gpu/Vulkan/CommandBuffer/Core.hs-boot
+++ b/src/Gpu/Vulkan/CommandBuffer/Core.hs-boot
@@ -1,9 +1,12 @@
 {-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
 
-module Gpu.Vulkan.CommandBuffer.Core (C, PtrC) where
+module Gpu.Vulkan.CommandBuffer.Core (C, PtrC, PtrSubmitInfo) where
 
 import Foreign.Ptr
 
 data CTag
 type C = Ptr CTag
 type PtrC = Ptr C
+
+data SubmitInfo
+type PtrSubmitInfo = Ptr SubmitInfo
diff --git a/src/Gpu/Vulkan/CommandBuffer/Core.hsc b/src/Gpu/Vulkan/CommandBuffer/Core.hsc
--- a/src/Gpu/Vulkan/CommandBuffer/Core.hsc
+++ b/src/Gpu/Vulkan/CommandBuffer/Core.hsc
@@ -23,8 +23,14 @@
 	inheritanceInfoSType, inheritanceInfoPNext,
 	inheritanceInfoRenderPass, inheritanceInfoSubpass,
 	inheritanceInfoFramebuffer, inheritanceInfoOcclusionQueryEnable,
-	inheritanceInfoQueryFlags, inheritanceInfoPipelineStatistics
+	inheritanceInfoQueryFlags, inheritanceInfoPipelineStatistics,
 
+	-- * SUBMIT INFO
+
+	SubmitInfo, PtrSubmitInfo, pattern SubmitInfo,
+	submitInfoSType, submitInfoPNext,
+	submitInfoCommandBuffer, submitInfoDeviceMask
+
 	) where
 
 import Foreign.Ptr
@@ -135,3 +141,25 @@
 
 foreign import ccall "vkFreeCommandBuffers" freeCs ::
 	Device.D -> CommandPool.C -> #{type uint32_t} -> Ptr C -> IO ()
+
+sTypeS :: #{type VkStructureType}
+sTypeS = #{const VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO}
+
+struct "SubmitInfo" #{size VkCommandBufferSubmitInfo}
+		#{alignment VkCommandBufferSubmitInfo} [
+	("sType", ''(), [| const $ pure () |],
+		[| \p _ -> #{poke VkCommandBufferSubmitInfo, sType}
+			p sTypeS |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkCommandBufferSubmitInfo, pNext} |],
+		[| #{poke VkCommandBufferSubmitInfo, pNext} |]),
+	("commandBuffer", ''C,
+		[| #{peek VkCommandBufferSubmitInfo, commandBuffer} |],
+		[| #{poke VkCommandBufferSubmitInfo, commandBuffer} |]),
+	("deviceMask", ''#{type uint32_t},
+		[| #{peek VkCommandBufferSubmitInfo, deviceMask} |],
+		[| #{poke VkCommandBufferSubmitInfo, deviceMask} |])
+	]
+	[''Show, ''Storable]
+
+type PtrSubmitInfo = Ptr SubmitInfo
diff --git a/src/Gpu/Vulkan/Core.hsc b/src/Gpu/Vulkan/Core.hsc
--- a/src/Gpu/Vulkan/Core.hsc
+++ b/src/Gpu/Vulkan/Core.hsc
@@ -31,6 +31,12 @@
 	submitInfoCommandBufferCount, submitInfoPCommandBuffers,
 	submitInfoSignalSemaphoreCount, submitInfoPSignalSemaphores,
 
+	SubmitInfo2, pattern SubmitInfo2,
+	submitInfo2SType, submitInfo2PNext, submitInfo2Flags,
+	submitInfo2WaitSemaphoreInfoCount, submitInfo2PWaitSemaphoreInfos,
+	submitInfo2CommandBufferInfoCount, submitInfo2PCommandBufferInfos,
+	submitInfo2SignalSemaphoreInfoCount, submitInfo2PSignalSemaphoreInfos,
+
 	-- * PROPERTIES
 
 	-- ** ExtensionProperties
@@ -290,6 +296,38 @@
 	("pSignalSemaphores", ''Semaphore.PtrS,
 		[| #{peek VkSubmitInfo, pSignalSemaphores} |],
 		[| #{poke VkSubmitInfo, pSignalSemaphores} |]) ]
+	[''Show, ''Storable]
+
+sTypeS2 :: #{type VkStructureType}
+sTypeS2 = #{const VK_STRUCTURE_TYPE_SUBMIT_INFO_2}
+
+struct "SubmitInfo2" #{size VkSubmitInfo2} #{alignment VkSubmitInfo2} [
+	("sType", ''(), [| const $ pure () |],
+		[| \p _ -> #{poke VkSubmitInfo2, sType} p sTypeS2 |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkSubmitInfo2, pNext} |],
+		[| #{poke VkSubmitInfo2, pNext} |]),
+	("flags", ''#{type VkSubmitFlags},
+		[| #{peek VkSubmitInfo2, flags} |],
+		[| #{poke VkSubmitInfo2, flags} |]),
+	("waitSemaphoreInfoCount", ''#{type uint32_t},
+		[| #{peek VkSubmitInfo2, waitSemaphoreInfoCount} |],
+		[| #{poke VkSubmitInfo2, waitSemaphoreInfoCount} |]),
+	("pWaitSemaphoreInfos", ''Semaphore.PtrSubmitInfo,
+		[| #{peek VkSubmitInfo2, pWaitSemaphoreInfos} |],
+		[| #{poke VkSubmitInfo2, pWaitSemaphoreInfos} |]),
+	("commandBufferInfoCount", ''#{type uint32_t},
+		[| #{peek VkSubmitInfo2, commandBufferInfoCount} |],
+		[| #{poke VkSubmitInfo2, commandBufferInfoCount} |]),
+	("pCommandBufferInfos", ''CommandBuffer.PtrSubmitInfo,
+		[| #{peek VkSubmitInfo2, pCommandBufferInfos} |],
+		[| #{poke VkSubmitInfo2, pCommandBufferInfos} |]),
+	("signalSemaphoreInfoCount", ''#{type uint32_t},
+		[| #{peek VkSubmitInfo2, signalSemaphoreInfoCount} |],
+		[| #{poke VkSubmitInfo2, signalSemaphoreInfoCount} |]),
+	("pSignalSemaphoreInfos", ''Semaphore.PtrSubmitInfo,
+		[| #{peek VkSubmitInfo2, pSignalSemaphoreInfos} |],
+		[| #{poke VkSubmitInfo2, pSignalSemaphoreInfos} |]) ]
 	[''Show, ''Storable]
 
 struct "ExtensionProperties" #{size VkExtensionProperties}
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
@@ -8,7 +8,7 @@
 
 	-- * SUBMIT AND WAIT IDLE
 
-	Q, submit, waitIdle,
+	Q, submit, submit2, waitIdle,
 
 	-- * BIND SPARSE
 
@@ -90,4 +90,8 @@
 
 foreign import ccall "vkQueueBindSparse" bindSparse ::
 	Q -> #{type uint32_t} -> Ptr BindSparseInfo -> Fence.F ->
+	IO #{type VkResult}
+
+foreign import ccall "vkQueueSubmit2" submit2 ::
+	Q -> #{type uint32_t} -> Ptr SubmitInfo2 -> Fence.F ->
 	IO #{type VkResult}
diff --git a/src/Gpu/Vulkan/Semaphore/Core.hs-boot b/src/Gpu/Vulkan/Semaphore/Core.hs-boot
--- a/src/Gpu/Vulkan/Semaphore/Core.hs-boot
+++ b/src/Gpu/Vulkan/Semaphore/Core.hs-boot
@@ -1,9 +1,12 @@
 {-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
 
-module Gpu.Vulkan.Semaphore.Core (S, PtrS) where
+module Gpu.Vulkan.Semaphore.Core (S, PtrS, PtrSubmitInfo) where
 
 import Foreign.Ptr
 
 data STag
 type S = Ptr STag
 type PtrS = Ptr S
+
+data SubmitInfo
+type PtrSubmitInfo = Ptr SubmitInfo
diff --git a/src/Gpu/Vulkan/Semaphore/Core.hsc b/src/Gpu/Vulkan/Semaphore/Core.hsc
--- a/src/Gpu/Vulkan/Semaphore/Core.hsc
+++ b/src/Gpu/Vulkan/Semaphore/Core.hsc
@@ -10,6 +10,13 @@
 	create, destroy, S, PtrS, CreateInfo, pattern CreateInfo,
 	createInfoSType, createInfoPNext, createInfoFlags,
 
+	-- * SUBMIT INFO
+
+	SubmitInfo, PtrSubmitInfo, pattern SubmitInfo,
+	submitInfoSType, submitInfoPNext,
+	submitInfoSemaphore, submitInfoValue,
+	submitInfoStageMask, submitInfoDeviceIndex
+
 	) where
 
 import Foreign.Ptr
@@ -49,3 +56,29 @@
 
 foreign import ccall "vkDestroySemaphore" destroy ::
 	Device.D -> S -> Ptr AllocationCallbacks.A -> IO ()
+
+ssType :: #{type VkStructureType}
+ssType = #{const VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO}
+
+struct "SubmitInfo" #{size VkSemaphoreSubmitInfo}
+	#{alignment VkSemaphoreSubmitInfo} [
+	("sType", ''(), [| const $ pure () |],
+		[| \p _ -> #{poke VkSemaphoreSubmitInfo, sType} p ssType |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkSemaphoreSubmitInfo, pNext} |],
+		[| #{poke VkSemaphoreSubmitInfo, pNext} |]),
+	("semaphore", ''S,
+		[| #{peek VkSemaphoreSubmitInfo, semaphore} |],
+		[| #{poke VkSemaphoreSubmitInfo, semaphore} |]),
+	("value", ''#{type uint64_t},
+		[| #{peek VkSemaphoreSubmitInfo, value} |],
+		[| #{poke VkSemaphoreSubmitInfo, value} |]),
+	("stageMask", ''#{type VkPipelineStageFlags2},
+		[| #{peek VkSemaphoreSubmitInfo, stageMask} |],
+		[| #{poke VkSemaphoreSubmitInfo, stageMask} |]),
+	("deviceIndex", ''#{type uint32_t},
+		[| #{peek VkSemaphoreSubmitInfo, deviceIndex} |],
+		[| #{poke VkSemaphoreSubmitInfo, deviceIndex} |]) ]
+	[''Show, ''Storable]
+
+type PtrSubmitInfo = Ptr SubmitInfo
