diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,12 @@
 
 ## WIP
 
+## [3.8.1] - 2020-12-08
+- Bump API version to v1.2.164
+
+- Add cabal flag trace-calls to enable calling traceEventIO before and after
+  every Vulkan command
+
 ## [3.8] - 2020-11-30
 
 - Bump API version to v1.2.163
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: vulkan
-version: "3.8"
+version: "3.8.1"
 synopsis: Bindings to the Vulkan graphics API.
 category: Graphics
 maintainer: Joe Hermaszewski <live.long.and.prosper@monoid.al>
@@ -31,6 +31,8 @@
       cpp-options: -DSAFE_FOREIGN_CALLS
     - condition: flag(generic-instances)
       cpp-options: -DGENERIC_INSTANCES
+    - condition: flag(trace-calls)
+      cpp-options: -DTRACE_CALLS
   ghc-options:
     - -Wall
     - -Wno-unticked-promoted-constructors
@@ -52,6 +54,12 @@
     description:
       Derive Generic instances for all structs. Disabled by default because of
       code size and compile time impact.
+    default: no
+    manual: yes
+
+  trace-calls:
+    description:
+      Inserts calls to Debug.Trace.traceEventIO around every Vulkan call.
     default: no
     manual: yes
 
diff --git a/src-manual/Vulkan/Internal/Utils.hs b/src-manual/Vulkan/Internal/Utils.hs
--- a/src-manual/Vulkan/Internal/Utils.hs
+++ b/src-manual/Vulkan/Internal/Utils.hs
@@ -1,9 +1,13 @@
+{-# LANGUAGE CPP #-}
+
 module Vulkan.Internal.Utils
   ( enumReadPrec
   , enumShowsPrec
+  , traceAroundEvent
   ) where
 
 import           Data.Foldable
+import           Debug.Trace
 import           GHC.Read                       ( expectP )
 import           Text.ParserCombinators.ReadP   ( skipSpaces
                                                 , string
@@ -62,3 +66,12 @@
       in  showParen (p >= 11)
                     (showString conName . showString " " . showsInternal x)
 
+-- | Wrap an IO action with a pair of 'traceEventIO' using the specified
+-- message with "begin" or "end" appended.
+traceAroundEvent :: String -> IO a -> IO a
+#if defined(TRACE_CALLS)
+traceAroundEvent msg a =
+  traceEventIO (msg <> " begin") *> a <* traceEventIO (msg <> " end")
+#else
+traceAroundEvent _ a = a
+#endif
diff --git a/src/Vulkan/CStruct/Extends.hs b/src/Vulkan/CStruct/Extends.hs
--- a/src/Vulkan/CStruct/Extends.hs
+++ b/src/Vulkan/CStruct/Extends.hs
@@ -305,6 +305,8 @@
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_external_memory_win32 (MemoryWin32HandlePropertiesKHR)
 import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_metal_surface (MetalSurfaceCreateInfoEXT)
 import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_sample_locations (MultisamplePropertiesEXT)
+import {-# SOURCE #-} Vulkan.Extensions.VK_VALVE_mutable_descriptor_type (MutableDescriptorTypeCreateInfoVALVE)
+import {-# SOURCE #-} Vulkan.Extensions.VK_VALVE_mutable_descriptor_type (MutableDescriptorTypeListVALVE)
 import {-# SOURCE #-} Vulkan.Core10.FundamentalTypes (Offset2D)
 import {-# SOURCE #-} Vulkan.Core10.FundamentalTypes (Offset3D)
 import {-# SOURCE #-} Vulkan.Extensions.VK_GOOGLE_display_timing (PastPresentationTimingGOOGLE)
@@ -392,6 +394,7 @@
 import {-# SOURCE #-} Vulkan.Core11.Promoted_From_VK_KHR_multiview (PhysicalDeviceMultiviewFeatures)
 import {-# SOURCE #-} Vulkan.Extensions.VK_NVX_multiview_per_view_attributes (PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX)
 import {-# SOURCE #-} Vulkan.Core11.Promoted_From_VK_KHR_multiview (PhysicalDeviceMultiviewProperties)
+import {-# SOURCE #-} Vulkan.Extensions.VK_VALVE_mutable_descriptor_type (PhysicalDeviceMutableDescriptorTypeFeaturesVALVE)
 import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_pci_bus_info (PhysicalDevicePCIBusInfoPropertiesEXT)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_performance_query (PhysicalDevicePerformanceQueryFeaturesKHR)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_performance_query (PhysicalDevicePerformanceQueryPropertiesKHR)
@@ -752,8 +755,10 @@
   Extends ComputePipelineCreateInfo PipelineCreationFeedbackCreateInfoEXT = ()
   Extends ComputePipelineCreateInfo PipelineCompilerControlCreateInfoAMD = ()
   Extends DescriptorPoolCreateInfo DescriptorPoolInlineUniformBlockCreateInfoEXT = ()
+  Extends DescriptorPoolCreateInfo MutableDescriptorTypeCreateInfoVALVE = ()
   Extends DescriptorSetAllocateInfo DescriptorSetVariableDescriptorCountAllocateInfo = ()
   Extends DescriptorSetLayoutCreateInfo DescriptorSetLayoutBindingFlagsCreateInfo = ()
+  Extends DescriptorSetLayoutCreateInfo MutableDescriptorTypeCreateInfoVALVE = ()
   Extends DescriptorSetLayoutSupport DescriptorSetVariableDescriptorCountLayoutSupport = ()
   Extends DeviceCreateInfo PhysicalDeviceDeviceGeneratedCommandsFeaturesNV = ()
   Extends DeviceCreateInfo DevicePrivateDataCreateInfoEXT = ()
@@ -837,6 +842,7 @@
   Extends DeviceCreateInfo PhysicalDeviceFragmentShadingRateFeaturesKHR = ()
   Extends DeviceCreateInfo PhysicalDeviceShaderTerminateInvocationFeaturesKHR = ()
   Extends DeviceCreateInfo PhysicalDeviceFragmentShadingRateEnumsFeaturesNV = ()
+  Extends DeviceCreateInfo PhysicalDeviceMutableDescriptorTypeFeaturesVALVE = ()
   Extends DeviceQueueCreateInfo DeviceQueueGlobalPriorityCreateInfoEXT = ()
   Extends FenceCreateInfo ExportFenceCreateInfo = ()
   Extends FenceCreateInfo ExportFenceWin32HandleInfoKHR = ()
@@ -965,6 +971,7 @@
   Extends PhysicalDeviceFeatures2 PhysicalDeviceFragmentShadingRateFeaturesKHR = ()
   Extends PhysicalDeviceFeatures2 PhysicalDeviceShaderTerminateInvocationFeaturesKHR = ()
   Extends PhysicalDeviceFeatures2 PhysicalDeviceFragmentShadingRateEnumsFeaturesNV = ()
+  Extends PhysicalDeviceFeatures2 PhysicalDeviceMutableDescriptorTypeFeaturesVALVE = ()
   Extends PhysicalDeviceImageFormatInfo2 PhysicalDeviceExternalImageFormatInfo = ()
   Extends PhysicalDeviceImageFormatInfo2 ImageFormatListCreateInfo = ()
   Extends PhysicalDeviceImageFormatInfo2 PhysicalDeviceImageDrmFormatModifierInfoEXT = ()
@@ -1449,6 +1456,8 @@
   STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV -> go @PhysicalDeviceFragmentShadingRateEnumsFeaturesNV
   STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV -> go @PhysicalDeviceFragmentShadingRateEnumsPropertiesNV
   STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV -> go @PipelineFragmentShadingRateEnumStateCreateInfoNV
+  STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE -> go @PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+  STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE -> go @MutableDescriptorTypeCreateInfoVALVE
   t -> throwIO $ IOError Nothing InvalidArgument "peekChainHead" ("Unrecognized struct type: " <> show t) Nothing Nothing
  where
   go :: forall e . (Typeable e, FromCStruct e, ToCStruct e, Show e) => IO b
@@ -1763,6 +1772,8 @@
 {-# complete (::&) :: PhysicalDeviceFragmentShadingRateEnumsFeaturesNV #-}
 {-# complete (::&) :: PhysicalDeviceFragmentShadingRateEnumsPropertiesNV #-}
 {-# complete (::&) :: PipelineFragmentShadingRateEnumStateCreateInfoNV #-}
+{-# complete (::&) :: PhysicalDeviceMutableDescriptorTypeFeaturesVALVE #-}
+{-# complete (::&) :: MutableDescriptorTypeCreateInfoVALVE #-}
 
 -- | View the head and tail of a 'Chain', see '::&'
 --
diff --git a/src/Vulkan/Core10/Buffer.hs b/src/Vulkan/Core10/Buffer.hs
--- a/src/Vulkan/Core10/Buffer.hs
+++ b/src/Vulkan/Core10/Buffer.hs
@@ -12,6 +12,7 @@
                              , BufferCreateFlags
                              ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -164,7 +165,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPBuffer <- ContT $ bracket (callocBytes @Buffer 8) free
-  r <- lift $ vkCreateBuffer' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPBuffer)
+  r <- lift $ traceAroundEvent "vkCreateBuffer" (vkCreateBuffer' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPBuffer))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pBuffer <- lift $ peek @Buffer pPBuffer
   pure $ (pBuffer)
@@ -250,7 +251,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyBuffer' (deviceHandle (device)) (buffer) pAllocator
+  lift $ traceAroundEvent "vkDestroyBuffer" (vkDestroyBuffer' (deviceHandle (device)) (buffer) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/BufferView.hs b/src/Vulkan/Core10/BufferView.hs
--- a/src/Vulkan/Core10/BufferView.hs
+++ b/src/Vulkan/Core10/BufferView.hs
@@ -8,6 +8,7 @@
                                  , BufferViewCreateFlags(..)
                                  ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -123,7 +124,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPView <- ContT $ bracket (callocBytes @BufferView 8) free
-  r <- lift $ vkCreateBufferView' (deviceHandle (device)) pCreateInfo pAllocator (pPView)
+  r <- lift $ traceAroundEvent "vkCreateBufferView" (vkCreateBufferView' (deviceHandle (device)) pCreateInfo pAllocator (pPView))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pView <- lift $ peek @BufferView pPView
   pure $ (pView)
@@ -210,7 +211,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyBufferView' (deviceHandle (device)) (bufferView) pAllocator
+  lift $ traceAroundEvent "vkDestroyBufferView" (vkDestroyBufferView' (deviceHandle (device)) (bufferView) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/CommandBuffer.hs b/src/Vulkan/Core10/CommandBuffer.hs
--- a/src/Vulkan/Core10/CommandBuffer.hs
+++ b/src/Vulkan/Core10/CommandBuffer.hs
@@ -20,6 +20,7 @@
                                     , CommandBufferResetFlags
                                     ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -193,7 +194,7 @@
   let vkAllocateCommandBuffers' = mkVkAllocateCommandBuffers vkAllocateCommandBuffersPtr
   pAllocateInfo <- ContT $ withCStruct (allocateInfo)
   pPCommandBuffers <- ContT $ bracket (callocBytes @(Ptr CommandBuffer_T) ((fromIntegral $ commandBufferCount ((allocateInfo) :: CommandBufferAllocateInfo)) * 8)) free
-  r <- lift $ vkAllocateCommandBuffers' (deviceHandle (device)) pAllocateInfo (pPCommandBuffers)
+  r <- lift $ traceAroundEvent "vkAllocateCommandBuffers" (vkAllocateCommandBuffers' (deviceHandle (device)) pAllocateInfo (pPCommandBuffers))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCommandBuffers <- lift $ generateM (fromIntegral $ commandBufferCount ((allocateInfo) :: CommandBufferAllocateInfo)) (\i -> do
     pCommandBuffersElem <- peek @(Ptr CommandBuffer_T) ((pPCommandBuffers `advancePtrBytes` (8 * (i)) :: Ptr (Ptr CommandBuffer_T)))
@@ -288,7 +289,7 @@
   let vkFreeCommandBuffers' = mkVkFreeCommandBuffers vkFreeCommandBuffersPtr
   pPCommandBuffers <- ContT $ allocaBytesAligned @(Ptr CommandBuffer_T) ((Data.Vector.length (commandBuffers)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPCommandBuffers `plusPtr` (8 * (i)) :: Ptr (Ptr CommandBuffer_T)) (commandBufferHandle (e))) (commandBuffers)
-  lift $ vkFreeCommandBuffers' (deviceHandle (device)) (commandPool) ((fromIntegral (Data.Vector.length $ (commandBuffers)) :: Word32)) (pPCommandBuffers)
+  lift $ traceAroundEvent "vkFreeCommandBuffers" (vkFreeCommandBuffers' (deviceHandle (device)) (commandPool) ((fromIntegral (Data.Vector.length $ (commandBuffers)) :: Word32)) (pPCommandBuffers))
   pure $ ()
 
 
@@ -380,7 +381,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkBeginCommandBuffer is null" Nothing Nothing
   let vkBeginCommandBuffer' = mkVkBeginCommandBuffer vkBeginCommandBufferPtr
   pBeginInfo <- ContT $ withCStruct (beginInfo)
-  r <- lift $ vkBeginCommandBuffer' (commandBufferHandle (commandBuffer)) (forgetExtensions pBeginInfo)
+  r <- lift $ traceAroundEvent "vkBeginCommandBuffer" (vkBeginCommandBuffer' (commandBufferHandle (commandBuffer)) (forgetExtensions pBeginInfo))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 -- | This function will call the supplied action between calls to
@@ -482,7 +483,7 @@
   unless (vkEndCommandBufferPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkEndCommandBuffer is null" Nothing Nothing
   let vkEndCommandBuffer' = mkVkEndCommandBuffer vkEndCommandBufferPtr
-  r <- vkEndCommandBuffer' (commandBufferHandle (commandBuffer))
+  r <- traceAroundEvent "vkEndCommandBuffer" (vkEndCommandBuffer' (commandBufferHandle (commandBuffer)))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -558,7 +559,7 @@
   unless (vkResetCommandBufferPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkResetCommandBuffer is null" Nothing Nothing
   let vkResetCommandBuffer' = mkVkResetCommandBuffer vkResetCommandBufferPtr
-  r <- vkResetCommandBuffer' (commandBufferHandle (commandBuffer)) (flags)
+  r <- traceAroundEvent "vkResetCommandBuffer" (vkResetCommandBuffer' (commandBufferHandle (commandBuffer)) (flags))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -588,9 +589,6 @@
     level :: CommandBufferLevel
   , -- | @commandBufferCount@ is the number of command buffers to allocate from
     -- the pool.
-    --
-    -- #VUID-VkCommandBufferAllocateInfo-commandBufferCount-00044#
-    -- @commandBufferCount@ /must/ be greater than @0@
     commandBufferCount :: Word32
   }
   deriving (Typeable, Eq)
diff --git a/src/Vulkan/Core10/CommandBufferBuilding.hs b/src/Vulkan/Core10/CommandBufferBuilding.hs
--- a/src/Vulkan/Core10/CommandBufferBuilding.hs
+++ b/src/Vulkan/Core10/CommandBufferBuilding.hs
@@ -66,6 +66,7 @@
                                             ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -393,7 +394,7 @@
   unless (vkCmdBindPipelinePtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBindPipeline is null" Nothing Nothing
   let vkCmdBindPipeline' = mkVkCmdBindPipeline vkCmdBindPipelinePtr
-  vkCmdBindPipeline' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (pipeline)
+  traceAroundEvent "vkCmdBindPipeline" (vkCmdBindPipeline' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (pipeline))
   pure $ ()
 
 
@@ -488,7 +489,7 @@
   let vkCmdSetViewport' = mkVkCmdSetViewport vkCmdSetViewportPtr
   pPViewports <- ContT $ allocaBytesAligned @Viewport ((Data.Vector.length (viewports)) * 24) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPViewports `plusPtr` (24 * (i)) :: Ptr Viewport) (e)) (viewports)
-  lift $ vkCmdSetViewport' (commandBufferHandle (commandBuffer)) (firstViewport) ((fromIntegral (Data.Vector.length $ (viewports)) :: Word32)) (pPViewports)
+  lift $ traceAroundEvent "vkCmdSetViewport" (vkCmdSetViewport' (commandBufferHandle (commandBuffer)) (firstViewport) ((fromIntegral (Data.Vector.length $ (viewports)) :: Word32)) (pPViewports))
   pure $ ()
 
 
@@ -601,7 +602,7 @@
   let vkCmdSetScissor' = mkVkCmdSetScissor vkCmdSetScissorPtr
   pPScissors <- ContT $ allocaBytesAligned @Rect2D ((Data.Vector.length (scissors)) * 16) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPScissors `plusPtr` (16 * (i)) :: Ptr Rect2D) (e)) (scissors)
-  lift $ vkCmdSetScissor' (commandBufferHandle (commandBuffer)) (firstScissor) ((fromIntegral (Data.Vector.length $ (scissors)) :: Word32)) (pPScissors)
+  lift $ traceAroundEvent "vkCmdSetScissor" (vkCmdSetScissor' (commandBufferHandle (commandBuffer)) (firstScissor) ((fromIntegral (Data.Vector.length $ (scissors)) :: Word32)) (pPScissors))
   pure $ ()
 
 
@@ -667,7 +668,7 @@
   unless (vkCmdSetLineWidthPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetLineWidth is null" Nothing Nothing
   let vkCmdSetLineWidth' = mkVkCmdSetLineWidth vkCmdSetLineWidthPtr
-  vkCmdSetLineWidth' (commandBufferHandle (commandBuffer)) (CFloat (lineWidth))
+  traceAroundEvent "vkCmdSetLineWidth" (vkCmdSetLineWidth' (commandBufferHandle (commandBuffer)) (CFloat (lineWidth)))
   pure $ ()
 
 
@@ -811,7 +812,7 @@
   unless (vkCmdSetDepthBiasPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetDepthBias is null" Nothing Nothing
   let vkCmdSetDepthBias' = mkVkCmdSetDepthBias vkCmdSetDepthBiasPtr
-  vkCmdSetDepthBias' (commandBufferHandle (commandBuffer)) (CFloat (depthBiasConstantFactor)) (CFloat (depthBiasClamp)) (CFloat (depthBiasSlopeFactor))
+  traceAroundEvent "vkCmdSetDepthBias" (vkCmdSetDepthBias' (commandBufferHandle (commandBuffer)) (CFloat (depthBiasConstantFactor)) (CFloat (depthBiasClamp)) (CFloat (depthBiasSlopeFactor)))
   pure $ ()
 
 
@@ -883,7 +884,7 @@
       poke (pBlendConstants' `plusPtr` 4 :: Ptr CFloat) (CFloat (e1))
       poke (pBlendConstants' `plusPtr` 8 :: Ptr CFloat) (CFloat (e2))
       poke (pBlendConstants' `plusPtr` 12 :: Ptr CFloat) (CFloat (e3))
-  lift $ vkCmdSetBlendConstants' (commandBufferHandle (commandBuffer)) (pBlendConstants)
+  lift $ traceAroundEvent "vkCmdSetBlendConstants" (vkCmdSetBlendConstants' (commandBufferHandle (commandBuffer)) (pBlendConstants))
   pure $ ()
 
 
@@ -963,7 +964,7 @@
   unless (vkCmdSetDepthBoundsPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetDepthBounds is null" Nothing Nothing
   let vkCmdSetDepthBounds' = mkVkCmdSetDepthBounds vkCmdSetDepthBoundsPtr
-  vkCmdSetDepthBounds' (commandBufferHandle (commandBuffer)) (CFloat (minDepthBounds)) (CFloat (maxDepthBounds))
+  traceAroundEvent "vkCmdSetDepthBounds" (vkCmdSetDepthBounds' (commandBufferHandle (commandBuffer)) (CFloat (minDepthBounds)) (CFloat (maxDepthBounds)))
   pure $ ()
 
 
@@ -1044,7 +1045,7 @@
   unless (vkCmdSetStencilCompareMaskPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetStencilCompareMask is null" Nothing Nothing
   let vkCmdSetStencilCompareMask' = mkVkCmdSetStencilCompareMask vkCmdSetStencilCompareMaskPtr
-  vkCmdSetStencilCompareMask' (commandBufferHandle (commandBuffer)) (faceMask) (compareMask)
+  traceAroundEvent "vkCmdSetStencilCompareMask" (vkCmdSetStencilCompareMask' (commandBufferHandle (commandBuffer)) (faceMask) (compareMask))
   pure $ ()
 
 
@@ -1126,7 +1127,7 @@
   unless (vkCmdSetStencilWriteMaskPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetStencilWriteMask is null" Nothing Nothing
   let vkCmdSetStencilWriteMask' = mkVkCmdSetStencilWriteMask vkCmdSetStencilWriteMaskPtr
-  vkCmdSetStencilWriteMask' (commandBufferHandle (commandBuffer)) (faceMask) (writeMask)
+  traceAroundEvent "vkCmdSetStencilWriteMask" (vkCmdSetStencilWriteMask' (commandBufferHandle (commandBuffer)) (faceMask) (writeMask))
   pure $ ()
 
 
@@ -1208,7 +1209,7 @@
   unless (vkCmdSetStencilReferencePtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetStencilReference is null" Nothing Nothing
   let vkCmdSetStencilReference' = mkVkCmdSetStencilReference vkCmdSetStencilReferencePtr
-  vkCmdSetStencilReference' (commandBufferHandle (commandBuffer)) (faceMask) (reference)
+  traceAroundEvent "vkCmdSetStencilReference" (vkCmdSetStencilReference' (commandBufferHandle (commandBuffer)) (faceMask) (reference))
   pure $ ()
 
 
@@ -1330,6 +1331,12 @@
 --     sum of the effective offset, as defined above, and the range of the
 --     binding /must/ be less than or equal to the size of the buffer
 --
+-- -   #VUID-vkCmdBindDescriptorSets-pDescriptorSets-04616# Each element of
+--     @pDescriptorSets@ /must/ not have been allocated from a
+--     'Vulkan.Core10.Handles.DescriptorPool' with the
+--     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+--     flag set
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-vkCmdBindDescriptorSets-commandBuffer-parameter#
@@ -1425,7 +1432,7 @@
   lift $ Data.Vector.imapM_ (\i e -> poke (pPDescriptorSets `plusPtr` (8 * (i)) :: Ptr DescriptorSet) (e)) (descriptorSets)
   pPDynamicOffsets <- ContT $ allocaBytesAligned @Word32 ((Data.Vector.length (dynamicOffsets)) * 4) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPDynamicOffsets `plusPtr` (4 * (i)) :: Ptr Word32) (e)) (dynamicOffsets)
-  lift $ vkCmdBindDescriptorSets' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (layout) (firstSet) ((fromIntegral (Data.Vector.length $ (descriptorSets)) :: Word32)) (pPDescriptorSets) ((fromIntegral (Data.Vector.length $ (dynamicOffsets)) :: Word32)) (pPDynamicOffsets)
+  lift $ traceAroundEvent "vkCmdBindDescriptorSets" (vkCmdBindDescriptorSets' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (layout) (firstSet) ((fromIntegral (Data.Vector.length $ (descriptorSets)) :: Word32)) (pPDescriptorSets) ((fromIntegral (Data.Vector.length $ (dynamicOffsets)) :: Word32)) (pPDynamicOffsets))
   pure $ ()
 
 
@@ -1530,7 +1537,7 @@
   unless (vkCmdBindIndexBufferPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBindIndexBuffer is null" Nothing Nothing
   let vkCmdBindIndexBuffer' = mkVkCmdBindIndexBuffer vkCmdBindIndexBufferPtr
-  vkCmdBindIndexBuffer' (commandBufferHandle (commandBuffer)) (buffer) (offset) (indexType)
+  traceAroundEvent "vkCmdBindIndexBuffer" (vkCmdBindIndexBuffer' (commandBufferHandle (commandBuffer)) (buffer) (offset) (indexType))
   pure $ ()
 
 
@@ -1671,7 +1678,7 @@
   lift $ Data.Vector.imapM_ (\i e -> poke (pPBuffers `plusPtr` (8 * (i)) :: Ptr Buffer) (e)) (buffers)
   pPOffsets <- ContT $ allocaBytesAligned @DeviceSize ((Data.Vector.length (offsets)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPOffsets `plusPtr` (8 * (i)) :: Ptr DeviceSize) (e)) (offsets)
-  lift $ vkCmdBindVertexBuffers' (commandBufferHandle (commandBuffer)) (firstBinding) ((fromIntegral pBuffersLength :: Word32)) (pPBuffers) (pPOffsets)
+  lift $ traceAroundEvent "vkCmdBindVertexBuffers" (vkCmdBindVertexBuffers' (commandBufferHandle (commandBuffer)) (firstBinding) ((fromIntegral pBuffersLength :: Word32)) (pPBuffers) (pPOffsets))
   pure $ ()
 
 
@@ -2093,6 +2100,13 @@
 --     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
 --     point /must/ not write to any resource
 --
+-- -   #VUID-vkCmdDraw-commandBuffer-04617# If any of the shader stages of
+--     the 'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind
+--     point used by this command uses the
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities-table-RayQueryKHR RayQueryKHR>
+--     capability, then @commandBuffer@ /must/ not be a protected command
+--     buffer
+--
 -- -   #VUID-vkCmdDraw-None-04007# All vertex input bindings accessed via
 --     vertex input variables declared in the vertex shader entry point’s
 --     interface /must/ have either valid or
@@ -2165,7 +2179,7 @@
   unless (vkCmdDrawPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDraw is null" Nothing Nothing
   let vkCmdDraw' = mkVkCmdDraw vkCmdDrawPtr
-  vkCmdDraw' (commandBufferHandle (commandBuffer)) (vertexCount) (instanceCount) (firstVertex) (firstInstance)
+  traceAroundEvent "vkCmdDraw" (vkCmdDraw' (commandBufferHandle (commandBuffer)) (vertexCount) (instanceCount) (firstVertex) (firstInstance))
   pure $ ()
 
 
@@ -2609,6 +2623,13 @@
 --     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
 --     point /must/ not write to any resource
 --
+-- -   #VUID-vkCmdDrawIndexed-commandBuffer-04617# If any of the shader
+--     stages of the 'Vulkan.Core10.Handles.Pipeline' bound to the pipeline
+--     bind point used by this command uses the
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities-table-RayQueryKHR RayQueryKHR>
+--     capability, then @commandBuffer@ /must/ not be a protected command
+--     buffer
+--
 -- -   #VUID-vkCmdDrawIndexed-None-04007# All vertex input bindings
 --     accessed via vertex input variables declared in the vertex shader
 --     entry point’s interface /must/ have either valid or
@@ -2690,7 +2711,7 @@
   unless (vkCmdDrawIndexedPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawIndexed is null" Nothing Nothing
   let vkCmdDrawIndexed' = mkVkCmdDrawIndexed vkCmdDrawIndexedPtr
-  vkCmdDrawIndexed' (commandBufferHandle (commandBuffer)) (indexCount) (instanceCount) (firstIndex) (vertexOffset) (firstInstance)
+  traceAroundEvent "vkCmdDrawIndexed" (vkCmdDrawIndexed' (commandBufferHandle (commandBuffer)) (indexCount) (instanceCount) (firstIndex) (vertexOffset) (firstInstance))
   pure $ ()
 
 
@@ -3232,7 +3253,7 @@
   unless (vkCmdDrawIndirectPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawIndirect is null" Nothing Nothing
   let vkCmdDrawIndirect' = mkVkCmdDrawIndirect vkCmdDrawIndirectPtr
-  vkCmdDrawIndirect' (commandBufferHandle (commandBuffer)) (buffer) (offset) (drawCount) (stride)
+  traceAroundEvent "vkCmdDrawIndirect" (vkCmdDrawIndirect' (commandBufferHandle (commandBuffer)) (buffer) (offset) (drawCount) (stride))
   pure $ ()
 
 
@@ -3778,7 +3799,7 @@
   unless (vkCmdDrawIndexedIndirectPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawIndexedIndirect is null" Nothing Nothing
   let vkCmdDrawIndexedIndirect' = mkVkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirectPtr
-  vkCmdDrawIndexedIndirect' (commandBufferHandle (commandBuffer)) (buffer) (offset) (drawCount) (stride)
+  traceAroundEvent "vkCmdDrawIndexedIndirect" (vkCmdDrawIndexedIndirect' (commandBufferHandle (commandBuffer)) (buffer) (offset) (drawCount) (stride))
   pure $ ()
 
 
@@ -4016,6 +4037,13 @@
 --     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
 --     point /must/ not write to any resource
 --
+-- -   #VUID-vkCmdDispatch-commandBuffer-04617# If any of the shader stages
+--     of the 'Vulkan.Core10.Handles.Pipeline' bound to the pipeline bind
+--     point used by this command uses the
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities-table-RayQueryKHR RayQueryKHR>
+--     capability, then @commandBuffer@ /must/ not be a protected command
+--     buffer
+--
 -- -   #VUID-vkCmdDispatch-groupCountX-00386# @groupCountX@ /must/ be less
 --     than or equal to
 --     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxComputeWorkGroupCount@[0]
@@ -4085,7 +4113,7 @@
   unless (vkCmdDispatchPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDispatch is null" Nothing Nothing
   let vkCmdDispatch' = mkVkCmdDispatch vkCmdDispatchPtr
-  vkCmdDispatch' (commandBufferHandle (commandBuffer)) (groupCountX) (groupCountY) (groupCountZ)
+  traceAroundEvent "vkCmdDispatch" (vkCmdDispatch' (commandBufferHandle (commandBuffer)) (groupCountX) (groupCountY) (groupCountZ))
   pure $ ()
 
 
@@ -4395,7 +4423,7 @@
   unless (vkCmdDispatchIndirectPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDispatchIndirect is null" Nothing Nothing
   let vkCmdDispatchIndirect' = mkVkCmdDispatchIndirect vkCmdDispatchIndirectPtr
-  vkCmdDispatchIndirect' (commandBufferHandle (commandBuffer)) (buffer) (offset)
+  traceAroundEvent "vkCmdDispatchIndirect" (vkCmdDispatchIndirect' (commandBufferHandle (commandBuffer)) (buffer) (offset))
   pure $ ()
 
 
@@ -4544,7 +4572,7 @@
   let vkCmdCopyBuffer' = mkVkCmdCopyBuffer vkCmdCopyBufferPtr
   pPRegions <- ContT $ allocaBytesAligned @BufferCopy ((Data.Vector.length (regions)) * 24) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRegions `plusPtr` (24 * (i)) :: Ptr BufferCopy) (e)) (regions)
-  lift $ vkCmdCopyBuffer' (commandBufferHandle (commandBuffer)) (srcBuffer) (dstBuffer) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions)
+  lift $ traceAroundEvent "vkCmdCopyBuffer" (vkCmdCopyBuffer' (commandBufferHandle (commandBuffer)) (srcBuffer) (dstBuffer) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions))
   pure $ ()
 
 
@@ -5089,7 +5117,7 @@
   let vkCmdCopyImage' = mkVkCmdCopyImage vkCmdCopyImagePtr
   pPRegions <- ContT $ allocaBytesAligned @ImageCopy ((Data.Vector.length (regions)) * 68) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRegions `plusPtr` (68 * (i)) :: Ptr ImageCopy) (e)) (regions)
-  lift $ vkCmdCopyImage' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions)
+  lift $ traceAroundEvent "vkCmdCopyImage" (vkCmdCopyImage' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions))
   pure $ ()
 
 
@@ -5535,7 +5563,7 @@
   let vkCmdBlitImage' = mkVkCmdBlitImage vkCmdBlitImagePtr
   pPRegions <- ContT $ allocaBytesAligned @ImageBlit ((Data.Vector.length (regions)) * 80) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRegions `plusPtr` (80 * (i)) :: Ptr ImageBlit) (e)) (regions)
-  lift $ vkCmdBlitImage' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions) (filter')
+  lift $ traceAroundEvent "vkCmdBlitImage" (vkCmdBlitImage' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions) (filter'))
   pure $ ()
 
 
@@ -5880,7 +5908,7 @@
   let vkCmdCopyBufferToImage' = mkVkCmdCopyBufferToImage vkCmdCopyBufferToImagePtr
   pPRegions <- ContT $ allocaBytesAligned @BufferImageCopy ((Data.Vector.length (regions)) * 56) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRegions `plusPtr` (56 * (i)) :: Ptr BufferImageCopy) (e)) (regions)
-  lift $ vkCmdCopyBufferToImage' (commandBufferHandle (commandBuffer)) (srcBuffer) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions)
+  lift $ traceAroundEvent "vkCmdCopyBufferToImage" (vkCmdCopyBufferToImage' (commandBufferHandle (commandBuffer)) (srcBuffer) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions))
   pure $ ()
 
 
@@ -6216,7 +6244,7 @@
   let vkCmdCopyImageToBuffer' = mkVkCmdCopyImageToBuffer vkCmdCopyImageToBufferPtr
   pPRegions <- ContT $ allocaBytesAligned @BufferImageCopy ((Data.Vector.length (regions)) * 56) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRegions `plusPtr` (56 * (i)) :: Ptr BufferImageCopy) (e)) (regions)
-  lift $ vkCmdCopyImageToBuffer' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstBuffer) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions)
+  lift $ traceAroundEvent "vkCmdCopyImageToBuffer" (vkCmdCopyImageToBuffer' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstBuffer) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions))
   pure $ ()
 
 
@@ -6372,7 +6400,7 @@
   unless (vkCmdUpdateBufferPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdUpdateBuffer is null" Nothing Nothing
   let vkCmdUpdateBuffer' = mkVkCmdUpdateBuffer vkCmdUpdateBufferPtr
-  vkCmdUpdateBuffer' (commandBufferHandle (commandBuffer)) (dstBuffer) (dstOffset) (dataSize) (data')
+  traceAroundEvent "vkCmdUpdateBuffer" (vkCmdUpdateBuffer' (commandBufferHandle (commandBuffer)) (dstBuffer) (dstOffset) (dataSize) (data'))
   pure $ ()
 
 
@@ -6505,7 +6533,7 @@
   unless (vkCmdFillBufferPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdFillBuffer is null" Nothing Nothing
   let vkCmdFillBuffer' = mkVkCmdFillBuffer vkCmdFillBufferPtr
-  vkCmdFillBuffer' (commandBufferHandle (commandBuffer)) (dstBuffer) (dstOffset) (size) (data')
+  traceAroundEvent "vkCmdFillBuffer" (vkCmdFillBuffer' (commandBufferHandle (commandBuffer)) (dstBuffer) (dstOffset) (size) (data'))
   pure $ ()
 
 
@@ -6693,7 +6721,7 @@
   pColor <- ContT $ withCStruct (color)
   pPRanges <- ContT $ allocaBytesAligned @ImageSubresourceRange ((Data.Vector.length (ranges)) * 20) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRanges `plusPtr` (20 * (i)) :: Ptr ImageSubresourceRange) (e)) (ranges)
-  lift $ vkCmdClearColorImage' (commandBufferHandle (commandBuffer)) (image) (imageLayout) pColor ((fromIntegral (Data.Vector.length $ (ranges)) :: Word32)) (pPRanges)
+  lift $ traceAroundEvent "vkCmdClearColorImage" (vkCmdClearColorImage' (commandBufferHandle (commandBuffer)) (image) (imageLayout) pColor ((fromIntegral (Data.Vector.length $ (ranges)) :: Word32)) (pPRanges))
   pure $ ()
 
 
@@ -6911,7 +6939,7 @@
   pDepthStencil <- ContT $ withCStruct (depthStencil)
   pPRanges <- ContT $ allocaBytesAligned @ImageSubresourceRange ((Data.Vector.length (ranges)) * 20) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRanges `plusPtr` (20 * (i)) :: Ptr ImageSubresourceRange) (e)) (ranges)
-  lift $ vkCmdClearDepthStencilImage' (commandBufferHandle (commandBuffer)) (image) (imageLayout) pDepthStencil ((fromIntegral (Data.Vector.length $ (ranges)) :: Word32)) (pPRanges)
+  lift $ traceAroundEvent "vkCmdClearDepthStencilImage" (vkCmdClearDepthStencilImage' (commandBufferHandle (commandBuffer)) (image) (imageLayout) pDepthStencil ((fromIntegral (Data.Vector.length $ (ranges)) :: Word32)) (pPRanges))
   pure $ ()
 
 
@@ -7087,7 +7115,7 @@
   Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPAttachments `plusPtr` (24 * (i)) :: Ptr ClearAttachment) (e) . ($ ())) (attachments)
   pPRects <- ContT $ allocaBytesAligned @ClearRect ((Data.Vector.length (rects)) * 24) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRects `plusPtr` (24 * (i)) :: Ptr ClearRect) (e)) (rects)
-  lift $ vkCmdClearAttachments' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (attachments)) :: Word32)) (pPAttachments) ((fromIntegral (Data.Vector.length $ (rects)) :: Word32)) (pPRects)
+  lift $ traceAroundEvent "vkCmdClearAttachments" (vkCmdClearAttachments' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (attachments)) :: Word32)) (pPAttachments) ((fromIntegral (Data.Vector.length $ (rects)) :: Word32)) (pPRects))
   pure $ ()
 
 
@@ -7362,7 +7390,7 @@
   let vkCmdResolveImage' = mkVkCmdResolveImage vkCmdResolveImagePtr
   pPRegions <- ContT $ allocaBytesAligned @ImageResolve ((Data.Vector.length (regions)) * 68) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPRegions `plusPtr` (68 * (i)) :: Ptr ImageResolve) (e)) (regions)
-  lift $ vkCmdResolveImage' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions)
+  lift $ traceAroundEvent "vkCmdResolveImage" (vkCmdResolveImage' (commandBufferHandle (commandBuffer)) (srcImage) (srcImageLayout) (dstImage) (dstImageLayout) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32)) (pPRegions))
   pure $ ()
 
 
@@ -7527,7 +7555,7 @@
   unless (vkCmdSetEventPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetEvent is null" Nothing Nothing
   let vkCmdSetEvent' = mkVkCmdSetEvent vkCmdSetEventPtr
-  vkCmdSetEvent' (commandBufferHandle (commandBuffer)) (event) (stageMask)
+  traceAroundEvent "vkCmdSetEvent" (vkCmdSetEvent' (commandBufferHandle (commandBuffer)) (event) (stageMask))
   pure $ ()
 
 
@@ -7698,7 +7726,7 @@
   unless (vkCmdResetEventPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdResetEvent is null" Nothing Nothing
   let vkCmdResetEvent' = mkVkCmdResetEvent vkCmdResetEventPtr
-  vkCmdResetEvent' (commandBufferHandle (commandBuffer)) (event) (stageMask)
+  traceAroundEvent "vkCmdResetEvent" (vkCmdResetEvent' (commandBufferHandle (commandBuffer)) (event) (stageMask))
   pure $ ()
 
 
@@ -7756,7 +7784,7 @@
   lift $ Data.Vector.imapM_ (\i e -> poke (pPBufferMemoryBarriers `plusPtr` (56 * (i)) :: Ptr BufferMemoryBarrier) (e)) (bufferMemoryBarriers)
   pPImageMemoryBarriers <- ContT $ allocaBytesAligned @(ImageMemoryBarrier _) ((Data.Vector.length (imageMemoryBarriers)) * 72) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPImageMemoryBarriers `plusPtr` (72 * (i)) :: Ptr (ImageMemoryBarrier _))) (e) . ($ ())) (imageMemoryBarriers)
-  lift $ vkCmdWaitEvents' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (events)) :: Word32)) (pPEvents) (srcStageMask) (dstStageMask) ((fromIntegral (Data.Vector.length $ (memoryBarriers)) :: Word32)) (pPMemoryBarriers) ((fromIntegral (Data.Vector.length $ (bufferMemoryBarriers)) :: Word32)) (pPBufferMemoryBarriers) ((fromIntegral (Data.Vector.length $ (imageMemoryBarriers)) :: Word32)) (forgetExtensions (pPImageMemoryBarriers))
+  lift $ traceAroundEvent "vkCmdWaitEvents" (vkCmdWaitEvents' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (events)) :: Word32)) (pPEvents) (srcStageMask) (dstStageMask) ((fromIntegral (Data.Vector.length $ (memoryBarriers)) :: Word32)) (pPMemoryBarriers) ((fromIntegral (Data.Vector.length $ (bufferMemoryBarriers)) :: Word32)) (pPBufferMemoryBarriers) ((fromIntegral (Data.Vector.length $ (imageMemoryBarriers)) :: Word32)) (forgetExtensions (pPImageMemoryBarriers)))
   pure $ ()
 
 -- | vkCmdWaitEvents - Wait for one or more events and insert a set of memory
@@ -8532,7 +8560,7 @@
   lift $ Data.Vector.imapM_ (\i e -> poke (pPBufferMemoryBarriers `plusPtr` (56 * (i)) :: Ptr BufferMemoryBarrier) (e)) (bufferMemoryBarriers)
   pPImageMemoryBarriers <- ContT $ allocaBytesAligned @(ImageMemoryBarrier _) ((Data.Vector.length (imageMemoryBarriers)) * 72) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPImageMemoryBarriers `plusPtr` (72 * (i)) :: Ptr (ImageMemoryBarrier _))) (e) . ($ ())) (imageMemoryBarriers)
-  lift $ vkCmdPipelineBarrier' (commandBufferHandle (commandBuffer)) (srcStageMask) (dstStageMask) (dependencyFlags) ((fromIntegral (Data.Vector.length $ (memoryBarriers)) :: Word32)) (pPMemoryBarriers) ((fromIntegral (Data.Vector.length $ (bufferMemoryBarriers)) :: Word32)) (pPBufferMemoryBarriers) ((fromIntegral (Data.Vector.length $ (imageMemoryBarriers)) :: Word32)) (forgetExtensions (pPImageMemoryBarriers))
+  lift $ traceAroundEvent "vkCmdPipelineBarrier" (vkCmdPipelineBarrier' (commandBufferHandle (commandBuffer)) (srcStageMask) (dstStageMask) (dependencyFlags) ((fromIntegral (Data.Vector.length $ (memoryBarriers)) :: Word32)) (pPMemoryBarriers) ((fromIntegral (Data.Vector.length $ (bufferMemoryBarriers)) :: Word32)) (pPBufferMemoryBarriers) ((fromIntegral (Data.Vector.length $ (imageMemoryBarriers)) :: Word32)) (forgetExtensions (pPImageMemoryBarriers)))
   pure $ ()
 
 
@@ -8742,7 +8770,7 @@
   unless (vkCmdBeginQueryPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBeginQuery is null" Nothing Nothing
   let vkCmdBeginQuery' = mkVkCmdBeginQuery vkCmdBeginQueryPtr
-  vkCmdBeginQuery' (commandBufferHandle (commandBuffer)) (queryPool) (query) (flags)
+  traceAroundEvent "vkCmdBeginQuery" (vkCmdBeginQuery' (commandBufferHandle (commandBuffer)) (queryPool) (query) (flags))
   pure $ ()
 
 -- | This function will call the supplied action between calls to
@@ -8870,7 +8898,7 @@
   unless (vkCmdEndQueryPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdEndQuery is null" Nothing Nothing
   let vkCmdEndQuery' = mkVkCmdEndQuery vkCmdEndQueryPtr
-  vkCmdEndQuery' (commandBufferHandle (commandBuffer)) (queryPool) (query)
+  traceAroundEvent "vkCmdEndQuery" (vkCmdEndQuery' (commandBufferHandle (commandBuffer)) (queryPool) (query))
   pure $ ()
 
 
@@ -8989,7 +9017,7 @@
   unless (vkCmdResetQueryPoolPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdResetQueryPool is null" Nothing Nothing
   let vkCmdResetQueryPool' = mkVkCmdResetQueryPool vkCmdResetQueryPoolPtr
-  vkCmdResetQueryPool' (commandBufferHandle (commandBuffer)) (queryPool) (firstQuery) (queryCount)
+  traceAroundEvent "vkCmdResetQueryPool" (vkCmdResetQueryPool' (commandBufferHandle (commandBuffer)) (queryPool) (firstQuery) (queryCount))
   pure $ ()
 
 
@@ -9181,7 +9209,7 @@
   unless (vkCmdWriteTimestampPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdWriteTimestamp is null" Nothing Nothing
   let vkCmdWriteTimestamp' = mkVkCmdWriteTimestamp vkCmdWriteTimestampPtr
-  vkCmdWriteTimestamp' (commandBufferHandle (commandBuffer)) (pipelineStage) (queryPool) (query)
+  traceAroundEvent "vkCmdWriteTimestamp" (vkCmdWriteTimestamp' (commandBufferHandle (commandBuffer)) (pipelineStage) (queryPool) (query))
   pure $ ()
 
 
@@ -9415,7 +9443,7 @@
   unless (vkCmdCopyQueryPoolResultsPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyQueryPoolResults is null" Nothing Nothing
   let vkCmdCopyQueryPoolResults' = mkVkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResultsPtr
-  vkCmdCopyQueryPoolResults' (commandBufferHandle (commandBuffer)) (queryPool) (firstQuery) (queryCount) (dstBuffer) (dstOffset) (stride) (flags)
+  traceAroundEvent "vkCmdCopyQueryPoolResults" (vkCmdCopyQueryPoolResults' (commandBufferHandle (commandBuffer)) (queryPool) (firstQuery) (queryCount) (dstBuffer) (dstOffset) (stride) (flags))
   pure $ ()
 
 
@@ -9562,7 +9590,7 @@
   unless (vkCmdPushConstantsPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdPushConstants is null" Nothing Nothing
   let vkCmdPushConstants' = mkVkCmdPushConstants vkCmdPushConstantsPtr
-  vkCmdPushConstants' (commandBufferHandle (commandBuffer)) (layout) (stageFlags) (offset) (size) (values)
+  traceAroundEvent "vkCmdPushConstants" (vkCmdPushConstants' (commandBufferHandle (commandBuffer)) (layout) (stageFlags) (offset) (size) (values))
   pure $ ()
 
 
@@ -9705,40 +9733,6 @@
 --     'Vulkan.Core10.Enums.AttachmentDescriptionFlagBits.ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT'
 --     set
 --
--- -   #VUID-vkCmdBeginRenderPass-pAttachments-04102# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pInputAttachments@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     containing at least
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BIT'
---     or
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT'
---
--- -   #VUID-vkCmdBeginRenderPass-pAttachments-04103# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pColorAttachments@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     containing
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BIT'
---
--- -   #VUID-vkCmdBeginRenderPass-pAttachments-04104# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pResolveAttachments@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     containing
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BIT'
---
--- -   #VUID-vkCmdBeginRenderPass-pAttachments-04105# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pDepthStencilAttachment@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     containing
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT'
---
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-vkCmdBeginRenderPass-commandBuffer-parameter# @commandBuffer@
@@ -9804,7 +9798,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBeginRenderPass is null" Nothing Nothing
   let vkCmdBeginRenderPass' = mkVkCmdBeginRenderPass vkCmdBeginRenderPassPtr
   pRenderPassBegin <- ContT $ withCStruct (renderPassBegin)
-  lift $ vkCmdBeginRenderPass' (commandBufferHandle (commandBuffer)) (forgetExtensions pRenderPassBegin) (contents)
+  lift $ traceAroundEvent "vkCmdBeginRenderPass" (vkCmdBeginRenderPass' (commandBufferHandle (commandBuffer)) (forgetExtensions pRenderPassBegin) (contents))
   pure $ ()
 
 -- | This function will call the supplied action between calls to
@@ -9915,7 +9909,7 @@
   unless (vkCmdNextSubpassPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdNextSubpass is null" Nothing Nothing
   let vkCmdNextSubpass' = mkVkCmdNextSubpass vkCmdNextSubpassPtr
-  vkCmdNextSubpass' (commandBufferHandle (commandBuffer)) (contents)
+  traceAroundEvent "vkCmdNextSubpass" (vkCmdNextSubpass' (commandBufferHandle (commandBuffer)) (contents))
   pure $ ()
 
 
@@ -9992,7 +9986,7 @@
   unless (vkCmdEndRenderPassPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdEndRenderPass is null" Nothing Nothing
   let vkCmdEndRenderPass' = mkVkCmdEndRenderPass vkCmdEndRenderPassPtr
-  vkCmdEndRenderPass' (commandBufferHandle (commandBuffer))
+  traceAroundEvent "vkCmdEndRenderPass" (vkCmdEndRenderPass' (commandBufferHandle (commandBuffer)))
   pure $ ()
 
 
@@ -10231,7 +10225,7 @@
   let vkCmdExecuteCommands' = mkVkCmdExecuteCommands vkCmdExecuteCommandsPtr
   pPCommandBuffers <- ContT $ allocaBytesAligned @(Ptr CommandBuffer_T) ((Data.Vector.length (commandBuffers)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPCommandBuffers `plusPtr` (8 * (i)) :: Ptr (Ptr CommandBuffer_T)) (commandBufferHandle (e))) (commandBuffers)
-  lift $ vkCmdExecuteCommands' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (commandBuffers)) :: Word32)) (pPCommandBuffers)
+  lift $ traceAroundEvent "vkCmdExecuteCommands" (vkCmdExecuteCommands' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (commandBuffers)) :: Word32)) (pPCommandBuffers))
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/CommandPool.hs b/src/Vulkan/Core10/CommandPool.hs
--- a/src/Vulkan/Core10/CommandPool.hs
+++ b/src/Vulkan/Core10/CommandPool.hs
@@ -12,6 +12,7 @@
                                   , CommandPoolResetFlags
                                   ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -139,7 +140,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPCommandPool <- ContT $ bracket (callocBytes @CommandPool 8) free
-  r <- lift $ vkCreateCommandPool' (deviceHandle (device)) pCreateInfo pAllocator (pPCommandPool)
+  r <- lift $ traceAroundEvent "vkCreateCommandPool" (vkCreateCommandPool' (deviceHandle (device)) pCreateInfo pAllocator (pPCommandPool))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCommandPool <- lift $ peek @CommandPool pPCommandPool
   pure $ (pCommandPool)
@@ -240,7 +241,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyCommandPool' (deviceHandle (device)) (commandPool) pAllocator
+  lift $ traceAroundEvent "vkDestroyCommandPool" (vkDestroyCommandPool' (deviceHandle (device)) (commandPool) pAllocator)
   pure $ ()
 
 
@@ -326,7 +327,7 @@
   unless (vkResetCommandPoolPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkResetCommandPool is null" Nothing Nothing
   let vkResetCommandPool' = mkVkResetCommandPool vkResetCommandPoolPtr
-  r <- vkResetCommandPool' (deviceHandle (device)) (commandPool) (flags)
+  r <- traceAroundEvent "vkResetCommandPool" (vkResetCommandPool' (deviceHandle (device)) (commandPool) (flags))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Core10/DescriptorSet.hs b/src/Vulkan/Core10/DescriptorSet.hs
--- a/src/Vulkan/Core10/DescriptorSet.hs
+++ b/src/Vulkan/Core10/DescriptorSet.hs
@@ -31,6 +31,7 @@
                                     , DescriptorSetLayoutCreateFlags
                                     ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -107,6 +108,7 @@
 import Vulkan.CStruct (FromCStruct(..))
 import Vulkan.Core10.Enums.ImageLayout (ImageLayout)
 import Vulkan.Core10.Handles (ImageView)
+import {-# SOURCE #-} Vulkan.Extensions.VK_VALVE_mutable_descriptor_type (MutableDescriptorTypeCreateInfoVALVE)
 import Vulkan.CStruct.Extends (PeekChain)
 import Vulkan.CStruct.Extends (PeekChain(..))
 import Vulkan.CStruct.Extends (PokeChain)
@@ -205,7 +207,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSetLayout <- ContT $ bracket (callocBytes @DescriptorSetLayout 8) free
-  r <- lift $ vkCreateDescriptorSetLayout' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSetLayout)
+  r <- lift $ traceAroundEvent "vkCreateDescriptorSetLayout" (vkCreateDescriptorSetLayout' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSetLayout))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSetLayout <- lift $ peek @DescriptorSetLayout pPSetLayout
   pure $ (pSetLayout)
@@ -293,7 +295,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyDescriptorSetLayout' (deviceHandle (device)) (descriptorSetLayout) pAllocator
+  lift $ traceAroundEvent "vkDestroyDescriptorSetLayout" (vkDestroyDescriptorSetLayout' (deviceHandle (device)) (descriptorSetLayout) pAllocator)
   pure $ ()
 
 
@@ -372,7 +374,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPDescriptorPool <- ContT $ bracket (callocBytes @DescriptorPool 8) free
-  r <- lift $ vkCreateDescriptorPool' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPDescriptorPool)
+  r <- lift $ traceAroundEvent "vkCreateDescriptorPool" (vkCreateDescriptorPool' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPDescriptorPool))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDescriptorPool <- lift $ peek @DescriptorPool pPDescriptorPool
   pure $ (pDescriptorPool)
@@ -468,7 +470,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyDescriptorPool' (deviceHandle (device)) (descriptorPool) pAllocator
+  lift $ traceAroundEvent "vkDestroyDescriptorPool" (vkDestroyDescriptorPool' (deviceHandle (device)) (descriptorPool) pAllocator)
   pure $ ()
 
 
@@ -539,7 +541,7 @@
   unless (vkResetDescriptorPoolPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkResetDescriptorPool is null" Nothing Nothing
   let vkResetDescriptorPool' = mkVkResetDescriptorPool vkResetDescriptorPoolPtr
-  _ <- vkResetDescriptorPool' (deviceHandle (device)) (descriptorPool) (flags)
+  _ <- traceAroundEvent "vkResetDescriptorPool" (vkResetDescriptorPool' (deviceHandle (device)) (descriptorPool) (flags))
   pure $ ()
 
 
@@ -668,7 +670,7 @@
   let vkAllocateDescriptorSets' = mkVkAllocateDescriptorSets vkAllocateDescriptorSetsPtr
   pAllocateInfo <- ContT $ withCStruct (allocateInfo)
   pPDescriptorSets <- ContT $ bracket (callocBytes @DescriptorSet ((fromIntegral . Data.Vector.length . setLayouts $ (allocateInfo)) * 8)) free
-  r <- lift $ vkAllocateDescriptorSets' (deviceHandle (device)) (forgetExtensions pAllocateInfo) (pPDescriptorSets)
+  r <- lift $ traceAroundEvent "vkAllocateDescriptorSets" (vkAllocateDescriptorSets' (deviceHandle (device)) (forgetExtensions pAllocateInfo) (pPDescriptorSets))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDescriptorSets <- lift $ generateM (fromIntegral . Data.Vector.length . setLayouts $ (allocateInfo)) (\i -> peek @DescriptorSet ((pPDescriptorSets `advancePtrBytes` (8 * (i)) :: Ptr DescriptorSet)))
   pure $ (pDescriptorSets)
@@ -772,7 +774,7 @@
   let vkFreeDescriptorSets' = mkVkFreeDescriptorSets vkFreeDescriptorSetsPtr
   pPDescriptorSets <- ContT $ allocaBytesAligned @DescriptorSet ((Data.Vector.length (descriptorSets)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPDescriptorSets `plusPtr` (8 * (i)) :: Ptr DescriptorSet) (e)) (descriptorSets)
-  _ <- lift $ vkFreeDescriptorSets' (deviceHandle (device)) (descriptorPool) ((fromIntegral (Data.Vector.length $ (descriptorSets)) :: Word32)) (pPDescriptorSets)
+  _ <- lift $ traceAroundEvent "vkFreeDescriptorSets" (vkFreeDescriptorSets' (deviceHandle (device)) (descriptorPool) ((fromIntegral (Data.Vector.length $ (descriptorSets)) :: Word32)) (pPDescriptorSets))
   pure $ ()
 
 
@@ -869,7 +871,7 @@
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPDescriptorWrites `plusPtr` (64 * (i)) :: Ptr (WriteDescriptorSet _))) (e) . ($ ())) (descriptorWrites)
   pPDescriptorCopies <- ContT $ allocaBytesAligned @CopyDescriptorSet ((Data.Vector.length (descriptorCopies)) * 56) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPDescriptorCopies `plusPtr` (56 * (i)) :: Ptr CopyDescriptorSet) (e)) (descriptorCopies)
-  lift $ vkUpdateDescriptorSets' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (descriptorWrites)) :: Word32)) (forgetExtensions (pPDescriptorWrites)) ((fromIntegral (Data.Vector.length $ (descriptorCopies)) :: Word32)) (pPDescriptorCopies)
+  lift $ traceAroundEvent "vkUpdateDescriptorSets" (vkUpdateDescriptorSets' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (descriptorWrites)) :: Word32)) (forgetExtensions (pPDescriptorWrites)) ((fromIntegral (Data.Vector.length $ (descriptorCopies)) :: Word32)) (pPDescriptorCopies))
   pure $ ()
 
 
@@ -1142,6 +1144,9 @@
 -- descriptor are discarded. A null acceleration structure descriptor
 -- results in the miss shader being invoked.
 --
+-- If the destination descriptor is a mutable descriptor, the active
+-- descriptor type for the destination descriptor becomes @descriptorType@.
+--
 -- If the @dstBinding@ has fewer than @descriptorCount@ array elements
 -- remaining starting from @dstArrayElement@, then the remainder will be
 -- used to update the subsequent binding - @dstBinding@+1 starting at array
@@ -1490,6 +1495,12 @@
 --     then @dstSet@ /must/ not have been allocated with a layout that
 --     included immutable samplers for @dstBinding@
 --
+-- -   #VUID-VkWriteDescriptorSet-dstSet-04611# If the
+--     'DescriptorSetLayoutBinding' for @dstSet@ at @dstBinding@ is
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     the new active descriptor type @descriptorType@ /must/ exist in the
+--     corresponding @pMutableDescriptorTypeLists@ list for @dstBinding@
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-VkWriteDescriptorSet-sType-sType# @sType@ /must/ be
@@ -1555,10 +1566,12 @@
   , -- | @descriptorType@ is a
     -- 'Vulkan.Core10.Enums.DescriptorType.DescriptorType' specifying the type
     -- of each descriptor in @pImageInfo@, @pBufferInfo@, or
-    -- @pTexelBufferView@, as described below. It /must/ be the same type as
-    -- that specified in 'DescriptorSetLayoutBinding' for @dstSet@ at
-    -- @dstBinding@. The type of the descriptor also controls which array the
-    -- descriptors are taken from.
+    -- @pTexelBufferView@, as described below. If 'DescriptorSetLayoutBinding'
+    -- for @dstSet@ at @dstBinding@ is not equal to
+    -- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+    -- @descriptorType@ /must/ be the same type as that specified in
+    -- 'DescriptorSetLayoutBinding' for @dstSet@ at @dstBinding@. The type of
+    -- the descriptor also controls which array the descriptors are taken from.
     descriptorType :: DescriptorType
   , -- | @pImageInfo@ is a pointer to an array of 'DescriptorImageInfo'
     -- structures or is ignored, as described below.
@@ -1680,6 +1693,27 @@
 -- | VkCopyDescriptorSet - Structure specifying a copy descriptor set
 -- operation
 --
+-- = Description
+--
+-- If the 'DescriptorSetLayoutBinding' for @dstBinding@ is
+-- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE' and
+-- @srcBinding@ is not
+-- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE', the
+-- new active descriptor type becomes the descriptor type of @srcBinding@.
+-- If both 'DescriptorSetLayoutBinding' for @srcBinding@ and @dstBinding@
+-- are 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+-- the active descriptor type in each source descriptor is copied into the
+-- corresponding destination descriptor. The active descriptor type /can/
+-- be different for each source descriptor.
+--
+-- Note
+--
+-- The intention is that copies to and from mutable descriptors is a simple
+-- memcpy. Copies between non-mutable and mutable descriptors are expected
+-- to require one memcpy per descriptor to handle the difference in size,
+-- but this use case with more than one @descriptorCount@ is considered
+-- rare.
+--
 -- == Valid Usage
 --
 -- -   #VUID-VkCopyDescriptorSet-srcBinding-00345# @srcBinding@ /must/ be a
@@ -1766,6 +1800,31 @@
 --     @dstSet@ /must/ not have been allocated with a layout that included
 --     immutable samplers for @dstBinding@
 --
+-- -   #VUID-VkCopyDescriptorSet-dstSet-04612# If
+--     'DescriptorSetLayoutBinding' for @dstSet@ at @dstBinding@ is
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     the new active descriptor type /must/ exist in the corresponding
+--     @pMutableDescriptorTypeLists@ list for @dstBinding@ if the new
+--     active descriptor type is not
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   #VUID-VkCopyDescriptorSet-srcSet-04613# If
+--     'DescriptorSetLayoutBinding' for @srcSet@ at @srcBinding@ is
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--     and the 'DescriptorSetLayoutBinding' for @dstSet@ at @dstBinding@ is
+--     not
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     the active descriptor type for the source descriptor /must/ match
+--     the descriptor type of @dstBinding@
+--
+-- -   #VUID-VkCopyDescriptorSet-dstSet-04614# If
+--     'DescriptorSetLayoutBinding' for @dstSet@ at @dstBinding@ is
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     and the new active descriptor type is
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     the @pMutableDescriptorTypeLists@ for @srcBinding@ and @dstBinding@
+--     /must/ match exactly
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-VkCopyDescriptorSet-sType-sType# @sType@ /must/ be
@@ -1939,6 +1998,11 @@
 --     @NULL@, @pImmutableSamplers@ /must/ be a valid pointer to an array
 --     of @descriptorCount@ valid 'Vulkan.Core10.Handles.Sampler' handles
 --
+-- -   #VUID-VkDescriptorSetLayoutBinding-descriptorType-04604# If the
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-inlineUniformBlock inlineUniformBlock>
+--     feature is not enabled, @descriptorType@ /must/ not be
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT'
+--
 -- -   #VUID-VkDescriptorSetLayoutBinding-descriptorType-02209# If
 --     @descriptorType@ is
 --     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT'
@@ -1967,6 +2031,11 @@
 --     'Vulkan.Core10.Enums.BorderColor.BORDER_COLOR_FLOAT_CUSTOM_EXT' or
 --     'Vulkan.Core10.Enums.BorderColor.BORDER_COLOR_INT_CUSTOM_EXT'
 --
+-- -   #VUID-VkDescriptorSetLayoutBinding-descriptorType-04605# If
+--     @descriptorType@ is
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     then @pImmutableSamplers@ /must/ be @NULL@.
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-VkDescriptorSetLayoutBinding-descriptorType-parameter#
@@ -2101,6 +2170,18 @@
 --     than or equal to
 --     'Vulkan.Extensions.VK_KHR_push_descriptor.PhysicalDevicePushDescriptorPropertiesKHR'::@maxPushDescriptors@
 --
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-flags-04590# If @flags@
+--     contains
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR',
+--     @flags@ /must/ not contain
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE'
+--
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-flags-04591# If @flags@
+--     contains
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR',
+--     @pBindings@ /must/ not have a @descriptorType@ of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
 -- -   #VUID-VkDescriptorSetLayoutCreateInfo-flags-03000# If any binding
 --     has the
 --     'Vulkan.Core12.Enums.DescriptorBindingFlagBits.DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT'
@@ -2115,14 +2196,47 @@
 --     or
 --     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC'
 --
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-flags-04592# If @flags@
+--     contains
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT',
+--     @flags@ /must/ not contain
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE'
+--
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-04593# If any
+--     binding has a @descriptorType@ of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     then a
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE'
+--     /must/ be present in the @pNext@ chain
+--
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-04594# If a
+--     binding has a @descriptorType@ value of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE',
+--     then @pImmutableSamplers@ /must/ be @NULL@
+--
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-mutableDescriptorType-04595#
+--     If
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'::@mutableDescriptorType@
+--     is not enabled, @pBindings@ /must/ not contain a @descriptorType@ of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-flags-04596# If @flags@
+--     contains
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE',
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'::@mutableDescriptorType@
+--     /must/ be enabled
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-VkDescriptorSetLayoutCreateInfo-sType-sType# @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO'
 --
--- -   #VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext# @pNext@ /must/ be
---     @NULL@ or a pointer to a valid instance of
+-- -   #VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext# Each @pNext@
+--     member of any structure (including this one) in the @pNext@ chain
+--     /must/ be either @NULL@ or a pointer to a valid instance of
 --     'Vulkan.Core12.Promoted_From_VK_EXT_descriptor_indexing.DescriptorSetLayoutBindingFlagsCreateInfo'
+--     or
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE'
 --
 -- -   #VUID-VkDescriptorSetLayoutCreateInfo-sType-unique# The @sType@
 --     value of each struct in the @pNext@ chain /must/ be unique
@@ -2168,6 +2282,7 @@
   getNext DescriptorSetLayoutCreateInfo{..} = next
   extends :: forall e b proxy. Typeable e => proxy e -> (Extends DescriptorSetLayoutCreateInfo e => b) -> Maybe b
   extends _ f
+    | Just Refl <- eqT @e @MutableDescriptorTypeCreateInfoVALVE = Just f
     | Just Refl <- eqT @e @DescriptorSetLayoutBindingFlagsCreateInfo = Just f
     | otherwise = Nothing
 
@@ -2331,19 +2446,63 @@
 -- set exceeds @maxUpdateAfterBindDescriptorsInAllPools@, or if
 -- fragmentation of the underlying hardware resources occurs.
 --
+-- If a @pPoolSizes@[i]::@type@ is
+-- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE', a
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE'
+-- struct in the @pNext@ chain /can/ be used to specify which mutable
+-- descriptor types /can/ be allocated from the pool. If present in the
+-- @pNext@ chain,
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE'::@pMutableDescriptorTypeLists@[i]
+-- specifies which kind of
+-- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+-- descriptors /can/ be allocated from this pool entry. If
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE'
+-- does not exist in the @pNext@ chain, or
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE'::@pMutableDescriptorTypeLists@[i]
+-- is out of range, the descriptor pool allocates enough memory to be able
+-- to allocate a
+-- 'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+-- descriptor with any supported
+-- 'Vulkan.Core10.Enums.DescriptorType.DescriptorType' as a mutable
+-- descriptor. A mutable descriptor /can/ be allocated from a pool entry if
+-- the type list in 'DescriptorSetLayoutCreateInfo' is a subset of the type
+-- list declared in the descriptor pool, or if the pool entry is created
+-- without a descriptor type list.
+--
 -- == Valid Usage
 --
 -- -   #VUID-VkDescriptorPoolCreateInfo-maxSets-00301# @maxSets@ /must/ be
 --     greater than @0@
 --
+-- -   #VUID-VkDescriptorPoolCreateInfo-flags-04607# If @flags@ has the
+--     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+--     bit set, then the
+--     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT'
+--     bit /must/ not be set
+--
+-- -   #VUID-VkDescriptorPoolCreateInfo-mutableDescriptorType-04608# If
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'::@mutableDescriptorType@
+--     is not enabled, @pPoolSizes@ /must/ not contain a @descriptorType@
+--     of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   #VUID-VkDescriptorPoolCreateInfo-flags-04609# If @flags@ has the
+--     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+--     bit set,
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'::@mutableDescriptorType@
+--     /must/ be enabled
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-VkDescriptorPoolCreateInfo-sType-sType# @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO'
 --
--- -   #VUID-VkDescriptorPoolCreateInfo-pNext-pNext# @pNext@ /must/ be
---     @NULL@ or a pointer to a valid instance of
+-- -   #VUID-VkDescriptorPoolCreateInfo-pNext-pNext# Each @pNext@ member of
+--     any structure (including this one) in the @pNext@ chain /must/ be
+--     either @NULL@ or a pointer to a valid instance of
 --     'Vulkan.Extensions.VK_EXT_inline_uniform_block.DescriptorPoolInlineUniformBlockCreateInfoEXT'
+--     or
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE'
 --
 -- -   #VUID-VkDescriptorPoolCreateInfo-sType-unique# The @sType@ value of
 --     each struct in the @pNext@ chain /must/ be unique
@@ -2392,6 +2551,7 @@
   getNext DescriptorPoolCreateInfo{..} = next
   extends :: forall e b proxy. Typeable e => proxy e -> (Extends DescriptorPoolCreateInfo e => b) -> Maybe b
   extends _ f
+    | Just Refl <- eqT @e @MutableDescriptorTypeCreateInfoVALVE = Just f
     | Just Refl <- eqT @e @DescriptorPoolInlineUniformBlockCreateInfoEXT = Just f
     | otherwise = Nothing
 
@@ -2457,6 +2617,13 @@
 --     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT'
 --     flag set
 --
+-- -   #VUID-VkDescriptorSetAllocateInfo-pSetLayouts-04610# If any element
+--     of @pSetLayouts@ was created with the
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE'
+--     bit set, @descriptorPool@ /must/ have been created with the
+--     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+--     flag set
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-VkDescriptorSetAllocateInfo-sType-sType# @sType@ /must/ be
@@ -2474,17 +2641,12 @@
 --     'Vulkan.Core10.Handles.DescriptorPool' handle
 --
 -- -   #VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter#
---     @pSetLayouts@ /must/ be a valid pointer to an array of
---     @descriptorSetCount@ valid
---     'Vulkan.Core10.Handles.DescriptorSetLayout' handles
---
--- -   #VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength#
---     @descriptorSetCount@ /must/ be greater than @0@
+--     @pSetLayouts@ /must/ be a valid pointer to a valid
+--     'Vulkan.Core10.Handles.DescriptorSetLayout' handle
 --
 -- -   #VUID-VkDescriptorSetAllocateInfo-commonparent# Both of
---     @descriptorPool@, and the elements of @pSetLayouts@ /must/ have been
---     created, allocated, or retrieved from the same
---     'Vulkan.Core10.Handles.Device'
+--     @descriptorPool@, and @pSetLayouts@ /must/ have been created,
+--     allocated, or retrieved from the same 'Vulkan.Core10.Handles.Device'
 --
 -- = See Also
 --
diff --git a/src/Vulkan/Core10/Device.hs b/src/Vulkan/Core10/Device.hs
--- a/src/Vulkan/Core10/Device.hs
+++ b/src/Vulkan/Core10/Device.hs
@@ -11,6 +11,7 @@
                              , DeviceQueueCreateFlags
                              ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -121,6 +122,7 @@
 import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_memory_priority (PhysicalDeviceMemoryPriorityFeaturesEXT)
 import {-# SOURCE #-} Vulkan.Extensions.VK_NV_mesh_shader (PhysicalDeviceMeshShaderFeaturesNV)
 import {-# SOURCE #-} Vulkan.Core11.Promoted_From_VK_KHR_multiview (PhysicalDeviceMultiviewFeatures)
+import {-# SOURCE #-} Vulkan.Extensions.VK_VALVE_mutable_descriptor_type (PhysicalDeviceMutableDescriptorTypeFeaturesVALVE)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_performance_query (PhysicalDevicePerformanceQueryFeaturesKHR)
 import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_pipeline_creation_cache_control (PhysicalDevicePipelineCreationCacheControlFeaturesEXT)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_pipeline_executable_properties (PhysicalDevicePipelineExecutablePropertiesFeaturesKHR)
@@ -286,7 +288,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPDevice <- ContT $ bracket (callocBytes @(Ptr Device_T) 8) free
-  r <- lift $ vkCreateDevice' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pCreateInfo) pAllocator (pPDevice)
+  r <- lift $ traceAroundEvent "vkCreateDevice" (vkCreateDevice' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pCreateInfo) pAllocator (pPDevice))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDevice <- lift $ peek @(Ptr Device_T) pPDevice
   pDevice' <- lift $ (\h -> Device h <$> initDeviceCmds cmds h) pDevice
@@ -382,7 +384,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyDevice' (deviceHandle (device)) pAllocator
+  lift $ traceAroundEvent "vkDestroyDevice" (vkDestroyDevice' (deviceHandle (device)) pAllocator)
   pure $ ()
 
 
@@ -716,6 +718,7 @@
 --     'Vulkan.Extensions.VK_EXT_memory_priority.PhysicalDeviceMemoryPriorityFeaturesEXT',
 --     'Vulkan.Extensions.VK_NV_mesh_shader.PhysicalDeviceMeshShaderFeaturesNV',
 --     'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewFeatures',
+--     'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.PhysicalDeviceMutableDescriptorTypeFeaturesVALVE',
 --     'Vulkan.Extensions.VK_KHR_performance_query.PhysicalDevicePerformanceQueryFeaturesKHR',
 --     'Vulkan.Extensions.VK_EXT_pipeline_creation_cache_control.PhysicalDevicePipelineCreationCacheControlFeaturesEXT',
 --     'Vulkan.Extensions.VK_KHR_pipeline_executable_properties.PhysicalDevicePipelineExecutablePropertiesFeaturesKHR',
@@ -834,6 +837,7 @@
   getNext DeviceCreateInfo{..} = next
   extends :: forall e b proxy. Typeable e => proxy e -> (Extends DeviceCreateInfo e => b) -> Maybe b
   extends _ f
+    | Just Refl <- eqT @e @PhysicalDeviceMutableDescriptorTypeFeaturesVALVE = Just f
     | Just Refl <- eqT @e @PhysicalDeviceFragmentShadingRateEnumsFeaturesNV = Just f
     | Just Refl <- eqT @e @PhysicalDeviceShaderTerminateInvocationFeaturesKHR = Just f
     | Just Refl <- eqT @e @PhysicalDeviceFragmentShadingRateFeaturesKHR = Just f
diff --git a/src/Vulkan/Core10/DeviceInitialization.hs b/src/Vulkan/Core10/DeviceInitialization.hs
--- a/src/Vulkan/Core10/DeviceInitialization.hs
+++ b/src/Vulkan/Core10/DeviceInitialization.hs
@@ -64,6 +64,7 @@
                                            ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -323,7 +324,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPInstance <- ContT $ bracket (callocBytes @(Ptr Instance_T) 8) free
-  r <- lift $ vkCreateInstance' (forgetExtensions pCreateInfo) pAllocator (pPInstance)
+  r <- lift $ traceAroundEvent "vkCreateInstance" (vkCreateInstance' (forgetExtensions pCreateInfo) pAllocator (pPInstance))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pInstance <- lift $ peek @(Ptr Instance_T) pPInstance
   pInstance' <- lift $ (\h -> Instance h <$> initInstanceCmds h) pInstance
@@ -405,7 +406,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyInstance' (instanceHandle (instance')) pAllocator
+  lift $ traceAroundEvent "vkDestroyInstance" (vkDestroyInstance' (instanceHandle (instance')) pAllocator)
   pure $ ()
 
 
@@ -481,11 +482,11 @@
   let vkEnumeratePhysicalDevices' = mkVkEnumeratePhysicalDevices vkEnumeratePhysicalDevicesPtr
   let instance'' = instanceHandle (instance')
   pPPhysicalDeviceCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumeratePhysicalDevices' instance'' (pPPhysicalDeviceCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkEnumeratePhysicalDevices" (vkEnumeratePhysicalDevices' instance'' (pPPhysicalDeviceCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPhysicalDeviceCount <- lift $ peek @Word32 pPPhysicalDeviceCount
   pPPhysicalDevices <- ContT $ bracket (callocBytes @(Ptr PhysicalDevice_T) ((fromIntegral (pPhysicalDeviceCount)) * 8)) free
-  r' <- lift $ vkEnumeratePhysicalDevices' instance'' (pPPhysicalDeviceCount) (pPPhysicalDevices)
+  r' <- lift $ traceAroundEvent "vkEnumeratePhysicalDevices" (vkEnumeratePhysicalDevices' instance'' (pPPhysicalDeviceCount) (pPPhysicalDevices))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPhysicalDeviceCount' <- lift $ peek @Word32 pPPhysicalDeviceCount
   pPhysicalDevices' <- lift $ generateM (fromIntegral (pPhysicalDeviceCount')) (\i -> do
@@ -574,7 +575,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeviceProcAddr is null" Nothing Nothing
   let vkGetDeviceProcAddr' = mkVkGetDeviceProcAddr vkGetDeviceProcAddrPtr
   pName <- ContT $ useAsCString (name)
-  r <- lift $ vkGetDeviceProcAddr' (deviceHandle (device)) pName
+  r <- lift $ traceAroundEvent "vkGetDeviceProcAddr" (vkGetDeviceProcAddr' (deviceHandle (device)) pName)
   pure $ (r)
 
 
@@ -679,7 +680,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetInstanceProcAddr is null" Nothing Nothing
   let vkGetInstanceProcAddr' = mkVkGetInstanceProcAddr vkGetInstanceProcAddrPtr
   pName <- ContT $ useAsCString (name)
-  r <- lift $ vkGetInstanceProcAddr' (instanceHandle (instance')) pName
+  r <- lift $ traceAroundEvent "vkGetInstanceProcAddr" (vkGetInstanceProcAddr' (instanceHandle (instance')) pName)
   pure $ (r)
 
 
@@ -713,7 +714,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceProperties is null" Nothing Nothing
   let vkGetPhysicalDeviceProperties' = mkVkGetPhysicalDeviceProperties vkGetPhysicalDevicePropertiesPtr
   pPProperties <- ContT (withZeroCStruct @PhysicalDeviceProperties)
-  lift $ vkGetPhysicalDeviceProperties' (physicalDeviceHandle (physicalDevice)) (pPProperties)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceProperties" (vkGetPhysicalDeviceProperties' (physicalDeviceHandle (physicalDevice)) (pPProperties))
   pProperties <- lift $ peekCStruct @PhysicalDeviceProperties pPProperties
   pure $ (pProperties)
 
@@ -773,11 +774,11 @@
   let vkGetPhysicalDeviceQueueFamilyProperties' = mkVkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyPropertiesPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPQueueFamilyPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetPhysicalDeviceQueueFamilyProperties' physicalDevice' (pPQueueFamilyPropertyCount) (nullPtr)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceQueueFamilyProperties" (vkGetPhysicalDeviceQueueFamilyProperties' physicalDevice' (pPQueueFamilyPropertyCount) (nullPtr))
   pQueueFamilyPropertyCount <- lift $ peek @Word32 pPQueueFamilyPropertyCount
   pPQueueFamilyProperties <- ContT $ bracket (callocBytes @QueueFamilyProperties ((fromIntegral (pQueueFamilyPropertyCount)) * 24)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPQueueFamilyProperties `advancePtrBytes` (i * 24) :: Ptr QueueFamilyProperties) . ($ ())) [0..(fromIntegral (pQueueFamilyPropertyCount)) - 1]
-  lift $ vkGetPhysicalDeviceQueueFamilyProperties' physicalDevice' (pPQueueFamilyPropertyCount) ((pPQueueFamilyProperties))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceQueueFamilyProperties" (vkGetPhysicalDeviceQueueFamilyProperties' physicalDevice' (pPQueueFamilyPropertyCount) ((pPQueueFamilyProperties)))
   pQueueFamilyPropertyCount' <- lift $ peek @Word32 pPQueueFamilyPropertyCount
   pQueueFamilyProperties' <- lift $ generateM (fromIntegral (pQueueFamilyPropertyCount')) (\i -> peekCStruct @QueueFamilyProperties (((pPQueueFamilyProperties) `advancePtrBytes` (24 * (i)) :: Ptr QueueFamilyProperties)))
   pure $ (pQueueFamilyProperties')
@@ -813,7 +814,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceMemoryProperties is null" Nothing Nothing
   let vkGetPhysicalDeviceMemoryProperties' = mkVkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryPropertiesPtr
   pPMemoryProperties <- ContT (withZeroCStruct @PhysicalDeviceMemoryProperties)
-  lift $ vkGetPhysicalDeviceMemoryProperties' (physicalDeviceHandle (physicalDevice)) (pPMemoryProperties)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceMemoryProperties" (vkGetPhysicalDeviceMemoryProperties' (physicalDeviceHandle (physicalDevice)) (pPMemoryProperties))
   pMemoryProperties <- lift $ peekCStruct @PhysicalDeviceMemoryProperties pPMemoryProperties
   pure $ (pMemoryProperties)
 
@@ -848,7 +849,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceFeatures is null" Nothing Nothing
   let vkGetPhysicalDeviceFeatures' = mkVkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeaturesPtr
   pPFeatures <- ContT (withZeroCStruct @PhysicalDeviceFeatures)
-  lift $ vkGetPhysicalDeviceFeatures' (physicalDeviceHandle (physicalDevice)) (pPFeatures)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceFeatures" (vkGetPhysicalDeviceFeatures' (physicalDeviceHandle (physicalDevice)) (pPFeatures))
   pFeatures <- lift $ peekCStruct @PhysicalDeviceFeatures pPFeatures
   pure $ (pFeatures)
 
@@ -890,7 +891,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceFormatProperties is null" Nothing Nothing
   let vkGetPhysicalDeviceFormatProperties' = mkVkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatPropertiesPtr
   pPFormatProperties <- ContT (withZeroCStruct @FormatProperties)
-  lift $ vkGetPhysicalDeviceFormatProperties' (physicalDeviceHandle (physicalDevice)) (format) (pPFormatProperties)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceFormatProperties" (vkGetPhysicalDeviceFormatProperties' (physicalDeviceHandle (physicalDevice)) (format) (pPFormatProperties))
   pFormatProperties <- lift $ peekCStruct @FormatProperties pPFormatProperties
   pure $ (pFormatProperties)
 
@@ -1017,7 +1018,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceImageFormatProperties is null" Nothing Nothing
   let vkGetPhysicalDeviceImageFormatProperties' = mkVkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatPropertiesPtr
   pPImageFormatProperties <- ContT (withZeroCStruct @ImageFormatProperties)
-  r <- lift $ vkGetPhysicalDeviceImageFormatProperties' (physicalDeviceHandle (physicalDevice)) (format) (type') (tiling) (usage) (flags) (pPImageFormatProperties)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceImageFormatProperties" (vkGetPhysicalDeviceImageFormatProperties' (physicalDeviceHandle (physicalDevice)) (format) (type') (tiling) (usage) (flags) (pPImageFormatProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pImageFormatProperties <- lift $ peekCStruct @ImageFormatProperties pPImageFormatProperties
   pure $ (pImageFormatProperties)
diff --git a/src/Vulkan/Core10/Enums/DescriptorPoolCreateFlagBits.hs b/src/Vulkan/Core10/Enums/DescriptorPoolCreateFlagBits.hs
--- a/src/Vulkan/Core10/Enums/DescriptorPoolCreateFlagBits.hs
+++ b/src/Vulkan/Core10/Enums/DescriptorPoolCreateFlagBits.hs
@@ -2,6 +2,7 @@
 -- No documentation found for Chapter "DescriptorPoolCreateFlagBits"
 module Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits  ( DescriptorPoolCreateFlags
                                                          , DescriptorPoolCreateFlagBits( DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
+                                                                                       , DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE
                                                                                        , DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT
                                                                                        , ..
                                                                                        )
@@ -39,6 +40,17 @@
 -- 'Vulkan.Core10.DescriptorSet.allocateDescriptorSets' and
 -- 'Vulkan.Core10.DescriptorSet.resetDescriptorPool' are allowed.
 pattern DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = DescriptorPoolCreateFlagBits 0x00000001
+-- | 'DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE' specifies that this
+-- descriptor pool and the descriptor sets allocated from it reside
+-- entirely in host memory and cannot be bound. Descriptor sets allocated
+-- from this pool are partially exempt from the external synchronization
+-- requirement in
+-- 'Vulkan.Extensions.VK_KHR_descriptor_update_template.updateDescriptorSetWithTemplateKHR'
+-- and 'Vulkan.Core10.DescriptorSet.updateDescriptorSets'. Descriptor sets
+-- and their descriptors can be updated concurrently in different threads,
+-- though the same descriptor /must/ not be updated concurrently by two
+-- threads.
+pattern DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE     = DescriptorPoolCreateFlagBits 0x00000004
 -- | 'DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT' specifies that descriptor
 -- sets allocated from this pool /can/ include bindings with the
 -- 'Vulkan.Core12.Enums.DescriptorBindingFlagBits.DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT'
@@ -58,6 +70,7 @@
 showTableDescriptorPoolCreateFlagBits :: [(DescriptorPoolCreateFlagBits, String)]
 showTableDescriptorPoolCreateFlagBits =
   [ (DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, "FREE_DESCRIPTOR_SET_BIT")
+  , (DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE    , "HOST_ONLY_BIT_VALVE")
   , (DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT  , "UPDATE_AFTER_BIND_BIT")
   ]
 
diff --git a/src/Vulkan/Core10/Enums/DescriptorSetLayoutCreateFlagBits.hs b/src/Vulkan/Core10/Enums/DescriptorSetLayoutCreateFlagBits.hs
--- a/src/Vulkan/Core10/Enums/DescriptorSetLayoutCreateFlagBits.hs
+++ b/src/Vulkan/Core10/Enums/DescriptorSetLayoutCreateFlagBits.hs
@@ -1,7 +1,8 @@
 {-# language CPP #-}
 -- No documentation found for Chapter "DescriptorSetLayoutCreateFlagBits"
 module Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits  ( DescriptorSetLayoutCreateFlags
-                                                              , DescriptorSetLayoutCreateFlagBits( DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
+                                                              , DescriptorSetLayoutCreateFlagBits( DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE
+                                                                                                 , DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
                                                                                                  , DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT
                                                                                                  , ..
                                                                                                  )
@@ -29,6 +30,17 @@
 newtype DescriptorSetLayoutCreateFlagBits = DescriptorSetLayoutCreateFlagBits Flags
   deriving newtype (Eq, Ord, Storable, Zero, Bits, FiniteBits)
 
+-- | 'DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE' specifies that
+-- descriptor sets using this layout /must/ be allocated from a descriptor
+-- pool created with the
+-- 'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+-- bit set. Descriptor set layouts created with this bit have no
+-- expressable limit for maximum number of descriptors per-stage. Host
+-- descriptor sets are limited only by available host memory, but /may/ be
+-- limited for implementation specific reasons. Implementations /may/ limit
+-- the number of supported descriptors to UpdateAfterBind limits or
+-- non-UpdateAfterBind limits, whichever is larger.
+pattern DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE   = DescriptorSetLayoutCreateFlagBits 0x00000004
 -- | 'DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR' specifies that
 -- descriptor sets /must/ not be allocated using this layout, and
 -- descriptors are instead pushed by
@@ -54,7 +66,8 @@
 
 showTableDescriptorSetLayoutCreateFlagBits :: [(DescriptorSetLayoutCreateFlagBits, String)]
 showTableDescriptorSetLayoutCreateFlagBits =
-  [ (DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR   , "PUSH_DESCRIPTOR_BIT_KHR")
+  [ (DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE  , "HOST_ONLY_POOL_BIT_VALVE")
+  , (DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR   , "PUSH_DESCRIPTOR_BIT_KHR")
   , (DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT, "UPDATE_AFTER_BIND_POOL_BIT")
   ]
 
diff --git a/src/Vulkan/Core10/Enums/DescriptorType.hs b/src/Vulkan/Core10/Enums/DescriptorType.hs
--- a/src/Vulkan/Core10/Enums/DescriptorType.hs
+++ b/src/Vulkan/Core10/Enums/DescriptorType.hs
@@ -11,6 +11,7 @@
                                                           , DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC
                                                           , DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
                                                           , DESCRIPTOR_TYPE_INPUT_ATTACHMENT
+                                                          , DESCRIPTOR_TYPE_MUTABLE_VALVE
                                                           , DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV
                                                           , DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR
                                                           , DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
@@ -66,6 +67,9 @@
 -- -   'DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT' specifies an
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-inlineuniformblock inline uniform block>.
 --
+-- -   'DESCRIPTOR_TYPE_MUTABLE_VALVE' specifies a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorsets-mutable descriptor of mutable type>.
+--
 -- When a descriptor set is updated via elements of
 -- 'Vulkan.Core10.DescriptorSet.WriteDescriptorSet', members of
 -- @pImageInfo@, @pBufferInfo@ and @pTexelBufferView@ are only accessed by
@@ -131,6 +135,7 @@
 -- 'Vulkan.Core10.DescriptorSet.DescriptorSetLayoutBinding',
 -- 'Vulkan.Core11.Promoted_From_VK_KHR_descriptor_update_template.DescriptorUpdateTemplateEntry',
 -- 'Vulkan.Extensions.VK_NVX_image_view_handle.ImageViewHandleInfoNVX',
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeListVALVE',
 -- 'Vulkan.Core10.DescriptorSet.WriteDescriptorSet'
 newtype DescriptorType = DescriptorType Int32
   deriving newtype (Eq, Ord, Storable, Zero)
@@ -157,6 +162,8 @@
 pattern DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC     = DescriptorType 9
 -- No documentation found for Nested "VkDescriptorType" "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT"
 pattern DESCRIPTOR_TYPE_INPUT_ATTACHMENT           = DescriptorType 10
+-- No documentation found for Nested "VkDescriptorType" "VK_DESCRIPTOR_TYPE_MUTABLE_VALVE"
+pattern DESCRIPTOR_TYPE_MUTABLE_VALVE              = DescriptorType 1000351000
 -- No documentation found for Nested "VkDescriptorType" "VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV"
 pattern DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV  = DescriptorType 1000165000
 -- No documentation found for Nested "VkDescriptorType" "VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR"
@@ -174,6 +181,7 @@
              DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
              DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC,
              DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
+             DESCRIPTOR_TYPE_MUTABLE_VALVE,
              DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV,
              DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR,
              DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT :: DescriptorType #-}
@@ -197,6 +205,7 @@
   , (DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC    , "UNIFORM_BUFFER_DYNAMIC")
   , (DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC    , "STORAGE_BUFFER_DYNAMIC")
   , (DESCRIPTOR_TYPE_INPUT_ATTACHMENT          , "INPUT_ATTACHMENT")
+  , (DESCRIPTOR_TYPE_MUTABLE_VALVE             , "MUTABLE_VALVE")
   , (DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV , "ACCELERATION_STRUCTURE_NV")
   , (DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, "ACCELERATION_STRUCTURE_KHR")
   , (DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT  , "INLINE_UNIFORM_BLOCK_EXT")
diff --git a/src/Vulkan/Core10/Enums/StructureType.hs b/src/Vulkan/Core10/Enums/StructureType.hs
--- a/src/Vulkan/Core10/Enums/StructureType.hs
+++ b/src/Vulkan/Core10/Enums/StructureType.hs
@@ -49,6 +49,8 @@
                                                         , STRUCTURE_TYPE_MEMORY_BARRIER
                                                         , STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
                                                         , STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
+                                                        , STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE
+                                                        , STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE
                                                         , STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT
                                                         , STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT
                                                         , STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR
@@ -710,6 +712,7 @@
 -- 'Vulkan.Extensions.VK_KHR_external_memory_win32.MemoryWin32HandlePropertiesKHR',
 -- 'Vulkan.Extensions.VK_EXT_metal_surface.MetalSurfaceCreateInfoEXT',
 -- 'Vulkan.Extensions.VK_EXT_sample_locations.MultisamplePropertiesEXT',
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.MutableDescriptorTypeCreateInfoVALVE',
 -- 'Vulkan.Extensions.VK_INTEL_performance_query.PerformanceConfigurationAcquireInfoINTEL',
 -- 'Vulkan.Extensions.VK_KHR_performance_query.PerformanceCounterDescriptionKHR',
 -- 'Vulkan.Extensions.VK_KHR_performance_query.PerformanceCounterKHR',
@@ -790,6 +793,7 @@
 -- 'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewFeatures',
 -- 'Vulkan.Extensions.VK_NVX_multiview_per_view_attributes.PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX',
 -- 'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewProperties',
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.PhysicalDeviceMutableDescriptorTypeFeaturesVALVE',
 -- 'Vulkan.Extensions.VK_EXT_pci_bus_info.PhysicalDevicePCIBusInfoPropertiesEXT',
 -- 'Vulkan.Extensions.VK_KHR_performance_query.PhysicalDevicePerformanceQueryFeaturesKHR',
 -- 'Vulkan.Extensions.VK_KHR_performance_query.PhysicalDevicePerformanceQueryPropertiesKHR',
@@ -1075,6 +1079,10 @@
 pattern STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO               = StructureType 47
 -- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO"
 pattern STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO                 = StructureType 48
+-- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE"
+pattern STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = StructureType 1000351002
+-- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE"
+pattern STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = StructureType 1000351000
 -- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT"
 pattern STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT          = StructureType 1000346000
 -- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT"
@@ -1968,6 +1976,8 @@
              STRUCTURE_TYPE_MEMORY_BARRIER,
              STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO,
              STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,
+             STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE,
+             STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE,
              STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT,
              STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT,
              STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
@@ -2448,21 +2458,25 @@
   , (STRUCTURE_TYPE_MEMORY_BARRIER                           , "MEMORY_BARRIER")
   , (STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO              , "LOADER_INSTANCE_CREATE_INFO")
   , (STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO                , "LOADER_DEVICE_CREATE_INFO")
-  , (STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT         , "DIRECTFB_SURFACE_CREATE_INFO_EXT")
-  , (STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, "PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT")
-  , (STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR                      , "IMAGE_RESOLVE_2_KHR")
-  , (STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR                  , "BUFFER_IMAGE_COPY_2_KHR")
-  , (STRUCTURE_TYPE_IMAGE_BLIT_2_KHR                         , "IMAGE_BLIT_2_KHR")
-  , (STRUCTURE_TYPE_IMAGE_COPY_2_KHR                         , "IMAGE_COPY_2_KHR")
-  , (STRUCTURE_TYPE_BUFFER_COPY_2_KHR                        , "BUFFER_COPY_2_KHR")
-  , (STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR                 , "RESOLVE_IMAGE_INFO_2_KHR")
-  , (STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR                    , "BLIT_IMAGE_INFO_2_KHR")
-  , (STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR          , "COPY_IMAGE_TO_BUFFER_INFO_2_KHR")
-  , (STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR          , "COPY_BUFFER_TO_IMAGE_INFO_2_KHR")
-  , (STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR                    , "COPY_IMAGE_INFO_2_KHR")
-  , (STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR                   , "COPY_BUFFER_INFO_2_KHR")
+  , (STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE, "MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE")
+  , ( STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE
+    , "PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE"
+    )
+  , (STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT             , "DIRECTFB_SURFACE_CREATE_INFO_EXT")
+  , (STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT    , "PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT")
+  , (STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR                          , "IMAGE_RESOLVE_2_KHR")
+  , (STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR                      , "BUFFER_IMAGE_COPY_2_KHR")
+  , (STRUCTURE_TYPE_IMAGE_BLIT_2_KHR                             , "IMAGE_BLIT_2_KHR")
+  , (STRUCTURE_TYPE_IMAGE_COPY_2_KHR                             , "IMAGE_COPY_2_KHR")
+  , (STRUCTURE_TYPE_BUFFER_COPY_2_KHR                            , "BUFFER_COPY_2_KHR")
+  , (STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR                     , "RESOLVE_IMAGE_INFO_2_KHR")
+  , (STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR                        , "BLIT_IMAGE_INFO_2_KHR")
+  , (STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR              , "COPY_IMAGE_TO_BUFFER_INFO_2_KHR")
+  , (STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR              , "COPY_BUFFER_TO_IMAGE_INFO_2_KHR")
+  , (STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR                        , "COPY_IMAGE_INFO_2_KHR")
+  , (STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR                       , "COPY_BUFFER_INFO_2_KHR")
   , (STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, "PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT")
-  , (STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM         , "COPY_COMMAND_TRANSFORM_INFO_QCOM")
+  , (STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM             , "COPY_COMMAND_TRANSFORM_INFO_QCOM")
   , ( STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT
     , "PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT"
     )
diff --git a/src/Vulkan/Core10/Enums/VendorId.hs b/src/Vulkan/Core10/Enums/VendorId.hs
--- a/src/Vulkan/Core10/Enums/VendorId.hs
+++ b/src/Vulkan/Core10/Enums/VendorId.hs
@@ -5,6 +5,7 @@
                                               , VENDOR_ID_KAZAN
                                               , VENDOR_ID_CODEPLAY
                                               , VENDOR_ID_MESA
+                                              , VENDOR_ID_POCL
                                               , ..
                                               )) where
 
@@ -48,11 +49,14 @@
 pattern VENDOR_ID_CODEPLAY = VendorId 65540
 -- No documentation found for Nested "VkVendorId" "VK_VENDOR_ID_MESA"
 pattern VENDOR_ID_MESA     = VendorId 65541
+-- No documentation found for Nested "VkVendorId" "VK_VENDOR_ID_POCL"
+pattern VENDOR_ID_POCL     = VendorId 65542
 {-# complete VENDOR_ID_VIV,
              VENDOR_ID_VSI,
              VENDOR_ID_KAZAN,
              VENDOR_ID_CODEPLAY,
-             VENDOR_ID_MESA :: VendorId #-}
+             VENDOR_ID_MESA,
+             VENDOR_ID_POCL :: VendorId #-}
 
 conNameVendorId :: String
 conNameVendorId = "VendorId"
@@ -67,6 +71,7 @@
   , (VENDOR_ID_KAZAN   , "KAZAN")
   , (VENDOR_ID_CODEPLAY, "CODEPLAY")
   , (VENDOR_ID_MESA    , "MESA")
+  , (VENDOR_ID_POCL    , "POCL")
   ]
 
 instance Show VendorId where
diff --git a/src/Vulkan/Core10/Event.hs b/src/Vulkan/Core10/Event.hs
--- a/src/Vulkan/Core10/Event.hs
+++ b/src/Vulkan/Core10/Event.hs
@@ -11,6 +11,7 @@
                             , EventCreateFlags(..)
                             ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -140,7 +141,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPEvent <- ContT $ bracket (callocBytes @Event 8) free
-  r <- lift $ vkCreateEvent' (deviceHandle (device)) pCreateInfo pAllocator (pPEvent)
+  r <- lift $ traceAroundEvent "vkCreateEvent" (vkCreateEvent' (deviceHandle (device)) pCreateInfo pAllocator (pPEvent))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pEvent <- lift $ peek @Event pPEvent
   pure $ (pEvent)
@@ -225,7 +226,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyEvent' (deviceHandle (device)) (event) pAllocator
+  lift $ traceAroundEvent "vkDestroyEvent" (vkDestroyEvent' (deviceHandle (device)) (event) pAllocator)
   pure $ ()
 
 
@@ -307,7 +308,7 @@
   unless (vkGetEventStatusPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetEventStatus is null" Nothing Nothing
   let vkGetEventStatus' = mkVkGetEventStatus vkGetEventStatusPtr
-  r <- vkGetEventStatus' (deviceHandle (device)) (event)
+  r <- traceAroundEvent "vkGetEventStatus" (vkGetEventStatus' (deviceHandle (device)) (event))
   when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -371,7 +372,7 @@
   unless (vkSetEventPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkSetEvent is null" Nothing Nothing
   let vkSetEvent' = mkVkSetEvent vkSetEventPtr
-  r <- vkSetEvent' (deviceHandle (device)) (event)
+  r <- traceAroundEvent "vkSetEvent" (vkSetEvent' (deviceHandle (device)) (event))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -439,7 +440,7 @@
   unless (vkResetEventPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkResetEvent is null" Nothing Nothing
   let vkResetEvent' = mkVkResetEvent vkResetEventPtr
-  r <- vkResetEvent' (deviceHandle (device)) (event)
+  r <- traceAroundEvent "vkResetEvent" (vkResetEvent' (deviceHandle (device)) (event))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Core10/ExtensionDiscovery.hs b/src/Vulkan/Core10/ExtensionDiscovery.hs
--- a/src/Vulkan/Core10/ExtensionDiscovery.hs
+++ b/src/Vulkan/Core10/ExtensionDiscovery.hs
@@ -6,6 +6,7 @@
                                          ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -149,12 +150,12 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ useAsCString (j)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumerateInstanceExtensionProperties' pLayerName (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkEnumerateInstanceExtensionProperties" (vkEnumerateInstanceExtensionProperties' pLayerName (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @ExtensionProperties ((fromIntegral (pPropertyCount)) * 260)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 260) :: Ptr ExtensionProperties) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkEnumerateInstanceExtensionProperties' pLayerName (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkEnumerateInstanceExtensionProperties" (vkEnumerateInstanceExtensionProperties' pLayerName (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @ExtensionProperties (((pPProperties) `advancePtrBytes` (260 * (i)) :: Ptr ExtensionProperties)))
@@ -237,12 +238,12 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ useAsCString (j)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumerateDeviceExtensionProperties' physicalDevice' pLayerName (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkEnumerateDeviceExtensionProperties" (vkEnumerateDeviceExtensionProperties' physicalDevice' pLayerName (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @ExtensionProperties ((fromIntegral (pPropertyCount)) * 260)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 260) :: Ptr ExtensionProperties) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkEnumerateDeviceExtensionProperties' physicalDevice' pLayerName (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkEnumerateDeviceExtensionProperties" (vkEnumerateDeviceExtensionProperties' physicalDevice' pLayerName (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @ExtensionProperties (((pPProperties) `advancePtrBytes` (260 * (i)) :: Ptr ExtensionProperties)))
diff --git a/src/Vulkan/Core10/Fence.hs b/src/Vulkan/Core10/Fence.hs
--- a/src/Vulkan/Core10/Fence.hs
+++ b/src/Vulkan/Core10/Fence.hs
@@ -13,6 +13,7 @@
                             , FenceCreateFlags
                             ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -150,7 +151,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPFence <- ContT $ bracket (callocBytes @Fence 8) free
-  r <- lift $ vkCreateFence' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPFence)
+  r <- lift $ traceAroundEvent "vkCreateFence" (vkCreateFence' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPFence))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFence <- lift $ peek @Fence pPFence
   pure $ (pFence)
@@ -236,7 +237,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyFence' (deviceHandle (device)) (fence) pAllocator
+  lift $ traceAroundEvent "vkDestroyFence" (vkDestroyFence' (deviceHandle (device)) (fence) pAllocator)
   pure $ ()
 
 
@@ -318,7 +319,7 @@
   let vkResetFences' = mkVkResetFences vkResetFencesPtr
   pPFences <- ContT $ allocaBytesAligned @Fence ((Data.Vector.length (fences)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPFences `plusPtr` (8 * (i)) :: Ptr Fence) (e)) (fences)
-  r <- lift $ vkResetFences' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (fences)) :: Word32)) (pPFences)
+  r <- lift $ traceAroundEvent "vkResetFences" (vkResetFences' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (fences)) :: Word32)) (pPFences))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -401,7 +402,7 @@
   unless (vkGetFenceStatusPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetFenceStatus is null" Nothing Nothing
   let vkGetFenceStatus' = mkVkGetFenceStatus vkGetFenceStatusPtr
-  r <- vkGetFenceStatus' (deviceHandle (device)) (fence)
+  r <- traceAroundEvent "vkGetFenceStatus" (vkGetFenceStatus' (deviceHandle (device)) (fence))
   when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -445,7 +446,7 @@
   let vkWaitForFences' = mkVkWaitForFences vkWaitForFencesPtr
   pPFences <- ContT $ allocaBytesAligned @Fence ((Data.Vector.length (fences)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPFences `plusPtr` (8 * (i)) :: Ptr Fence) (e)) (fences)
-  r <- lift $ vkWaitForFences' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (fences)) :: Word32)) (pPFences) (boolToBool32 (waitAll)) (timeout)
+  r <- lift $ traceAroundEvent "vkWaitForFences" (vkWaitForFences' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (fences)) :: Word32)) (pPFences) (boolToBool32 (waitAll)) (timeout))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
diff --git a/src/Vulkan/Core10/FundamentalTypes.hs b/src/Vulkan/Core10/FundamentalTypes.hs
--- a/src/Vulkan/Core10/FundamentalTypes.hs
+++ b/src/Vulkan/Core10/FundamentalTypes.hs
@@ -443,6 +443,7 @@
 -- 'Vulkan.Extensions.VK_NV_mesh_shader.PhysicalDeviceMeshShaderFeaturesNV',
 -- 'Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewFeatures',
 -- 'Vulkan.Extensions.VK_NVX_multiview_per_view_attributes.PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX',
+-- 'Vulkan.Extensions.VK_VALVE_mutable_descriptor_type.PhysicalDeviceMutableDescriptorTypeFeaturesVALVE',
 -- 'Vulkan.Extensions.VK_KHR_performance_query.PhysicalDevicePerformanceQueryFeaturesKHR',
 -- 'Vulkan.Extensions.VK_KHR_performance_query.PhysicalDevicePerformanceQueryPropertiesKHR',
 -- 'Vulkan.Extensions.VK_EXT_pipeline_creation_cache_control.PhysicalDevicePipelineCreationCacheControlFeaturesEXT',
diff --git a/src/Vulkan/Core10/Handles.hs b/src/Vulkan/Core10/Handles.hs
--- a/src/Vulkan/Core10/Handles.hs
+++ b/src/Vulkan/Core10/Handles.hs
@@ -123,6 +123,7 @@
 --
 -- 'Vulkan.Core11.Promoted_From_VK_KHR_device_group_creation.DeviceGroupDeviceCreateInfo',
 -- 'Vulkan.Core11.Promoted_From_VK_KHR_device_group_creation.PhysicalDeviceGroupProperties',
+-- 'Vulkan.Extensions.VK_NV_acquire_winrt_display.acquireWinrtDisplayNV',
 -- 'Vulkan.Extensions.VK_EXT_acquire_xlib_display.acquireXlibDisplayEXT',
 -- 'Vulkan.Core10.Device.createDevice',
 -- 'Vulkan.Extensions.VK_KHR_display.createDisplayModeKHR',
@@ -189,6 +190,7 @@
 -- 'Vulkan.Extensions.VK_KHR_xcb_surface.getPhysicalDeviceXcbPresentationSupportKHR',
 -- 'Vulkan.Extensions.VK_KHR_xlib_surface.getPhysicalDeviceXlibPresentationSupportKHR',
 -- 'Vulkan.Extensions.VK_EXT_acquire_xlib_display.getRandROutputDisplayEXT',
+-- 'Vulkan.Extensions.VK_NV_acquire_winrt_display.getWinrtDisplayNV',
 -- 'Vulkan.Extensions.VK_EXT_direct_mode_display.releaseDisplayEXT'
 data PhysicalDevice = PhysicalDevice
   { physicalDeviceHandle :: Ptr PhysicalDevice_T
diff --git a/src/Vulkan/Core10/Image.hs b/src/Vulkan/Core10/Image.hs
--- a/src/Vulkan/Core10/Image.hs
+++ b/src/Vulkan/Core10/Image.hs
@@ -10,6 +10,7 @@
                             , ImageLayout(..)
                             ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -171,7 +172,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPImage <- ContT $ bracket (callocBytes @Image 8) free
-  r <- lift $ vkCreateImage' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPImage)
+  r <- lift $ traceAroundEvent "vkCreateImage" (vkCreateImage' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPImage))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pImage <- lift $ peek @Image pPImage
   pure $ (pImage)
@@ -257,7 +258,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyImage' (deviceHandle (device)) (image) pAllocator
+  lift $ traceAroundEvent "vkDestroyImage" (vkDestroyImage' (deviceHandle (device)) (image) pAllocator)
   pure $ ()
 
 
@@ -417,7 +418,7 @@
   let vkGetImageSubresourceLayout' = mkVkGetImageSubresourceLayout vkGetImageSubresourceLayoutPtr
   pSubresource <- ContT $ withCStruct (subresource)
   pPLayout <- ContT (withZeroCStruct @SubresourceLayout)
-  lift $ vkGetImageSubresourceLayout' (deviceHandle (device)) (image) pSubresource (pPLayout)
+  lift $ traceAroundEvent "vkGetImageSubresourceLayout" (vkGetImageSubresourceLayout' (deviceHandle (device)) (image) pSubresource (pPLayout))
   pLayout <- lift $ peekCStruct @SubresourceLayout pPLayout
   pure $ (pLayout)
 
diff --git a/src/Vulkan/Core10/ImageView.hs b/src/Vulkan/Core10/ImageView.hs
--- a/src/Vulkan/Core10/ImageView.hs
+++ b/src/Vulkan/Core10/ImageView.hs
@@ -13,6 +13,7 @@
                                 , ImageViewCreateFlags
                                 ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -150,7 +151,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPView <- ContT $ bracket (callocBytes @ImageView 8) free
-  r <- lift $ vkCreateImageView' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPView)
+  r <- lift $ traceAroundEvent "vkCreateImageView" (vkCreateImageView' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPView))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pView <- lift $ peek @ImageView pPView
   pure $ (pView)
@@ -236,7 +237,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyImageView' (deviceHandle (device)) (imageView) pAllocator
+  lift $ traceAroundEvent "vkDestroyImageView" (vkDestroyImageView' (deviceHandle (device)) (imageView) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/LayerDiscovery.hs b/src/Vulkan/Core10/LayerDiscovery.hs
--- a/src/Vulkan/Core10/LayerDiscovery.hs
+++ b/src/Vulkan/Core10/LayerDiscovery.hs
@@ -6,6 +6,7 @@
                                      ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -129,12 +130,12 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkEnumerateInstanceLayerProperties is null" Nothing Nothing
   let vkEnumerateInstanceLayerProperties' = mkVkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerPropertiesPtr
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumerateInstanceLayerProperties' (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkEnumerateInstanceLayerProperties" (vkEnumerateInstanceLayerProperties' (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @LayerProperties ((fromIntegral (pPropertyCount)) * 520)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 520) :: Ptr LayerProperties) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkEnumerateInstanceLayerProperties' (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkEnumerateInstanceLayerProperties" (vkEnumerateInstanceLayerProperties' (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @LayerProperties (((pPProperties) `advancePtrBytes` (520 * (i)) :: Ptr LayerProperties)))
@@ -214,12 +215,12 @@
   let vkEnumerateDeviceLayerProperties' = mkVkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerPropertiesPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumerateDeviceLayerProperties' physicalDevice' (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkEnumerateDeviceLayerProperties" (vkEnumerateDeviceLayerProperties' physicalDevice' (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @LayerProperties ((fromIntegral (pPropertyCount)) * 520)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 520) :: Ptr LayerProperties) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkEnumerateDeviceLayerProperties' physicalDevice' (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkEnumerateDeviceLayerProperties" (vkEnumerateDeviceLayerProperties' physicalDevice' (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @LayerProperties (((pPProperties) `advancePtrBytes` (520 * (i)) :: Ptr LayerProperties)))
diff --git a/src/Vulkan/Core10/Memory.hs b/src/Vulkan/Core10/Memory.hs
--- a/src/Vulkan/Core10/Memory.hs
+++ b/src/Vulkan/Core10/Memory.hs
@@ -14,6 +14,7 @@
                              , MemoryMapFlags(..)
                              ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -254,7 +255,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPMemory <- ContT $ bracket (callocBytes @DeviceMemory 8) free
-  r <- lift $ vkAllocateMemory' (deviceHandle (device)) (forgetExtensions pAllocateInfo) pAllocator (pPMemory)
+  r <- lift $ traceAroundEvent "vkAllocateMemory" (vkAllocateMemory' (deviceHandle (device)) (forgetExtensions pAllocateInfo) pAllocator (pPMemory))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pMemory <- lift $ peek @DeviceMemory pPMemory
   pure $ (pMemory)
@@ -359,7 +360,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkFreeMemory' (deviceHandle (device)) (memory) pAllocator
+  lift $ traceAroundEvent "vkFreeMemory" (vkFreeMemory' (deviceHandle (device)) (memory) pAllocator)
   pure $ ()
 
 
@@ -505,7 +506,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkMapMemory is null" Nothing Nothing
   let vkMapMemory' = mkVkMapMemory vkMapMemoryPtr
   pPpData <- ContT $ bracket (callocBytes @(Ptr ()) 8) free
-  r <- lift $ vkMapMemory' (deviceHandle (device)) (memory) (offset) (size) (flags) (pPpData)
+  r <- lift $ traceAroundEvent "vkMapMemory" (vkMapMemory' (deviceHandle (device)) (memory) (offset) (size) (flags) (pPpData))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   ppData <- lift $ peek @(Ptr ()) pPpData
   pure $ (ppData)
@@ -568,7 +569,7 @@
   unless (vkUnmapMemoryPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkUnmapMemory is null" Nothing Nothing
   let vkUnmapMemory' = mkVkUnmapMemory vkUnmapMemoryPtr
-  vkUnmapMemory' (deviceHandle (device)) (memory)
+  traceAroundEvent "vkUnmapMemory" (vkUnmapMemory' (deviceHandle (device)) (memory))
   pure $ ()
 
 
@@ -648,7 +649,7 @@
   let vkFlushMappedMemoryRanges' = mkVkFlushMappedMemoryRanges vkFlushMappedMemoryRangesPtr
   pPMemoryRanges <- ContT $ allocaBytesAligned @MappedMemoryRange ((Data.Vector.length (memoryRanges)) * 40) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPMemoryRanges `plusPtr` (40 * (i)) :: Ptr MappedMemoryRange) (e)) (memoryRanges)
-  r <- lift $ vkFlushMappedMemoryRanges' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (memoryRanges)) :: Word32)) (pPMemoryRanges)
+  r <- lift $ traceAroundEvent "vkFlushMappedMemoryRanges" (vkFlushMappedMemoryRanges' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (memoryRanges)) :: Word32)) (pPMemoryRanges))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -720,7 +721,7 @@
   let vkInvalidateMappedMemoryRanges' = mkVkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRangesPtr
   pPMemoryRanges <- ContT $ allocaBytesAligned @MappedMemoryRange ((Data.Vector.length (memoryRanges)) * 40) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPMemoryRanges `plusPtr` (40 * (i)) :: Ptr MappedMemoryRange) (e)) (memoryRanges)
-  r <- lift $ vkInvalidateMappedMemoryRanges' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (memoryRanges)) :: Word32)) (pPMemoryRanges)
+  r <- lift $ traceAroundEvent "vkInvalidateMappedMemoryRanges" (vkInvalidateMappedMemoryRanges' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (memoryRanges)) :: Word32)) (pPMemoryRanges))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -775,7 +776,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeviceMemoryCommitment is null" Nothing Nothing
   let vkGetDeviceMemoryCommitment' = mkVkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitmentPtr
   pPCommittedMemoryInBytes <- ContT $ bracket (callocBytes @DeviceSize 8) free
-  lift $ vkGetDeviceMemoryCommitment' (deviceHandle (device)) (memory) (pPCommittedMemoryInBytes)
+  lift $ traceAroundEvent "vkGetDeviceMemoryCommitment" (vkGetDeviceMemoryCommitment' (deviceHandle (device)) (memory) (pPCommittedMemoryInBytes))
   pCommittedMemoryInBytes <- lift $ peek @DeviceSize pPCommittedMemoryInBytes
   pure $ (pCommittedMemoryInBytes)
 
diff --git a/src/Vulkan/Core10/MemoryManagement.hs b/src/Vulkan/Core10/MemoryManagement.hs
--- a/src/Vulkan/Core10/MemoryManagement.hs
+++ b/src/Vulkan/Core10/MemoryManagement.hs
@@ -8,6 +8,7 @@
                                        , DeviceMemory(..)
                                        ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -94,7 +95,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetBufferMemoryRequirements is null" Nothing Nothing
   let vkGetBufferMemoryRequirements' = mkVkGetBufferMemoryRequirements vkGetBufferMemoryRequirementsPtr
   pPMemoryRequirements <- ContT (withZeroCStruct @MemoryRequirements)
-  lift $ vkGetBufferMemoryRequirements' (deviceHandle (device)) (buffer) (pPMemoryRequirements)
+  lift $ traceAroundEvent "vkGetBufferMemoryRequirements" (vkGetBufferMemoryRequirements' (deviceHandle (device)) (buffer) (pPMemoryRequirements))
   pMemoryRequirements <- lift $ peekCStruct @MemoryRequirements pPMemoryRequirements
   pure $ (pMemoryRequirements)
 
@@ -272,7 +273,7 @@
   unless (vkBindBufferMemoryPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkBindBufferMemory is null" Nothing Nothing
   let vkBindBufferMemory' = mkVkBindBufferMemory vkBindBufferMemoryPtr
-  r <- vkBindBufferMemory' (deviceHandle (device)) (buffer) (memory) (memoryOffset)
+  r <- traceAroundEvent "vkBindBufferMemory" (vkBindBufferMemory' (deviceHandle (device)) (buffer) (memory) (memoryOffset))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -330,7 +331,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetImageMemoryRequirements is null" Nothing Nothing
   let vkGetImageMemoryRequirements' = mkVkGetImageMemoryRequirements vkGetImageMemoryRequirementsPtr
   pPMemoryRequirements <- ContT (withZeroCStruct @MemoryRequirements)
-  lift $ vkGetImageMemoryRequirements' (deviceHandle (device)) (image) (pPMemoryRequirements)
+  lift $ traceAroundEvent "vkGetImageMemoryRequirements" (vkGetImageMemoryRequirements' (deviceHandle (device)) (image) (pPMemoryRequirements))
   pMemoryRequirements <- lift $ peekCStruct @MemoryRequirements pPMemoryRequirements
   pure $ (pMemoryRequirements)
 
@@ -525,7 +526,7 @@
   unless (vkBindImageMemoryPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkBindImageMemory is null" Nothing Nothing
   let vkBindImageMemory' = mkVkBindImageMemory vkBindImageMemoryPtr
-  r <- vkBindImageMemory' (deviceHandle (device)) (image) (memory) (memoryOffset)
+  r <- traceAroundEvent "vkBindImageMemory" (vkBindImageMemory' (deviceHandle (device)) (image) (memory) (memoryOffset))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Core10/Pass.hs b/src/Vulkan/Core10/Pass.hs
--- a/src/Vulkan/Core10/Pass.hs
+++ b/src/Vulkan/Core10/Pass.hs
@@ -32,6 +32,7 @@
                            , FramebufferCreateFlags
                            ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -214,7 +215,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPFramebuffer <- ContT $ bracket (callocBytes @Framebuffer 8) free
-  r <- lift $ vkCreateFramebuffer' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPFramebuffer)
+  r <- lift $ traceAroundEvent "vkCreateFramebuffer" (vkCreateFramebuffer' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPFramebuffer))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFramebuffer <- lift $ peek @Framebuffer pPFramebuffer
   pure $ (pFramebuffer)
@@ -301,7 +302,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyFramebuffer' (deviceHandle (device)) (framebuffer) pAllocator
+  lift $ traceAroundEvent "vkDestroyFramebuffer" (vkDestroyFramebuffer' (deviceHandle (device)) (framebuffer) pAllocator)
   pure $ ()
 
 
@@ -368,7 +369,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPRenderPass <- ContT $ bracket (callocBytes @RenderPass 8) free
-  r <- lift $ vkCreateRenderPass' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPRenderPass)
+  r <- lift $ traceAroundEvent "vkCreateRenderPass" (vkCreateRenderPass' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPRenderPass))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pRenderPass <- lift $ peek @RenderPass pPRenderPass
   pure $ (pRenderPass)
@@ -455,7 +456,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyRenderPass' (deviceHandle (device)) (renderPass) pAllocator
+  lift $ traceAroundEvent "vkDestroyRenderPass" (vkDestroyRenderPass' (deviceHandle (device)) (renderPass) pAllocator)
   pure $ ()
 
 
@@ -531,7 +532,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetRenderAreaGranularity is null" Nothing Nothing
   let vkGetRenderAreaGranularity' = mkVkGetRenderAreaGranularity vkGetRenderAreaGranularityPtr
   pPGranularity <- ContT (withZeroCStruct @Extent2D)
-  lift $ vkGetRenderAreaGranularity' (deviceHandle (device)) (renderPass) (pPGranularity)
+  lift $ traceAroundEvent "vkGetRenderAreaGranularity" (vkGetRenderAreaGranularity' (deviceHandle (device)) (renderPass) (pPGranularity))
   pGranularity <- lift $ peekCStruct @Extent2D pPGranularity
   pure $ (pGranularity)
 
diff --git a/src/Vulkan/Core10/Pipeline.hs b/src/Vulkan/Core10/Pipeline.hs
--- a/src/Vulkan/Core10/Pipeline.hs
+++ b/src/Vulkan/Core10/Pipeline.hs
@@ -59,6 +59,7 @@
                                ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -375,7 +376,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPPipelines <- ContT $ bracket (callocBytes @Pipeline ((fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) * 8)) free
-  r <- lift $ vkCreateGraphicsPipelines' (deviceHandle (device)) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines)
+  r <- lift $ traceAroundEvent "vkCreateGraphicsPipelines" (vkCreateGraphicsPipelines' (deviceHandle (device)) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPipelines <- lift $ generateM (fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) (\i -> peek @Pipeline ((pPPipelines `advancePtrBytes` (8 * (i)) :: Ptr Pipeline)))
   pure $ (r, pPipelines)
@@ -504,7 +505,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPPipelines <- ContT $ bracket (callocBytes @Pipeline ((fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) * 8)) free
-  r <- lift $ vkCreateComputePipelines' (deviceHandle (device)) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines)
+  r <- lift $ traceAroundEvent "vkCreateComputePipelines" (vkCreateComputePipelines' (deviceHandle (device)) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPipelines <- lift $ generateM (fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) (\i -> peek @Pipeline ((pPPipelines `advancePtrBytes` (8 * (i)) :: Ptr Pipeline)))
   pure $ (r, pPipelines)
@@ -590,7 +591,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyPipeline' (deviceHandle (device)) (pipeline) pAllocator
+  lift $ traceAroundEvent "vkDestroyPipeline" (vkDestroyPipeline' (deviceHandle (device)) (pipeline) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/PipelineCache.hs b/src/Vulkan/Core10/PipelineCache.hs
--- a/src/Vulkan/Core10/PipelineCache.hs
+++ b/src/Vulkan/Core10/PipelineCache.hs
@@ -11,6 +11,7 @@
                                     , PipelineCacheCreateFlags
                                     ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -175,7 +176,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPPipelineCache <- ContT $ bracket (callocBytes @PipelineCache 8) free
-  r <- lift $ vkCreatePipelineCache' (deviceHandle (device)) pCreateInfo pAllocator (pPPipelineCache)
+  r <- lift $ traceAroundEvent "vkCreatePipelineCache" (vkCreatePipelineCache' (deviceHandle (device)) pCreateInfo pAllocator (pPPipelineCache))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPipelineCache <- lift $ peek @PipelineCache pPPipelineCache
   pure $ (pPipelineCache)
@@ -260,7 +261,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyPipelineCache' (deviceHandle (device)) (pipelineCache) pAllocator
+  lift $ traceAroundEvent "vkDestroyPipelineCache" (vkDestroyPipelineCache' (deviceHandle (device)) (pipelineCache) pAllocator)
   pure $ ()
 
 
@@ -389,11 +390,11 @@
   let vkGetPipelineCacheData' = mkVkGetPipelineCacheData vkGetPipelineCacheDataPtr
   let device' = deviceHandle (device)
   pPDataSize <- ContT $ bracket (callocBytes @CSize 8) free
-  r <- lift $ vkGetPipelineCacheData' device' (pipelineCache) (pPDataSize) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPipelineCacheData" (vkGetPipelineCacheData' device' (pipelineCache) (pPDataSize) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDataSize <- lift $ peek @CSize pPDataSize
   pPData <- ContT $ bracket (callocBytes @(()) (fromIntegral (((\(CSize a) -> a) pDataSize)))) free
-  r' <- lift $ vkGetPipelineCacheData' device' (pipelineCache) (pPDataSize) (pPData)
+  r' <- lift $ traceAroundEvent "vkGetPipelineCacheData" (vkGetPipelineCacheData' device' (pipelineCache) (pPDataSize) (pPData))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pDataSize'' <- lift $ peek @CSize pPDataSize
   pData' <- lift $ packCStringLen  (castPtr @() @CChar pPData, (fromIntegral (((\(CSize a) -> a) pDataSize''))))
@@ -481,7 +482,7 @@
   let vkMergePipelineCaches' = mkVkMergePipelineCaches vkMergePipelineCachesPtr
   pPSrcCaches <- ContT $ allocaBytesAligned @PipelineCache ((Data.Vector.length (srcCaches)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPSrcCaches `plusPtr` (8 * (i)) :: Ptr PipelineCache) (e)) (srcCaches)
-  r <- lift $ vkMergePipelineCaches' (deviceHandle (device)) (dstCache) ((fromIntegral (Data.Vector.length $ (srcCaches)) :: Word32)) (pPSrcCaches)
+  r <- lift $ traceAroundEvent "vkMergePipelineCaches" (vkMergePipelineCaches' (deviceHandle (device)) (dstCache) ((fromIntegral (Data.Vector.length $ (srcCaches)) :: Word32)) (pPSrcCaches))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Core10/PipelineLayout.hs b/src/Vulkan/Core10/PipelineLayout.hs
--- a/src/Vulkan/Core10/PipelineLayout.hs
+++ b/src/Vulkan/Core10/PipelineLayout.hs
@@ -8,6 +8,7 @@
                                      , PipelineLayout(..)
                                      ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -129,7 +130,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPPipelineLayout <- ContT $ bracket (callocBytes @PipelineLayout 8) free
-  r <- lift $ vkCreatePipelineLayout' (deviceHandle (device)) pCreateInfo pAllocator (pPPipelineLayout)
+  r <- lift $ traceAroundEvent "vkCreatePipelineLayout" (vkCreatePipelineLayout' (deviceHandle (device)) pCreateInfo pAllocator (pPPipelineLayout))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPipelineLayout <- lift $ peek @PipelineLayout pPPipelineLayout
   pure $ (pPipelineLayout)
@@ -220,7 +221,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyPipelineLayout' (deviceHandle (device)) (pipelineLayout) pAllocator
+  lift $ traceAroundEvent "vkDestroyPipelineLayout" (vkDestroyPipelineLayout' (deviceHandle (device)) (pipelineLayout) pAllocator)
   pure $ ()
 
 
@@ -663,6 +664,11 @@
 --     across all shader stages and across all elements of @pSetLayouts@
 --     /must/ be less than or equal to
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-maxDescriptorSetSubsampledSamplers ::maxDescriptorSetSubsampledSamplers>
+--
+-- -   #VUID-VkPipelineLayoutCreateInfo-pSetLayouts-04606# Any element of
+--     @pSetLayouts@ /must/ not have been created with the
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE'
+--     bit set
 --
 -- == Valid Usage (Implicit)
 --
diff --git a/src/Vulkan/Core10/Query.hs b/src/Vulkan/Core10/Query.hs
--- a/src/Vulkan/Core10/Query.hs
+++ b/src/Vulkan/Core10/Query.hs
@@ -14,6 +14,7 @@
                             , QueryPipelineStatisticFlags
                             ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -155,7 +156,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPQueryPool <- ContT $ bracket (callocBytes @QueryPool 8) free
-  r <- lift $ vkCreateQueryPool' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPQueryPool)
+  r <- lift $ traceAroundEvent "vkCreateQueryPool" (vkCreateQueryPool' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPQueryPool))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pQueryPool <- lift $ peek @QueryPool pPQueryPool
   pure $ (pQueryPool)
@@ -241,7 +242,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyQueryPool' (deviceHandle (device)) (queryPool) pAllocator
+  lift $ traceAroundEvent "vkDestroyQueryPool" (vkDestroyQueryPool' (deviceHandle (device)) (queryPool) pAllocator)
   pure $ ()
 
 
@@ -485,7 +486,7 @@
   unless (vkGetQueryPoolResultsPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetQueryPoolResults is null" Nothing Nothing
   let vkGetQueryPoolResults' = mkVkGetQueryPoolResults vkGetQueryPoolResultsPtr
-  r <- vkGetQueryPoolResults' (deviceHandle (device)) (queryPool) (firstQuery) (queryCount) (CSize (dataSize)) (data') (stride) (flags)
+  r <- traceAroundEvent "vkGetQueryPoolResults" (vkGetQueryPoolResults' (deviceHandle (device)) (queryPool) (firstQuery) (queryCount) (CSize (dataSize)) (data') (stride) (flags))
   when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
diff --git a/src/Vulkan/Core10/Queue.hs b/src/Vulkan/Core10/Queue.hs
--- a/src/Vulkan/Core10/Queue.hs
+++ b/src/Vulkan/Core10/Queue.hs
@@ -12,6 +12,7 @@
                             , PipelineStageFlags
                             ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -155,7 +156,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeviceQueue is null" Nothing Nothing
   let vkGetDeviceQueue' = mkVkGetDeviceQueue vkGetDeviceQueuePtr
   pPQueue <- ContT $ bracket (callocBytes @(Ptr Queue_T) 8) free
-  lift $ vkGetDeviceQueue' (deviceHandle (device)) (queueFamilyIndex) (queueIndex) (pPQueue)
+  lift $ traceAroundEvent "vkGetDeviceQueue" (vkGetDeviceQueue' (deviceHandle (device)) (queueFamilyIndex) (queueIndex) (pPQueue))
   pQueue <- lift $ peek @(Ptr Queue_T) pPQueue
   pure $ (((\h -> Queue h cmds ) pQueue))
 
@@ -405,7 +406,7 @@
   let vkQueueSubmit' = mkVkQueueSubmit vkQueueSubmitPtr
   pPSubmits <- ContT $ allocaBytesAligned @(SubmitInfo _) ((Data.Vector.length (submits)) * 72) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPSubmits `plusPtr` (72 * (i)) :: Ptr (SubmitInfo _))) (e) . ($ ())) (submits)
-  r <- lift $ vkQueueSubmit' (queueHandle (queue)) ((fromIntegral (Data.Vector.length $ (submits)) :: Word32)) (forgetExtensions (pPSubmits)) (fence)
+  r <- lift $ traceAroundEvent "vkQueueSubmit" (vkQueueSubmit' (queueHandle (queue)) ((fromIntegral (Data.Vector.length $ (submits)) :: Word32)) (forgetExtensions (pPSubmits)) (fence))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -433,7 +434,7 @@
   unless (vkQueueWaitIdlePtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkQueueWaitIdle is null" Nothing Nothing
   let vkQueueWaitIdle' = mkVkQueueWaitIdle vkQueueWaitIdlePtr
-  r <- vkQueueWaitIdle' (queueHandle (queue))
+  r <- traceAroundEvent "vkQueueWaitIdle" (vkQueueWaitIdle' (queueHandle (queue)))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 -- | vkQueueWaitIdle - Wait for a queue to become idle
@@ -519,7 +520,7 @@
   unless (vkDeviceWaitIdlePtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkDeviceWaitIdle is null" Nothing Nothing
   let vkDeviceWaitIdle' = mkVkDeviceWaitIdle vkDeviceWaitIdlePtr
-  r <- vkDeviceWaitIdle' (deviceHandle (device))
+  r <- traceAroundEvent "vkDeviceWaitIdle" (vkDeviceWaitIdle' (deviceHandle (device)))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 -- | vkDeviceWaitIdle - Wait for a device to become idle
diff --git a/src/Vulkan/Core10/QueueSemaphore.hs b/src/Vulkan/Core10/QueueSemaphore.hs
--- a/src/Vulkan/Core10/QueueSemaphore.hs
+++ b/src/Vulkan/Core10/QueueSemaphore.hs
@@ -8,6 +8,7 @@
                                      , SemaphoreCreateFlags(..)
                                      ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -134,7 +135,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSemaphore <- ContT $ bracket (callocBytes @Semaphore 8) free
-  r <- lift $ vkCreateSemaphore' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSemaphore)
+  r <- lift $ traceAroundEvent "vkCreateSemaphore" (vkCreateSemaphore' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSemaphore))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSemaphore <- lift $ peek @Semaphore pPSemaphore
   pure $ (pSemaphore)
@@ -220,7 +221,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroySemaphore' (deviceHandle (device)) (semaphore) pAllocator
+  lift $ traceAroundEvent "vkDestroySemaphore" (vkDestroySemaphore' (deviceHandle (device)) (semaphore) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/Sampler.hs b/src/Vulkan/Core10/Sampler.hs
--- a/src/Vulkan/Core10/Sampler.hs
+++ b/src/Vulkan/Core10/Sampler.hs
@@ -13,6 +13,7 @@
                               , SamplerCreateFlags
                               ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -161,7 +162,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSampler <- ContT $ bracket (callocBytes @Sampler 8) free
-  r <- lift $ vkCreateSampler' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSampler)
+  r <- lift $ traceAroundEvent "vkCreateSampler" (vkCreateSampler' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSampler))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSampler <- lift $ peek @Sampler pPSampler
   pure $ (pSampler)
@@ -247,7 +248,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroySampler' (deviceHandle (device)) (sampler) pAllocator
+  lift $ traceAroundEvent "vkDestroySampler" (vkDestroySampler' (deviceHandle (device)) (sampler) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/Shader.hs b/src/Vulkan/Core10/Shader.hs
--- a/src/Vulkan/Core10/Shader.hs
+++ b/src/Vulkan/Core10/Shader.hs
@@ -9,6 +9,7 @@
                              , ShaderModuleCreateFlags
                              ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -161,7 +162,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPShaderModule <- ContT $ bracket (callocBytes @ShaderModule 8) free
-  r <- lift $ vkCreateShaderModule' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPShaderModule)
+  r <- lift $ traceAroundEvent "vkCreateShaderModule" (vkCreateShaderModule' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPShaderModule))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pShaderModule <- lift $ peek @ShaderModule pPShaderModule
   pure $ (pShaderModule)
@@ -251,7 +252,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyShaderModule' (deviceHandle (device)) (shaderModule) pAllocator
+  lift $ traceAroundEvent "vkDestroyShaderModule" (vkDestroyShaderModule' (deviceHandle (device)) (shaderModule) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core10/SparseResourceMemoryManagement.hs b/src/Vulkan/Core10/SparseResourceMemoryManagement.hs
--- a/src/Vulkan/Core10/SparseResourceMemoryManagement.hs
+++ b/src/Vulkan/Core10/SparseResourceMemoryManagement.hs
@@ -20,6 +20,7 @@
                                                      , SparseMemoryBindFlags
                                                      ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -200,11 +201,11 @@
   let vkGetImageSparseMemoryRequirements' = mkVkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirementsPtr
   let device' = deviceHandle (device)
   pPSparseMemoryRequirementCount <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetImageSparseMemoryRequirements' device' (image) (pPSparseMemoryRequirementCount) (nullPtr)
+  lift $ traceAroundEvent "vkGetImageSparseMemoryRequirements" (vkGetImageSparseMemoryRequirements' device' (image) (pPSparseMemoryRequirementCount) (nullPtr))
   pSparseMemoryRequirementCount <- lift $ peek @Word32 pPSparseMemoryRequirementCount
   pPSparseMemoryRequirements <- ContT $ bracket (callocBytes @SparseImageMemoryRequirements ((fromIntegral (pSparseMemoryRequirementCount)) * 48)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPSparseMemoryRequirements `advancePtrBytes` (i * 48) :: Ptr SparseImageMemoryRequirements) . ($ ())) [0..(fromIntegral (pSparseMemoryRequirementCount)) - 1]
-  lift $ vkGetImageSparseMemoryRequirements' device' (image) (pPSparseMemoryRequirementCount) ((pPSparseMemoryRequirements))
+  lift $ traceAroundEvent "vkGetImageSparseMemoryRequirements" (vkGetImageSparseMemoryRequirements' device' (image) (pPSparseMemoryRequirementCount) ((pPSparseMemoryRequirements)))
   pSparseMemoryRequirementCount' <- lift $ peek @Word32 pPSparseMemoryRequirementCount
   pSparseMemoryRequirements' <- lift $ generateM (fromIntegral (pSparseMemoryRequirementCount')) (\i -> peekCStruct @SparseImageMemoryRequirements (((pPSparseMemoryRequirements) `advancePtrBytes` (48 * (i)) :: Ptr SparseImageMemoryRequirements)))
   pure $ (pSparseMemoryRequirements')
@@ -327,11 +328,11 @@
   let vkGetPhysicalDeviceSparseImageFormatProperties' = mkVkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatPropertiesPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetPhysicalDeviceSparseImageFormatProperties' physicalDevice' (format) (type') (samples) (usage) (tiling) (pPPropertyCount) (nullPtr)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceSparseImageFormatProperties" (vkGetPhysicalDeviceSparseImageFormatProperties' physicalDevice' (format) (type') (samples) (usage) (tiling) (pPPropertyCount) (nullPtr))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @SparseImageFormatProperties ((fromIntegral (pPropertyCount)) * 20)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 20) :: Ptr SparseImageFormatProperties) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  lift $ vkGetPhysicalDeviceSparseImageFormatProperties' physicalDevice' (format) (type') (samples) (usage) (tiling) (pPPropertyCount) ((pPProperties))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceSparseImageFormatProperties" (vkGetPhysicalDeviceSparseImageFormatProperties' physicalDevice' (format) (type') (samples) (usage) (tiling) (pPPropertyCount) ((pPProperties)))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @SparseImageFormatProperties (((pPProperties) `advancePtrBytes` (20 * (i)) :: Ptr SparseImageFormatProperties)))
   pure $ (pProperties')
@@ -490,7 +491,7 @@
   let vkQueueBindSparse' = mkVkQueueBindSparse vkQueueBindSparsePtr
   pPBindInfo <- ContT $ allocaBytesAligned @(BindSparseInfo _) ((Data.Vector.length (bindInfo)) * 96) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPBindInfo `plusPtr` (96 * (i)) :: Ptr (BindSparseInfo _))) (e) . ($ ())) (bindInfo)
-  r <- lift $ vkQueueBindSparse' (queueHandle (queue)) ((fromIntegral (Data.Vector.length $ (bindInfo)) :: Word32)) (forgetExtensions (pPBindInfo)) (fence)
+  r <- lift $ traceAroundEvent "vkQueueBindSparse" (vkQueueBindSparse' (queueHandle (queue)) ((fromIntegral (Data.Vector.length $ (bindInfo)) :: Word32)) (forgetExtensions (pPBindInfo)) (fence))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Core11/DeviceInitialization.hs b/src/Vulkan/Core11/DeviceInitialization.hs
--- a/src/Vulkan/Core11/DeviceInitialization.hs
+++ b/src/Vulkan/Core11/DeviceInitialization.hs
@@ -2,6 +2,7 @@
 -- No documentation found for Chapter "DeviceInitialization"
 module Vulkan.Core11.DeviceInitialization  (enumerateInstanceVersion) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -72,7 +73,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkEnumerateInstanceVersion is null" Nothing Nothing
   let vkEnumerateInstanceVersion' = mkVkEnumerateInstanceVersion vkEnumerateInstanceVersionPtr
   pPApiVersion <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumerateInstanceVersion' (pPApiVersion)
+  r <- lift $ traceAroundEvent "vkEnumerateInstanceVersion" (vkEnumerateInstanceVersion' (pPApiVersion))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pApiVersion <- lift $ peek @Word32 pPApiVersion
   pure $ (pApiVersion)
diff --git a/src/Vulkan/Core11/Originally_Based_On_VK_KHR_protected_memory.hs b/src/Vulkan/Core11/Originally_Based_On_VK_KHR_protected_memory.hs
--- a/src/Vulkan/Core11/Originally_Based_On_VK_KHR_protected_memory.hs
+++ b/src/Vulkan/Core11/Originally_Based_On_VK_KHR_protected_memory.hs
@@ -20,6 +20,7 @@
                                                                   , CommandPoolCreateFlags
                                                                   ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -117,7 +118,7 @@
   let vkGetDeviceQueue2' = mkVkGetDeviceQueue2 vkGetDeviceQueue2Ptr
   pQueueInfo <- ContT $ withCStruct (queueInfo)
   pPQueue <- ContT $ bracket (callocBytes @(Ptr Queue_T) 8) free
-  lift $ vkGetDeviceQueue2' (deviceHandle (device)) pQueueInfo (pPQueue)
+  lift $ traceAroundEvent "vkGetDeviceQueue2" (vkGetDeviceQueue2' (deviceHandle (device)) pQueueInfo (pPQueue))
   pQueue <- lift $ peek @(Ptr Queue_T) pPQueue
   pure $ (((\h -> Queue h cmds ) pQueue))
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_bind_memory2.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_bind_memory2.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_bind_memory2.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_bind_memory2.hs
@@ -9,6 +9,7 @@
                                                         , ImageCreateFlags
                                                         ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Data.Typeable (eqT)
@@ -129,7 +130,7 @@
   let vkBindBufferMemory2' = mkVkBindBufferMemory2 vkBindBufferMemory2Ptr
   pPBindInfos <- ContT $ allocaBytesAligned @(BindBufferMemoryInfo _) ((Data.Vector.length (bindInfos)) * 40) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPBindInfos `plusPtr` (40 * (i)) :: Ptr (BindBufferMemoryInfo _))) (e) . ($ ())) (bindInfos)
-  r <- lift $ vkBindBufferMemory2' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (bindInfos)) :: Word32)) (forgetExtensions (pPBindInfos))
+  r <- lift $ traceAroundEvent "vkBindBufferMemory2" (vkBindBufferMemory2' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (bindInfos)) :: Word32)) (forgetExtensions (pPBindInfos)))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -200,7 +201,7 @@
   let vkBindImageMemory2' = mkVkBindImageMemory2 vkBindImageMemory2Ptr
   pPBindInfos <- ContT $ allocaBytesAligned @(BindImageMemoryInfo _) ((Data.Vector.length (bindInfos)) * 40) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPBindInfos `plusPtr` (40 * (i)) :: Ptr (BindImageMemoryInfo _))) (e) . ($ ())) (bindInfos)
-  r <- lift $ vkBindImageMemory2' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (bindInfos)) :: Word32)) (forgetExtensions (pPBindInfos))
+  r <- lift $ traceAroundEvent "vkBindImageMemory2" (vkBindImageMemory2' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (bindInfos)) :: Word32)) (forgetExtensions (pPBindInfos)))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_descriptor_update_template.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_descriptor_update_template.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_descriptor_update_template.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_descriptor_update_template.hs
@@ -13,6 +13,7 @@
                                                                       , ObjectType(..)
                                                                       ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -153,7 +154,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPDescriptorUpdateTemplate <- ContT $ bracket (callocBytes @DescriptorUpdateTemplate 8) free
-  r <- lift $ vkCreateDescriptorUpdateTemplate' (deviceHandle (device)) pCreateInfo pAllocator (pPDescriptorUpdateTemplate)
+  r <- lift $ traceAroundEvent "vkCreateDescriptorUpdateTemplate" (vkCreateDescriptorUpdateTemplate' (deviceHandle (device)) pCreateInfo pAllocator (pPDescriptorUpdateTemplate))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDescriptorUpdateTemplate <- lift $ peek @DescriptorUpdateTemplate pPDescriptorUpdateTemplate
   pure $ (pDescriptorUpdateTemplate)
@@ -244,7 +245,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyDescriptorUpdateTemplate' (deviceHandle (device)) (descriptorUpdateTemplate) pAllocator
+  lift $ traceAroundEvent "vkDestroyDescriptorUpdateTemplate" (vkDestroyDescriptorUpdateTemplate' (deviceHandle (device)) (descriptorUpdateTemplate) pAllocator)
   pure $ ()
 
 
@@ -396,7 +397,7 @@
   unless (vkUpdateDescriptorSetWithTemplatePtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkUpdateDescriptorSetWithTemplate is null" Nothing Nothing
   let vkUpdateDescriptorSetWithTemplate' = mkVkUpdateDescriptorSetWithTemplate vkUpdateDescriptorSetWithTemplatePtr
-  vkUpdateDescriptorSetWithTemplate' (deviceHandle (device)) (descriptorSet) (descriptorUpdateTemplate) (data')
+  traceAroundEvent "vkUpdateDescriptorSetWithTemplate" (vkUpdateDescriptorSetWithTemplate' (deviceHandle (device)) (descriptorSet) (descriptorUpdateTemplate) (data'))
   pure $ ()
 
 
@@ -564,6 +565,12 @@
 --     @set@ /must/ be the unique set number in the pipeline layout that
 --     uses a descriptor set layout that was created with
 --     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR'
+--
+-- -   #VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-04615# If
+--     @templateType@ is
+--     'Vulkan.Core11.Enums.DescriptorUpdateTemplateType.DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET',
+--     @descriptorSetLayout@ /must/ not contain a binding with type
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
 --
 -- == Valid Usage (Implicit)
 --
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group.hs
@@ -20,6 +20,7 @@
                                                         , MemoryAllocateFlags
                                                         ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -138,7 +139,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeviceGroupPeerMemoryFeatures is null" Nothing Nothing
   let vkGetDeviceGroupPeerMemoryFeatures' = mkVkGetDeviceGroupPeerMemoryFeatures vkGetDeviceGroupPeerMemoryFeaturesPtr
   pPPeerMemoryFeatures <- ContT $ bracket (callocBytes @PeerMemoryFeatureFlags 4) free
-  lift $ vkGetDeviceGroupPeerMemoryFeatures' (deviceHandle (device)) (heapIndex) (localDeviceIndex) (remoteDeviceIndex) (pPPeerMemoryFeatures)
+  lift $ traceAroundEvent "vkGetDeviceGroupPeerMemoryFeatures" (vkGetDeviceGroupPeerMemoryFeatures' (deviceHandle (device)) (heapIndex) (localDeviceIndex) (remoteDeviceIndex) (pPPeerMemoryFeatures))
   pPeerMemoryFeatures <- lift $ peek @PeerMemoryFeatureFlags pPPeerMemoryFeatures
   pure $ (pPeerMemoryFeatures)
 
@@ -230,7 +231,7 @@
   unless (vkCmdSetDeviceMaskPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetDeviceMask is null" Nothing Nothing
   let vkCmdSetDeviceMask' = mkVkCmdSetDeviceMask vkCmdSetDeviceMaskPtr
-  vkCmdSetDeviceMask' (commandBufferHandle (commandBuffer)) (deviceMask)
+  traceAroundEvent "vkCmdSetDeviceMask" (vkCmdSetDeviceMask' (commandBufferHandle (commandBuffer)) (deviceMask))
   pure $ ()
 
 
@@ -557,7 +558,7 @@
   unless (vkCmdDispatchBasePtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDispatchBase is null" Nothing Nothing
   let vkCmdDispatchBase' = mkVkCmdDispatchBase vkCmdDispatchBasePtr
-  vkCmdDispatchBase' (commandBufferHandle (commandBuffer)) (baseGroupX) (baseGroupY) (baseGroupZ) (groupCountX) (groupCountY) (groupCountZ)
+  traceAroundEvent "vkCmdDispatchBase" (vkCmdDispatchBase' (commandBufferHandle (commandBuffer)) (baseGroupX) (baseGroupY) (baseGroupZ) (groupCountX) (groupCountY) (groupCountZ))
   pure $ ()
 
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group_creation.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group_creation.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group_creation.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_device_group_creation.hs
@@ -11,6 +11,7 @@
                                                                  ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -147,12 +148,12 @@
   let vkEnumeratePhysicalDeviceGroups' = mkVkEnumeratePhysicalDeviceGroups vkEnumeratePhysicalDeviceGroupsPtr
   let instance'' = instanceHandle (instance')
   pPPhysicalDeviceGroupCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumeratePhysicalDeviceGroups' instance'' (pPPhysicalDeviceGroupCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkEnumeratePhysicalDeviceGroups" (vkEnumeratePhysicalDeviceGroups' instance'' (pPPhysicalDeviceGroupCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPhysicalDeviceGroupCount <- lift $ peek @Word32 pPPhysicalDeviceGroupCount
   pPPhysicalDeviceGroupProperties <- ContT $ bracket (callocBytes @PhysicalDeviceGroupProperties ((fromIntegral (pPhysicalDeviceGroupCount)) * 288)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPPhysicalDeviceGroupProperties `advancePtrBytes` (i * 288) :: Ptr PhysicalDeviceGroupProperties) . ($ ())) [0..(fromIntegral (pPhysicalDeviceGroupCount)) - 1]
-  r' <- lift $ vkEnumeratePhysicalDeviceGroups' instance'' (pPPhysicalDeviceGroupCount) ((pPPhysicalDeviceGroupProperties))
+  r' <- lift $ traceAroundEvent "vkEnumeratePhysicalDeviceGroups" (vkEnumeratePhysicalDeviceGroups' instance'' (pPPhysicalDeviceGroupCount) ((pPPhysicalDeviceGroupProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPhysicalDeviceGroupCount' <- lift $ peek @Word32 pPPhysicalDeviceGroupCount
   pPhysicalDeviceGroupProperties' <- lift $ generateM (fromIntegral (pPhysicalDeviceGroupCount')) (\i -> peekCStruct @PhysicalDeviceGroupProperties (((pPPhysicalDeviceGroupProperties) `advancePtrBytes` (288 * (i)) :: Ptr PhysicalDeviceGroupProperties)))
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_external_fence_capabilities.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_external_fence_capabilities.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_external_fence_capabilities.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_external_fence_capabilities.hs
@@ -10,6 +10,7 @@
                                                                        , ExternalFenceFeatureFlags
                                                                        ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -93,7 +94,7 @@
   let vkGetPhysicalDeviceExternalFenceProperties' = mkVkGetPhysicalDeviceExternalFenceProperties vkGetPhysicalDeviceExternalFencePropertiesPtr
   pExternalFenceInfo <- ContT $ withCStruct (externalFenceInfo)
   pPExternalFenceProperties <- ContT (withZeroCStruct @ExternalFenceProperties)
-  lift $ vkGetPhysicalDeviceExternalFenceProperties' (physicalDeviceHandle (physicalDevice)) pExternalFenceInfo (pPExternalFenceProperties)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceExternalFenceProperties" (vkGetPhysicalDeviceExternalFenceProperties' (physicalDeviceHandle (physicalDevice)) pExternalFenceInfo (pPExternalFenceProperties))
   pExternalFenceProperties <- lift $ peekCStruct @ExternalFenceProperties pPExternalFenceProperties
   pure $ (pExternalFenceProperties)
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_external_memory_capabilities.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_external_memory_capabilities.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_external_memory_capabilities.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_external_memory_capabilities.hs
@@ -17,6 +17,7 @@
                                                                         ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -117,7 +118,7 @@
   let vkGetPhysicalDeviceExternalBufferProperties' = mkVkGetPhysicalDeviceExternalBufferProperties vkGetPhysicalDeviceExternalBufferPropertiesPtr
   pExternalBufferInfo <- ContT $ withCStruct (externalBufferInfo)
   pPExternalBufferProperties <- ContT (withZeroCStruct @ExternalBufferProperties)
-  lift $ vkGetPhysicalDeviceExternalBufferProperties' (physicalDeviceHandle (physicalDevice)) pExternalBufferInfo (pPExternalBufferProperties)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceExternalBufferProperties" (vkGetPhysicalDeviceExternalBufferProperties' (physicalDeviceHandle (physicalDevice)) pExternalBufferInfo (pPExternalBufferProperties))
   pExternalBufferProperties <- lift $ peekCStruct @ExternalBufferProperties pPExternalBufferProperties
   pure $ (pExternalBufferProperties)
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_external_semaphore_capabilities.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_external_semaphore_capabilities.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_external_semaphore_capabilities.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_external_semaphore_capabilities.hs
@@ -10,6 +10,7 @@
                                                                            , ExternalSemaphoreFeatureFlags
                                                                            ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Data.Typeable (eqT)
@@ -108,7 +109,7 @@
   let vkGetPhysicalDeviceExternalSemaphoreProperties' = mkVkGetPhysicalDeviceExternalSemaphoreProperties vkGetPhysicalDeviceExternalSemaphorePropertiesPtr
   pExternalSemaphoreInfo <- ContT $ withCStruct (externalSemaphoreInfo)
   pPExternalSemaphoreProperties <- ContT (withZeroCStruct @ExternalSemaphoreProperties)
-  lift $ vkGetPhysicalDeviceExternalSemaphoreProperties' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pExternalSemaphoreInfo) (pPExternalSemaphoreProperties)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceExternalSemaphoreProperties" (vkGetPhysicalDeviceExternalSemaphoreProperties' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pExternalSemaphoreInfo) (pPExternalSemaphoreProperties))
   pExternalSemaphoreProperties <- lift $ peekCStruct @ExternalSemaphoreProperties pPExternalSemaphoreProperties
   pure $ (pExternalSemaphoreProperties)
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_get_memory_requirements2.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_get_memory_requirements2.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_get_memory_requirements2.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_get_memory_requirements2.hs
@@ -11,6 +11,7 @@
                                                                     , StructureType(..)
                                                                     ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -115,7 +116,7 @@
   let vkGetBufferMemoryRequirements2' = mkVkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2Ptr
   pInfo <- ContT $ withCStruct (info)
   pPMemoryRequirements <- ContT (withZeroCStruct @(MemoryRequirements2 _))
-  lift $ vkGetBufferMemoryRequirements2' (deviceHandle (device)) pInfo (forgetExtensions (pPMemoryRequirements))
+  lift $ traceAroundEvent "vkGetBufferMemoryRequirements2" (vkGetBufferMemoryRequirements2' (deviceHandle (device)) pInfo (forgetExtensions (pPMemoryRequirements)))
   pMemoryRequirements <- lift $ peekCStruct @(MemoryRequirements2 _) pPMemoryRequirements
   pure $ (pMemoryRequirements)
 
@@ -157,7 +158,7 @@
   let vkGetImageMemoryRequirements2' = mkVkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2Ptr
   pInfo <- ContT $ withCStruct (info)
   pPMemoryRequirements <- ContT (withZeroCStruct @(MemoryRequirements2 _))
-  lift $ vkGetImageMemoryRequirements2' (deviceHandle (device)) (forgetExtensions pInfo) (forgetExtensions (pPMemoryRequirements))
+  lift $ traceAroundEvent "vkGetImageMemoryRequirements2" (vkGetImageMemoryRequirements2' (deviceHandle (device)) (forgetExtensions pInfo) (forgetExtensions (pPMemoryRequirements)))
   pMemoryRequirements <- lift $ peekCStruct @(MemoryRequirements2 _) pPMemoryRequirements
   pure $ (pMemoryRequirements)
 
@@ -212,11 +213,11 @@
   let device' = deviceHandle (device)
   pInfo <- ContT $ withCStruct (info)
   pPSparseMemoryRequirementCount <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetImageSparseMemoryRequirements2' device' pInfo (pPSparseMemoryRequirementCount) (nullPtr)
+  lift $ traceAroundEvent "vkGetImageSparseMemoryRequirements2" (vkGetImageSparseMemoryRequirements2' device' pInfo (pPSparseMemoryRequirementCount) (nullPtr))
   pSparseMemoryRequirementCount <- lift $ peek @Word32 pPSparseMemoryRequirementCount
   pPSparseMemoryRequirements <- ContT $ bracket (callocBytes @SparseImageMemoryRequirements2 ((fromIntegral (pSparseMemoryRequirementCount)) * 64)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPSparseMemoryRequirements `advancePtrBytes` (i * 64) :: Ptr SparseImageMemoryRequirements2) . ($ ())) [0..(fromIntegral (pSparseMemoryRequirementCount)) - 1]
-  lift $ vkGetImageSparseMemoryRequirements2' device' pInfo (pPSparseMemoryRequirementCount) ((pPSparseMemoryRequirements))
+  lift $ traceAroundEvent "vkGetImageSparseMemoryRequirements2" (vkGetImageSparseMemoryRequirements2' device' pInfo (pPSparseMemoryRequirementCount) ((pPSparseMemoryRequirements)))
   pSparseMemoryRequirementCount' <- lift $ peek @Word32 pPSparseMemoryRequirementCount
   pSparseMemoryRequirements' <- lift $ generateM (fromIntegral (pSparseMemoryRequirementCount')) (\i -> peekCStruct @SparseImageMemoryRequirements2 (((pPSparseMemoryRequirements) `advancePtrBytes` (64 * (i)) :: Ptr SparseImageMemoryRequirements2)))
   pure $ (pSparseMemoryRequirements')
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_get_physical_device_properties2.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_get_physical_device_properties2.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_get_physical_device_properties2.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_get_physical_device_properties2.hs
@@ -19,6 +19,7 @@
                                                                            , StructureType(..)
                                                                            ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -152,6 +153,7 @@
 import {-# SOURCE #-} Vulkan.Core11.Promoted_From_VK_KHR_multiview (PhysicalDeviceMultiviewFeatures)
 import {-# SOURCE #-} Vulkan.Extensions.VK_NVX_multiview_per_view_attributes (PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX)
 import {-# SOURCE #-} Vulkan.Core11.Promoted_From_VK_KHR_multiview (PhysicalDeviceMultiviewProperties)
+import {-# SOURCE #-} Vulkan.Extensions.VK_VALVE_mutable_descriptor_type (PhysicalDeviceMutableDescriptorTypeFeaturesVALVE)
 import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_pci_bus_info (PhysicalDevicePCIBusInfoPropertiesEXT)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_performance_query (PhysicalDevicePerformanceQueryFeaturesKHR)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_performance_query (PhysicalDevicePerformanceQueryPropertiesKHR)
@@ -279,7 +281,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceFeatures2 is null" Nothing Nothing
   let vkGetPhysicalDeviceFeatures2' = mkVkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2Ptr
   pPFeatures <- ContT (withZeroCStruct @(PhysicalDeviceFeatures2 _))
-  lift $ vkGetPhysicalDeviceFeatures2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions (pPFeatures))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceFeatures2" (vkGetPhysicalDeviceFeatures2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions (pPFeatures)))
   pFeatures <- lift $ peekCStruct @(PhysicalDeviceFeatures2 _) pPFeatures
   pure $ (pFeatures)
 
@@ -321,7 +323,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceProperties2 is null" Nothing Nothing
   let vkGetPhysicalDeviceProperties2' = mkVkGetPhysicalDeviceProperties2 vkGetPhysicalDeviceProperties2Ptr
   pPProperties <- ContT (withZeroCStruct @(PhysicalDeviceProperties2 _))
-  lift $ vkGetPhysicalDeviceProperties2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions (pPProperties))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceProperties2" (vkGetPhysicalDeviceProperties2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions (pPProperties)))
   pProperties <- lift $ peekCStruct @(PhysicalDeviceProperties2 _) pPProperties
   pure $ (pProperties)
 
@@ -370,7 +372,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceFormatProperties2 is null" Nothing Nothing
   let vkGetPhysicalDeviceFormatProperties2' = mkVkGetPhysicalDeviceFormatProperties2 vkGetPhysicalDeviceFormatProperties2Ptr
   pPFormatProperties <- ContT (withZeroCStruct @(FormatProperties2 _))
-  lift $ vkGetPhysicalDeviceFormatProperties2' (physicalDeviceHandle (physicalDevice)) (format) (forgetExtensions (pPFormatProperties))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceFormatProperties2" (vkGetPhysicalDeviceFormatProperties2' (physicalDeviceHandle (physicalDevice)) (format) (forgetExtensions (pPFormatProperties)))
   pFormatProperties <- lift $ peekCStruct @(FormatProperties2 _) pPFormatProperties
   pure $ (pFormatProperties)
 
@@ -451,7 +453,7 @@
   let vkGetPhysicalDeviceImageFormatProperties2' = mkVkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2Ptr
   pImageFormatInfo <- ContT $ withCStruct (imageFormatInfo)
   pPImageFormatProperties <- ContT (withZeroCStruct @(ImageFormatProperties2 _))
-  r <- lift $ vkGetPhysicalDeviceImageFormatProperties2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pImageFormatInfo) (forgetExtensions (pPImageFormatProperties))
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceImageFormatProperties2" (vkGetPhysicalDeviceImageFormatProperties2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pImageFormatInfo) (forgetExtensions (pPImageFormatProperties)))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pImageFormatProperties <- lift $ peekCStruct @(ImageFormatProperties2 _) pPImageFormatProperties
   pure $ (pImageFormatProperties)
@@ -506,11 +508,11 @@
   let vkGetPhysicalDeviceQueueFamilyProperties2' = mkVkGetPhysicalDeviceQueueFamilyProperties2 vkGetPhysicalDeviceQueueFamilyProperties2Ptr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPQueueFamilyPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetPhysicalDeviceQueueFamilyProperties2' physicalDevice' (pPQueueFamilyPropertyCount) (forgetExtensions (nullPtr))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceQueueFamilyProperties2" (vkGetPhysicalDeviceQueueFamilyProperties2' physicalDevice' (pPQueueFamilyPropertyCount) (forgetExtensions (nullPtr)))
   pQueueFamilyPropertyCount <- lift $ peek @Word32 pPQueueFamilyPropertyCount
   pPQueueFamilyProperties <- ContT $ bracket (callocBytes @(QueueFamilyProperties2 _) ((fromIntegral (pQueueFamilyPropertyCount)) * 40)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPQueueFamilyProperties `advancePtrBytes` (i * 40) :: Ptr (QueueFamilyProperties2 _)) . ($ ())) [0..(fromIntegral (pQueueFamilyPropertyCount)) - 1]
-  lift $ vkGetPhysicalDeviceQueueFamilyProperties2' physicalDevice' (pPQueueFamilyPropertyCount) (forgetExtensions ((pPQueueFamilyProperties)))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceQueueFamilyProperties2" (vkGetPhysicalDeviceQueueFamilyProperties2' physicalDevice' (pPQueueFamilyPropertyCount) (forgetExtensions ((pPQueueFamilyProperties))))
   pQueueFamilyPropertyCount' <- lift $ peek @Word32 pPQueueFamilyPropertyCount
   pQueueFamilyProperties' <- lift $ generateM (fromIntegral (pQueueFamilyPropertyCount')) (\i -> peekCStruct @(QueueFamilyProperties2 _) (((pPQueueFamilyProperties) `advancePtrBytes` (40 * (i)) :: Ptr (QueueFamilyProperties2 _))))
   pure $ (pQueueFamilyProperties')
@@ -554,7 +556,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceMemoryProperties2 is null" Nothing Nothing
   let vkGetPhysicalDeviceMemoryProperties2' = mkVkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2Ptr
   pPMemoryProperties <- ContT (withZeroCStruct @(PhysicalDeviceMemoryProperties2 _))
-  lift $ vkGetPhysicalDeviceMemoryProperties2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions (pPMemoryProperties))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceMemoryProperties2" (vkGetPhysicalDeviceMemoryProperties2' (physicalDeviceHandle (physicalDevice)) (forgetExtensions (pPMemoryProperties)))
   pMemoryProperties <- lift $ peekCStruct @(PhysicalDeviceMemoryProperties2 _) pPMemoryProperties
   pure $ (pMemoryProperties)
 
@@ -616,11 +618,11 @@
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pFormatInfo <- ContT $ withCStruct (formatInfo)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetPhysicalDeviceSparseImageFormatProperties2' physicalDevice' pFormatInfo (pPPropertyCount) (nullPtr)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceSparseImageFormatProperties2" (vkGetPhysicalDeviceSparseImageFormatProperties2' physicalDevice' pFormatInfo (pPPropertyCount) (nullPtr))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @SparseImageFormatProperties2 ((fromIntegral (pPropertyCount)) * 40)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 40) :: Ptr SparseImageFormatProperties2) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  lift $ vkGetPhysicalDeviceSparseImageFormatProperties2' physicalDevice' pFormatInfo (pPPropertyCount) ((pPProperties))
+  lift $ traceAroundEvent "vkGetPhysicalDeviceSparseImageFormatProperties2" (vkGetPhysicalDeviceSparseImageFormatProperties2' physicalDevice' pFormatInfo (pPPropertyCount) ((pPProperties)))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @SparseImageFormatProperties2 (((pPProperties) `advancePtrBytes` (40 * (i)) :: Ptr SparseImageFormatProperties2)))
   pure $ (pProperties')
@@ -670,6 +672,7 @@
   getNext PhysicalDeviceFeatures2{..} = next
   extends :: forall e b proxy. Typeable e => proxy e -> (Extends PhysicalDeviceFeatures2 e => b) -> Maybe b
   extends _ f
+    | Just Refl <- eqT @e @PhysicalDeviceMutableDescriptorTypeFeaturesVALVE = Just f
     | Just Refl <- eqT @e @PhysicalDeviceFragmentShadingRateEnumsFeaturesNV = Just f
     | Just Refl <- eqT @e @PhysicalDeviceShaderTerminateInvocationFeaturesKHR = Just f
     | Just Refl <- eqT @e @PhysicalDeviceFragmentShadingRateFeaturesKHR = Just f
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance1.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance1.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance1.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance1.hs
@@ -9,6 +9,7 @@
                                                         , FormatFeatureFlags
                                                         ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import GHC.IO (throwIO)
@@ -118,6 +119,6 @@
   unless (vkTrimCommandPoolPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkTrimCommandPool is null" Nothing Nothing
   let vkTrimCommandPool' = mkVkTrimCommandPool vkTrimCommandPoolPtr
-  vkTrimCommandPool' (deviceHandle (device)) (commandPool) (flags)
+  traceAroundEvent "vkTrimCommandPool" (vkTrimCommandPool' (deviceHandle (device)) (commandPool) (flags))
   pure $ ()
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance3.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance3.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance3.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_maintenance3.hs
@@ -6,6 +6,7 @@
                                                         , StructureType(..)
                                                         ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Data.Typeable (eqT)
@@ -131,7 +132,7 @@
   let vkGetDescriptorSetLayoutSupport' = mkVkGetDescriptorSetLayoutSupport vkGetDescriptorSetLayoutSupportPtr
   pCreateInfo <- ContT $ withCStruct (createInfo)
   pPSupport <- ContT (withZeroCStruct @(DescriptorSetLayoutSupport _))
-  lift $ vkGetDescriptorSetLayoutSupport' (deviceHandle (device)) (forgetExtensions pCreateInfo) (forgetExtensions (pPSupport))
+  lift $ traceAroundEvent "vkGetDescriptorSetLayoutSupport" (vkGetDescriptorSetLayoutSupport' (deviceHandle (device)) (forgetExtensions pCreateInfo) (forgetExtensions (pPSupport)))
   pSupport <- lift $ peekCStruct @(DescriptorSetLayoutSupport _) pPSupport
   pure $ (pSupport)
 
diff --git a/src/Vulkan/Core11/Promoted_From_VK_KHR_sampler_ycbcr_conversion.hs b/src/Vulkan/Core11/Promoted_From_VK_KHR_sampler_ycbcr_conversion.hs
--- a/src/Vulkan/Core11/Promoted_From_VK_KHR_sampler_ycbcr_conversion.hs
+++ b/src/Vulkan/Core11/Promoted_From_VK_KHR_sampler_ycbcr_conversion.hs
@@ -24,6 +24,7 @@
                                                                     , ChromaLocation(..)
                                                                     ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -196,7 +197,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPYcbcrConversion <- ContT $ bracket (callocBytes @SamplerYcbcrConversion 8) free
-  r <- lift $ vkCreateSamplerYcbcrConversion' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPYcbcrConversion)
+  r <- lift $ traceAroundEvent "vkCreateSamplerYcbcrConversion" (vkCreateSamplerYcbcrConversion' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPYcbcrConversion))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pYcbcrConversion <- lift $ peek @SamplerYcbcrConversion pPYcbcrConversion
   pure $ (pYcbcrConversion)
@@ -271,7 +272,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroySamplerYcbcrConversion' (deviceHandle (device)) (ycbcrConversion) pAllocator
+  lift $ traceAroundEvent "vkDestroySamplerYcbcrConversion" (vkDestroySamplerYcbcrConversion' (deviceHandle (device)) (ycbcrConversion) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core12/Promoted_From_VK_EXT_host_query_reset.hs b/src/Vulkan/Core12/Promoted_From_VK_EXT_host_query_reset.hs
--- a/src/Vulkan/Core12/Promoted_From_VK_EXT_host_query_reset.hs
+++ b/src/Vulkan/Core12/Promoted_From_VK_EXT_host_query_reset.hs
@@ -5,6 +5,7 @@
                                                             , StructureType(..)
                                                             ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -115,7 +116,7 @@
   unless (vkResetQueryPoolPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkResetQueryPool is null" Nothing Nothing
   let vkResetQueryPool' = mkVkResetQueryPool vkResetQueryPoolPtr
-  vkResetQueryPool' (deviceHandle (device)) (queryPool) (firstQuery) (queryCount)
+  traceAroundEvent "vkResetQueryPool" (vkResetQueryPool' (deviceHandle (device)) (queryPool) (firstQuery) (queryCount))
   pure $ ()
 
 
diff --git a/src/Vulkan/Core12/Promoted_From_VK_KHR_buffer_device_address.hs b/src/Vulkan/Core12/Promoted_From_VK_KHR_buffer_device_address.hs
--- a/src/Vulkan/Core12/Promoted_From_VK_KHR_buffer_device_address.hs
+++ b/src/Vulkan/Core12/Promoted_From_VK_KHR_buffer_device_address.hs
@@ -18,6 +18,7 @@
                                                                  , MemoryAllocateFlags
                                                                  ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -128,7 +129,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetBufferOpaqueCaptureAddress is null" Nothing Nothing
   let vkGetBufferOpaqueCaptureAddress' = mkVkGetBufferOpaqueCaptureAddress vkGetBufferOpaqueCaptureAddressPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkGetBufferOpaqueCaptureAddress' (deviceHandle (device)) pInfo
+  r <- lift $ traceAroundEvent "vkGetBufferOpaqueCaptureAddress" (vkGetBufferOpaqueCaptureAddress' (deviceHandle (device)) pInfo)
   pure $ (r)
 
 
@@ -202,7 +203,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetBufferDeviceAddress is null" Nothing Nothing
   let vkGetBufferDeviceAddress' = mkVkGetBufferDeviceAddress vkGetBufferDeviceAddressPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkGetBufferDeviceAddress' (deviceHandle (device)) pInfo
+  r <- lift $ traceAroundEvent "vkGetBufferDeviceAddress" (vkGetBufferDeviceAddress' (deviceHandle (device)) pInfo)
   pure $ (r)
 
 
@@ -268,7 +269,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeviceMemoryOpaqueCaptureAddress is null" Nothing Nothing
   let vkGetDeviceMemoryOpaqueCaptureAddress' = mkVkGetDeviceMemoryOpaqueCaptureAddress vkGetDeviceMemoryOpaqueCaptureAddressPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkGetDeviceMemoryOpaqueCaptureAddress' (deviceHandle (device)) pInfo
+  r <- lift $ traceAroundEvent "vkGetDeviceMemoryOpaqueCaptureAddress" (vkGetDeviceMemoryOpaqueCaptureAddress' (deviceHandle (device)) pInfo)
   pure $ (r)
 
 
diff --git a/src/Vulkan/Core12/Promoted_From_VK_KHR_create_renderpass2.hs b/src/Vulkan/Core12/Promoted_From_VK_KHR_create_renderpass2.hs
--- a/src/Vulkan/Core12/Promoted_From_VK_KHR_create_renderpass2.hs
+++ b/src/Vulkan/Core12/Promoted_From_VK_KHR_create_renderpass2.hs
@@ -15,6 +15,7 @@
                                                               , StructureType(..)
                                                               ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -190,7 +191,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPRenderPass <- ContT $ bracket (callocBytes @RenderPass 8) free
-  r <- lift $ vkCreateRenderPass2' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPRenderPass)
+  r <- lift $ traceAroundEvent "vkCreateRenderPass2" (vkCreateRenderPass2' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPRenderPass))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pRenderPass <- lift $ peek @RenderPass pPRenderPass
   pure $ (pRenderPass)
@@ -340,40 +341,6 @@
 --     'Vulkan.Core10.Enums.AttachmentDescriptionFlagBits.ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT'
 --     set
 --
--- -   #VUID-vkCmdBeginRenderPass2-pAttachments-04106# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pInputAttachments@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     contain at least
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BIT'
---     or
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT'
---
--- -   #VUID-vkCmdBeginRenderPass2-pAttachments-04107# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pColorAttachments@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     contain
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BIT'
---
--- -   #VUID-vkCmdBeginRenderPass2-pAttachments-04108# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pResolveAttachments@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     contain
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_COLOR_ATTACHMENT_BIT'
---
--- -   #VUID-vkCmdBeginRenderPass2-pAttachments-04109# Each element of the
---     @pAttachments@ of @framebuffer@ that is referenced by any element of
---     the @pDepthStencilAttachment@ of any element of @pSubpasses@ of
---     @renderPass@ /must/ have
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#resources-image-view-format-features image view format features>
---     contain
---     'Vulkan.Core10.Enums.FormatFeatureFlagBits.FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT'
---
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-vkCmdBeginRenderPass2-commandBuffer-parameter# @commandBuffer@
@@ -444,7 +411,7 @@
   let vkCmdBeginRenderPass2' = mkVkCmdBeginRenderPass2 vkCmdBeginRenderPass2Ptr
   pRenderPassBegin <- ContT $ withCStruct (renderPassBegin)
   pSubpassBeginInfo <- ContT $ withCStruct (subpassBeginInfo)
-  lift $ vkCmdBeginRenderPass2' (commandBufferHandle (commandBuffer)) (forgetExtensions pRenderPassBegin) pSubpassBeginInfo
+  lift $ traceAroundEvent "vkCmdBeginRenderPass2" (vkCmdBeginRenderPass2' (commandBufferHandle (commandBuffer)) (forgetExtensions pRenderPassBegin) pSubpassBeginInfo)
   pure $ ()
 
 -- | This function will call the supplied action between calls to
@@ -547,7 +514,7 @@
   let vkCmdNextSubpass2' = mkVkCmdNextSubpass2 vkCmdNextSubpass2Ptr
   pSubpassBeginInfo <- ContT $ withCStruct (subpassBeginInfo)
   pSubpassEndInfo <- ContT $ withCStruct (subpassEndInfo)
-  lift $ vkCmdNextSubpass2' (commandBufferHandle (commandBuffer)) pSubpassBeginInfo pSubpassEndInfo
+  lift $ traceAroundEvent "vkCmdNextSubpass2" (vkCmdNextSubpass2' (commandBufferHandle (commandBuffer)) pSubpassBeginInfo pSubpassEndInfo)
   pure $ ()
 
 
@@ -633,7 +600,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdEndRenderPass2 is null" Nothing Nothing
   let vkCmdEndRenderPass2' = mkVkCmdEndRenderPass2 vkCmdEndRenderPass2Ptr
   pSubpassEndInfo <- ContT $ withCStruct (subpassEndInfo)
-  lift $ vkCmdEndRenderPass2' (commandBufferHandle (commandBuffer)) pSubpassEndInfo
+  lift $ traceAroundEvent "vkCmdEndRenderPass2" (vkCmdEndRenderPass2' (commandBufferHandle (commandBuffer)) pSubpassEndInfo)
   pure $ ()
 
 
diff --git a/src/Vulkan/Core12/Promoted_From_VK_KHR_draw_indirect_count.hs b/src/Vulkan/Core12/Promoted_From_VK_KHR_draw_indirect_count.hs
--- a/src/Vulkan/Core12/Promoted_From_VK_KHR_draw_indirect_count.hs
+++ b/src/Vulkan/Core12/Promoted_From_VK_KHR_draw_indirect_count.hs
@@ -4,6 +4,7 @@
                                                                , cmdDrawIndexedIndirectCount
                                                                ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import GHC.IO (throwIO)
@@ -586,7 +587,7 @@
   unless (vkCmdDrawIndirectCountPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawIndirectCount is null" Nothing Nothing
   let vkCmdDrawIndirectCount' = mkVkCmdDrawIndirectCount vkCmdDrawIndirectCountPtr
-  vkCmdDrawIndirectCount' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride)
+  traceAroundEvent "vkCmdDrawIndirectCount" (vkCmdDrawIndirectCount' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride))
   pure $ ()
 
 
@@ -1161,6 +1162,6 @@
   unless (vkCmdDrawIndexedIndirectCountPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawIndexedIndirectCount is null" Nothing Nothing
   let vkCmdDrawIndexedIndirectCount' = mkVkCmdDrawIndexedIndirectCount vkCmdDrawIndexedIndirectCountPtr
-  vkCmdDrawIndexedIndirectCount' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride)
+  traceAroundEvent "vkCmdDrawIndexedIndirectCount" (vkCmdDrawIndexedIndirectCount' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride))
   pure $ ()
 
diff --git a/src/Vulkan/Core12/Promoted_From_VK_KHR_timeline_semaphore.hs b/src/Vulkan/Core12/Promoted_From_VK_KHR_timeline_semaphore.hs
--- a/src/Vulkan/Core12/Promoted_From_VK_KHR_timeline_semaphore.hs
+++ b/src/Vulkan/Core12/Promoted_From_VK_KHR_timeline_semaphore.hs
@@ -16,6 +16,7 @@
                                                               , SemaphoreWaitFlags
                                                               ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -147,7 +148,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetSemaphoreCounterValue is null" Nothing Nothing
   let vkGetSemaphoreCounterValue' = mkVkGetSemaphoreCounterValue vkGetSemaphoreCounterValuePtr
   pPValue <- ContT $ bracket (callocBytes @Word64 8) free
-  r <- lift $ vkGetSemaphoreCounterValue' (deviceHandle (device)) (semaphore) (pPValue)
+  r <- lift $ traceAroundEvent "vkGetSemaphoreCounterValue" (vkGetSemaphoreCounterValue' (deviceHandle (device)) (semaphore) (pPValue))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pValue <- lift $ peek @Word64 pPValue
   pure $ (pValue)
@@ -192,7 +193,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkWaitSemaphores is null" Nothing Nothing
   let vkWaitSemaphores' = mkVkWaitSemaphores vkWaitSemaphoresPtr
   pWaitInfo <- ContT $ withCStruct (waitInfo)
-  r <- lift $ vkWaitSemaphores' (deviceHandle (device)) pWaitInfo (timeout)
+  r <- lift $ traceAroundEvent "vkWaitSemaphores" (vkWaitSemaphores' (deviceHandle (device)) pWaitInfo (timeout))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -343,7 +344,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkSignalSemaphore is null" Nothing Nothing
   let vkSignalSemaphore' = mkVkSignalSemaphore vkSignalSemaphorePtr
   pSignalInfo <- ContT $ withCStruct (signalInfo)
-  r <- lift $ vkSignalSemaphore' (deviceHandle (device)) pSignalInfo
+  r <- lift $ traceAroundEvent "vkSignalSemaphore" (vkSignalSemaphore' (deviceHandle (device)) pSignalInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Dynamic.hs b/src/Vulkan/Dynamic.hs
--- a/src/Vulkan/Dynamic.hs
+++ b/src/Vulkan/Dynamic.hs
@@ -406,6 +406,8 @@
   , pVkReleaseDisplayEXT :: FunPtr (Ptr PhysicalDevice_T -> DisplayKHR -> IO Result)
   , pVkAcquireXlibDisplayEXT :: FunPtr (Ptr PhysicalDevice_T -> ("dpy" ::: Ptr Display) -> DisplayKHR -> IO Result)
   , pVkGetRandROutputDisplayEXT :: FunPtr (Ptr PhysicalDevice_T -> ("dpy" ::: Ptr Display) -> RROutput -> ("pDisplay" ::: Ptr DisplayKHR) -> IO Result)
+  , pVkAcquireWinrtDisplayNV :: FunPtr (Ptr PhysicalDevice_T -> DisplayKHR -> IO Result)
+  , pVkGetWinrtDisplayNV :: FunPtr (Ptr PhysicalDevice_T -> ("deviceRelativeId" ::: Word32) -> ("pDisplay" ::: Ptr DisplayKHR) -> IO Result)
   , pVkGetPhysicalDeviceSurfaceCapabilities2EXT :: FunPtr (Ptr PhysicalDevice_T -> SurfaceKHR -> ("pSurfaceCapabilities" ::: Ptr SurfaceCapabilities2EXT) -> IO Result)
   , pVkEnumeratePhysicalDeviceGroups :: FunPtr (Ptr Instance_T -> ("pPhysicalDeviceGroupCount" ::: Ptr Word32) -> ("pPhysicalDeviceGroupProperties" ::: Ptr PhysicalDeviceGroupProperties) -> IO Result)
   , pVkGetPhysicalDevicePresentRectanglesKHR :: FunPtr (Ptr PhysicalDevice_T -> SurfaceKHR -> ("pRectCount" ::: Ptr Word32) -> ("pRects" ::: Ptr Rect2D) -> IO Result)
@@ -447,7 +449,7 @@
     nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr
     nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr
     nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr nullFunPtr
-    nullFunPtr nullFunPtr
+    nullFunPtr nullFunPtr nullFunPtr nullFunPtr
 
 -- | A version of 'getInstanceProcAddr' which can be called
 -- with a null pointer for the instance.
@@ -522,6 +524,8 @@
   vkReleaseDisplayEXT <- getInstanceProcAddr' handle (Ptr "vkReleaseDisplayEXT"#)
   vkAcquireXlibDisplayEXT <- getInstanceProcAddr' handle (Ptr "vkAcquireXlibDisplayEXT"#)
   vkGetRandROutputDisplayEXT <- getInstanceProcAddr' handle (Ptr "vkGetRandROutputDisplayEXT"#)
+  vkAcquireWinrtDisplayNV <- getInstanceProcAddr' handle (Ptr "vkAcquireWinrtDisplayNV"#)
+  vkGetWinrtDisplayNV <- getInstanceProcAddr' handle (Ptr "vkGetWinrtDisplayNV"#)
   vkGetPhysicalDeviceSurfaceCapabilities2EXT <- getInstanceProcAddr' handle (Ptr "vkGetPhysicalDeviceSurfaceCapabilities2EXT"#)
   vkEnumeratePhysicalDeviceGroups <- getFirstInstanceProcAddr [(Ptr "vkEnumeratePhysicalDeviceGroupsKHR"#), (Ptr "vkEnumeratePhysicalDeviceGroups"#)]
   vkGetPhysicalDevicePresentRectanglesKHR <- getInstanceProcAddr' handle (Ptr "vkGetPhysicalDevicePresentRectanglesKHR"#)
@@ -604,6 +608,8 @@
     (castFunPtr @_ @(Ptr PhysicalDevice_T -> DisplayKHR -> IO Result) vkReleaseDisplayEXT)
     (castFunPtr @_ @(Ptr PhysicalDevice_T -> ("dpy" ::: Ptr Display) -> DisplayKHR -> IO Result) vkAcquireXlibDisplayEXT)
     (castFunPtr @_ @(Ptr PhysicalDevice_T -> ("dpy" ::: Ptr Display) -> RROutput -> ("pDisplay" ::: Ptr DisplayKHR) -> IO Result) vkGetRandROutputDisplayEXT)
+    (castFunPtr @_ @(Ptr PhysicalDevice_T -> DisplayKHR -> IO Result) vkAcquireWinrtDisplayNV)
+    (castFunPtr @_ @(Ptr PhysicalDevice_T -> ("deviceRelativeId" ::: Word32) -> ("pDisplay" ::: Ptr DisplayKHR) -> IO Result) vkGetWinrtDisplayNV)
     (castFunPtr @_ @(Ptr PhysicalDevice_T -> SurfaceKHR -> ("pSurfaceCapabilities" ::: Ptr SurfaceCapabilities2EXT) -> IO Result) vkGetPhysicalDeviceSurfaceCapabilities2EXT)
     (castFunPtr @_ @(Ptr Instance_T -> ("pPhysicalDeviceGroupCount" ::: Ptr Word32) -> ("pPhysicalDeviceGroupProperties" ::: Ptr PhysicalDeviceGroupProperties) -> IO Result) vkEnumeratePhysicalDeviceGroups)
     (castFunPtr @_ @(Ptr PhysicalDevice_T -> SurfaceKHR -> ("pRectCount" ::: Ptr Word32) -> ("pRects" ::: Ptr Rect2D) -> IO Result) vkGetPhysicalDevicePresentRectanglesKHR)
diff --git a/src/Vulkan/Extensions.hs b/src/Vulkan/Extensions.hs
--- a/src/Vulkan/Extensions.hs
+++ b/src/Vulkan/Extensions.hs
@@ -187,6 +187,7 @@
                           , module Vulkan.Extensions.VK_NN_vi_surface
                           , module Vulkan.Extensions.VK_NVX_image_view_handle
                           , module Vulkan.Extensions.VK_NVX_multiview_per_view_attributes
+                          , module Vulkan.Extensions.VK_NV_acquire_winrt_display
                           , module Vulkan.Extensions.VK_NV_clip_space_w_scaling
                           , module Vulkan.Extensions.VK_NV_compute_shader_derivatives
                           , module Vulkan.Extensions.VK_NV_cooperative_matrix
@@ -223,6 +224,7 @@
                           , module Vulkan.Extensions.VK_QCOM_render_pass_store_ops
                           , module Vulkan.Extensions.VK_QCOM_render_pass_transform
                           , module Vulkan.Extensions.VK_QCOM_rotated_copy_commands
+                          , module Vulkan.Extensions.VK_VALVE_mutable_descriptor_type
                           ) where
 import Vulkan.Extensions.Dependencies
 import Vulkan.Extensions.Handles
@@ -411,6 +413,7 @@
 import Vulkan.Extensions.VK_NN_vi_surface
 import Vulkan.Extensions.VK_NVX_image_view_handle
 import Vulkan.Extensions.VK_NVX_multiview_per_view_attributes
+import Vulkan.Extensions.VK_NV_acquire_winrt_display
 import Vulkan.Extensions.VK_NV_clip_space_w_scaling
 import Vulkan.Extensions.VK_NV_compute_shader_derivatives
 import Vulkan.Extensions.VK_NV_cooperative_matrix
@@ -447,4 +450,5 @@
 import Vulkan.Extensions.VK_QCOM_render_pass_store_ops
 import Vulkan.Extensions.VK_QCOM_render_pass_transform
 import Vulkan.Extensions.VK_QCOM_rotated_copy_commands
+import Vulkan.Extensions.VK_VALVE_mutable_descriptor_type
 
diff --git a/src/Vulkan/Extensions/Dependencies.hs b/src/Vulkan/Extensions/Dependencies.hs
--- a/src/Vulkan/Extensions/Dependencies.hs
+++ b/src/Vulkan/Extensions/Dependencies.hs
@@ -136,6 +136,7 @@
 import Vulkan.Extensions.VK_MVK_macos_surface (pattern MVK_MACOS_SURFACE_EXTENSION_NAME)
 import Vulkan.Extensions.VK_NN_vi_surface (pattern NN_VI_SURFACE_EXTENSION_NAME)
 import Vulkan.Extensions.VK_NVX_multiview_per_view_attributes (pattern NVX_MULTIVIEW_PER_VIEW_ATTRIBUTES_EXTENSION_NAME)
+import Vulkan.Extensions.VK_NV_acquire_winrt_display (pattern NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME)
 import Vulkan.Extensions.VK_NV_compute_shader_derivatives (pattern NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME)
 import Vulkan.Extensions.VK_NV_cooperative_matrix (pattern NV_COOPERATIVE_MATRIX_EXTENSION_NAME)
 import Vulkan.Extensions.VK_NV_corner_sampled_image (pattern NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME)
@@ -160,6 +161,7 @@
 import Vulkan.Extensions.VK_NV_win32_keyed_mutex (pattern NV_WIN32_KEYED_MUTEX_EXTENSION_NAME)
 import Vulkan.Extensions.VK_QCOM_render_pass_transform (pattern QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME)
 import Vulkan.Extensions.VK_QCOM_rotated_copy_commands (pattern QCOM_rotated_copy_commands_EXTENSION_NAME)
+import Vulkan.Extensions.VK_VALVE_mutable_descriptor_type (pattern VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME)
 -- | The set of other extensions required to use this extension
 extensionDependencies :: ("extensionName" ::: ByteString) -> [ByteString]
 extensionDependencies = \case
@@ -460,9 +462,13 @@
   QCOM_rotated_copy_commands_EXTENSION_NAME ->
     [KHR_SWAPCHAIN_EXTENSION_NAME, KHR_COPY_COMMANDS_2_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
   EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
-  EXT_4444_FORMATS_EXTENSION_NAME -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  EXT_4444_FORMATS_EXTENSION_NAME     -> [KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME ->
+    [EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, KHR_DISPLAY_EXTENSION_NAME, KHR_SURFACE_EXTENSION_NAME]
   EXT_DIRECTFB_SURFACE_EXTENSION_NAME -> [KHR_SURFACE_EXTENSION_NAME]
-  _                               -> []
+  VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME ->
+    [KHR_MAINTENANCE3_EXTENSION_NAME, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME]
+  _ -> []
 
 -- | The minimum required API version to use this extension
 extensionCoreRequirement :: ("extensionName" ::: ByteString) -> Word32
diff --git a/src/Vulkan/Extensions/Handles.hs b/src/Vulkan/Extensions/Handles.hs
--- a/src/Vulkan/Extensions/Handles.hs
+++ b/src/Vulkan/Extensions/Handles.hs
@@ -236,6 +236,7 @@
 --
 -- 'Vulkan.Extensions.VK_KHR_display.DisplayPlanePropertiesKHR',
 -- 'Vulkan.Extensions.VK_KHR_display.DisplayPropertiesKHR',
+-- 'Vulkan.Extensions.VK_NV_acquire_winrt_display.acquireWinrtDisplayNV',
 -- 'Vulkan.Extensions.VK_EXT_acquire_xlib_display.acquireXlibDisplayEXT',
 -- 'Vulkan.Extensions.VK_KHR_display.createDisplayModeKHR',
 -- 'Vulkan.Extensions.VK_EXT_display_control.displayPowerControlEXT',
@@ -243,6 +244,7 @@
 -- 'Vulkan.Extensions.VK_KHR_display.getDisplayModePropertiesKHR',
 -- 'Vulkan.Extensions.VK_KHR_display.getDisplayPlaneSupportedDisplaysKHR',
 -- 'Vulkan.Extensions.VK_EXT_acquire_xlib_display.getRandROutputDisplayEXT',
+-- 'Vulkan.Extensions.VK_NV_acquire_winrt_display.getWinrtDisplayNV',
 -- 'Vulkan.Extensions.VK_EXT_display_control.registerDisplayEventEXT',
 -- 'Vulkan.Extensions.VK_EXT_direct_mode_display.releaseDisplayEXT'
 newtype DisplayKHR = DisplayKHR Word64
diff --git a/src/Vulkan/Extensions/VK_AMD_buffer_marker.hs b/src/Vulkan/Extensions/VK_AMD_buffer_marker.hs
--- a/src/Vulkan/Extensions/VK_AMD_buffer_marker.hs
+++ b/src/Vulkan/Extensions/VK_AMD_buffer_marker.hs
@@ -93,6 +93,7 @@
                                                , pattern AMD_BUFFER_MARKER_EXTENSION_NAME
                                                ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import GHC.IO (throwIO)
@@ -291,7 +292,7 @@
   unless (vkCmdWriteBufferMarkerAMDPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdWriteBufferMarkerAMD is null" Nothing Nothing
   let vkCmdWriteBufferMarkerAMD' = mkVkCmdWriteBufferMarkerAMD vkCmdWriteBufferMarkerAMDPtr
-  vkCmdWriteBufferMarkerAMD' (commandBufferHandle (commandBuffer)) (pipelineStage) (dstBuffer) (dstOffset) (marker)
+  traceAroundEvent "vkCmdWriteBufferMarkerAMD" (vkCmdWriteBufferMarkerAMD' (commandBufferHandle (commandBuffer)) (pipelineStage) (dstBuffer) (dstOffset) (marker))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_AMD_display_native_hdr.hs b/src/Vulkan/Extensions/VK_AMD_display_native_hdr.hs
--- a/src/Vulkan/Extensions/VK_AMD_display_native_hdr.hs
+++ b/src/Vulkan/Extensions/VK_AMD_display_native_hdr.hs
@@ -135,6 +135,7 @@
                                                     , ColorSpaceKHR(..)
                                                     ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -199,8 +200,8 @@
 --
 -- == Valid Usage
 --
--- -   #VUID-vkSetLocalDimmingAMD-XXXXX# It is only valid to call
---     'setLocalDimmingAMD' if
+-- -   #VUID-vkSetLocalDimmingAMD-localDimmingSupport-04618# It is only
+--     valid to call 'setLocalDimmingAMD' if
 --     'DisplayNativeHdrSurfaceCapabilitiesAMD'::@localDimmingSupport@ is
 --     supported
 --
@@ -223,7 +224,7 @@
   unless (vkSetLocalDimmingAMDPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkSetLocalDimmingAMD is null" Nothing Nothing
   let vkSetLocalDimmingAMD' = mkVkSetLocalDimmingAMD vkSetLocalDimmingAMDPtr
-  vkSetLocalDimmingAMD' (deviceHandle (device)) (swapChain) (boolToBool32 (localDimmingEnable))
+  traceAroundEvent "vkSetLocalDimmingAMD" (vkSetLocalDimmingAMD' (deviceHandle (device)) (swapChain) (boolToBool32 (localDimmingEnable)))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_AMD_shader_info.hs b/src/Vulkan/Extensions/VK_AMD_shader_info.hs
--- a/src/Vulkan/Extensions/VK_AMD_shader_info.hs
+++ b/src/Vulkan/Extensions/VK_AMD_shader_info.hs
@@ -169,6 +169,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -341,11 +342,11 @@
   let vkGetShaderInfoAMD' = mkVkGetShaderInfoAMD vkGetShaderInfoAMDPtr
   let device' = deviceHandle (device)
   pPInfoSize <- ContT $ bracket (callocBytes @CSize 8) free
-  r <- lift $ vkGetShaderInfoAMD' device' (pipeline) (shaderStage) (infoType) (pPInfoSize) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetShaderInfoAMD" (vkGetShaderInfoAMD' device' (pipeline) (shaderStage) (infoType) (pPInfoSize) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pInfoSize <- lift $ peek @CSize pPInfoSize
   pPInfo <- ContT $ bracket (callocBytes @(()) (fromIntegral (((\(CSize a) -> a) pInfoSize)))) free
-  r' <- lift $ vkGetShaderInfoAMD' device' (pipeline) (shaderStage) (infoType) (pPInfoSize) (pPInfo)
+  r' <- lift $ traceAroundEvent "vkGetShaderInfoAMD" (vkGetShaderInfoAMD' device' (pipeline) (shaderStage) (infoType) (pPInfoSize) (pPInfo))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pInfoSize'' <- lift $ peek @CSize pPInfoSize
   pInfo' <- lift $ packCStringLen  (castPtr @() @CChar pPInfo, (fromIntegral (((\(CSize a) -> a) pInfoSize''))))
diff --git a/src/Vulkan/Extensions/VK_ANDROID_external_memory_android_hardware_buffer.hs b/src/Vulkan/Extensions/VK_ANDROID_external_memory_android_hardware_buffer.hs
--- a/src/Vulkan/Extensions/VK_ANDROID_external_memory_android_hardware_buffer.hs
+++ b/src/Vulkan/Extensions/VK_ANDROID_external_memory_android_hardware_buffer.hs
@@ -270,6 +270,7 @@
                                                                              , AHardwareBuffer
                                                                              ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -390,7 +391,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetAndroidHardwareBufferPropertiesANDROID is null" Nothing Nothing
   let vkGetAndroidHardwareBufferPropertiesANDROID' = mkVkGetAndroidHardwareBufferPropertiesANDROID vkGetAndroidHardwareBufferPropertiesANDROIDPtr
   pPProperties <- ContT (withZeroCStruct @(AndroidHardwareBufferPropertiesANDROID _))
-  r <- lift $ vkGetAndroidHardwareBufferPropertiesANDROID' (deviceHandle (device)) (buffer) (forgetExtensions (pPProperties))
+  r <- lift $ traceAroundEvent "vkGetAndroidHardwareBufferPropertiesANDROID" (vkGetAndroidHardwareBufferPropertiesANDROID' (deviceHandle (device)) (buffer) (forgetExtensions (pPProperties)))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pProperties <- lift $ peekCStruct @(AndroidHardwareBufferPropertiesANDROID _) pPProperties
   pure $ (pProperties)
@@ -459,7 +460,7 @@
   let vkGetMemoryAndroidHardwareBufferANDROID' = mkVkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROIDPtr
   pInfo <- ContT $ withCStruct (info)
   pPBuffer <- ContT $ bracket (callocBytes @(Ptr AHardwareBuffer) 8) free
-  r <- lift $ vkGetMemoryAndroidHardwareBufferANDROID' (deviceHandle (device)) pInfo (pPBuffer)
+  r <- lift $ traceAroundEvent "vkGetMemoryAndroidHardwareBufferANDROID" (vkGetMemoryAndroidHardwareBufferANDROID' (deviceHandle (device)) pInfo (pPBuffer))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pBuffer <- lift $ peek @(Ptr AHardwareBuffer) pPBuffer
   pure $ (pBuffer)
diff --git a/src/Vulkan/Extensions/VK_EXT_acquire_xlib_display.hs b/src/Vulkan/Extensions/VK_EXT_acquire_xlib_display.hs
--- a/src/Vulkan/Extensions/VK_EXT_acquire_xlib_display.hs
+++ b/src/Vulkan/Extensions/VK_EXT_acquire_xlib_display.hs
@@ -123,6 +123,7 @@
                                                       , Display
                                                       ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -227,7 +228,7 @@
   unless (vkAcquireXlibDisplayEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkAcquireXlibDisplayEXT is null" Nothing Nothing
   let vkAcquireXlibDisplayEXT' = mkVkAcquireXlibDisplayEXT vkAcquireXlibDisplayEXTPtr
-  r <- vkAcquireXlibDisplayEXT' (physicalDeviceHandle (physicalDevice)) (dpy) (display)
+  r <- traceAroundEvent "vkAcquireXlibDisplayEXT" (vkAcquireXlibDisplayEXT' (physicalDeviceHandle (physicalDevice)) (dpy) (display))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -283,7 +284,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetRandROutputDisplayEXT is null" Nothing Nothing
   let vkGetRandROutputDisplayEXT' = mkVkGetRandROutputDisplayEXT vkGetRandROutputDisplayEXTPtr
   pPDisplay <- ContT $ bracket (callocBytes @DisplayKHR 8) free
-  r <- lift $ vkGetRandROutputDisplayEXT' (physicalDeviceHandle (physicalDevice)) (dpy) (rrOutput) (pPDisplay)
+  r <- lift $ traceAroundEvent "vkGetRandROutputDisplayEXT" (vkGetRandROutputDisplayEXT' (physicalDeviceHandle (physicalDevice)) (dpy) (rrOutput) (pPDisplay))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDisplay <- lift $ peek @DisplayKHR pPDisplay
   pure $ (pDisplay)
diff --git a/src/Vulkan/Extensions/VK_EXT_calibrated_timestamps.hs b/src/Vulkan/Extensions/VK_EXT_calibrated_timestamps.hs
--- a/src/Vulkan/Extensions/VK_EXT_calibrated_timestamps.hs
+++ b/src/Vulkan/Extensions/VK_EXT_calibrated_timestamps.hs
@@ -181,6 +181,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -310,11 +311,11 @@
   let vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' = mkVkGetPhysicalDeviceCalibrateableTimeDomainsEXT vkGetPhysicalDeviceCalibrateableTimeDomainsEXTPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPTimeDomainCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' physicalDevice' (pPTimeDomainCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" (vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' physicalDevice' (pPTimeDomainCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pTimeDomainCount <- lift $ peek @Word32 pPTimeDomainCount
   pPTimeDomains <- ContT $ bracket (callocBytes @TimeDomainEXT ((fromIntegral (pTimeDomainCount)) * 4)) free
-  r' <- lift $ vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' physicalDevice' (pPTimeDomainCount) (pPTimeDomains)
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" (vkGetPhysicalDeviceCalibrateableTimeDomainsEXT' physicalDevice' (pPTimeDomainCount) (pPTimeDomains))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pTimeDomainCount' <- lift $ peek @Word32 pPTimeDomainCount
   pTimeDomains' <- lift $ generateM (fromIntegral (pTimeDomainCount')) (\i -> peek @TimeDomainEXT ((pPTimeDomains `advancePtrBytes` (4 * (i)) :: Ptr TimeDomainEXT)))
@@ -389,7 +390,7 @@
   lift $ Data.Vector.imapM_ (\i e -> poke (pPTimestampInfos `plusPtr` (24 * (i)) :: Ptr CalibratedTimestampInfoEXT) (e)) (timestampInfos)
   pPTimestamps <- ContT $ bracket (callocBytes @Word64 ((fromIntegral ((fromIntegral (Data.Vector.length $ (timestampInfos)) :: Word32))) * 8)) free
   pPMaxDeviation <- ContT $ bracket (callocBytes @Word64 8) free
-  r <- lift $ vkGetCalibratedTimestampsEXT' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (timestampInfos)) :: Word32)) (pPTimestampInfos) (pPTimestamps) (pPMaxDeviation)
+  r <- lift $ traceAroundEvent "vkGetCalibratedTimestampsEXT" (vkGetCalibratedTimestampsEXT' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (timestampInfos)) :: Word32)) (pPTimestampInfos) (pPTimestamps) (pPMaxDeviation))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pTimestamps <- lift $ generateM (fromIntegral ((fromIntegral (Data.Vector.length $ (timestampInfos)) :: Word32))) (\i -> peek @Word64 ((pPTimestamps `advancePtrBytes` (8 * (i)) :: Ptr Word64)))
   pMaxDeviation <- lift $ peek @Word64 pPMaxDeviation
diff --git a/src/Vulkan/Extensions/VK_EXT_conditional_rendering.hs b/src/Vulkan/Extensions/VK_EXT_conditional_rendering.hs
--- a/src/Vulkan/Extensions/VK_EXT_conditional_rendering.hs
+++ b/src/Vulkan/Extensions/VK_EXT_conditional_rendering.hs
@@ -178,6 +178,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -300,7 +301,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBeginConditionalRenderingEXT is null" Nothing Nothing
   let vkCmdBeginConditionalRenderingEXT' = mkVkCmdBeginConditionalRenderingEXT vkCmdBeginConditionalRenderingEXTPtr
   pConditionalRenderingBegin <- ContT $ withCStruct (conditionalRenderingBegin)
-  lift $ vkCmdBeginConditionalRenderingEXT' (commandBufferHandle (commandBuffer)) pConditionalRenderingBegin
+  lift $ traceAroundEvent "vkCmdBeginConditionalRenderingEXT" (vkCmdBeginConditionalRenderingEXT' (commandBufferHandle (commandBuffer)) pConditionalRenderingBegin)
   pure $ ()
 
 -- | This function will call the supplied action between calls to
@@ -390,7 +391,7 @@
   unless (vkCmdEndConditionalRenderingEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdEndConditionalRenderingEXT is null" Nothing Nothing
   let vkCmdEndConditionalRenderingEXT' = mkVkCmdEndConditionalRenderingEXT vkCmdEndConditionalRenderingEXTPtr
-  vkCmdEndConditionalRenderingEXT' (commandBufferHandle (commandBuffer))
+  traceAroundEvent "vkCmdEndConditionalRenderingEXT" (vkCmdEndConditionalRenderingEXT' (commandBufferHandle (commandBuffer)))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_debug_marker.hs b/src/Vulkan/Extensions/VK_EXT_debug_marker.hs
--- a/src/Vulkan/Extensions/VK_EXT_debug_marker.hs
+++ b/src/Vulkan/Extensions/VK_EXT_debug_marker.hs
@@ -288,6 +288,7 @@
                                               ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -400,7 +401,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkDebugMarkerSetObjectNameEXT is null" Nothing Nothing
   let vkDebugMarkerSetObjectNameEXT' = mkVkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXTPtr
   pNameInfo <- ContT $ withCStruct (nameInfo)
-  r <- lift $ vkDebugMarkerSetObjectNameEXT' (deviceHandle (device)) pNameInfo
+  r <- lift $ traceAroundEvent "vkDebugMarkerSetObjectNameEXT" (vkDebugMarkerSetObjectNameEXT' (deviceHandle (device)) pNameInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -455,7 +456,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkDebugMarkerSetObjectTagEXT is null" Nothing Nothing
   let vkDebugMarkerSetObjectTagEXT' = mkVkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXTPtr
   pTagInfo <- ContT $ withCStruct (tagInfo)
-  r <- lift $ vkDebugMarkerSetObjectTagEXT' (deviceHandle (device)) pTagInfo
+  r <- lift $ traceAroundEvent "vkDebugMarkerSetObjectTagEXT" (vkDebugMarkerSetObjectTagEXT' (deviceHandle (device)) pTagInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -522,7 +523,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDebugMarkerBeginEXT is null" Nothing Nothing
   let vkCmdDebugMarkerBeginEXT' = mkVkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXTPtr
   pMarkerInfo <- ContT $ withCStruct (markerInfo)
-  lift $ vkCmdDebugMarkerBeginEXT' (commandBufferHandle (commandBuffer)) pMarkerInfo
+  lift $ traceAroundEvent "vkCmdDebugMarkerBeginEXT" (vkCmdDebugMarkerBeginEXT' (commandBufferHandle (commandBuffer)) pMarkerInfo)
   pure $ ()
 
 
@@ -602,7 +603,7 @@
   unless (vkCmdDebugMarkerEndEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDebugMarkerEndEXT is null" Nothing Nothing
   let vkCmdDebugMarkerEndEXT' = mkVkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXTPtr
-  vkCmdDebugMarkerEndEXT' (commandBufferHandle (commandBuffer))
+  traceAroundEvent "vkCmdDebugMarkerEndEXT" (vkCmdDebugMarkerEndEXT' (commandBufferHandle (commandBuffer)))
   pure $ ()
 
 
@@ -669,7 +670,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDebugMarkerInsertEXT is null" Nothing Nothing
   let vkCmdDebugMarkerInsertEXT' = mkVkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXTPtr
   pMarkerInfo <- ContT $ withCStruct (markerInfo)
-  lift $ vkCmdDebugMarkerInsertEXT' (commandBufferHandle (commandBuffer)) pMarkerInfo
+  lift $ traceAroundEvent "vkCmdDebugMarkerInsertEXT" (vkCmdDebugMarkerInsertEXT' (commandBufferHandle (commandBuffer)) pMarkerInfo)
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_debug_report.hs b/src/Vulkan/Extensions/VK_EXT_debug_report.hs
--- a/src/Vulkan/Extensions/VK_EXT_debug_report.hs
+++ b/src/Vulkan/Extensions/VK_EXT_debug_report.hs
@@ -372,6 +372,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -506,7 +507,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPCallback <- ContT $ bracket (callocBytes @DebugReportCallbackEXT 8) free
-  r <- lift $ vkCreateDebugReportCallbackEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPCallback)
+  r <- lift $ traceAroundEvent "vkCreateDebugReportCallbackEXT" (vkCreateDebugReportCallbackEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPCallback))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCallback <- lift $ peek @DebugReportCallbackEXT pPCallback
   pure $ (pCallback)
@@ -596,7 +597,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyDebugReportCallbackEXT' (instanceHandle (instance')) (callback) pAllocator
+  lift $ traceAroundEvent "vkDestroyDebugReportCallbackEXT" (vkDestroyDebugReportCallbackEXT' (instanceHandle (instance')) (callback) pAllocator)
   pure $ ()
 
 
@@ -683,7 +684,7 @@
   let vkDebugReportMessageEXT' = mkVkDebugReportMessageEXT vkDebugReportMessageEXTPtr
   pLayerPrefix <- ContT $ useAsCString (layerPrefix)
   pMessage <- ContT $ useAsCString (message)
-  lift $ vkDebugReportMessageEXT' (instanceHandle (instance')) (flags) (objectType) (object) (CSize (location)) (messageCode) pLayerPrefix pMessage
+  lift $ traceAroundEvent "vkDebugReportMessageEXT" (vkDebugReportMessageEXT' (instanceHandle (instance')) (flags) (objectType) (object) (CSize (location)) (messageCode) pLayerPrefix pMessage)
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_debug_utils.hs b/src/Vulkan/Extensions/VK_EXT_debug_utils.hs
--- a/src/Vulkan/Extensions/VK_EXT_debug_utils.hs
+++ b/src/Vulkan/Extensions/VK_EXT_debug_utils.hs
@@ -531,6 +531,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -691,7 +692,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkSetDebugUtilsObjectNameEXT is null" Nothing Nothing
   let vkSetDebugUtilsObjectNameEXT' = mkVkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXTPtr
   pNameInfo <- ContT $ withCStruct (nameInfo)
-  r <- lift $ vkSetDebugUtilsObjectNameEXT' (deviceHandle (device)) pNameInfo
+  r <- lift $ traceAroundEvent "vkSetDebugUtilsObjectNameEXT" (vkSetDebugUtilsObjectNameEXT' (deviceHandle (device)) pNameInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -747,7 +748,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkSetDebugUtilsObjectTagEXT is null" Nothing Nothing
   let vkSetDebugUtilsObjectTagEXT' = mkVkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXTPtr
   pTagInfo <- ContT $ withCStruct (tagInfo)
-  r <- lift $ vkSetDebugUtilsObjectTagEXT' (deviceHandle (device)) pTagInfo
+  r <- lift $ traceAroundEvent "vkSetDebugUtilsObjectTagEXT" (vkSetDebugUtilsObjectTagEXT' (deviceHandle (device)) pTagInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -793,7 +794,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkQueueBeginDebugUtilsLabelEXT is null" Nothing Nothing
   let vkQueueBeginDebugUtilsLabelEXT' = mkVkQueueBeginDebugUtilsLabelEXT vkQueueBeginDebugUtilsLabelEXTPtr
   pLabelInfo <- ContT $ withCStruct (labelInfo)
-  lift $ vkQueueBeginDebugUtilsLabelEXT' (queueHandle (queue)) pLabelInfo
+  lift $ traceAroundEvent "vkQueueBeginDebugUtilsLabelEXT" (vkQueueBeginDebugUtilsLabelEXT' (queueHandle (queue)) pLabelInfo)
   pure $ ()
 
 
@@ -845,7 +846,7 @@
   unless (vkQueueEndDebugUtilsLabelEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkQueueEndDebugUtilsLabelEXT is null" Nothing Nothing
   let vkQueueEndDebugUtilsLabelEXT' = mkVkQueueEndDebugUtilsLabelEXT vkQueueEndDebugUtilsLabelEXTPtr
-  vkQueueEndDebugUtilsLabelEXT' (queueHandle (queue))
+  traceAroundEvent "vkQueueEndDebugUtilsLabelEXT" (vkQueueEndDebugUtilsLabelEXT' (queueHandle (queue)))
   pure $ ()
 
 
@@ -891,7 +892,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkQueueInsertDebugUtilsLabelEXT is null" Nothing Nothing
   let vkQueueInsertDebugUtilsLabelEXT' = mkVkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXTPtr
   pLabelInfo <- ContT $ withCStruct (labelInfo)
-  lift $ vkQueueInsertDebugUtilsLabelEXT' (queueHandle (queue)) pLabelInfo
+  lift $ traceAroundEvent "vkQueueInsertDebugUtilsLabelEXT" (vkQueueInsertDebugUtilsLabelEXT' (queueHandle (queue)) pLabelInfo)
   pure $ ()
 
 
@@ -958,7 +959,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBeginDebugUtilsLabelEXT is null" Nothing Nothing
   let vkCmdBeginDebugUtilsLabelEXT' = mkVkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXTPtr
   pLabelInfo <- ContT $ withCStruct (labelInfo)
-  lift $ vkCmdBeginDebugUtilsLabelEXT' (commandBufferHandle (commandBuffer)) pLabelInfo
+  lift $ traceAroundEvent "vkCmdBeginDebugUtilsLabelEXT" (vkCmdBeginDebugUtilsLabelEXT' (commandBufferHandle (commandBuffer)) pLabelInfo)
   pure $ ()
 
 -- | This function will call the supplied action between calls to
@@ -1048,7 +1049,7 @@
   unless (vkCmdEndDebugUtilsLabelEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdEndDebugUtilsLabelEXT is null" Nothing Nothing
   let vkCmdEndDebugUtilsLabelEXT' = mkVkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXTPtr
-  vkCmdEndDebugUtilsLabelEXT' (commandBufferHandle (commandBuffer))
+  traceAroundEvent "vkCmdEndDebugUtilsLabelEXT" (vkCmdEndDebugUtilsLabelEXT' (commandBufferHandle (commandBuffer)))
   pure $ ()
 
 
@@ -1114,7 +1115,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdInsertDebugUtilsLabelEXT is null" Nothing Nothing
   let vkCmdInsertDebugUtilsLabelEXT' = mkVkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXTPtr
   pLabelInfo <- ContT $ withCStruct (labelInfo)
-  lift $ vkCmdInsertDebugUtilsLabelEXT' (commandBufferHandle (commandBuffer)) pLabelInfo
+  lift $ traceAroundEvent "vkCmdInsertDebugUtilsLabelEXT" (vkCmdInsertDebugUtilsLabelEXT' (commandBufferHandle (commandBuffer)) pLabelInfo)
   pure $ ()
 
 
@@ -1188,7 +1189,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPMessenger <- ContT $ bracket (callocBytes @DebugUtilsMessengerEXT 8) free
-  r <- lift $ vkCreateDebugUtilsMessengerEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPMessenger)
+  r <- lift $ traceAroundEvent "vkCreateDebugUtilsMessengerEXT" (vkCreateDebugUtilsMessengerEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPMessenger))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pMessenger <- lift $ peek @DebugUtilsMessengerEXT pPMessenger
   pure $ (pMessenger)
@@ -1282,7 +1283,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyDebugUtilsMessengerEXT' (instanceHandle (instance')) (messenger) pAllocator
+  lift $ traceAroundEvent "vkDestroyDebugUtilsMessengerEXT" (vkDestroyDebugUtilsMessengerEXT' (instanceHandle (instance')) (messenger) pAllocator)
   pure $ ()
 
 
@@ -1352,7 +1353,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkSubmitDebugUtilsMessageEXT is null" Nothing Nothing
   let vkSubmitDebugUtilsMessageEXT' = mkVkSubmitDebugUtilsMessageEXT vkSubmitDebugUtilsMessageEXTPtr
   pCallbackData <- ContT $ withCStruct (callbackData)
-  lift $ vkSubmitDebugUtilsMessageEXT' (instanceHandle (instance')) (messageSeverity) (messageTypes) pCallbackData
+  lift $ traceAroundEvent "vkSubmitDebugUtilsMessageEXT" (vkSubmitDebugUtilsMessageEXT' (instanceHandle (instance')) (messageSeverity) (messageTypes) pCallbackData)
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_direct_mode_display.hs b/src/Vulkan/Extensions/VK_EXT_direct_mode_display.hs
--- a/src/Vulkan/Extensions/VK_EXT_direct_mode_display.hs
+++ b/src/Vulkan/Extensions/VK_EXT_direct_mode_display.hs
@@ -111,6 +111,7 @@
                                                      , DisplayKHR(..)
                                                      ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import GHC.IO (throwIO)
@@ -170,7 +171,7 @@
   unless (vkReleaseDisplayEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkReleaseDisplayEXT is null" Nothing Nothing
   let vkReleaseDisplayEXT' = mkVkReleaseDisplayEXT vkReleaseDisplayEXTPtr
-  _ <- vkReleaseDisplayEXT' (physicalDeviceHandle (physicalDevice)) (display)
+  _ <- traceAroundEvent "vkReleaseDisplayEXT" (vkReleaseDisplayEXT' (physicalDeviceHandle (physicalDevice)) (display))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_directfb_surface.hs b/src/Vulkan/Extensions/VK_EXT_directfb_surface.hs
--- a/src/Vulkan/Extensions/VK_EXT_directfb_surface.hs
+++ b/src/Vulkan/Extensions/VK_EXT_directfb_surface.hs
@@ -106,6 +106,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -236,7 +237,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateDirectFBSurfaceEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateDirectFBSurfaceEXT" (vkCreateDirectFBSurfaceEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
@@ -289,7 +290,7 @@
   unless (vkGetPhysicalDeviceDirectFBPresentationSupportEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceDirectFBPresentationSupportEXT is null" Nothing Nothing
   let vkGetPhysicalDeviceDirectFBPresentationSupportEXT' = mkVkGetPhysicalDeviceDirectFBPresentationSupportEXT vkGetPhysicalDeviceDirectFBPresentationSupportEXTPtr
-  r <- vkGetPhysicalDeviceDirectFBPresentationSupportEXT' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (dfb)
+  r <- traceAroundEvent "vkGetPhysicalDeviceDirectFBPresentationSupportEXT" (vkGetPhysicalDeviceDirectFBPresentationSupportEXT' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (dfb))
   pure $ ((bool32ToBool r))
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_discard_rectangles.hs b/src/Vulkan/Extensions/VK_EXT_discard_rectangles.hs
--- a/src/Vulkan/Extensions/VK_EXT_discard_rectangles.hs
+++ b/src/Vulkan/Extensions/VK_EXT_discard_rectangles.hs
@@ -140,6 +140,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -301,7 +302,7 @@
   let vkCmdSetDiscardRectangleEXT' = mkVkCmdSetDiscardRectangleEXT vkCmdSetDiscardRectangleEXTPtr
   pPDiscardRectangles <- ContT $ allocaBytesAligned @Rect2D ((Data.Vector.length (discardRectangles)) * 16) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPDiscardRectangles `plusPtr` (16 * (i)) :: Ptr Rect2D) (e)) (discardRectangles)
-  lift $ vkCmdSetDiscardRectangleEXT' (commandBufferHandle (commandBuffer)) (firstDiscardRectangle) ((fromIntegral (Data.Vector.length $ (discardRectangles)) :: Word32)) (pPDiscardRectangles)
+  lift $ traceAroundEvent "vkCmdSetDiscardRectangleEXT" (vkCmdSetDiscardRectangleEXT' (commandBufferHandle (commandBuffer)) (firstDiscardRectangle) ((fromIntegral (Data.Vector.length $ (discardRectangles)) :: Word32)) (pPDiscardRectangles))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_display_control.hs b/src/Vulkan/Extensions/VK_EXT_display_control.hs
--- a/src/Vulkan/Extensions/VK_EXT_display_control.hs
+++ b/src/Vulkan/Extensions/VK_EXT_display_control.hs
@@ -181,6 +181,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -305,7 +306,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkDisplayPowerControlEXT is null" Nothing Nothing
   let vkDisplayPowerControlEXT' = mkVkDisplayPowerControlEXT vkDisplayPowerControlEXTPtr
   pDisplayPowerInfo <- ContT $ withCStruct (displayPowerInfo)
-  r <- lift $ vkDisplayPowerControlEXT' (deviceHandle (device)) (display) pDisplayPowerInfo
+  r <- lift $ traceAroundEvent "vkDisplayPowerControlEXT" (vkDisplayPowerControlEXT' (deviceHandle (device)) (display) pDisplayPowerInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -371,7 +372,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPFence <- ContT $ bracket (callocBytes @Fence 8) free
-  r <- lift $ vkRegisterDeviceEventEXT' (deviceHandle (device)) pDeviceEventInfo pAllocator (pPFence)
+  r <- lift $ traceAroundEvent "vkRegisterDeviceEventEXT" (vkRegisterDeviceEventEXT' (deviceHandle (device)) pDeviceEventInfo pAllocator (pPFence))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFence <- lift $ peek @Fence pPFence
   pure $ (pFence)
@@ -449,7 +450,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPFence <- ContT $ bracket (callocBytes @Fence 8) free
-  r <- lift $ vkRegisterDisplayEventEXT' (deviceHandle (device)) (display) pDisplayEventInfo pAllocator (pPFence)
+  r <- lift $ traceAroundEvent "vkRegisterDisplayEventEXT" (vkRegisterDisplayEventEXT' (deviceHandle (device)) (display) pDisplayEventInfo pAllocator (pPFence))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFence <- lift $ peek @Fence pPFence
   pure $ (pFence)
@@ -531,7 +532,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetSwapchainCounterEXT is null" Nothing Nothing
   let vkGetSwapchainCounterEXT' = mkVkGetSwapchainCounterEXT vkGetSwapchainCounterEXTPtr
   pPCounterValue <- ContT $ bracket (callocBytes @Word64 8) free
-  r <- lift $ vkGetSwapchainCounterEXT' (deviceHandle (device)) (swapchain) (counter) (pPCounterValue)
+  r <- lift $ traceAroundEvent "vkGetSwapchainCounterEXT" (vkGetSwapchainCounterEXT' (deviceHandle (device)) (swapchain) (counter) (pPCounterValue))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCounterValue <- lift $ peek @Word64 pPCounterValue
   pure $ (pCounterValue)
diff --git a/src/Vulkan/Extensions/VK_EXT_display_surface_counter.hs b/src/Vulkan/Extensions/VK_EXT_display_surface_counter.hs
--- a/src/Vulkan/Extensions/VK_EXT_display_surface_counter.hs
+++ b/src/Vulkan/Extensions/VK_EXT_display_surface_counter.hs
@@ -119,6 +119,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -247,7 +248,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceSurfaceCapabilities2EXT is null" Nothing Nothing
   let vkGetPhysicalDeviceSurfaceCapabilities2EXT' = mkVkGetPhysicalDeviceSurfaceCapabilities2EXT vkGetPhysicalDeviceSurfaceCapabilities2EXTPtr
   pPSurfaceCapabilities <- ContT (withZeroCStruct @SurfaceCapabilities2EXT)
-  r <- lift $ vkGetPhysicalDeviceSurfaceCapabilities2EXT' (physicalDeviceHandle (physicalDevice)) (surface) (pPSurfaceCapabilities)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceCapabilities2EXT" (vkGetPhysicalDeviceSurfaceCapabilities2EXT' (physicalDeviceHandle (physicalDevice)) (surface) (pPSurfaceCapabilities))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurfaceCapabilities <- lift $ peekCStruct @SurfaceCapabilities2EXT pPSurfaceCapabilities
   pure $ (pSurfaceCapabilities)
diff --git a/src/Vulkan/Extensions/VK_EXT_extended_dynamic_state.hs b/src/Vulkan/Extensions/VK_EXT_extended_dynamic_state.hs
--- a/src/Vulkan/Extensions/VK_EXT_extended_dynamic_state.hs
+++ b/src/Vulkan/Extensions/VK_EXT_extended_dynamic_state.hs
@@ -176,6 +176,7 @@
                                                         , pattern EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME
                                                         ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -315,7 +316,7 @@
   unless (vkCmdSetCullModeEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetCullModeEXT is null" Nothing Nothing
   let vkCmdSetCullModeEXT' = mkVkCmdSetCullModeEXT vkCmdSetCullModeEXTPtr
-  vkCmdSetCullModeEXT' (commandBufferHandle (commandBuffer)) (cullMode)
+  traceAroundEvent "vkCmdSetCullModeEXT" (vkCmdSetCullModeEXT' (commandBufferHandle (commandBuffer)) (cullMode))
   pure $ ()
 
 
@@ -385,7 +386,7 @@
   unless (vkCmdSetFrontFaceEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetFrontFaceEXT is null" Nothing Nothing
   let vkCmdSetFrontFaceEXT' = mkVkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXTPtr
-  vkCmdSetFrontFaceEXT' (commandBufferHandle (commandBuffer)) (frontFace)
+  traceAroundEvent "vkCmdSetFrontFaceEXT" (vkCmdSetFrontFaceEXT' (commandBufferHandle (commandBuffer)) (frontFace))
   pure $ ()
 
 
@@ -457,7 +458,7 @@
   unless (vkCmdSetPrimitiveTopologyEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetPrimitiveTopologyEXT is null" Nothing Nothing
   let vkCmdSetPrimitiveTopologyEXT' = mkVkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXTPtr
-  vkCmdSetPrimitiveTopologyEXT' (commandBufferHandle (commandBuffer)) (primitiveTopology)
+  traceAroundEvent "vkCmdSetPrimitiveTopologyEXT" (vkCmdSetPrimitiveTopologyEXT' (commandBufferHandle (commandBuffer)) (primitiveTopology))
   pure $ ()
 
 
@@ -542,7 +543,7 @@
   let vkCmdSetViewportWithCountEXT' = mkVkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXTPtr
   pPViewports <- ContT $ allocaBytesAligned @Viewport ((Data.Vector.length (viewports)) * 24) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPViewports `plusPtr` (24 * (i)) :: Ptr Viewport) (e)) (viewports)
-  lift $ vkCmdSetViewportWithCountEXT' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (viewports)) :: Word32)) (pPViewports)
+  lift $ traceAroundEvent "vkCmdSetViewportWithCountEXT" (vkCmdSetViewportWithCountEXT' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (viewports)) :: Word32)) (pPViewports))
   pure $ ()
 
 
@@ -640,7 +641,7 @@
   let vkCmdSetScissorWithCountEXT' = mkVkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXTPtr
   pPScissors <- ContT $ allocaBytesAligned @Rect2D ((Data.Vector.length (scissors)) * 16) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPScissors `plusPtr` (16 * (i)) :: Ptr Rect2D) (e)) (scissors)
-  lift $ vkCmdSetScissorWithCountEXT' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (scissors)) :: Word32)) (pPScissors)
+  lift $ traceAroundEvent "vkCmdSetScissorWithCountEXT" (vkCmdSetScissorWithCountEXT' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (scissors)) :: Word32)) (pPScissors))
   pure $ ()
 
 
@@ -837,7 +838,7 @@
       pPStrides <- ContT $ allocaBytesAligned @DeviceSize (((Data.Vector.length (strides))) * 8) 8
       lift $ Data.Vector.imapM_ (\i e -> poke (pPStrides `plusPtr` (8 * (i)) :: Ptr DeviceSize) (e)) ((strides))
       pure $ pPStrides
-  lift $ vkCmdBindVertexBuffers2EXT' (commandBufferHandle (commandBuffer)) (firstBinding) ((fromIntegral pBuffersLength :: Word32)) (pPBuffers) (pPOffsets) pSizes pStrides
+  lift $ traceAroundEvent "vkCmdBindVertexBuffers2EXT" (vkCmdBindVertexBuffers2EXT' (commandBufferHandle (commandBuffer)) (firstBinding) ((fromIntegral pBuffersLength :: Word32)) (pPBuffers) (pPOffsets) pSizes pStrides)
   pure $ ()
 
 
@@ -914,7 +915,7 @@
   unless (vkCmdSetDepthTestEnableEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetDepthTestEnableEXT is null" Nothing Nothing
   let vkCmdSetDepthTestEnableEXT' = mkVkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXTPtr
-  vkCmdSetDepthTestEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (depthTestEnable))
+  traceAroundEvent "vkCmdSetDepthTestEnableEXT" (vkCmdSetDepthTestEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (depthTestEnable)))
   pure $ ()
 
 
@@ -991,7 +992,7 @@
   unless (vkCmdSetDepthWriteEnableEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetDepthWriteEnableEXT is null" Nothing Nothing
   let vkCmdSetDepthWriteEnableEXT' = mkVkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXTPtr
-  vkCmdSetDepthWriteEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (depthWriteEnable))
+  traceAroundEvent "vkCmdSetDepthWriteEnableEXT" (vkCmdSetDepthWriteEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (depthWriteEnable)))
   pure $ ()
 
 
@@ -1072,7 +1073,7 @@
   unless (vkCmdSetDepthCompareOpEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetDepthCompareOpEXT is null" Nothing Nothing
   let vkCmdSetDepthCompareOpEXT' = mkVkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXTPtr
-  vkCmdSetDepthCompareOpEXT' (commandBufferHandle (commandBuffer)) (depthCompareOp)
+  traceAroundEvent "vkCmdSetDepthCompareOpEXT" (vkCmdSetDepthCompareOpEXT' (commandBufferHandle (commandBuffer)) (depthCompareOp))
   pure $ ()
 
 
@@ -1149,7 +1150,7 @@
   unless (vkCmdSetDepthBoundsTestEnableEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetDepthBoundsTestEnableEXT is null" Nothing Nothing
   let vkCmdSetDepthBoundsTestEnableEXT' = mkVkCmdSetDepthBoundsTestEnableEXT vkCmdSetDepthBoundsTestEnableEXTPtr
-  vkCmdSetDepthBoundsTestEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (depthBoundsTestEnable))
+  traceAroundEvent "vkCmdSetDepthBoundsTestEnableEXT" (vkCmdSetDepthBoundsTestEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (depthBoundsTestEnable)))
   pure $ ()
 
 
@@ -1226,7 +1227,7 @@
   unless (vkCmdSetStencilTestEnableEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetStencilTestEnableEXT is null" Nothing Nothing
   let vkCmdSetStencilTestEnableEXT' = mkVkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXTPtr
-  vkCmdSetStencilTestEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (stencilTestEnable))
+  traceAroundEvent "vkCmdSetStencilTestEnableEXT" (vkCmdSetStencilTestEnableEXT' (commandBufferHandle (commandBuffer)) (boolToBool32 (stencilTestEnable)))
   pure $ ()
 
 
@@ -1336,7 +1337,7 @@
   unless (vkCmdSetStencilOpEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetStencilOpEXT is null" Nothing Nothing
   let vkCmdSetStencilOpEXT' = mkVkCmdSetStencilOpEXT vkCmdSetStencilOpEXTPtr
-  vkCmdSetStencilOpEXT' (commandBufferHandle (commandBuffer)) (faceMask) (failOp) (passOp) (depthFailOp) (compareOp)
+  traceAroundEvent "vkCmdSetStencilOpEXT" (vkCmdSetStencilOpEXT' (commandBufferHandle (commandBuffer)) (faceMask) (failOp) (passOp) (depthFailOp) (compareOp))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_external_memory_host.hs b/src/Vulkan/Extensions/VK_EXT_external_memory_host.hs
--- a/src/Vulkan/Extensions/VK_EXT_external_memory_host.hs
+++ b/src/Vulkan/Extensions/VK_EXT_external_memory_host.hs
@@ -179,6 +179,7 @@
                                                       , pattern EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME
                                                       ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -303,7 +304,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetMemoryHostPointerPropertiesEXT is null" Nothing Nothing
   let vkGetMemoryHostPointerPropertiesEXT' = mkVkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXTPtr
   pPMemoryHostPointerProperties <- ContT (withZeroCStruct @MemoryHostPointerPropertiesEXT)
-  r <- lift $ vkGetMemoryHostPointerPropertiesEXT' (deviceHandle (device)) (handleType) (hostPointer) (pPMemoryHostPointerProperties)
+  r <- lift $ traceAroundEvent "vkGetMemoryHostPointerPropertiesEXT" (vkGetMemoryHostPointerPropertiesEXT' (deviceHandle (device)) (handleType) (hostPointer) (pPMemoryHostPointerProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pMemoryHostPointerProperties <- lift $ peekCStruct @MemoryHostPointerPropertiesEXT pPMemoryHostPointerProperties
   pure $ (pMemoryHostPointerProperties)
diff --git a/src/Vulkan/Extensions/VK_EXT_full_screen_exclusive.hs b/src/Vulkan/Extensions/VK_EXT_full_screen_exclusive.hs
--- a/src/Vulkan/Extensions/VK_EXT_full_screen_exclusive.hs
+++ b/src/Vulkan/Extensions/VK_EXT_full_screen_exclusive.hs
@@ -283,6 +283,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -442,11 +443,11 @@
   pSurfaceInfo <- ContT $ withCStruct (surfaceInfo)
   let x9 = forgetExtensions pSurfaceInfo
   pPPresentModeCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceSurfacePresentModes2EXT' physicalDevice' x9 (pPPresentModeCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfacePresentModes2EXT" (vkGetPhysicalDeviceSurfacePresentModes2EXT' physicalDevice' x9 (pPPresentModeCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPresentModeCount <- lift $ peek @Word32 pPPresentModeCount
   pPPresentModes <- ContT $ bracket (callocBytes @PresentModeKHR ((fromIntegral (pPresentModeCount)) * 4)) free
-  r' <- lift $ vkGetPhysicalDeviceSurfacePresentModes2EXT' physicalDevice' x9 (pPPresentModeCount) (pPPresentModes)
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfacePresentModes2EXT" (vkGetPhysicalDeviceSurfacePresentModes2EXT' physicalDevice' x9 (pPPresentModeCount) (pPPresentModes))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPresentModeCount' <- lift $ peek @Word32 pPPresentModeCount
   pPresentModes' <- lift $ generateM (fromIntegral (pPresentModeCount')) (\i -> peek @PresentModeKHR ((pPPresentModes `advancePtrBytes` (4 * (i)) :: Ptr PresentModeKHR)))
@@ -514,7 +515,7 @@
   let vkGetDeviceGroupSurfacePresentModes2EXT' = mkVkGetDeviceGroupSurfacePresentModes2EXT vkGetDeviceGroupSurfacePresentModes2EXTPtr
   pSurfaceInfo <- ContT $ withCStruct (surfaceInfo)
   pPModes <- ContT $ bracket (callocBytes @DeviceGroupPresentModeFlagsKHR 4) free
-  r <- lift $ vkGetDeviceGroupSurfacePresentModes2EXT' (deviceHandle (device)) (forgetExtensions pSurfaceInfo) (pPModes)
+  r <- lift $ traceAroundEvent "vkGetDeviceGroupSurfacePresentModes2EXT" (vkGetDeviceGroupSurfacePresentModes2EXT' (deviceHandle (device)) (forgetExtensions pSurfaceInfo) (pPModes))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pModes <- lift $ peek @DeviceGroupPresentModeFlagsKHR pPModes
   pure $ (pModes)
@@ -606,7 +607,7 @@
   unless (vkAcquireFullScreenExclusiveModeEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkAcquireFullScreenExclusiveModeEXT is null" Nothing Nothing
   let vkAcquireFullScreenExclusiveModeEXT' = mkVkAcquireFullScreenExclusiveModeEXT vkAcquireFullScreenExclusiveModeEXTPtr
-  r <- vkAcquireFullScreenExclusiveModeEXT' (deviceHandle (device)) (swapchain)
+  r <- traceAroundEvent "vkAcquireFullScreenExclusiveModeEXT" (vkAcquireFullScreenExclusiveModeEXT' (deviceHandle (device)) (swapchain))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -655,7 +656,7 @@
   unless (vkReleaseFullScreenExclusiveModeEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkReleaseFullScreenExclusiveModeEXT is null" Nothing Nothing
   let vkReleaseFullScreenExclusiveModeEXT' = mkVkReleaseFullScreenExclusiveModeEXT vkReleaseFullScreenExclusiveModeEXTPtr
-  r <- vkReleaseFullScreenExclusiveModeEXT' (deviceHandle (device)) (swapchain)
+  r <- traceAroundEvent "vkReleaseFullScreenExclusiveModeEXT" (vkReleaseFullScreenExclusiveModeEXT' (deviceHandle (device)) (swapchain))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_hdr_metadata.hs b/src/Vulkan/Extensions/VK_EXT_hdr_metadata.hs
--- a/src/Vulkan/Extensions/VK_EXT_hdr_metadata.hs
+++ b/src/Vulkan/Extensions/VK_EXT_hdr_metadata.hs
@@ -127,6 +127,7 @@
                                               , SwapchainKHR(..)
                                               ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -227,7 +228,7 @@
   lift $ Data.Vector.imapM_ (\i e -> poke (pPSwapchains `plusPtr` (8 * (i)) :: Ptr SwapchainKHR) (e)) (swapchains)
   pPMetadata <- ContT $ allocaBytesAligned @HdrMetadataEXT ((Data.Vector.length (metadata)) * 64) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPMetadata `plusPtr` (64 * (i)) :: Ptr HdrMetadataEXT) (e)) (metadata)
-  lift $ vkSetHdrMetadataEXT' (deviceHandle (device)) ((fromIntegral pSwapchainsLength :: Word32)) (pPSwapchains) (pPMetadata)
+  lift $ traceAroundEvent "vkSetHdrMetadataEXT" (vkSetHdrMetadataEXT' (deviceHandle (device)) ((fromIntegral pSwapchainsLength :: Word32)) (pPSwapchains) (pPMetadata))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_headless_surface.hs b/src/Vulkan/Extensions/VK_EXT_headless_surface.hs
--- a/src/Vulkan/Extensions/VK_EXT_headless_surface.hs
+++ b/src/Vulkan/Extensions/VK_EXT_headless_surface.hs
@@ -114,6 +114,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -236,7 +237,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateHeadlessSurfaceEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateHeadlessSurfaceEXT" (vkCreateHeadlessSurfaceEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_EXT_image_drm_format_modifier.hs b/src/Vulkan/Extensions/VK_EXT_image_drm_format_modifier.hs
--- a/src/Vulkan/Extensions/VK_EXT_image_drm_format_modifier.hs
+++ b/src/Vulkan/Extensions/VK_EXT_image_drm_format_modifier.hs
@@ -539,6 +539,7 @@
                                                            , pattern EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME
                                                            ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -644,7 +645,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetImageDrmFormatModifierPropertiesEXT is null" Nothing Nothing
   let vkGetImageDrmFormatModifierPropertiesEXT' = mkVkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXTPtr
   pPProperties <- ContT (withZeroCStruct @ImageDrmFormatModifierPropertiesEXT)
-  r <- lift $ vkGetImageDrmFormatModifierPropertiesEXT' (deviceHandle (device)) (image) (pPProperties)
+  r <- lift $ traceAroundEvent "vkGetImageDrmFormatModifierPropertiesEXT" (vkGetImageDrmFormatModifierPropertiesEXT' (deviceHandle (device)) (image) (pPProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pProperties <- lift $ peekCStruct @ImageDrmFormatModifierPropertiesEXT pPProperties
   pure $ (pProperties)
diff --git a/src/Vulkan/Extensions/VK_EXT_line_rasterization.hs b/src/Vulkan/Extensions/VK_EXT_line_rasterization.hs
--- a/src/Vulkan/Extensions/VK_EXT_line_rasterization.hs
+++ b/src/Vulkan/Extensions/VK_EXT_line_rasterization.hs
@@ -150,6 +150,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -260,7 +261,7 @@
   unless (vkCmdSetLineStippleEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetLineStippleEXT is null" Nothing Nothing
   let vkCmdSetLineStippleEXT' = mkVkCmdSetLineStippleEXT vkCmdSetLineStippleEXTPtr
-  vkCmdSetLineStippleEXT' (commandBufferHandle (commandBuffer)) (lineStippleFactor) (lineStipplePattern)
+  traceAroundEvent "vkCmdSetLineStippleEXT" (vkCmdSetLineStippleEXT' (commandBufferHandle (commandBuffer)) (lineStippleFactor) (lineStipplePattern))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_metal_surface.hs b/src/Vulkan/Extensions/VK_EXT_metal_surface.hs
--- a/src/Vulkan/Extensions/VK_EXT_metal_surface.hs
+++ b/src/Vulkan/Extensions/VK_EXT_metal_surface.hs
@@ -104,6 +104,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -226,7 +227,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateMetalSurfaceEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateMetalSurfaceEXT" (vkCreateMetalSurfaceEXT' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_EXT_private_data.hs b/src/Vulkan/Extensions/VK_EXT_private_data.hs
--- a/src/Vulkan/Extensions/VK_EXT_private_data.hs
+++ b/src/Vulkan/Extensions/VK_EXT_private_data.hs
@@ -155,6 +155,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -292,7 +293,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPPrivateDataSlot <- ContT $ bracket (callocBytes @PrivateDataSlotEXT 8) free
-  r <- lift $ vkCreatePrivateDataSlotEXT' (deviceHandle (device)) pCreateInfo pAllocator (pPPrivateDataSlot)
+  r <- lift $ traceAroundEvent "vkCreatePrivateDataSlotEXT" (vkCreatePrivateDataSlotEXT' (deviceHandle (device)) pCreateInfo pAllocator (pPPrivateDataSlot))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPrivateDataSlot <- lift $ peek @PrivateDataSlotEXT pPPrivateDataSlot
   pure $ (pPrivateDataSlot)
@@ -380,7 +381,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyPrivateDataSlotEXT' (deviceHandle (device)) (privateDataSlot) pAllocator
+  lift $ traceAroundEvent "vkDestroyPrivateDataSlotEXT" (vkDestroyPrivateDataSlotEXT' (deviceHandle (device)) (privateDataSlot) pAllocator)
   pure $ ()
 
 
@@ -448,7 +449,7 @@
   unless (vkSetPrivateDataEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkSetPrivateDataEXT is null" Nothing Nothing
   let vkSetPrivateDataEXT' = mkVkSetPrivateDataEXT vkSetPrivateDataEXTPtr
-  r <- vkSetPrivateDataEXT' (deviceHandle (device)) (objectType) (objectHandle) (privateDataSlot) (data')
+  r <- traceAroundEvent "vkSetPrivateDataEXT" (vkSetPrivateDataEXT' (deviceHandle (device)) (objectType) (objectHandle) (privateDataSlot) (data'))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -515,7 +516,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPrivateDataEXT is null" Nothing Nothing
   let vkGetPrivateDataEXT' = mkVkGetPrivateDataEXT vkGetPrivateDataEXTPtr
   pPData <- ContT $ bracket (callocBytes @Word64 8) free
-  lift $ vkGetPrivateDataEXT' (deviceHandle (device)) (objectType) (objectHandle) (privateDataSlot) (pPData)
+  lift $ traceAroundEvent "vkGetPrivateDataEXT" (vkGetPrivateDataEXT' (deviceHandle (device)) (objectType) (objectHandle) (privateDataSlot) (pPData))
   pData <- lift $ peek @Word64 pPData
   pure $ (pData)
 
diff --git a/src/Vulkan/Extensions/VK_EXT_sample_locations.hs b/src/Vulkan/Extensions/VK_EXT_sample_locations.hs
--- a/src/Vulkan/Extensions/VK_EXT_sample_locations.hs
+++ b/src/Vulkan/Extensions/VK_EXT_sample_locations.hs
@@ -183,6 +183,7 @@
                                                   ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -322,7 +323,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetSampleLocationsEXT is null" Nothing Nothing
   let vkCmdSetSampleLocationsEXT' = mkVkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXTPtr
   pSampleLocationsInfo <- ContT $ withCStruct (sampleLocationsInfo)
-  lift $ vkCmdSetSampleLocationsEXT' (commandBufferHandle (commandBuffer)) pSampleLocationsInfo
+  lift $ traceAroundEvent "vkCmdSetSampleLocationsEXT" (vkCmdSetSampleLocationsEXT' (commandBufferHandle (commandBuffer)) pSampleLocationsInfo)
   pure $ ()
 
 
@@ -364,7 +365,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceMultisamplePropertiesEXT is null" Nothing Nothing
   let vkGetPhysicalDeviceMultisamplePropertiesEXT' = mkVkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXTPtr
   pPMultisampleProperties <- ContT (withZeroCStruct @MultisamplePropertiesEXT)
-  lift $ vkGetPhysicalDeviceMultisamplePropertiesEXT' (physicalDeviceHandle (physicalDevice)) (samples) (pPMultisampleProperties)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceMultisamplePropertiesEXT" (vkGetPhysicalDeviceMultisamplePropertiesEXT' (physicalDeviceHandle (physicalDevice)) (samples) (pPMultisampleProperties))
   pMultisampleProperties <- lift $ peekCStruct @MultisamplePropertiesEXT pPMultisampleProperties
   pure $ (pMultisampleProperties)
 
diff --git a/src/Vulkan/Extensions/VK_EXT_tooling_info.hs b/src/Vulkan/Extensions/VK_EXT_tooling_info.hs
--- a/src/Vulkan/Extensions/VK_EXT_tooling_info.hs
+++ b/src/Vulkan/Extensions/VK_EXT_tooling_info.hs
@@ -188,6 +188,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -318,12 +319,12 @@
   let vkGetPhysicalDeviceToolPropertiesEXT' = mkVkGetPhysicalDeviceToolPropertiesEXT vkGetPhysicalDeviceToolPropertiesEXTPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPToolCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceToolPropertiesEXT' physicalDevice' (pPToolCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceToolPropertiesEXT" (vkGetPhysicalDeviceToolPropertiesEXT' physicalDevice' (pPToolCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pToolCount <- lift $ peek @Word32 pPToolCount
   pPToolProperties <- ContT $ bracket (callocBytes @PhysicalDeviceToolPropertiesEXT ((fromIntegral (pToolCount)) * 1048)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPToolProperties `advancePtrBytes` (i * 1048) :: Ptr PhysicalDeviceToolPropertiesEXT) . ($ ())) [0..(fromIntegral (pToolCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceToolPropertiesEXT' physicalDevice' (pPToolCount) ((pPToolProperties))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceToolPropertiesEXT" (vkGetPhysicalDeviceToolPropertiesEXT' physicalDevice' (pPToolCount) ((pPToolProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pToolCount' <- lift $ peek @Word32 pPToolCount
   pToolProperties' <- lift $ generateM (fromIntegral (pToolCount')) (\i -> peekCStruct @PhysicalDeviceToolPropertiesEXT (((pPToolProperties) `advancePtrBytes` (1048 * (i)) :: Ptr PhysicalDeviceToolPropertiesEXT)))
diff --git a/src/Vulkan/Extensions/VK_EXT_transform_feedback.hs b/src/Vulkan/Extensions/VK_EXT_transform_feedback.hs
--- a/src/Vulkan/Extensions/VK_EXT_transform_feedback.hs
+++ b/src/Vulkan/Extensions/VK_EXT_transform_feedback.hs
@@ -252,6 +252,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -480,7 +481,7 @@
       pPSizes <- ContT $ allocaBytesAligned @DeviceSize (((Data.Vector.length (sizes))) * 8) 8
       lift $ Data.Vector.imapM_ (\i e -> poke (pPSizes `plusPtr` (8 * (i)) :: Ptr DeviceSize) (e)) ((sizes))
       pure $ pPSizes
-  lift $ vkCmdBindTransformFeedbackBuffersEXT' (commandBufferHandle (commandBuffer)) (firstBinding) ((fromIntegral pBuffersLength :: Word32)) (pPBuffers) (pPOffsets) pSizes
+  lift $ traceAroundEvent "vkCmdBindTransformFeedbackBuffersEXT" (vkCmdBindTransformFeedbackBuffersEXT' (commandBufferHandle (commandBuffer)) (firstBinding) ((fromIntegral pBuffersLength :: Word32)) (pPBuffers) (pPOffsets) pSizes)
   pure $ ()
 
 
@@ -646,7 +647,7 @@
       pPCounterBufferOffsets <- ContT $ allocaBytesAligned @DeviceSize (((Data.Vector.length (counterBufferOffsets))) * 8) 8
       lift $ Data.Vector.imapM_ (\i e -> poke (pPCounterBufferOffsets `plusPtr` (8 * (i)) :: Ptr DeviceSize) (e)) ((counterBufferOffsets))
       pure $ pPCounterBufferOffsets
-  lift $ vkCmdBeginTransformFeedbackEXT' (commandBufferHandle (commandBuffer)) (firstCounterBuffer) ((fromIntegral pCounterBuffersLength :: Word32)) (pPCounterBuffers) pCounterBufferOffsets
+  lift $ traceAroundEvent "vkCmdBeginTransformFeedbackEXT" (vkCmdBeginTransformFeedbackEXT' (commandBufferHandle (commandBuffer)) (firstCounterBuffer) ((fromIntegral pCounterBuffersLength :: Word32)) (pPCounterBuffers) pCounterBufferOffsets)
   pure $ ()
 
 -- | This function will call the supplied action between calls to
@@ -801,7 +802,7 @@
       pPCounterBufferOffsets <- ContT $ allocaBytesAligned @DeviceSize (((Data.Vector.length (counterBufferOffsets))) * 8) 8
       lift $ Data.Vector.imapM_ (\i e -> poke (pPCounterBufferOffsets `plusPtr` (8 * (i)) :: Ptr DeviceSize) (e)) ((counterBufferOffsets))
       pure $ pPCounterBufferOffsets
-  lift $ vkCmdEndTransformFeedbackEXT' (commandBufferHandle (commandBuffer)) (firstCounterBuffer) ((fromIntegral pCounterBuffersLength :: Word32)) (pPCounterBuffers) pCounterBufferOffsets
+  lift $ traceAroundEvent "vkCmdEndTransformFeedbackEXT" (vkCmdEndTransformFeedbackEXT' (commandBufferHandle (commandBuffer)) (firstCounterBuffer) ((fromIntegral pCounterBuffersLength :: Word32)) (pPCounterBuffers) pCounterBufferOffsets)
   pure $ ()
 
 
@@ -1015,7 +1016,7 @@
   unless (vkCmdBeginQueryIndexedEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBeginQueryIndexedEXT is null" Nothing Nothing
   let vkCmdBeginQueryIndexedEXT' = mkVkCmdBeginQueryIndexedEXT vkCmdBeginQueryIndexedEXTPtr
-  vkCmdBeginQueryIndexedEXT' (commandBufferHandle (commandBuffer)) (queryPool) (query) (flags) (index)
+  traceAroundEvent "vkCmdBeginQueryIndexedEXT" (vkCmdBeginQueryIndexedEXT' (commandBufferHandle (commandBuffer)) (queryPool) (query) (flags) (index))
   pure $ ()
 
 -- | This function will call the supplied action between calls to
@@ -1137,7 +1138,7 @@
   unless (vkCmdEndQueryIndexedEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdEndQueryIndexedEXT is null" Nothing Nothing
   let vkCmdEndQueryIndexedEXT' = mkVkCmdEndQueryIndexedEXT vkCmdEndQueryIndexedEXTPtr
-  vkCmdEndQueryIndexedEXT' (commandBufferHandle (commandBuffer)) (queryPool) (query) (index)
+  traceAroundEvent "vkCmdEndQueryIndexedEXT" (vkCmdEndQueryIndexedEXT' (commandBufferHandle (commandBuffer)) (queryPool) (query) (index))
   pure $ ()
 
 
@@ -1687,7 +1688,7 @@
   unless (vkCmdDrawIndirectByteCountEXTPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawIndirectByteCountEXT is null" Nothing Nothing
   let vkCmdDrawIndirectByteCountEXT' = mkVkCmdDrawIndirectByteCountEXT vkCmdDrawIndirectByteCountEXTPtr
-  vkCmdDrawIndirectByteCountEXT' (commandBufferHandle (commandBuffer)) (instanceCount) (firstInstance) (counterBuffer) (counterBufferOffset) (counterOffset) (vertexStride)
+  traceAroundEvent "vkCmdDrawIndirectByteCountEXT" (vkCmdDrawIndirectByteCountEXT' (commandBufferHandle (commandBuffer)) (instanceCount) (firstInstance) (counterBuffer) (counterBufferOffset) (counterOffset) (vertexStride))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_EXT_validation_cache.hs b/src/Vulkan/Extensions/VK_EXT_validation_cache.hs
--- a/src/Vulkan/Extensions/VK_EXT_validation_cache.hs
+++ b/src/Vulkan/Extensions/VK_EXT_validation_cache.hs
@@ -142,6 +142,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -309,7 +310,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPValidationCache <- ContT $ bracket (callocBytes @ValidationCacheEXT 8) free
-  r <- lift $ vkCreateValidationCacheEXT' (deviceHandle (device)) pCreateInfo pAllocator (pPValidationCache)
+  r <- lift $ traceAroundEvent "vkCreateValidationCacheEXT" (vkCreateValidationCacheEXT' (deviceHandle (device)) pCreateInfo pAllocator (pPValidationCache))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pValidationCache <- lift $ peek @ValidationCacheEXT pPValidationCache
   pure $ (pValidationCache)
@@ -397,7 +398,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyValidationCacheEXT' (deviceHandle (device)) (validationCache) pAllocator
+  lift $ traceAroundEvent "vkDestroyValidationCacheEXT" (vkDestroyValidationCacheEXT' (deviceHandle (device)) (validationCache) pAllocator)
   pure $ ()
 
 
@@ -525,11 +526,11 @@
   let vkGetValidationCacheDataEXT' = mkVkGetValidationCacheDataEXT vkGetValidationCacheDataEXTPtr
   let device' = deviceHandle (device)
   pPDataSize <- ContT $ bracket (callocBytes @CSize 8) free
-  r <- lift $ vkGetValidationCacheDataEXT' device' (validationCache) (pPDataSize) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetValidationCacheDataEXT" (vkGetValidationCacheDataEXT' device' (validationCache) (pPDataSize) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDataSize <- lift $ peek @CSize pPDataSize
   pPData <- ContT $ bracket (callocBytes @(()) (fromIntegral (((\(CSize a) -> a) pDataSize)))) free
-  r' <- lift $ vkGetValidationCacheDataEXT' device' (validationCache) (pPDataSize) (pPData)
+  r' <- lift $ traceAroundEvent "vkGetValidationCacheDataEXT" (vkGetValidationCacheDataEXT' device' (validationCache) (pPDataSize) (pPData))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pDataSize'' <- lift $ peek @CSize pPDataSize
   pData' <- lift $ packCStringLen  (castPtr @() @CChar pPData, (fromIntegral (((\(CSize a) -> a) pDataSize''))))
@@ -620,7 +621,7 @@
   let vkMergeValidationCachesEXT' = mkVkMergeValidationCachesEXT vkMergeValidationCachesEXTPtr
   pPSrcCaches <- ContT $ allocaBytesAligned @ValidationCacheEXT ((Data.Vector.length (srcCaches)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPSrcCaches `plusPtr` (8 * (i)) :: Ptr ValidationCacheEXT) (e)) (srcCaches)
-  r <- lift $ vkMergeValidationCachesEXT' (deviceHandle (device)) (dstCache) ((fromIntegral (Data.Vector.length $ (srcCaches)) :: Word32)) (pPSrcCaches)
+  r <- lift $ traceAroundEvent "vkMergeValidationCachesEXT" (vkMergeValidationCachesEXT' (deviceHandle (device)) (dstCache) ((fromIntegral (Data.Vector.length $ (srcCaches)) :: Word32)) (pPSrcCaches))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Extensions/VK_FUCHSIA_imagepipe_surface.hs b/src/Vulkan/Extensions/VK_FUCHSIA_imagepipe_surface.hs
--- a/src/Vulkan/Extensions/VK_FUCHSIA_imagepipe_surface.hs
+++ b/src/Vulkan/Extensions/VK_FUCHSIA_imagepipe_surface.hs
@@ -104,6 +104,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -228,7 +229,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateImagePipeSurfaceFUCHSIA' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateImagePipeSurfaceFUCHSIA" (vkCreateImagePipeSurfaceFUCHSIA' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_GGP_stream_descriptor_surface.hs b/src/Vulkan/Extensions/VK_GGP_stream_descriptor_surface.hs
--- a/src/Vulkan/Extensions/VK_GGP_stream_descriptor_surface.hs
+++ b/src/Vulkan/Extensions/VK_GGP_stream_descriptor_surface.hs
@@ -130,6 +130,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -258,7 +259,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateStreamDescriptorSurfaceGGP' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateStreamDescriptorSurfaceGGP" (vkCreateStreamDescriptorSurfaceGGP' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_GOOGLE_display_timing.hs b/src/Vulkan/Extensions/VK_GOOGLE_display_timing.hs
--- a/src/Vulkan/Extensions/VK_GOOGLE_display_timing.hs
+++ b/src/Vulkan/Extensions/VK_GOOGLE_display_timing.hs
@@ -135,6 +135,7 @@
                                                    , SwapchainKHR(..)
                                                    ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -252,7 +253,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetRefreshCycleDurationGOOGLE is null" Nothing Nothing
   let vkGetRefreshCycleDurationGOOGLE' = mkVkGetRefreshCycleDurationGOOGLE vkGetRefreshCycleDurationGOOGLEPtr
   pPDisplayTimingProperties <- ContT (withZeroCStruct @RefreshCycleDurationGOOGLE)
-  r <- lift $ vkGetRefreshCycleDurationGOOGLE' (deviceHandle (device)) (swapchain) (pPDisplayTimingProperties)
+  r <- lift $ traceAroundEvent "vkGetRefreshCycleDurationGOOGLE" (vkGetRefreshCycleDurationGOOGLE' (deviceHandle (device)) (swapchain) (pPDisplayTimingProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDisplayTimingProperties <- lift $ peekCStruct @RefreshCycleDurationGOOGLE pPDisplayTimingProperties
   pure $ (pDisplayTimingProperties)
@@ -349,12 +350,12 @@
   let vkGetPastPresentationTimingGOOGLE' = mkVkGetPastPresentationTimingGOOGLE vkGetPastPresentationTimingGOOGLEPtr
   let device' = deviceHandle (device)
   pPPresentationTimingCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPastPresentationTimingGOOGLE' device' (swapchain) (pPPresentationTimingCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPastPresentationTimingGOOGLE" (vkGetPastPresentationTimingGOOGLE' device' (swapchain) (pPPresentationTimingCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPresentationTimingCount <- lift $ peek @Word32 pPPresentationTimingCount
   pPPresentationTimings <- ContT $ bracket (callocBytes @PastPresentationTimingGOOGLE ((fromIntegral (pPresentationTimingCount)) * 40)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPPresentationTimings `advancePtrBytes` (i * 40) :: Ptr PastPresentationTimingGOOGLE) . ($ ())) [0..(fromIntegral (pPresentationTimingCount)) - 1]
-  r' <- lift $ vkGetPastPresentationTimingGOOGLE' device' (swapchain) (pPPresentationTimingCount) ((pPPresentationTimings))
+  r' <- lift $ traceAroundEvent "vkGetPastPresentationTimingGOOGLE" (vkGetPastPresentationTimingGOOGLE' device' (swapchain) (pPPresentationTimingCount) ((pPPresentationTimings)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPresentationTimingCount' <- lift $ peek @Word32 pPPresentationTimingCount
   pPresentationTimings' <- lift $ generateM (fromIntegral (pPresentationTimingCount')) (\i -> peekCStruct @PastPresentationTimingGOOGLE (((pPPresentationTimings) `advancePtrBytes` (40 * (i)) :: Ptr PastPresentationTimingGOOGLE)))
diff --git a/src/Vulkan/Extensions/VK_INTEL_performance_query.hs b/src/Vulkan/Extensions/VK_INTEL_performance_query.hs
--- a/src/Vulkan/Extensions/VK_INTEL_performance_query.hs
+++ b/src/Vulkan/Extensions/VK_INTEL_performance_query.hs
@@ -363,6 +363,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -492,7 +493,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkInitializePerformanceApiINTEL is null" Nothing Nothing
   let vkInitializePerformanceApiINTEL' = mkVkInitializePerformanceApiINTEL vkInitializePerformanceApiINTELPtr
   pInitializeInfo <- ContT $ withCStruct (initializeInfo)
-  r <- lift $ vkInitializePerformanceApiINTEL' (deviceHandle (device)) pInitializeInfo
+  r <- lift $ traceAroundEvent "vkInitializePerformanceApiINTEL" (vkInitializePerformanceApiINTEL' (deviceHandle (device)) pInitializeInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -524,7 +525,7 @@
   unless (vkUninitializePerformanceApiINTELPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkUninitializePerformanceApiINTEL is null" Nothing Nothing
   let vkUninitializePerformanceApiINTEL' = mkVkUninitializePerformanceApiINTEL vkUninitializePerformanceApiINTELPtr
-  vkUninitializePerformanceApiINTEL' (deviceHandle (device))
+  traceAroundEvent "vkUninitializePerformanceApiINTEL" (vkUninitializePerformanceApiINTEL' (deviceHandle (device)))
   pure $ ()
 
 
@@ -608,7 +609,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetPerformanceMarkerINTEL is null" Nothing Nothing
   let vkCmdSetPerformanceMarkerINTEL' = mkVkCmdSetPerformanceMarkerINTEL vkCmdSetPerformanceMarkerINTELPtr
   pMarkerInfo <- ContT $ withCStruct (markerInfo)
-  r <- lift $ vkCmdSetPerformanceMarkerINTEL' (commandBufferHandle (commandBuffer)) pMarkerInfo
+  r <- lift $ traceAroundEvent "vkCmdSetPerformanceMarkerINTEL" (vkCmdSetPerformanceMarkerINTEL' (commandBufferHandle (commandBuffer)) pMarkerInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -688,7 +689,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetPerformanceStreamMarkerINTEL is null" Nothing Nothing
   let vkCmdSetPerformanceStreamMarkerINTEL' = mkVkCmdSetPerformanceStreamMarkerINTEL vkCmdSetPerformanceStreamMarkerINTELPtr
   pMarkerInfo <- ContT $ withCStruct (markerInfo)
-  r <- lift $ vkCmdSetPerformanceStreamMarkerINTEL' (commandBufferHandle (commandBuffer)) pMarkerInfo
+  r <- lift $ traceAroundEvent "vkCmdSetPerformanceStreamMarkerINTEL" (vkCmdSetPerformanceStreamMarkerINTEL' (commandBufferHandle (commandBuffer)) pMarkerInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -775,7 +776,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetPerformanceOverrideINTEL is null" Nothing Nothing
   let vkCmdSetPerformanceOverrideINTEL' = mkVkCmdSetPerformanceOverrideINTEL vkCmdSetPerformanceOverrideINTELPtr
   pOverrideInfo <- ContT $ withCStruct (overrideInfo)
-  r <- lift $ vkCmdSetPerformanceOverrideINTEL' (commandBufferHandle (commandBuffer)) pOverrideInfo
+  r <- lift $ traceAroundEvent "vkCmdSetPerformanceOverrideINTEL" (vkCmdSetPerformanceOverrideINTEL' (commandBufferHandle (commandBuffer)) pOverrideInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -830,7 +831,7 @@
   let vkAcquirePerformanceConfigurationINTEL' = mkVkAcquirePerformanceConfigurationINTEL vkAcquirePerformanceConfigurationINTELPtr
   pAcquireInfo <- ContT $ withCStruct (acquireInfo)
   pPConfiguration <- ContT $ bracket (callocBytes @PerformanceConfigurationINTEL 8) free
-  r <- lift $ vkAcquirePerformanceConfigurationINTEL' (deviceHandle (device)) pAcquireInfo (pPConfiguration)
+  r <- lift $ traceAroundEvent "vkAcquirePerformanceConfigurationINTEL" (vkAcquirePerformanceConfigurationINTEL' (deviceHandle (device)) pAcquireInfo (pPConfiguration))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pConfiguration <- lift $ peek @PerformanceConfigurationINTEL pPConfiguration
   pure $ (pConfiguration)
@@ -900,7 +901,7 @@
   unless (vkReleasePerformanceConfigurationINTELPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkReleasePerformanceConfigurationINTEL is null" Nothing Nothing
   let vkReleasePerformanceConfigurationINTEL' = mkVkReleasePerformanceConfigurationINTEL vkReleasePerformanceConfigurationINTELPtr
-  r <- vkReleasePerformanceConfigurationINTEL' (deviceHandle (device)) (configuration)
+  r <- traceAroundEvent "vkReleasePerformanceConfigurationINTEL" (vkReleasePerformanceConfigurationINTEL' (deviceHandle (device)) (configuration))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -964,7 +965,7 @@
   unless (vkQueueSetPerformanceConfigurationINTELPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkQueueSetPerformanceConfigurationINTEL is null" Nothing Nothing
   let vkQueueSetPerformanceConfigurationINTEL' = mkVkQueueSetPerformanceConfigurationINTEL vkQueueSetPerformanceConfigurationINTELPtr
-  r <- vkQueueSetPerformanceConfigurationINTEL' (queueHandle (queue)) (configuration)
+  r <- traceAroundEvent "vkQueueSetPerformanceConfigurationINTEL" (vkQueueSetPerformanceConfigurationINTEL' (queueHandle (queue)) (configuration))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -1013,7 +1014,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPerformanceParameterINTEL is null" Nothing Nothing
   let vkGetPerformanceParameterINTEL' = mkVkGetPerformanceParameterINTEL vkGetPerformanceParameterINTELPtr
   pPValue <- ContT (withZeroCStruct @PerformanceValueINTEL)
-  r <- lift $ vkGetPerformanceParameterINTEL' (deviceHandle (device)) (parameter) (pPValue)
+  r <- lift $ traceAroundEvent "vkGetPerformanceParameterINTEL" (vkGetPerformanceParameterINTEL' (deviceHandle (device)) (parameter) (pPValue))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pValue <- lift $ peekCStruct @PerformanceValueINTEL pPValue
   pure $ (pValue)
diff --git a/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs b/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs
--- a/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs
+++ b/src/Vulkan/Extensions/VK_KHR_acceleration_structure.hs
@@ -1236,6 +1236,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -1444,7 +1445,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyAccelerationStructureKHR' (deviceHandle (device)) (accelerationStructure) pAllocator
+  lift $ traceAroundEvent "vkDestroyAccelerationStructureKHR" (vkDestroyAccelerationStructureKHR' (deviceHandle (device)) (accelerationStructure) pAllocator)
   pure $ ()
 
 
@@ -1538,7 +1539,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyAccelerationStructureKHR is null" Nothing Nothing
   let vkCmdCopyAccelerationStructureKHR' = mkVkCmdCopyAccelerationStructureKHR vkCmdCopyAccelerationStructureKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  lift $ vkCmdCopyAccelerationStructureKHR' (commandBufferHandle (commandBuffer)) pInfo
+  lift $ traceAroundEvent "vkCmdCopyAccelerationStructureKHR" (vkCmdCopyAccelerationStructureKHR' (commandBufferHandle (commandBuffer)) pInfo)
   pure $ ()
 
 
@@ -1647,7 +1648,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCopyAccelerationStructureKHR is null" Nothing Nothing
   let vkCopyAccelerationStructureKHR' = mkVkCopyAccelerationStructureKHR vkCopyAccelerationStructureKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkCopyAccelerationStructureKHR' (deviceHandle (device)) (deferredOperation) pInfo
+  r <- lift $ traceAroundEvent "vkCopyAccelerationStructureKHR" (vkCopyAccelerationStructureKHR' (deviceHandle (device)) (deferredOperation) pInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -1790,7 +1791,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyAccelerationStructureToMemoryKHR is null" Nothing Nothing
   let vkCmdCopyAccelerationStructureToMemoryKHR' = mkVkCmdCopyAccelerationStructureToMemoryKHR vkCmdCopyAccelerationStructureToMemoryKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  lift $ vkCmdCopyAccelerationStructureToMemoryKHR' (commandBufferHandle (commandBuffer)) pInfo
+  lift $ traceAroundEvent "vkCmdCopyAccelerationStructureToMemoryKHR" (vkCmdCopyAccelerationStructureToMemoryKHR' (commandBufferHandle (commandBuffer)) pInfo)
   pure $ ()
 
 
@@ -1905,7 +1906,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCopyAccelerationStructureToMemoryKHR is null" Nothing Nothing
   let vkCopyAccelerationStructureToMemoryKHR' = mkVkCopyAccelerationStructureToMemoryKHR vkCopyAccelerationStructureToMemoryKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkCopyAccelerationStructureToMemoryKHR' (deviceHandle (device)) (deferredOperation) pInfo
+  r <- lift $ traceAroundEvent "vkCopyAccelerationStructureToMemoryKHR" (vkCopyAccelerationStructureToMemoryKHR' (deviceHandle (device)) (deferredOperation) pInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -2023,7 +2024,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyMemoryToAccelerationStructureKHR is null" Nothing Nothing
   let vkCmdCopyMemoryToAccelerationStructureKHR' = mkVkCmdCopyMemoryToAccelerationStructureKHR vkCmdCopyMemoryToAccelerationStructureKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  lift $ vkCmdCopyMemoryToAccelerationStructureKHR' (commandBufferHandle (commandBuffer)) pInfo
+  lift $ traceAroundEvent "vkCmdCopyMemoryToAccelerationStructureKHR" (vkCmdCopyMemoryToAccelerationStructureKHR' (commandBufferHandle (commandBuffer)) pInfo)
   pure $ ()
 
 
@@ -2134,7 +2135,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCopyMemoryToAccelerationStructureKHR is null" Nothing Nothing
   let vkCopyMemoryToAccelerationStructureKHR' = mkVkCopyMemoryToAccelerationStructureKHR vkCopyMemoryToAccelerationStructureKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkCopyMemoryToAccelerationStructureKHR' (deviceHandle (device)) (deferredOperation) pInfo
+  r <- lift $ traceAroundEvent "vkCopyMemoryToAccelerationStructureKHR" (vkCopyMemoryToAccelerationStructureKHR' (deviceHandle (device)) (deferredOperation) pInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -2275,7 +2276,7 @@
   let vkCmdWriteAccelerationStructuresPropertiesKHR' = mkVkCmdWriteAccelerationStructuresPropertiesKHR vkCmdWriteAccelerationStructuresPropertiesKHRPtr
   pPAccelerationStructures <- ContT $ allocaBytesAligned @AccelerationStructureKHR ((Data.Vector.length (accelerationStructures)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPAccelerationStructures `plusPtr` (8 * (i)) :: Ptr AccelerationStructureKHR) (e)) (accelerationStructures)
-  lift $ vkCmdWriteAccelerationStructuresPropertiesKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (accelerationStructures)) :: Word32)) (pPAccelerationStructures) (queryType) (queryPool) (firstQuery)
+  lift $ traceAroundEvent "vkCmdWriteAccelerationStructuresPropertiesKHR" (vkCmdWriteAccelerationStructuresPropertiesKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (accelerationStructures)) :: Word32)) (pPAccelerationStructures) (queryType) (queryPool) (firstQuery))
   pure $ ()
 
 
@@ -2424,7 +2425,7 @@
   let vkWriteAccelerationStructuresPropertiesKHR' = mkVkWriteAccelerationStructuresPropertiesKHR vkWriteAccelerationStructuresPropertiesKHRPtr
   pPAccelerationStructures <- ContT $ allocaBytesAligned @AccelerationStructureKHR ((Data.Vector.length (accelerationStructures)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPAccelerationStructures `plusPtr` (8 * (i)) :: Ptr AccelerationStructureKHR) (e)) (accelerationStructures)
-  r <- lift $ vkWriteAccelerationStructuresPropertiesKHR' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (accelerationStructures)) :: Word32)) (pPAccelerationStructures) (queryType) (CSize (dataSize)) (data') (CSize (stride))
+  r <- lift $ traceAroundEvent "vkWriteAccelerationStructuresPropertiesKHR" (vkWriteAccelerationStructuresPropertiesKHR' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (accelerationStructures)) :: Word32)) (pPAccelerationStructures) (queryType) (CSize (dataSize)) (data') (CSize (stride)))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -2479,7 +2480,7 @@
   let vkGetDeviceAccelerationStructureCompatibilityKHR' = mkVkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHRPtr
   pVersionInfo <- ContT $ withCStruct (versionInfo)
   pPCompatibility <- ContT $ bracket (callocBytes @AccelerationStructureCompatibilityKHR 4) free
-  lift $ vkGetDeviceAccelerationStructureCompatibilityKHR' (deviceHandle (device)) pVersionInfo (pPCompatibility)
+  lift $ traceAroundEvent "vkGetDeviceAccelerationStructureCompatibilityKHR" (vkGetDeviceAccelerationStructureCompatibilityKHR' (deviceHandle (device)) pVersionInfo (pPCompatibility))
   pCompatibility <- lift $ peek @AccelerationStructureCompatibilityKHR pPCompatibility
   pure $ (pCompatibility)
 
@@ -2593,7 +2594,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPAccelerationStructure <- ContT $ bracket (callocBytes @AccelerationStructureKHR 8) free
-  r <- lift $ vkCreateAccelerationStructureKHR' (deviceHandle (device)) pCreateInfo pAllocator (pPAccelerationStructure)
+  r <- lift $ traceAroundEvent "vkCreateAccelerationStructureKHR" (vkCreateAccelerationStructureKHR' (deviceHandle (device)) pCreateInfo pAllocator (pPAccelerationStructure))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pAccelerationStructure <- lift $ peek @AccelerationStructureKHR pPAccelerationStructure
   pure $ (pAccelerationStructure)
@@ -3192,7 +3193,7 @@
     pPpBuildRangeInfos' <- ContT $ allocaBytesAligned @AccelerationStructureBuildRangeInfoKHR ((Data.Vector.length (e)) * 16) 4
     lift $ Data.Vector.imapM_ (\i' e' -> poke (pPpBuildRangeInfos' `plusPtr` (16 * (i')) :: Ptr AccelerationStructureBuildRangeInfoKHR) (e')) (e)
     lift $ poke (pPpBuildRangeInfos `plusPtr` (8 * (i)) :: Ptr (Ptr AccelerationStructureBuildRangeInfoKHR)) (pPpBuildRangeInfos')) (buildRangeInfos)
-  lift $ vkCmdBuildAccelerationStructuresKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPpBuildRangeInfos)
+  lift $ traceAroundEvent "vkCmdBuildAccelerationStructuresKHR" (vkCmdBuildAccelerationStructuresKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPpBuildRangeInfos))
   pure $ ()
 
 
@@ -3821,7 +3822,7 @@
     pPpMaxPrimitiveCounts' <- ContT $ allocaBytesAligned @Word32 ((Data.Vector.length (e)) * 4) 4
     lift $ Data.Vector.imapM_ (\i' e' -> poke (pPpMaxPrimitiveCounts' `plusPtr` (4 * (i')) :: Ptr Word32) (e')) (e)
     lift $ poke (pPpMaxPrimitiveCounts `plusPtr` (8 * (i)) :: Ptr (Ptr Word32)) (pPpMaxPrimitiveCounts')) (maxPrimitiveCounts)
-  lift $ vkCmdBuildAccelerationStructuresIndirectKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPIndirectDeviceAddresses) (pPIndirectStrides) (pPpMaxPrimitiveCounts)
+  lift $ traceAroundEvent "vkCmdBuildAccelerationStructuresIndirectKHR" (vkCmdBuildAccelerationStructuresIndirectKHR' (commandBufferHandle (commandBuffer)) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPIndirectDeviceAddresses) (pPIndirectStrides) (pPpMaxPrimitiveCounts))
   pure $ ()
 
 
@@ -4286,7 +4287,7 @@
     pPpBuildRangeInfos' <- ContT $ allocaBytesAligned @AccelerationStructureBuildRangeInfoKHR ((Data.Vector.length (e)) * 16) 4
     lift $ Data.Vector.imapM_ (\i' e' -> poke (pPpBuildRangeInfos' `plusPtr` (16 * (i')) :: Ptr AccelerationStructureBuildRangeInfoKHR) (e')) (e)
     lift $ poke (pPpBuildRangeInfos `plusPtr` (8 * (i)) :: Ptr (Ptr AccelerationStructureBuildRangeInfoKHR)) (pPpBuildRangeInfos')) (buildRangeInfos)
-  r <- lift $ vkBuildAccelerationStructuresKHR' (deviceHandle (device)) (deferredOperation) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPpBuildRangeInfos)
+  r <- lift $ traceAroundEvent "vkBuildAccelerationStructuresKHR" (vkBuildAccelerationStructuresKHR' (deviceHandle (device)) (deferredOperation) ((fromIntegral pInfosLength :: Word32)) (pPInfos) (pPpBuildRangeInfos))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -4363,7 +4364,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetAccelerationStructureDeviceAddressKHR is null" Nothing Nothing
   let vkGetAccelerationStructureDeviceAddressKHR' = mkVkGetAccelerationStructureDeviceAddressKHR vkGetAccelerationStructureDeviceAddressKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkGetAccelerationStructureDeviceAddressKHR' (deviceHandle (device)) pInfo
+  r <- lift $ traceAroundEvent "vkGetAccelerationStructureDeviceAddressKHR" (vkGetAccelerationStructureDeviceAddressKHR' (deviceHandle (device)) pInfo)
   pure $ (r)
 
 
@@ -4521,7 +4522,7 @@
   pPMaxPrimitiveCounts <- ContT $ allocaBytesAligned @Word32 ((Data.Vector.length (maxPrimitiveCounts)) * 4) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPMaxPrimitiveCounts `plusPtr` (4 * (i)) :: Ptr Word32) (e)) (maxPrimitiveCounts)
   pPSizeInfo <- ContT (withZeroCStruct @AccelerationStructureBuildSizesInfoKHR)
-  lift $ vkGetAccelerationStructureBuildSizesKHR' (deviceHandle (device)) (buildType) pBuildInfo (pPMaxPrimitiveCounts) (pPSizeInfo)
+  lift $ traceAroundEvent "vkGetAccelerationStructureBuildSizesKHR" (vkGetAccelerationStructureBuildSizesKHR' (deviceHandle (device)) (buildType) pBuildInfo (pPMaxPrimitiveCounts) (pPSizeInfo))
   pSizeInfo <- lift $ peekCStruct @AccelerationStructureBuildSizesInfoKHR pPSizeInfo
   pure $ (pSizeInfo)
 
diff --git a/src/Vulkan/Extensions/VK_KHR_android_surface.hs b/src/Vulkan/Extensions/VK_KHR_android_surface.hs
--- a/src/Vulkan/Extensions/VK_KHR_android_surface.hs
+++ b/src/Vulkan/Extensions/VK_KHR_android_surface.hs
@@ -172,6 +172,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -322,7 +323,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateAndroidSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateAndroidSurfaceKHR" (vkCreateAndroidSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs b/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs
--- a/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs
+++ b/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs
@@ -175,6 +175,7 @@
                                                 ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Data.Typeable (eqT)
@@ -343,7 +344,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyBuffer2KHR is null" Nothing Nothing
   let vkCmdCopyBuffer2KHR' = mkVkCmdCopyBuffer2KHR vkCmdCopyBuffer2KHRPtr
   pCopyBufferInfo <- ContT $ withCStruct (copyBufferInfo)
-  lift $ vkCmdCopyBuffer2KHR' (commandBufferHandle (commandBuffer)) pCopyBufferInfo
+  lift $ traceAroundEvent "vkCmdCopyBuffer2KHR" (vkCmdCopyBuffer2KHR' (commandBufferHandle (commandBuffer)) pCopyBufferInfo)
   pure $ ()
 
 
@@ -434,7 +435,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyImage2KHR is null" Nothing Nothing
   let vkCmdCopyImage2KHR' = mkVkCmdCopyImage2KHR vkCmdCopyImage2KHRPtr
   pCopyImageInfo <- ContT $ withCStruct (copyImageInfo)
-  lift $ vkCmdCopyImage2KHR' (commandBufferHandle (commandBuffer)) pCopyImageInfo
+  lift $ traceAroundEvent "vkCmdCopyImage2KHR" (vkCmdCopyImage2KHR' (commandBufferHandle (commandBuffer)) pCopyImageInfo)
   pure $ ()
 
 
@@ -524,7 +525,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBlitImage2KHR is null" Nothing Nothing
   let vkCmdBlitImage2KHR' = mkVkCmdBlitImage2KHR vkCmdBlitImage2KHRPtr
   pBlitImageInfo <- ContT $ withCStruct (blitImageInfo)
-  lift $ vkCmdBlitImage2KHR' (commandBufferHandle (commandBuffer)) pBlitImageInfo
+  lift $ traceAroundEvent "vkCmdBlitImage2KHR" (vkCmdBlitImage2KHR' (commandBufferHandle (commandBuffer)) pBlitImageInfo)
   pure $ ()
 
 
@@ -617,7 +618,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyBufferToImage2KHR is null" Nothing Nothing
   let vkCmdCopyBufferToImage2KHR' = mkVkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2KHRPtr
   pCopyBufferToImageInfo <- ContT $ withCStruct (copyBufferToImageInfo)
-  lift $ vkCmdCopyBufferToImage2KHR' (commandBufferHandle (commandBuffer)) pCopyBufferToImageInfo
+  lift $ traceAroundEvent "vkCmdCopyBufferToImage2KHR" (vkCmdCopyBufferToImage2KHR' (commandBufferHandle (commandBuffer)) pCopyBufferToImageInfo)
   pure $ ()
 
 
@@ -710,7 +711,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyImageToBuffer2KHR is null" Nothing Nothing
   let vkCmdCopyImageToBuffer2KHR' = mkVkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2KHRPtr
   pCopyImageToBufferInfo <- ContT $ withCStruct (copyImageToBufferInfo)
-  lift $ vkCmdCopyImageToBuffer2KHR' (commandBufferHandle (commandBuffer)) pCopyImageToBufferInfo
+  lift $ traceAroundEvent "vkCmdCopyImageToBuffer2KHR" (vkCmdCopyImageToBuffer2KHR' (commandBufferHandle (commandBuffer)) pCopyImageToBufferInfo)
   pure $ ()
 
 
@@ -800,7 +801,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdResolveImage2KHR is null" Nothing Nothing
   let vkCmdResolveImage2KHR' = mkVkCmdResolveImage2KHR vkCmdResolveImage2KHRPtr
   pResolveImageInfo <- ContT $ withCStruct (resolveImageInfo)
-  lift $ vkCmdResolveImage2KHR' (commandBufferHandle (commandBuffer)) pResolveImageInfo
+  lift $ traceAroundEvent "vkCmdResolveImage2KHR" (vkCmdResolveImage2KHR' (commandBufferHandle (commandBuffer)) pResolveImageInfo)
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_deferred_host_operations.hs b/src/Vulkan/Extensions/VK_KHR_deferred_host_operations.hs
--- a/src/Vulkan/Extensions/VK_KHR_deferred_host_operations.hs
+++ b/src/Vulkan/Extensions/VK_KHR_deferred_host_operations.hs
@@ -246,6 +246,7 @@
                                                           , DeferredOperationKHR(..)
                                                           ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -340,7 +341,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPDeferredOperation <- ContT $ bracket (callocBytes @DeferredOperationKHR 8) free
-  r <- lift $ vkCreateDeferredOperationKHR' (deviceHandle (device)) pAllocator (pPDeferredOperation)
+  r <- lift $ traceAroundEvent "vkCreateDeferredOperationKHR" (vkCreateDeferredOperationKHR' (deviceHandle (device)) pAllocator (pPDeferredOperation))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDeferredOperation <- lift $ peek @DeferredOperationKHR pPDeferredOperation
   pure $ (pDeferredOperation)
@@ -429,7 +430,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyDeferredOperationKHR' (deviceHandle (device)) (operation) pAllocator
+  lift $ traceAroundEvent "vkDestroyDeferredOperationKHR" (vkDestroyDeferredOperationKHR' (deviceHandle (device)) (operation) pAllocator)
   pure $ ()
 
 
@@ -510,7 +511,7 @@
   unless (vkGetDeferredOperationMaxConcurrencyKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeferredOperationMaxConcurrencyKHR is null" Nothing Nothing
   let vkGetDeferredOperationMaxConcurrencyKHR' = mkVkGetDeferredOperationMaxConcurrencyKHR vkGetDeferredOperationMaxConcurrencyKHRPtr
-  r <- vkGetDeferredOperationMaxConcurrencyKHR' (deviceHandle (device)) (operation)
+  r <- traceAroundEvent "vkGetDeferredOperationMaxConcurrencyKHR" (vkGetDeferredOperationMaxConcurrencyKHR' (deviceHandle (device)) (operation))
   pure $ (r)
 
 
@@ -572,7 +573,7 @@
   unless (vkGetDeferredOperationResultKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeferredOperationResultKHR is null" Nothing Nothing
   let vkGetDeferredOperationResultKHR' = mkVkGetDeferredOperationResultKHR vkGetDeferredOperationResultKHRPtr
-  r <- vkGetDeferredOperationResultKHR' (deviceHandle (device)) (operation)
+  r <- traceAroundEvent "vkGetDeferredOperationResultKHR" (vkGetDeferredOperationResultKHR' (deviceHandle (device)) (operation))
   pure $ (r)
 
 
@@ -673,7 +674,7 @@
   unless (vkDeferredOperationJoinKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkDeferredOperationJoinKHR is null" Nothing Nothing
   let vkDeferredOperationJoinKHR' = mkVkDeferredOperationJoinKHR vkDeferredOperationJoinKHRPtr
-  r <- vkDeferredOperationJoinKHR' (deviceHandle (device)) (operation)
+  r <- traceAroundEvent "vkDeferredOperationJoinKHR" (vkDeferredOperationJoinKHR' (deviceHandle (device)) (operation))
   when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
diff --git a/src/Vulkan/Extensions/VK_KHR_display.hs b/src/Vulkan/Extensions/VK_KHR_display.hs
--- a/src/Vulkan/Extensions/VK_KHR_display.hs
+++ b/src/Vulkan/Extensions/VK_KHR_display.hs
@@ -548,6 +548,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -706,12 +707,12 @@
   let vkGetPhysicalDeviceDisplayPropertiesKHR' = mkVkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceDisplayPropertiesKHR' physicalDevice' (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayPropertiesKHR" (vkGetPhysicalDeviceDisplayPropertiesKHR' physicalDevice' (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @DisplayPropertiesKHR ((fromIntegral (pPropertyCount)) * 48)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 48) :: Ptr DisplayPropertiesKHR) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceDisplayPropertiesKHR' physicalDevice' (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayPropertiesKHR" (vkGetPhysicalDeviceDisplayPropertiesKHR' physicalDevice' (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @DisplayPropertiesKHR (((pPProperties) `advancePtrBytes` (48 * (i)) :: Ptr DisplayPropertiesKHR)))
@@ -783,12 +784,12 @@
   let vkGetPhysicalDeviceDisplayPlanePropertiesKHR' = mkVkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceDisplayPlanePropertiesKHR' physicalDevice' (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" (vkGetPhysicalDeviceDisplayPlanePropertiesKHR' physicalDevice' (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @DisplayPlanePropertiesKHR ((fromIntegral (pPropertyCount)) * 16)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 16) :: Ptr DisplayPlanePropertiesKHR) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceDisplayPlanePropertiesKHR' physicalDevice' (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" (vkGetPhysicalDeviceDisplayPlanePropertiesKHR' physicalDevice' (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @DisplayPlanePropertiesKHR (((pPProperties) `advancePtrBytes` (16 * (i)) :: Ptr DisplayPlanePropertiesKHR)))
@@ -874,11 +875,11 @@
   let vkGetDisplayPlaneSupportedDisplaysKHR' = mkVkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPDisplayCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetDisplayPlaneSupportedDisplaysKHR' physicalDevice' (planeIndex) (pPDisplayCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetDisplayPlaneSupportedDisplaysKHR" (vkGetDisplayPlaneSupportedDisplaysKHR' physicalDevice' (planeIndex) (pPDisplayCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDisplayCount <- lift $ peek @Word32 pPDisplayCount
   pPDisplays <- ContT $ bracket (callocBytes @DisplayKHR ((fromIntegral (pDisplayCount)) * 8)) free
-  r' <- lift $ vkGetDisplayPlaneSupportedDisplaysKHR' physicalDevice' (planeIndex) (pPDisplayCount) (pPDisplays)
+  r' <- lift $ traceAroundEvent "vkGetDisplayPlaneSupportedDisplaysKHR" (vkGetDisplayPlaneSupportedDisplaysKHR' physicalDevice' (planeIndex) (pPDisplayCount) (pPDisplays))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pDisplayCount' <- lift $ peek @Word32 pPDisplayCount
   pDisplays' <- lift $ generateM (fromIntegral (pDisplayCount')) (\i -> peek @DisplayKHR ((pPDisplays `advancePtrBytes` (8 * (i)) :: Ptr DisplayKHR)))
@@ -962,12 +963,12 @@
   let vkGetDisplayModePropertiesKHR' = mkVkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetDisplayModePropertiesKHR' physicalDevice' (display) (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetDisplayModePropertiesKHR" (vkGetDisplayModePropertiesKHR' physicalDevice' (display) (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @DisplayModePropertiesKHR ((fromIntegral (pPropertyCount)) * 24)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 24) :: Ptr DisplayModePropertiesKHR) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkGetDisplayModePropertiesKHR' physicalDevice' (display) (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetDisplayModePropertiesKHR" (vkGetDisplayModePropertiesKHR' physicalDevice' (display) (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @DisplayModePropertiesKHR (((pPProperties) `advancePtrBytes` (24 * (i)) :: Ptr DisplayModePropertiesKHR)))
@@ -1055,7 +1056,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPMode <- ContT $ bracket (callocBytes @DisplayModeKHR 8) free
-  r <- lift $ vkCreateDisplayModeKHR' (physicalDeviceHandle (physicalDevice)) (display) pCreateInfo pAllocator (pPMode)
+  r <- lift $ traceAroundEvent "vkCreateDisplayModeKHR" (vkCreateDisplayModeKHR' (physicalDeviceHandle (physicalDevice)) (display) pCreateInfo pAllocator (pPMode))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pMode <- lift $ peek @DisplayModeKHR pPMode
   pure $ (pMode)
@@ -1123,7 +1124,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDisplayPlaneCapabilitiesKHR is null" Nothing Nothing
   let vkGetDisplayPlaneCapabilitiesKHR' = mkVkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHRPtr
   pPCapabilities <- ContT (withZeroCStruct @DisplayPlaneCapabilitiesKHR)
-  r <- lift $ vkGetDisplayPlaneCapabilitiesKHR' (physicalDeviceHandle (physicalDevice)) (mode) (planeIndex) (pPCapabilities)
+  r <- lift $ traceAroundEvent "vkGetDisplayPlaneCapabilitiesKHR" (vkGetDisplayPlaneCapabilitiesKHR' (physicalDeviceHandle (physicalDevice)) (mode) (planeIndex) (pPCapabilities))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCapabilities <- lift $ peekCStruct @DisplayPlaneCapabilitiesKHR pPCapabilities
   pure $ (pCapabilities)
@@ -1199,7 +1200,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateDisplayPlaneSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateDisplayPlaneSurfaceKHR" (vkCreateDisplayPlaneSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_KHR_display_swapchain.hs b/src/Vulkan/Extensions/VK_KHR_display_swapchain.hs
--- a/src/Vulkan/Extensions/VK_KHR_display_swapchain.hs
+++ b/src/Vulkan/Extensions/VK_KHR_display_swapchain.hs
@@ -222,6 +222,7 @@
                                                    , SwapchainCreateFlagsKHR
                                                    ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -404,7 +405,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSwapchains <- ContT $ bracket (callocBytes @SwapchainKHR ((fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) * 8)) free
-  r <- lift $ vkCreateSharedSwapchainsKHR' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPSwapchains)
+  r <- lift $ traceAroundEvent "vkCreateSharedSwapchainsKHR" (vkCreateSharedSwapchainsKHR' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPSwapchains))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSwapchains <- lift $ generateM (fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) (\i -> peek @SwapchainKHR ((pPSwapchains `advancePtrBytes` (8 * (i)) :: Ptr SwapchainKHR)))
   pure $ (pSwapchains)
diff --git a/src/Vulkan/Extensions/VK_KHR_external_fence_fd.hs b/src/Vulkan/Extensions/VK_KHR_external_fence_fd.hs
--- a/src/Vulkan/Extensions/VK_KHR_external_fence_fd.hs
+++ b/src/Vulkan/Extensions/VK_KHR_external_fence_fd.hs
@@ -113,6 +113,7 @@
                                                    , pattern KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME
                                                    ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -237,7 +238,7 @@
   let vkGetFenceFdKHR' = mkVkGetFenceFdKHR vkGetFenceFdKHRPtr
   pGetFdInfo <- ContT $ withCStruct (getFdInfo)
   pPFd <- ContT $ bracket (callocBytes @CInt 4) free
-  r <- lift $ vkGetFenceFdKHR' (deviceHandle (device)) pGetFdInfo (pPFd)
+  r <- lift $ traceAroundEvent "vkGetFenceFdKHR" (vkGetFenceFdKHR' (deviceHandle (device)) pGetFdInfo (pPFd))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFd <- lift $ peek @CInt pPFd
   pure $ (((\(CInt a) -> a) pFd))
@@ -299,7 +300,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkImportFenceFdKHR is null" Nothing Nothing
   let vkImportFenceFdKHR' = mkVkImportFenceFdKHR vkImportFenceFdKHRPtr
   pImportFenceFdInfo <- ContT $ withCStruct (importFenceFdInfo)
-  r <- lift $ vkImportFenceFdKHR' (deviceHandle (device)) pImportFenceFdInfo
+  r <- lift $ traceAroundEvent "vkImportFenceFdKHR" (vkImportFenceFdKHR' (deviceHandle (device)) pImportFenceFdInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_external_fence_win32.hs b/src/Vulkan/Extensions/VK_KHR_external_fence_win32.hs
--- a/src/Vulkan/Extensions/VK_KHR_external_fence_win32.hs
+++ b/src/Vulkan/Extensions/VK_KHR_external_fence_win32.hs
@@ -137,6 +137,7 @@
                                                       , SECURITY_ATTRIBUTES
                                                       ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -251,7 +252,7 @@
   let vkGetFenceWin32HandleKHR' = mkVkGetFenceWin32HandleKHR vkGetFenceWin32HandleKHRPtr
   pGetWin32HandleInfo <- ContT $ withCStruct (getWin32HandleInfo)
   pPHandle <- ContT $ bracket (callocBytes @HANDLE 8) free
-  r <- lift $ vkGetFenceWin32HandleKHR' (deviceHandle (device)) pGetWin32HandleInfo (pPHandle)
+  r <- lift $ traceAroundEvent "vkGetFenceWin32HandleKHR" (vkGetFenceWin32HandleKHR' (deviceHandle (device)) pGetWin32HandleInfo (pPHandle))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pHandle <- lift $ peek @HANDLE pPHandle
   pure $ (pHandle)
@@ -314,7 +315,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkImportFenceWin32HandleKHR is null" Nothing Nothing
   let vkImportFenceWin32HandleKHR' = mkVkImportFenceWin32HandleKHR vkImportFenceWin32HandleKHRPtr
   pImportFenceWin32HandleInfo <- ContT $ withCStruct (importFenceWin32HandleInfo)
-  r <- lift $ vkImportFenceWin32HandleKHR' (deviceHandle (device)) pImportFenceWin32HandleInfo
+  r <- lift $ traceAroundEvent "vkImportFenceWin32HandleKHR" (vkImportFenceWin32HandleKHR' (deviceHandle (device)) pImportFenceWin32HandleInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_external_memory_fd.hs b/src/Vulkan/Extensions/VK_KHR_external_memory_fd.hs
--- a/src/Vulkan/Extensions/VK_KHR_external_memory_fd.hs
+++ b/src/Vulkan/Extensions/VK_KHR_external_memory_fd.hs
@@ -135,6 +135,7 @@
                                                     , pattern KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME
                                                     ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -246,7 +247,7 @@
   let vkGetMemoryFdKHR' = mkVkGetMemoryFdKHR vkGetMemoryFdKHRPtr
   pGetFdInfo <- ContT $ withCStruct (getFdInfo)
   pPFd <- ContT $ bracket (callocBytes @CInt 4) free
-  r <- lift $ vkGetMemoryFdKHR' (deviceHandle (device)) pGetFdInfo (pPFd)
+  r <- lift $ traceAroundEvent "vkGetMemoryFdKHR" (vkGetMemoryFdKHR' (deviceHandle (device)) pGetFdInfo (pPFd))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFd <- lift $ peek @CInt pPFd
   pure $ (((\(CInt a) -> a) pFd))
@@ -309,7 +310,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetMemoryFdPropertiesKHR is null" Nothing Nothing
   let vkGetMemoryFdPropertiesKHR' = mkVkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHRPtr
   pPMemoryFdProperties <- ContT (withZeroCStruct @MemoryFdPropertiesKHR)
-  r <- lift $ vkGetMemoryFdPropertiesKHR' (deviceHandle (device)) (handleType) (CInt (fd)) (pPMemoryFdProperties)
+  r <- lift $ traceAroundEvent "vkGetMemoryFdPropertiesKHR" (vkGetMemoryFdPropertiesKHR' (deviceHandle (device)) (handleType) (CInt (fd)) (pPMemoryFdProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pMemoryFdProperties <- lift $ peekCStruct @MemoryFdPropertiesKHR pPMemoryFdProperties
   pure $ (pMemoryFdProperties)
diff --git a/src/Vulkan/Extensions/VK_KHR_external_memory_win32.hs b/src/Vulkan/Extensions/VK_KHR_external_memory_win32.hs
--- a/src/Vulkan/Extensions/VK_KHR_external_memory_win32.hs
+++ b/src/Vulkan/Extensions/VK_KHR_external_memory_win32.hs
@@ -151,6 +151,7 @@
                                                        , SECURITY_ATTRIBUTES
                                                        ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -269,7 +270,7 @@
   let vkGetMemoryWin32HandleKHR' = mkVkGetMemoryWin32HandleKHR vkGetMemoryWin32HandleKHRPtr
   pGetWin32HandleInfo <- ContT $ withCStruct (getWin32HandleInfo)
   pPHandle <- ContT $ bracket (callocBytes @HANDLE 8) free
-  r <- lift $ vkGetMemoryWin32HandleKHR' (deviceHandle (device)) pGetWin32HandleInfo (pPHandle)
+  r <- lift $ traceAroundEvent "vkGetMemoryWin32HandleKHR" (vkGetMemoryWin32HandleKHR' (deviceHandle (device)) pGetWin32HandleInfo (pPHandle))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pHandle <- lift $ peek @HANDLE pPHandle
   pure $ (pHandle)
@@ -331,7 +332,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetMemoryWin32HandlePropertiesKHR is null" Nothing Nothing
   let vkGetMemoryWin32HandlePropertiesKHR' = mkVkGetMemoryWin32HandlePropertiesKHR vkGetMemoryWin32HandlePropertiesKHRPtr
   pPMemoryWin32HandleProperties <- ContT (withZeroCStruct @MemoryWin32HandlePropertiesKHR)
-  r <- lift $ vkGetMemoryWin32HandlePropertiesKHR' (deviceHandle (device)) (handleType) (handle) (pPMemoryWin32HandleProperties)
+  r <- lift $ traceAroundEvent "vkGetMemoryWin32HandlePropertiesKHR" (vkGetMemoryWin32HandlePropertiesKHR' (deviceHandle (device)) (handleType) (handle) (pPMemoryWin32HandleProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pMemoryWin32HandleProperties <- lift $ peekCStruct @MemoryWin32HandlePropertiesKHR pPMemoryWin32HandleProperties
   pure $ (pMemoryWin32HandleProperties)
diff --git a/src/Vulkan/Extensions/VK_KHR_external_semaphore_fd.hs b/src/Vulkan/Extensions/VK_KHR_external_semaphore_fd.hs
--- a/src/Vulkan/Extensions/VK_KHR_external_semaphore_fd.hs
+++ b/src/Vulkan/Extensions/VK_KHR_external_semaphore_fd.hs
@@ -117,6 +117,7 @@
                                                        , pattern KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME
                                                        ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -237,7 +238,7 @@
   let vkGetSemaphoreFdKHR' = mkVkGetSemaphoreFdKHR vkGetSemaphoreFdKHRPtr
   pGetFdInfo <- ContT $ withCStruct (getFdInfo)
   pPFd <- ContT $ bracket (callocBytes @CInt 4) free
-  r <- lift $ vkGetSemaphoreFdKHR' (deviceHandle (device)) pGetFdInfo (pPFd)
+  r <- lift $ traceAroundEvent "vkGetSemaphoreFdKHR" (vkGetSemaphoreFdKHR' (deviceHandle (device)) pGetFdInfo (pPFd))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFd <- lift $ peek @CInt pPFd
   pure $ (((\(CInt a) -> a) pFd))
@@ -299,7 +300,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkImportSemaphoreFdKHR is null" Nothing Nothing
   let vkImportSemaphoreFdKHR' = mkVkImportSemaphoreFdKHR vkImportSemaphoreFdKHRPtr
   pImportSemaphoreFdInfo <- ContT $ withCStruct (importSemaphoreFdInfo)
-  r <- lift $ vkImportSemaphoreFdKHR' (deviceHandle (device)) pImportSemaphoreFdInfo
+  r <- lift $ traceAroundEvent "vkImportSemaphoreFdKHR" (vkImportSemaphoreFdKHR' (deviceHandle (device)) pImportSemaphoreFdInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_external_semaphore_win32.hs b/src/Vulkan/Extensions/VK_KHR_external_semaphore_win32.hs
--- a/src/Vulkan/Extensions/VK_KHR_external_semaphore_win32.hs
+++ b/src/Vulkan/Extensions/VK_KHR_external_semaphore_win32.hs
@@ -162,6 +162,7 @@
                                                           , SECURITY_ATTRIBUTES
                                                           ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -286,7 +287,7 @@
   let vkGetSemaphoreWin32HandleKHR' = mkVkGetSemaphoreWin32HandleKHR vkGetSemaphoreWin32HandleKHRPtr
   pGetWin32HandleInfo <- ContT $ withCStruct (getWin32HandleInfo)
   pPHandle <- ContT $ bracket (callocBytes @HANDLE 8) free
-  r <- lift $ vkGetSemaphoreWin32HandleKHR' (deviceHandle (device)) pGetWin32HandleInfo (pPHandle)
+  r <- lift $ traceAroundEvent "vkGetSemaphoreWin32HandleKHR" (vkGetSemaphoreWin32HandleKHR' (deviceHandle (device)) pGetWin32HandleInfo (pPHandle))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pHandle <- lift $ peek @HANDLE pPHandle
   pure $ (pHandle)
@@ -350,7 +351,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkImportSemaphoreWin32HandleKHR is null" Nothing Nothing
   let vkImportSemaphoreWin32HandleKHR' = mkVkImportSemaphoreWin32HandleKHR vkImportSemaphoreWin32HandleKHRPtr
   pImportSemaphoreWin32HandleInfo <- ContT $ withCStruct (importSemaphoreWin32HandleInfo)
-  r <- lift $ vkImportSemaphoreWin32HandleKHR' (deviceHandle (device)) pImportSemaphoreWin32HandleInfo
+  r <- lift $ traceAroundEvent "vkImportSemaphoreWin32HandleKHR" (vkImportSemaphoreWin32HandleKHR' (deviceHandle (device)) pImportSemaphoreWin32HandleInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_fragment_shading_rate.hs b/src/Vulkan/Extensions/VK_KHR_fragment_shading_rate.hs
--- a/src/Vulkan/Extensions/VK_KHR_fragment_shading_rate.hs
+++ b/src/Vulkan/Extensions/VK_KHR_fragment_shading_rate.hs
@@ -226,6 +226,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -450,7 +451,7 @@
     (e0, e1) -> do
       poke (pCombinerOps' :: Ptr FragmentShadingRateCombinerOpKHR) (e0)
       poke (pCombinerOps' `plusPtr` 4 :: Ptr FragmentShadingRateCombinerOpKHR) (e1)
-  lift $ vkCmdSetFragmentShadingRateKHR' (commandBufferHandle (commandBuffer)) pFragmentSize (pCombinerOps)
+  lift $ traceAroundEvent "vkCmdSetFragmentShadingRateKHR" (vkCmdSetFragmentShadingRateKHR' (commandBufferHandle (commandBuffer)) pFragmentSize (pCombinerOps))
   pure $ ()
 
 
@@ -584,12 +585,12 @@
   let vkGetPhysicalDeviceFragmentShadingRatesKHR' = mkVkGetPhysicalDeviceFragmentShadingRatesKHR vkGetPhysicalDeviceFragmentShadingRatesKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPFragmentShadingRateCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceFragmentShadingRatesKHR' physicalDevice' (pPFragmentShadingRateCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceFragmentShadingRatesKHR" (vkGetPhysicalDeviceFragmentShadingRatesKHR' physicalDevice' (pPFragmentShadingRateCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pFragmentShadingRateCount <- lift $ peek @Word32 pPFragmentShadingRateCount
   pPFragmentShadingRates <- ContT $ bracket (callocBytes @PhysicalDeviceFragmentShadingRateKHR ((fromIntegral (pFragmentShadingRateCount)) * 32)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPFragmentShadingRates `advancePtrBytes` (i * 32) :: Ptr PhysicalDeviceFragmentShadingRateKHR) . ($ ())) [0..(fromIntegral (pFragmentShadingRateCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceFragmentShadingRatesKHR' physicalDevice' (pPFragmentShadingRateCount) ((pPFragmentShadingRates))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceFragmentShadingRatesKHR" (vkGetPhysicalDeviceFragmentShadingRatesKHR' physicalDevice' (pPFragmentShadingRateCount) ((pPFragmentShadingRates)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pFragmentShadingRateCount' <- lift $ peek @Word32 pPFragmentShadingRateCount
   pFragmentShadingRates' <- lift $ generateM (fromIntegral (pFragmentShadingRateCount')) (\i -> peekCStruct @PhysicalDeviceFragmentShadingRateKHR (((pPFragmentShadingRates) `advancePtrBytes` (32 * (i)) :: Ptr PhysicalDeviceFragmentShadingRateKHR)))
diff --git a/src/Vulkan/Extensions/VK_KHR_get_display_properties2.hs b/src/Vulkan/Extensions/VK_KHR_get_display_properties2.hs
--- a/src/Vulkan/Extensions/VK_KHR_get_display_properties2.hs
+++ b/src/Vulkan/Extensions/VK_KHR_get_display_properties2.hs
@@ -173,6 +173,7 @@
                                                          , SurfaceTransformFlagsKHR
                                                          ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -305,12 +306,12 @@
   let vkGetPhysicalDeviceDisplayProperties2KHR' = mkVkGetPhysicalDeviceDisplayProperties2KHR vkGetPhysicalDeviceDisplayProperties2KHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceDisplayProperties2KHR' physicalDevice' (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayProperties2KHR" (vkGetPhysicalDeviceDisplayProperties2KHR' physicalDevice' (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @DisplayProperties2KHR ((fromIntegral (pPropertyCount)) * 64)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 64) :: Ptr DisplayProperties2KHR) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceDisplayProperties2KHR' physicalDevice' (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayProperties2KHR" (vkGetPhysicalDeviceDisplayProperties2KHR' physicalDevice' (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @DisplayProperties2KHR (((pPProperties) `advancePtrBytes` (64 * (i)) :: Ptr DisplayProperties2KHR)))
@@ -378,12 +379,12 @@
   let vkGetPhysicalDeviceDisplayPlaneProperties2KHR' = mkVkGetPhysicalDeviceDisplayPlaneProperties2KHR vkGetPhysicalDeviceDisplayPlaneProperties2KHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceDisplayPlaneProperties2KHR' physicalDevice' (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayPlaneProperties2KHR" (vkGetPhysicalDeviceDisplayPlaneProperties2KHR' physicalDevice' (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @DisplayPlaneProperties2KHR ((fromIntegral (pPropertyCount)) * 32)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 32) :: Ptr DisplayPlaneProperties2KHR) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceDisplayPlaneProperties2KHR' physicalDevice' (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceDisplayPlaneProperties2KHR" (vkGetPhysicalDeviceDisplayPlaneProperties2KHR' physicalDevice' (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @DisplayPlaneProperties2KHR (((pPProperties) `advancePtrBytes` (32 * (i)) :: Ptr DisplayPlaneProperties2KHR)))
@@ -459,12 +460,12 @@
   let vkGetDisplayModeProperties2KHR' = mkVkGetDisplayModeProperties2KHR vkGetDisplayModeProperties2KHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetDisplayModeProperties2KHR' physicalDevice' (display) (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetDisplayModeProperties2KHR" (vkGetDisplayModeProperties2KHR' physicalDevice' (display) (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @DisplayModeProperties2KHR ((fromIntegral (pPropertyCount)) * 40)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 40) :: Ptr DisplayModeProperties2KHR) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkGetDisplayModeProperties2KHR' physicalDevice' (display) (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetDisplayModeProperties2KHR" (vkGetDisplayModeProperties2KHR' physicalDevice' (display) (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @DisplayModeProperties2KHR (((pPProperties) `advancePtrBytes` (40 * (i)) :: Ptr DisplayModeProperties2KHR)))
@@ -528,7 +529,7 @@
   let vkGetDisplayPlaneCapabilities2KHR' = mkVkGetDisplayPlaneCapabilities2KHR vkGetDisplayPlaneCapabilities2KHRPtr
   pDisplayPlaneInfo <- ContT $ withCStruct (displayPlaneInfo)
   pPCapabilities <- ContT (withZeroCStruct @DisplayPlaneCapabilities2KHR)
-  r <- lift $ vkGetDisplayPlaneCapabilities2KHR' (physicalDeviceHandle (physicalDevice)) pDisplayPlaneInfo (pPCapabilities)
+  r <- lift $ traceAroundEvent "vkGetDisplayPlaneCapabilities2KHR" (vkGetDisplayPlaneCapabilities2KHR' (physicalDeviceHandle (physicalDevice)) pDisplayPlaneInfo (pPCapabilities))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCapabilities <- lift $ peekCStruct @DisplayPlaneCapabilities2KHR pPCapabilities
   pure $ (pCapabilities)
diff --git a/src/Vulkan/Extensions/VK_KHR_get_surface_capabilities2.hs b/src/Vulkan/Extensions/VK_KHR_get_surface_capabilities2.hs
--- a/src/Vulkan/Extensions/VK_KHR_get_surface_capabilities2.hs
+++ b/src/Vulkan/Extensions/VK_KHR_get_surface_capabilities2.hs
@@ -160,6 +160,7 @@
                                                            , SurfaceTransformFlagsKHR
                                                            ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -317,7 +318,7 @@
   let vkGetPhysicalDeviceSurfaceCapabilities2KHR' = mkVkGetPhysicalDeviceSurfaceCapabilities2KHR vkGetPhysicalDeviceSurfaceCapabilities2KHRPtr
   pSurfaceInfo <- ContT $ withCStruct (surfaceInfo)
   pPSurfaceCapabilities <- ContT (withZeroCStruct @(SurfaceCapabilities2KHR _))
-  r <- lift $ vkGetPhysicalDeviceSurfaceCapabilities2KHR' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pSurfaceInfo) (forgetExtensions (pPSurfaceCapabilities))
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceCapabilities2KHR" (vkGetPhysicalDeviceSurfaceCapabilities2KHR' (physicalDeviceHandle (physicalDevice)) (forgetExtensions pSurfaceInfo) (forgetExtensions (pPSurfaceCapabilities)))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurfaceCapabilities <- lift $ peekCStruct @(SurfaceCapabilities2KHR _) pPSurfaceCapabilities
   pure $ (pSurfaceCapabilities)
@@ -421,12 +422,12 @@
   pSurfaceInfo <- ContT $ withCStruct (surfaceInfo)
   let x9 = forgetExtensions pSurfaceInfo
   pPSurfaceFormatCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceSurfaceFormats2KHR' physicalDevice' x9 (pPSurfaceFormatCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceFormats2KHR" (vkGetPhysicalDeviceSurfaceFormats2KHR' physicalDevice' x9 (pPSurfaceFormatCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurfaceFormatCount <- lift $ peek @Word32 pPSurfaceFormatCount
   pPSurfaceFormats <- ContT $ bracket (callocBytes @SurfaceFormat2KHR ((fromIntegral (pSurfaceFormatCount)) * 24)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPSurfaceFormats `advancePtrBytes` (i * 24) :: Ptr SurfaceFormat2KHR) . ($ ())) [0..(fromIntegral (pSurfaceFormatCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceSurfaceFormats2KHR' physicalDevice' x9 (pPSurfaceFormatCount) ((pPSurfaceFormats))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceFormats2KHR" (vkGetPhysicalDeviceSurfaceFormats2KHR' physicalDevice' x9 (pPSurfaceFormatCount) ((pPSurfaceFormats)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pSurfaceFormatCount' <- lift $ peek @Word32 pPSurfaceFormatCount
   pSurfaceFormats' <- lift $ generateM (fromIntegral (pSurfaceFormatCount')) (\i -> peekCStruct @SurfaceFormat2KHR (((pPSurfaceFormats) `advancePtrBytes` (24 * (i)) :: Ptr SurfaceFormat2KHR)))
diff --git a/src/Vulkan/Extensions/VK_KHR_performance_query.hs b/src/Vulkan/Extensions/VK_KHR_performance_query.hs
--- a/src/Vulkan/Extensions/VK_KHR_performance_query.hs
+++ b/src/Vulkan/Extensions/VK_KHR_performance_query.hs
@@ -535,6 +535,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -706,14 +707,14 @@
   let vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR' = mkVkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPCounterCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR' physicalDevice' (queueFamilyIndex) (pPCounterCount) (nullPtr) (nullPtr)
+  r <- lift $ traceAroundEvent "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR" (vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR' physicalDevice' (queueFamilyIndex) (pPCounterCount) (nullPtr) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCounterCount <- lift $ peek @Word32 pPCounterCount
   pPCounters <- ContT $ bracket (callocBytes @PerformanceCounterKHR ((fromIntegral (pCounterCount)) * 48)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPCounters `advancePtrBytes` (i * 48) :: Ptr PerformanceCounterKHR) . ($ ())) [0..(fromIntegral (pCounterCount)) - 1]
   pPCounterDescriptions <- ContT $ bracket (callocBytes @PerformanceCounterDescriptionKHR ((fromIntegral (pCounterCount)) * 792)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPCounterDescriptions `advancePtrBytes` (i * 792) :: Ptr PerformanceCounterDescriptionKHR) . ($ ())) [0..(fromIntegral (pCounterCount)) - 1]
-  r' <- lift $ vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR' physicalDevice' (queueFamilyIndex) (pPCounterCount) ((pPCounters)) ((pPCounterDescriptions))
+  r' <- lift $ traceAroundEvent "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR" (vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR' physicalDevice' (queueFamilyIndex) (pPCounterCount) ((pPCounters)) ((pPCounterDescriptions)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pCounterCount' <- lift $ peek @Word32 pPCounterCount
   let x33 = pCounterCount'
@@ -772,7 +773,7 @@
   let vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR' = mkVkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHRPtr
   pPerformanceQueryCreateInfo <- ContT $ withCStruct (performanceQueryCreateInfo)
   pPNumPasses <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR' (physicalDeviceHandle (physicalDevice)) pPerformanceQueryCreateInfo (pPNumPasses)
+  lift $ traceAroundEvent "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR" (vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR' (physicalDeviceHandle (physicalDevice)) pPerformanceQueryCreateInfo (pPNumPasses))
   pNumPasses <- lift $ peek @Word32 pPNumPasses
   pure $ (pNumPasses)
 
@@ -826,7 +827,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkAcquireProfilingLockKHR is null" Nothing Nothing
   let vkAcquireProfilingLockKHR' = mkVkAcquireProfilingLockKHR vkAcquireProfilingLockKHRPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkAcquireProfilingLockKHR' (deviceHandle (device)) pInfo
+  r <- lift $ traceAroundEvent "vkAcquireProfilingLockKHR" (vkAcquireProfilingLockKHR' (deviceHandle (device)) pInfo)
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -863,7 +864,7 @@
   unless (vkReleaseProfilingLockKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkReleaseProfilingLockKHR is null" Nothing Nothing
   let vkReleaseProfilingLockKHR' = mkVkReleaseProfilingLockKHR vkReleaseProfilingLockKHRPtr
-  vkReleaseProfilingLockKHR' (deviceHandle (device))
+  traceAroundEvent "vkReleaseProfilingLockKHR" (vkReleaseProfilingLockKHR' (deviceHandle (device)))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_pipeline_executable_properties.hs b/src/Vulkan/Extensions/VK_KHR_pipeline_executable_properties.hs
--- a/src/Vulkan/Extensions/VK_KHR_pipeline_executable_properties.hs
+++ b/src/Vulkan/Extensions/VK_KHR_pipeline_executable_properties.hs
@@ -202,6 +202,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -363,12 +364,12 @@
   let device' = deviceHandle (device)
   pPipelineInfo <- ContT $ withCStruct (pipelineInfo)
   pPExecutableCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPipelineExecutablePropertiesKHR' device' pPipelineInfo (pPExecutableCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPipelineExecutablePropertiesKHR" (vkGetPipelineExecutablePropertiesKHR' device' pPipelineInfo (pPExecutableCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pExecutableCount <- lift $ peek @Word32 pPExecutableCount
   pPProperties <- ContT $ bracket (callocBytes @PipelineExecutablePropertiesKHR ((fromIntegral (pExecutableCount)) * 536)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 536) :: Ptr PipelineExecutablePropertiesKHR) . ($ ())) [0..(fromIntegral (pExecutableCount)) - 1]
-  r' <- lift $ vkGetPipelineExecutablePropertiesKHR' device' pPipelineInfo (pPExecutableCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetPipelineExecutablePropertiesKHR" (vkGetPipelineExecutablePropertiesKHR' device' pPipelineInfo (pPExecutableCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pExecutableCount' <- lift $ peek @Word32 pPExecutableCount
   pProperties' <- lift $ generateM (fromIntegral (pExecutableCount')) (\i -> peekCStruct @PipelineExecutablePropertiesKHR (((pPProperties) `advancePtrBytes` (536 * (i)) :: Ptr PipelineExecutablePropertiesKHR)))
@@ -466,12 +467,12 @@
   let device' = deviceHandle (device)
   pExecutableInfo <- ContT $ withCStruct (executableInfo)
   pPStatisticCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPipelineExecutableStatisticsKHR' device' pExecutableInfo (pPStatisticCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPipelineExecutableStatisticsKHR" (vkGetPipelineExecutableStatisticsKHR' device' pExecutableInfo (pPStatisticCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pStatisticCount <- lift $ peek @Word32 pPStatisticCount
   pPStatistics <- ContT $ bracket (callocBytes @PipelineExecutableStatisticKHR ((fromIntegral (pStatisticCount)) * 544)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPStatistics `advancePtrBytes` (i * 544) :: Ptr PipelineExecutableStatisticKHR) . ($ ())) [0..(fromIntegral (pStatisticCount)) - 1]
-  r' <- lift $ vkGetPipelineExecutableStatisticsKHR' device' pExecutableInfo (pPStatisticCount) ((pPStatistics))
+  r' <- lift $ traceAroundEvent "vkGetPipelineExecutableStatisticsKHR" (vkGetPipelineExecutableStatisticsKHR' device' pExecutableInfo (pPStatisticCount) ((pPStatistics)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pStatisticCount' <- lift $ peek @Word32 pPStatisticCount
   pStatistics' <- lift $ generateM (fromIntegral (pStatisticCount')) (\i -> peekCStruct @PipelineExecutableStatisticKHR (((pPStatistics) `advancePtrBytes` (544 * (i)) :: Ptr PipelineExecutableStatisticKHR)))
@@ -578,12 +579,12 @@
   let device' = deviceHandle (device)
   pExecutableInfo <- ContT $ withCStruct (executableInfo)
   pPInternalRepresentationCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPipelineExecutableInternalRepresentationsKHR' device' pExecutableInfo (pPInternalRepresentationCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPipelineExecutableInternalRepresentationsKHR" (vkGetPipelineExecutableInternalRepresentationsKHR' device' pExecutableInfo (pPInternalRepresentationCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pInternalRepresentationCount <- lift $ peek @Word32 pPInternalRepresentationCount
   pPInternalRepresentations <- ContT $ bracket (callocBytes @PipelineExecutableInternalRepresentationKHR ((fromIntegral (pInternalRepresentationCount)) * 552)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPInternalRepresentations `advancePtrBytes` (i * 552) :: Ptr PipelineExecutableInternalRepresentationKHR) . ($ ())) [0..(fromIntegral (pInternalRepresentationCount)) - 1]
-  r' <- lift $ vkGetPipelineExecutableInternalRepresentationsKHR' device' pExecutableInfo (pPInternalRepresentationCount) ((pPInternalRepresentations))
+  r' <- lift $ traceAroundEvent "vkGetPipelineExecutableInternalRepresentationsKHR" (vkGetPipelineExecutableInternalRepresentationsKHR' device' pExecutableInfo (pPInternalRepresentationCount) ((pPInternalRepresentations)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pInternalRepresentationCount' <- lift $ peek @Word32 pPInternalRepresentationCount
   pInternalRepresentations' <- lift $ generateM (fromIntegral (pInternalRepresentationCount')) (\i -> peekCStruct @PipelineExecutableInternalRepresentationKHR (((pPInternalRepresentations) `advancePtrBytes` (552 * (i)) :: Ptr PipelineExecutableInternalRepresentationKHR)))
diff --git a/src/Vulkan/Extensions/VK_KHR_push_descriptor.hs b/src/Vulkan/Extensions/VK_KHR_push_descriptor.hs
--- a/src/Vulkan/Extensions/VK_KHR_push_descriptor.hs
+++ b/src/Vulkan/Extensions/VK_KHR_push_descriptor.hs
@@ -135,6 +135,7 @@
                                                  , pattern KHR_PUSH_DESCRIPTOR_EXTENSION_NAME
                                                  ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -345,7 +346,7 @@
   let vkCmdPushDescriptorSetKHR' = mkVkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHRPtr
   pPDescriptorWrites <- ContT $ allocaBytesAligned @(WriteDescriptorSet _) ((Data.Vector.length (descriptorWrites)) * 64) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPDescriptorWrites `plusPtr` (64 * (i)) :: Ptr (WriteDescriptorSet _))) (e) . ($ ())) (descriptorWrites)
-  lift $ vkCmdPushDescriptorSetKHR' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (layout) (set) ((fromIntegral (Data.Vector.length $ (descriptorWrites)) :: Word32)) (forgetExtensions (pPDescriptorWrites))
+  lift $ traceAroundEvent "vkCmdPushDescriptorSetKHR" (vkCmdPushDescriptorSetKHR' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (layout) (set) ((fromIntegral (Data.Vector.length $ (descriptorWrites)) :: Word32)) (forgetExtensions (pPDescriptorWrites)))
   pure $ ()
 
 
@@ -497,7 +498,7 @@
   unless (vkCmdPushDescriptorSetWithTemplateKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdPushDescriptorSetWithTemplateKHR is null" Nothing Nothing
   let vkCmdPushDescriptorSetWithTemplateKHR' = mkVkCmdPushDescriptorSetWithTemplateKHR vkCmdPushDescriptorSetWithTemplateKHRPtr
-  vkCmdPushDescriptorSetWithTemplateKHR' (commandBufferHandle (commandBuffer)) (descriptorUpdateTemplate) (layout) (set) (data')
+  traceAroundEvent "vkCmdPushDescriptorSetWithTemplateKHR" (vkCmdPushDescriptorSetWithTemplateKHR' (commandBufferHandle (commandBuffer)) (descriptorUpdateTemplate) (layout) (set) (data'))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs b/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs
--- a/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs
+++ b/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs
@@ -289,7 +289,7 @@
 --
 -- == New or Modified Built-In Variables
 --
--- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIDKHR>
+-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIdKHR>
 --
 -- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchsize LaunchSizeKHR>
 --
@@ -757,6 +757,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -1249,16 +1250,8 @@
 --     /must/ have been created with
 --     'RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR'
 --
--- -   #VUID-vkCmdTraceRaysKHR-commandBuffer-02712# If @commandBuffer@ is a
---     protected command buffer, any resource written to by the
---     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
---     point used by this command /must/ not be an unprotected resource
---
--- -   #VUID-vkCmdTraceRaysKHR-commandBuffer-02713# If @commandBuffer@ is a
---     protected command buffer, pipeline stages other than the
---     framebuffer-space and compute stages in the
---     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
---     point /must/ not write to any resource
+-- -   #VUID-vkCmdTraceRaysKHR-commandBuffer-04625# @commandBuffer@ /must/
+--     not be a protected command buffer
 --
 -- -   #VUID-vkCmdTraceRaysKHR-width-03626# @width@ /must/ be less than or
 --     equal to
@@ -1368,7 +1361,7 @@
   pMissShaderBindingTable <- ContT $ withCStruct (missShaderBindingTable)
   pHitShaderBindingTable <- ContT $ withCStruct (hitShaderBindingTable)
   pCallableShaderBindingTable <- ContT $ withCStruct (callableShaderBindingTable)
-  lift $ vkCmdTraceRaysKHR' (commandBufferHandle (commandBuffer)) pRaygenShaderBindingTable pMissShaderBindingTable pHitShaderBindingTable pCallableShaderBindingTable (width) (height) (depth)
+  lift $ traceAroundEvent "vkCmdTraceRaysKHR" (vkCmdTraceRaysKHR' (commandBufferHandle (commandBuffer)) pRaygenShaderBindingTable pMissShaderBindingTable pHitShaderBindingTable pCallableShaderBindingTable (width) (height) (depth))
   pure $ ()
 
 
@@ -1384,6 +1377,9 @@
 --
 -- == Valid Usage
 --
+-- -   #VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-04619#
+--     @pipeline@ /must/ be a ray tracing pipeline
+--
 -- -   #VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-04050#
 --     @firstGroup@ /must/ be less than the number of shader groups in
 --     @pipeline@
@@ -1458,7 +1454,7 @@
   unless (vkGetRayTracingShaderGroupHandlesKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetRayTracingShaderGroupHandlesKHR is null" Nothing Nothing
   let vkGetRayTracingShaderGroupHandlesKHR' = mkVkGetRayTracingShaderGroupHandlesKHR vkGetRayTracingShaderGroupHandlesKHRPtr
-  r <- vkGetRayTracingShaderGroupHandlesKHR' (deviceHandle (device)) (pipeline) (firstGroup) (groupCount) (CSize (dataSize)) (data')
+  r <- traceAroundEvent "vkGetRayTracingShaderGroupHandlesKHR" (vkGetRayTracingShaderGroupHandlesKHR' (deviceHandle (device)) (pipeline) (firstGroup) (groupCount) (CSize (dataSize)) (data'))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -1474,6 +1470,9 @@
 --
 -- == Valid Usage
 --
+-- -   #VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-04620#
+--     @pipeline@ /must/ be a ray tracing pipeline
+--
 -- -   #VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-04051#
 --     @firstGroup@ /must/ be less than the number of shader groups in
 --     @pipeline@
@@ -1550,7 +1549,7 @@
   unless (vkGetRayTracingCaptureReplayShaderGroupHandlesKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetRayTracingCaptureReplayShaderGroupHandlesKHR is null" Nothing Nothing
   let vkGetRayTracingCaptureReplayShaderGroupHandlesKHR' = mkVkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHRPtr
-  r <- vkGetRayTracingCaptureReplayShaderGroupHandlesKHR' (deviceHandle (device)) (pipeline) (firstGroup) (groupCount) (CSize (dataSize)) (data')
+  r <- traceAroundEvent "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR" (vkGetRayTracingCaptureReplayShaderGroupHandlesKHR' (deviceHandle (device)) (pipeline) (firstGroup) (groupCount) (CSize (dataSize)) (data'))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -1718,7 +1717,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPPipelines <- ContT $ bracket (callocBytes @Pipeline ((fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) * 8)) free
-  r <- lift $ vkCreateRayTracingPipelinesKHR' (deviceHandle (device)) (deferredOperation) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines)
+  r <- lift $ traceAroundEvent "vkCreateRayTracingPipelinesKHR" (vkCreateRayTracingPipelinesKHR' (deviceHandle (device)) (deferredOperation) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPipelines <- lift $ generateM (fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) (\i -> peek @Pipeline ((pPPipelines `advancePtrBytes` (8 * (i)) :: Ptr Pipeline)))
   pure $ (r, pPipelines)
@@ -2239,7 +2238,7 @@
   pMissShaderBindingTable <- ContT $ withCStruct (missShaderBindingTable)
   pHitShaderBindingTable <- ContT $ withCStruct (hitShaderBindingTable)
   pCallableShaderBindingTable <- ContT $ withCStruct (callableShaderBindingTable)
-  lift $ vkCmdTraceRaysIndirectKHR' (commandBufferHandle (commandBuffer)) pRaygenShaderBindingTable pMissShaderBindingTable pHitShaderBindingTable pCallableShaderBindingTable (indirectDeviceAddress)
+  lift $ traceAroundEvent "vkCmdTraceRaysIndirectKHR" (vkCmdTraceRaysIndirectKHR' (commandBufferHandle (commandBuffer)) pRaygenShaderBindingTable pMissShaderBindingTable pHitShaderBindingTable pCallableShaderBindingTable (indirectDeviceAddress))
   pure $ ()
 
 
@@ -2260,6 +2259,9 @@
 --
 -- == Valid Usage
 --
+-- -   #VUID-vkGetRayTracingShaderGroupStackSizeKHR-pipeline-04622#
+--     @pipeline@ /must/ be a ray tracing pipeline
+--
 -- -   #VUID-vkGetRayTracingShaderGroupStackSizeKHR-group-03608# The value
 --     of @group@ must be less than the number of shader groups in
 --     @pipeline@
@@ -2304,7 +2306,7 @@
   unless (vkGetRayTracingShaderGroupStackSizeKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetRayTracingShaderGroupStackSizeKHR is null" Nothing Nothing
   let vkGetRayTracingShaderGroupStackSizeKHR' = mkVkGetRayTracingShaderGroupStackSizeKHR vkGetRayTracingShaderGroupStackSizeKHRPtr
-  r <- vkGetRayTracingShaderGroupStackSizeKHR' (deviceHandle (device)) (pipeline) (group) (groupShader)
+  r <- traceAroundEvent "vkGetRayTracingShaderGroupStackSizeKHR" (vkGetRayTracingShaderGroupStackSizeKHR' (deviceHandle (device)) (pipeline) (group) (groupShader))
   pure $ (r)
 
 
@@ -2383,7 +2385,7 @@
   unless (vkCmdSetRayTracingPipelineStackSizeKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetRayTracingPipelineStackSizeKHR is null" Nothing Nothing
   let vkCmdSetRayTracingPipelineStackSizeKHR' = mkVkCmdSetRayTracingPipelineStackSizeKHR vkCmdSetRayTracingPipelineStackSizeKHRPtr
-  vkCmdSetRayTracingPipelineStackSizeKHR' (commandBufferHandle (commandBuffer)) (pipelineStackSize)
+  traceAroundEvent "vkCmdSetRayTracingPipelineStackSizeKHR" (vkCmdSetRayTracingPipelineStackSizeKHR' (commandBufferHandle (commandBuffer)) (pipelineStackSize))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs-boot b/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs-boot
--- a/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs-boot
+++ b/src/Vulkan/Extensions/VK_KHR_ray_tracing_pipeline.hs-boot
@@ -289,7 +289,7 @@
 --
 -- == New or Modified Built-In Variables
 --
--- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIDKHR>
+-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIdKHR>
 --
 -- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchsize LaunchSizeKHR>
 --
diff --git a/src/Vulkan/Extensions/VK_KHR_shared_presentable_image.hs b/src/Vulkan/Extensions/VK_KHR_shared_presentable_image.hs
--- a/src/Vulkan/Extensions/VK_KHR_shared_presentable_image.hs
+++ b/src/Vulkan/Extensions/VK_KHR_shared_presentable_image.hs
@@ -226,6 +226,7 @@
                                                           , PresentModeKHR(..)
                                                           ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -329,7 +330,7 @@
   unless (vkGetSwapchainStatusKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetSwapchainStatusKHR is null" Nothing Nothing
   let vkGetSwapchainStatusKHR' = mkVkGetSwapchainStatusKHR vkGetSwapchainStatusKHRPtr
-  r <- vkGetSwapchainStatusKHR' (deviceHandle (device)) (swapchain)
+  r <- traceAroundEvent "vkGetSwapchainStatusKHR" (vkGetSwapchainStatusKHR' (deviceHandle (device)) (swapchain))
   when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
diff --git a/src/Vulkan/Extensions/VK_KHR_surface.hs b/src/Vulkan/Extensions/VK_KHR_surface.hs
--- a/src/Vulkan/Extensions/VK_KHR_surface.hs
+++ b/src/Vulkan/Extensions/VK_KHR_surface.hs
@@ -433,6 +433,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -579,7 +580,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroySurfaceKHR' (instanceHandle (instance')) (surface) pAllocator
+  lift $ traceAroundEvent "vkDestroySurfaceKHR" (vkDestroySurfaceKHR' (instanceHandle (instance')) (surface) pAllocator)
   pure $ ()
 
 
@@ -653,7 +654,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceSurfaceSupportKHR is null" Nothing Nothing
   let vkGetPhysicalDeviceSurfaceSupportKHR' = mkVkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHRPtr
   pPSupported <- ContT $ bracket (callocBytes @Bool32 4) free
-  r <- lift $ vkGetPhysicalDeviceSurfaceSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (surface) (pPSupported)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceSupportKHR" (vkGetPhysicalDeviceSurfaceSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (surface) (pPSupported))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSupported <- lift $ peek @Bool32 pPSupported
   pure $ ((bool32ToBool pSupported))
@@ -720,7 +721,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceSurfaceCapabilitiesKHR is null" Nothing Nothing
   let vkGetPhysicalDeviceSurfaceCapabilitiesKHR' = mkVkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHRPtr
   pPSurfaceCapabilities <- ContT (withZeroCStruct @SurfaceCapabilitiesKHR)
-  r <- lift $ vkGetPhysicalDeviceSurfaceCapabilitiesKHR' (physicalDeviceHandle (physicalDevice)) (surface) (pPSurfaceCapabilities)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" (vkGetPhysicalDeviceSurfaceCapabilitiesKHR' (physicalDeviceHandle (physicalDevice)) (surface) (pPSurfaceCapabilities))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurfaceCapabilities <- lift $ peekCStruct @SurfaceCapabilitiesKHR pPSurfaceCapabilities
   pure $ (pSurfaceCapabilities)
@@ -832,12 +833,12 @@
   let vkGetPhysicalDeviceSurfaceFormatsKHR' = mkVkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPSurfaceFormatCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceSurfaceFormatsKHR' physicalDevice' (surface) (pPSurfaceFormatCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceFormatsKHR" (vkGetPhysicalDeviceSurfaceFormatsKHR' physicalDevice' (surface) (pPSurfaceFormatCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurfaceFormatCount <- lift $ peek @Word32 pPSurfaceFormatCount
   pPSurfaceFormats <- ContT $ bracket (callocBytes @SurfaceFormatKHR ((fromIntegral (pSurfaceFormatCount)) * 8)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPSurfaceFormats `advancePtrBytes` (i * 8) :: Ptr SurfaceFormatKHR) . ($ ())) [0..(fromIntegral (pSurfaceFormatCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceSurfaceFormatsKHR' physicalDevice' (surface) (pPSurfaceFormatCount) ((pPSurfaceFormats))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfaceFormatsKHR" (vkGetPhysicalDeviceSurfaceFormatsKHR' physicalDevice' (surface) (pPSurfaceFormatCount) ((pPSurfaceFormats)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pSurfaceFormatCount' <- lift $ peek @Word32 pPSurfaceFormatCount
   pSurfaceFormats' <- lift $ generateM (fromIntegral (pSurfaceFormatCount')) (\i -> peekCStruct @SurfaceFormatKHR (((pPSurfaceFormats) `advancePtrBytes` (8 * (i)) :: Ptr SurfaceFormatKHR)))
@@ -928,11 +929,11 @@
   let vkGetPhysicalDeviceSurfacePresentModesKHR' = mkVkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPresentModeCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceSurfacePresentModesKHR' physicalDevice' (surface) (pPPresentModeCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfacePresentModesKHR" (vkGetPhysicalDeviceSurfacePresentModesKHR' physicalDevice' (surface) (pPPresentModeCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPresentModeCount <- lift $ peek @Word32 pPPresentModeCount
   pPPresentModes <- ContT $ bracket (callocBytes @PresentModeKHR ((fromIntegral (pPresentModeCount)) * 4)) free
-  r' <- lift $ vkGetPhysicalDeviceSurfacePresentModesKHR' physicalDevice' (surface) (pPPresentModeCount) (pPPresentModes)
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceSurfacePresentModesKHR" (vkGetPhysicalDeviceSurfacePresentModesKHR' physicalDevice' (surface) (pPPresentModeCount) (pPPresentModes))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPresentModeCount' <- lift $ peek @Word32 pPPresentModeCount
   pPresentModes' <- lift $ generateM (fromIntegral (pPresentModeCount')) (\i -> peek @PresentModeKHR ((pPPresentModes `advancePtrBytes` (4 * (i)) :: Ptr PresentModeKHR)))
diff --git a/src/Vulkan/Extensions/VK_KHR_swapchain.hs b/src/Vulkan/Extensions/VK_KHR_swapchain.hs
--- a/src/Vulkan/Extensions/VK_KHR_swapchain.hs
+++ b/src/Vulkan/Extensions/VK_KHR_swapchain.hs
@@ -1124,6 +1124,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -1296,6 +1297,16 @@
 -- include the app not being set as high-dpi aware, or if the physical
 -- device and monitor are not compatible in this mode.
 --
+-- When the 'Vulkan.Extensions.Handles.SurfaceKHR' in
+-- 'SwapchainCreateInfoKHR' is a display surface, then the
+-- 'Vulkan.Extensions.Handles.DisplayModeKHR' in display surface’s
+-- 'Vulkan.Extensions.VK_KHR_display.DisplaySurfaceCreateInfoKHR' is
+-- associated with a particular 'Vulkan.Extensions.Handles.DisplayKHR'.
+-- Swapchain creation /may/ fail if that
+-- 'Vulkan.Extensions.Handles.DisplayKHR' is not acquired by the
+-- application. In this scenario
+-- 'Vulkan.Core10.Enums.Result.ERROR_INITIALIZATION_FAILED' is returned.
+--
 -- == Valid Usage (Implicit)
 --
 -- -   #VUID-vkCreateSwapchainKHR-device-parameter# @device@ /must/ be a
@@ -1368,7 +1379,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSwapchain <- ContT $ bracket (callocBytes @SwapchainKHR 8) free
-  r <- lift $ vkCreateSwapchainKHR' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSwapchain)
+  r <- lift $ traceAroundEvent "vkCreateSwapchainKHR" (vkCreateSwapchainKHR' (deviceHandle (device)) (forgetExtensions pCreateInfo) pAllocator (pPSwapchain))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSwapchain <- lift $ peek @SwapchainKHR pPSwapchain
   pure $ (pSwapchain)
@@ -1482,7 +1493,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroySwapchainKHR' (deviceHandle (device)) (swapchain) pAllocator
+  lift $ traceAroundEvent "vkDestroySwapchainKHR" (vkDestroySwapchainKHR' (deviceHandle (device)) (swapchain) pAllocator)
   pure $ ()
 
 
@@ -1565,11 +1576,11 @@
   let vkGetSwapchainImagesKHR' = mkVkGetSwapchainImagesKHR vkGetSwapchainImagesKHRPtr
   let device' = deviceHandle (device)
   pPSwapchainImageCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetSwapchainImagesKHR' device' (swapchain) (pPSwapchainImageCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetSwapchainImagesKHR" (vkGetSwapchainImagesKHR' device' (swapchain) (pPSwapchainImageCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSwapchainImageCount <- lift $ peek @Word32 pPSwapchainImageCount
   pPSwapchainImages <- ContT $ bracket (callocBytes @Image ((fromIntegral (pSwapchainImageCount)) * 8)) free
-  r' <- lift $ vkGetSwapchainImagesKHR' device' (swapchain) (pPSwapchainImageCount) (pPSwapchainImages)
+  r' <- lift $ traceAroundEvent "vkGetSwapchainImagesKHR" (vkGetSwapchainImagesKHR' device' (swapchain) (pPSwapchainImageCount) (pPSwapchainImages))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pSwapchainImageCount' <- lift $ peek @Word32 pPSwapchainImageCount
   pSwapchainImages' <- lift $ generateM (fromIntegral (pSwapchainImageCount')) (\i -> peek @Image ((pPSwapchainImages `advancePtrBytes` (8 * (i)) :: Ptr Image)))
@@ -1613,7 +1624,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkAcquireNextImageKHR is null" Nothing Nothing
   let vkAcquireNextImageKHR' = mkVkAcquireNextImageKHR vkAcquireNextImageKHRPtr
   pPImageIndex <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkAcquireNextImageKHR' (deviceHandle (device)) (swapchain) (timeout) (semaphore) (fence) (pPImageIndex)
+  r <- lift $ traceAroundEvent "vkAcquireNextImageKHR" (vkAcquireNextImageKHR' (deviceHandle (device)) (swapchain) (timeout) (semaphore) (fence) (pPImageIndex))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pImageIndex <- lift $ peek @Word32 pPImageIndex
   pure $ (r, pImageIndex)
@@ -1937,7 +1948,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkQueuePresentKHR is null" Nothing Nothing
   let vkQueuePresentKHR' = mkVkQueuePresentKHR vkQueuePresentKHRPtr
   pPresentInfo <- ContT $ withCStruct (presentInfo)
-  r <- lift $ vkQueuePresentKHR' (queueHandle (queue)) (forgetExtensions pPresentInfo)
+  r <- lift $ traceAroundEvent "vkQueuePresentKHR" (vkQueuePresentKHR' (queueHandle (queue)) (forgetExtensions pPresentInfo))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pure $ (r)
 
@@ -1981,7 +1992,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeviceGroupPresentCapabilitiesKHR is null" Nothing Nothing
   let vkGetDeviceGroupPresentCapabilitiesKHR' = mkVkGetDeviceGroupPresentCapabilitiesKHR vkGetDeviceGroupPresentCapabilitiesKHRPtr
   pPDeviceGroupPresentCapabilities <- ContT (withZeroCStruct @DeviceGroupPresentCapabilitiesKHR)
-  r <- lift $ vkGetDeviceGroupPresentCapabilitiesKHR' (deviceHandle (device)) (pPDeviceGroupPresentCapabilities)
+  r <- lift $ traceAroundEvent "vkGetDeviceGroupPresentCapabilitiesKHR" (vkGetDeviceGroupPresentCapabilitiesKHR' (deviceHandle (device)) (pPDeviceGroupPresentCapabilities))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pDeviceGroupPresentCapabilities <- lift $ peekCStruct @DeviceGroupPresentCapabilitiesKHR pPDeviceGroupPresentCapabilities
   pure $ (pDeviceGroupPresentCapabilities)
@@ -2056,7 +2067,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetDeviceGroupSurfacePresentModesKHR is null" Nothing Nothing
   let vkGetDeviceGroupSurfacePresentModesKHR' = mkVkGetDeviceGroupSurfacePresentModesKHR vkGetDeviceGroupSurfacePresentModesKHRPtr
   pPModes <- ContT $ bracket (callocBytes @DeviceGroupPresentModeFlagsKHR 4) free
-  r <- lift $ vkGetDeviceGroupSurfacePresentModesKHR' (deviceHandle (device)) (surface) (pPModes)
+  r <- lift $ traceAroundEvent "vkGetDeviceGroupSurfacePresentModesKHR" (vkGetDeviceGroupSurfacePresentModesKHR' (deviceHandle (device)) (surface) (pPModes))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pModes <- lift $ peek @DeviceGroupPresentModeFlagsKHR pPModes
   pure $ (pModes)
@@ -2091,7 +2102,7 @@
   let vkAcquireNextImage2KHR' = mkVkAcquireNextImage2KHR vkAcquireNextImage2KHRPtr
   pAcquireInfo <- ContT $ withCStruct (acquireInfo)
   pPImageIndex <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkAcquireNextImage2KHR' (deviceHandle (device)) pAcquireInfo (pPImageIndex)
+  r <- lift $ traceAroundEvent "vkAcquireNextImage2KHR" (vkAcquireNextImage2KHR' (deviceHandle (device)) pAcquireInfo (pPImageIndex))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pImageIndex <- lift $ peek @Word32 pPImageIndex
   pure $ (r, pImageIndex)
@@ -2262,12 +2273,12 @@
   let vkGetPhysicalDevicePresentRectanglesKHR' = mkVkGetPhysicalDevicePresentRectanglesKHR vkGetPhysicalDevicePresentRectanglesKHRPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPRectCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDevicePresentRectanglesKHR' physicalDevice' (surface) (pPRectCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDevicePresentRectanglesKHR" (vkGetPhysicalDevicePresentRectanglesKHR' physicalDevice' (surface) (pPRectCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pRectCount <- lift $ peek @Word32 pPRectCount
   pPRects <- ContT $ bracket (callocBytes @Rect2D ((fromIntegral (pRectCount)) * 16)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPRects `advancePtrBytes` (i * 16) :: Ptr Rect2D) . ($ ())) [0..(fromIntegral (pRectCount)) - 1]
-  r' <- lift $ vkGetPhysicalDevicePresentRectanglesKHR' physicalDevice' (surface) (pPRectCount) ((pPRects))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDevicePresentRectanglesKHR" (vkGetPhysicalDevicePresentRectanglesKHR' physicalDevice' (surface) (pPRectCount) ((pPRects)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pRectCount' <- lift $ peek @Word32 pPRectCount
   pRects' <- lift $ generateM (fromIntegral (pRectCount')) (\i -> peekCStruct @Rect2D (((pPRects) `advancePtrBytes` (16 * (i)) :: Ptr Rect2D)))
diff --git a/src/Vulkan/Extensions/VK_KHR_wayland_surface.hs b/src/Vulkan/Extensions/VK_KHR_wayland_surface.hs
--- a/src/Vulkan/Extensions/VK_KHR_wayland_surface.hs
+++ b/src/Vulkan/Extensions/VK_KHR_wayland_surface.hs
@@ -201,6 +201,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -331,7 +332,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateWaylandSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateWaylandSurfaceKHR" (vkCreateWaylandSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
@@ -385,7 +386,7 @@
   unless (vkGetPhysicalDeviceWaylandPresentationSupportKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceWaylandPresentationSupportKHR is null" Nothing Nothing
   let vkGetPhysicalDeviceWaylandPresentationSupportKHR' = mkVkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHRPtr
-  r <- vkGetPhysicalDeviceWaylandPresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (display)
+  r <- traceAroundEvent "vkGetPhysicalDeviceWaylandPresentationSupportKHR" (vkGetPhysicalDeviceWaylandPresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (display))
   pure $ ((bool32ToBool r))
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_win32_surface.hs b/src/Vulkan/Extensions/VK_KHR_win32_surface.hs
--- a/src/Vulkan/Extensions/VK_KHR_win32_surface.hs
+++ b/src/Vulkan/Extensions/VK_KHR_win32_surface.hs
@@ -227,6 +227,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -356,7 +357,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateWin32SurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateWin32SurfaceKHR" (vkCreateWin32SurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
@@ -404,7 +405,7 @@
   unless (vkGetPhysicalDeviceWin32PresentationSupportKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceWin32PresentationSupportKHR is null" Nothing Nothing
   let vkGetPhysicalDeviceWin32PresentationSupportKHR' = mkVkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHRPtr
-  r <- vkGetPhysicalDeviceWin32PresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex)
+  r <- traceAroundEvent "vkGetPhysicalDeviceWin32PresentationSupportKHR" (vkGetPhysicalDeviceWin32PresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex))
   pure $ ((bool32ToBool r))
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_xcb_surface.hs b/src/Vulkan/Extensions/VK_KHR_xcb_surface.hs
--- a/src/Vulkan/Extensions/VK_KHR_xcb_surface.hs
+++ b/src/Vulkan/Extensions/VK_KHR_xcb_surface.hs
@@ -184,6 +184,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -312,7 +313,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateXcbSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateXcbSurfaceKHR" (vkCreateXcbSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
@@ -367,7 +368,7 @@
   unless (vkGetPhysicalDeviceXcbPresentationSupportKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceXcbPresentationSupportKHR is null" Nothing Nothing
   let vkGetPhysicalDeviceXcbPresentationSupportKHR' = mkVkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHRPtr
-  r <- vkGetPhysicalDeviceXcbPresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (connection) (visual_id)
+  r <- traceAroundEvent "vkGetPhysicalDeviceXcbPresentationSupportKHR" (vkGetPhysicalDeviceXcbPresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (connection) (visual_id))
   pure $ ((bool32ToBool r))
 
 
diff --git a/src/Vulkan/Extensions/VK_KHR_xlib_surface.hs b/src/Vulkan/Extensions/VK_KHR_xlib_surface.hs
--- a/src/Vulkan/Extensions/VK_KHR_xlib_surface.hs
+++ b/src/Vulkan/Extensions/VK_KHR_xlib_surface.hs
@@ -184,6 +184,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -314,7 +315,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateXlibSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateXlibSurfaceKHR" (vkCreateXlibSurfaceKHR' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
@@ -369,7 +370,7 @@
   unless (vkGetPhysicalDeviceXlibPresentationSupportKHRPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceXlibPresentationSupportKHR is null" Nothing Nothing
   let vkGetPhysicalDeviceXlibPresentationSupportKHR' = mkVkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHRPtr
-  r <- vkGetPhysicalDeviceXlibPresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (dpy) (visualID)
+  r <- traceAroundEvent "vkGetPhysicalDeviceXlibPresentationSupportKHR" (vkGetPhysicalDeviceXlibPresentationSupportKHR' (physicalDeviceHandle (physicalDevice)) (queueFamilyIndex) (dpy) (visualID))
   pure $ ((bool32ToBool r))
 
 
diff --git a/src/Vulkan/Extensions/VK_MVK_ios_surface.hs b/src/Vulkan/Extensions/VK_MVK_ios_surface.hs
--- a/src/Vulkan/Extensions/VK_MVK_ios_surface.hs
+++ b/src/Vulkan/Extensions/VK_MVK_ios_surface.hs
@@ -122,6 +122,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -264,7 +265,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateIOSSurfaceMVK' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateIOSSurfaceMVK" (vkCreateIOSSurfaceMVK' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_MVK_macos_surface.hs b/src/Vulkan/Extensions/VK_MVK_macos_surface.hs
--- a/src/Vulkan/Extensions/VK_MVK_macos_surface.hs
+++ b/src/Vulkan/Extensions/VK_MVK_macos_surface.hs
@@ -122,6 +122,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -267,7 +268,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateMacOSSurfaceMVK' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateMacOSSurfaceMVK" (vkCreateMacOSSurfaceMVK' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_NN_vi_surface.hs b/src/Vulkan/Extensions/VK_NN_vi_surface.hs
--- a/src/Vulkan/Extensions/VK_NN_vi_surface.hs
+++ b/src/Vulkan/Extensions/VK_NN_vi_surface.hs
@@ -121,6 +121,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -259,7 +260,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPSurface <- ContT $ bracket (callocBytes @SurfaceKHR 8) free
-  r <- lift $ vkCreateViSurfaceNN' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface)
+  r <- lift $ traceAroundEvent "vkCreateViSurfaceNN" (vkCreateViSurfaceNN' (instanceHandle (instance')) pCreateInfo pAllocator (pPSurface))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pSurface <- lift $ peek @SurfaceKHR pPSurface
   pure $ (pSurface)
diff --git a/src/Vulkan/Extensions/VK_NVX_image_view_handle.hs b/src/Vulkan/Extensions/VK_NVX_image_view_handle.hs
--- a/src/Vulkan/Extensions/VK_NVX_image_view_handle.hs
+++ b/src/Vulkan/Extensions/VK_NVX_image_view_handle.hs
@@ -101,6 +101,7 @@
                                                    , pattern NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME
                                                    ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -183,7 +184,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetImageViewHandleNVX is null" Nothing Nothing
   let vkGetImageViewHandleNVX' = mkVkGetImageViewHandleNVX vkGetImageViewHandleNVXPtr
   pInfo <- ContT $ withCStruct (info)
-  r <- lift $ vkGetImageViewHandleNVX' (deviceHandle (device)) pInfo
+  r <- lift $ traceAroundEvent "vkGetImageViewHandleNVX" (vkGetImageViewHandleNVX' (deviceHandle (device)) pInfo)
   pure $ (r)
 
 
@@ -234,7 +235,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetImageViewAddressNVX is null" Nothing Nothing
   let vkGetImageViewAddressNVX' = mkVkGetImageViewAddressNVX vkGetImageViewAddressNVXPtr
   pPProperties <- ContT (withZeroCStruct @ImageViewAddressPropertiesNVX)
-  r <- lift $ vkGetImageViewAddressNVX' (deviceHandle (device)) (imageView) (pPProperties)
+  r <- lift $ traceAroundEvent "vkGetImageViewAddressNVX" (vkGetImageViewAddressNVX' (deviceHandle (device)) (imageView) (pPProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pProperties <- lift $ peekCStruct @ImageViewAddressPropertiesNVX pPProperties
   pure $ (pProperties)
diff --git a/src/Vulkan/Extensions/VK_NV_acquire_winrt_display.hs b/src/Vulkan/Extensions/VK_NV_acquire_winrt_display.hs
new file mode 100644
--- /dev/null
+++ b/src/Vulkan/Extensions/VK_NV_acquire_winrt_display.hs
@@ -0,0 +1,382 @@
+{-# language CPP #-}
+-- | = Name
+--
+-- VK_NV_acquire_winrt_display - device extension
+--
+-- == VK_NV_acquire_winrt_display
+--
+-- [__Name String__]
+--     @VK_NV_acquire_winrt_display@
+--
+-- [__Extension Type__]
+--     Device extension
+--
+-- [__Registered Extension Number__]
+--     346
+--
+-- [__Revision__]
+--     1
+--
+-- [__Extension and Version Dependencies__]
+--
+--     -   Requires Vulkan 1.0
+--
+--     -   Requires @VK_EXT_direct_mode_display@
+--
+-- [__Contact__]
+--
+--     -   Jeff Juliano
+--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?title=VK_NV_acquire_winrt_display:%20&body=@jjuliano%20 >
+--
+-- == Other Extension Metadata
+--
+-- [__Last Modified Date__]
+--     2020-09-29
+--
+-- [__IP Status__]
+--     No known IP claims.
+--
+-- [__Contributors__]
+--
+--     -   Jeff Juliano, NVIDIA
+--
+-- == Description
+--
+-- This extension allows an application to take exclusive control of a
+-- display on Windows 10 provided that the display is not already
+-- controlled by a compositor. Examples of compositors include the Windows
+-- desktop compositor, other applications using this Vulkan extension, and
+-- applications that
+-- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaymanager.tryacquiretarget “Acquire”>
+-- a
+-- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget “DisplayTarget”>
+-- using a <https://docs.microsoft.com/en-us/uwp/api/ “WinRT”> command such
+-- as
+-- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaymanager.tryacquiretarget “winrt::Windows::Devices::Display::Core::DisplayManager.TryAcquireTarget()”>.
+--
+-- When control is acquired the application has exclusive access to the
+-- display until control is released or the application terminates. An
+-- application’s attempt to acquire is denied if a different application
+-- has already acquired the display.
+--
+-- == New Commands
+--
+-- -   'acquireWinrtDisplayNV'
+--
+-- -   'getWinrtDisplayNV'
+--
+-- == New Enum Constants
+--
+-- -   'NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME'
+--
+-- -   'NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION'
+--
+-- == Issues
+--
+-- 1) What should the platform substring be for this extension:
+--
+-- __RESOLVED__: The platform substring is “Winrt”.
+--
+-- The substring “Winrt” matches the fact that the OS API exposing the
+-- acquire and release functionality is called “WinRT”.
+--
+-- The substring “Win32” is wrong because the related “WinRT” API is
+-- explicitly __not__ a “Win32” API. “WinRT” is a competing API family to
+-- the “Win32” API family.
+--
+-- The substring “Windows” is suboptimal because there could be more than
+-- one relevant API on the Windows platform. There is preference to use the
+-- more-specific substring “Winrt”.
+--
+-- 2) Should 'acquireWinrtDisplayNV' take a winRT DisplayTarget, or a
+-- Vulkan display handle as input?
+--
+-- __RESOLVED__: A Vulkan display handle. This matches the design of
+-- 'Vulkan.Extensions.VK_EXT_acquire_xlib_display.acquireXlibDisplayEXT'.
+--
+-- 3) Should the acquire command be platform-independent named
+-- “vkAcquireDisplayNV”, or platform-specific named
+-- “vkAcquireWinrtDisplayNV”?
+--
+-- __RESOLVED__: Add a platform-specific command.
+--
+-- The inputs to the Acquire command are all Vulkan types. None are WinRT
+-- types. This opens the possibility of the winrt extension defining a
+-- platform-independent acquire command.
+--
+-- The X11 acquire command does need to accept a platform-specific
+-- parameter. This could be handled by adding to a platform-independent
+-- acquire command a params struct to which platform-dependent types can be
+-- chained by pNext pointer.
+--
+-- The prevailing opinion is that it would be odd to create a second
+-- platform-independent function that is used on the Windows 10 platform,
+-- but that is not used for the X11 platform. Since a Windows 10
+-- platform-specific command is needed anyway for converting between
+-- vkDisplayKHR and platform-native handles, opinion was to create a
+-- platform-specific acquire function.
+--
+-- 4) Should the 'getWinrtDisplayNV' parameter identifying a display be
+-- named “deviceRelativeId” or “adapterRelativeId”?
+--
+-- __RESOLVED__: The WinRT name is “AdapterRelativeId”. The name “adapter”
+-- is the Windows analog to a Vulkan “physical device”. Vulkan already has
+-- precedent to use the name @deviceLUID@ for the concept that Windows APIs
+-- call “AdapterLuid”. Keeping form with this precedent, the name
+-- “deviceRelativeId” is chosen.
+--
+-- 5) Does 'acquireWinrtDisplayNV' cause the Windows desktop compositor to
+-- release a display?
+--
+-- __RESOLVED__: No. 'acquireWinrtDisplayNV' does not itself cause the
+-- Windows desktop compositor to release a display. This action must be
+-- performed outside of Vulkan.
+--
+-- Beginning with Windows 10 version 2004 it is possible to cause the
+-- Windows desktop compositor to release a display by using the “Advanced
+-- display settings” sub-page of the “Display settings” control panel. See
+-- <https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors>
+--
+-- 6) Where can one find additional information about custom compositors
+-- for Windows 10?
+--
+-- __RESOLVED__: Relevant references are as follows.
+--
+-- According to Microsoft’s documentation on
+-- <https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors-compositor \"building a custom compositor\">,
+-- the ability to write a custom compositor is not a replacement for a
+-- fullscreen desktop window. The feature is for writing compositor apps
+-- that drive specialized hardware.
+--
+-- Only certain editions of Windows 10 support custom compositors,
+-- <https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors#windows-10-version-2004 \"documented here\">.
+-- The product type can be queried from Windows 10. See
+-- <https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getproductinfo>
+--
+-- == Version History
+--
+-- -   Revision 1, 2020-09-29 (Jeff Juliano)
+--
+--     -   Initial draft
+--
+-- = See Also
+--
+-- 'acquireWinrtDisplayNV', 'getWinrtDisplayNV'
+--
+-- = Document Notes
+--
+-- For more information, see the
+-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_acquire_winrt_display Vulkan Specification>
+--
+-- This page is a generated document. Fixes and changes should be made to
+-- the generator scripts, not directly.
+module Vulkan.Extensions.VK_NV_acquire_winrt_display  ( acquireWinrtDisplayNV
+                                                      , getWinrtDisplayNV
+                                                      , NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION
+                                                      , pattern NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION
+                                                      , NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME
+                                                      , pattern NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME
+                                                      , DisplayKHR(..)
+                                                      ) where
+
+import Vulkan.Internal.Utils (traceAroundEvent)
+import Control.Exception.Base (bracket)
+import Control.Monad (unless)
+import Control.Monad.IO.Class (liftIO)
+import Foreign.Marshal.Alloc (callocBytes)
+import Foreign.Marshal.Alloc (free)
+import GHC.Base (when)
+import GHC.IO (throwIO)
+import GHC.Ptr (nullFunPtr)
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.Trans.Cont (evalContT)
+import Control.Monad.IO.Class (MonadIO)
+import Data.String (IsString)
+import Foreign.Storable (Storable(peek))
+import GHC.IO.Exception (IOErrorType(..))
+import GHC.IO.Exception (IOException(..))
+import Foreign.Ptr (FunPtr)
+import Foreign.Ptr (Ptr)
+import Data.Word (Word32)
+import Control.Monad.Trans.Cont (ContT(..))
+import Vulkan.NamedType ((:::))
+import Vulkan.Extensions.Handles (DisplayKHR)
+import Vulkan.Extensions.Handles (DisplayKHR(..))
+import Vulkan.Dynamic (InstanceCmds(pVkAcquireWinrtDisplayNV))
+import Vulkan.Dynamic (InstanceCmds(pVkGetWinrtDisplayNV))
+import Vulkan.Core10.Handles (PhysicalDevice)
+import Vulkan.Core10.Handles (PhysicalDevice(..))
+import Vulkan.Core10.Handles (PhysicalDevice_T)
+import Vulkan.Core10.Enums.Result (Result)
+import Vulkan.Core10.Enums.Result (Result(..))
+import Vulkan.Exception (VulkanException(..))
+import Vulkan.Core10.Enums.Result (Result(SUCCESS))
+import Vulkan.Extensions.Handles (DisplayKHR(..))
+foreign import ccall
+#if !defined(SAFE_FOREIGN_CALLS)
+  unsafe
+#endif
+  "dynamic" mkVkAcquireWinrtDisplayNV
+  :: FunPtr (Ptr PhysicalDevice_T -> DisplayKHR -> IO Result) -> Ptr PhysicalDevice_T -> DisplayKHR -> IO Result
+
+-- | vkAcquireWinrtDisplayNV - Acquire access to a VkDisplayKHR
+--
+-- = Description
+--
+-- All permissions necessary to control the display are granted to the
+-- Vulkan instance associated with @physicalDevice@ until the display is
+-- released or the application is terminated. Permission to access the
+-- display /may/ be revoked by events that cause Windows 10 itself to lose
+-- access to @display@. If this has happened, operations which require
+-- access to the display /must/ fail with an appropriate error code. If
+-- permission to access @display@ has already been acquired by another
+-- entity, the call /must/ return the error code
+-- 'Vulkan.Core10.Enums.Result.ERROR_INITIALIZATION_FAILED'.
+--
+-- Note
+--
+-- The Vulkan instance acquires control of a
+-- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget “winrt::Windows::Devices::Display::Core::DisplayTarget”>
+-- by performing an operation equivalent to
+-- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaymanager.tryacquiretarget “winrt::Windows::Devices::Display::Core::DisplayManager.TryAcquireTarget()”>
+-- on the “DisplayTarget”.
+--
+-- Note
+--
+-- One example of when Windows 10 loses access to a display is when the
+-- display is hot-unplugged.
+--
+-- Note
+--
+-- One example of when a display has already been acquired by another
+-- entity is when the Windows desktop compositor (DWM) is in control of the
+-- display. Beginning with Windows 10 version 2004 it is possible to cause
+-- DWM to release a display by using the “Advanced display settings”
+-- sub-page of the “Display settings” control panel.
+-- 'acquireWinrtDisplayNV' does not itself cause DWM to release a display;
+-- this action must be performed outside of Vulkan.
+--
+-- == Return Codes
+--
+-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
+--
+--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
+--
+-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
+--
+--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
+--
+--     -   'Vulkan.Core10.Enums.Result.ERROR_DEVICE_LOST'
+--
+--     -   'Vulkan.Core10.Enums.Result.ERROR_INITIALIZATION_FAILED'
+--
+-- = See Also
+--
+-- 'Vulkan.Extensions.Handles.DisplayKHR',
+-- 'Vulkan.Core10.Handles.PhysicalDevice'
+acquireWinrtDisplayNV :: forall io
+                       . (MonadIO io)
+                      => -- | @physicalDevice@ The physical device the display is on.
+                         --
+                         -- #VUID-vkAcquireWinrtDisplayNV-physicalDevice-parameter# @physicalDevice@
+                         -- /must/ be a valid 'Vulkan.Core10.Handles.PhysicalDevice' handle
+                         PhysicalDevice
+                      -> -- | @display@ The display the caller wishes to control in Vulkan.
+                         --
+                         -- #VUID-vkAcquireWinrtDisplayNV-display-parameter# @display@ /must/ be a
+                         -- valid 'Vulkan.Extensions.Handles.DisplayKHR' handle
+                         --
+                         -- #VUID-vkAcquireWinrtDisplayNV-display-parent# @display@ /must/ have been
+                         -- created, allocated, or retrieved from @physicalDevice@
+                         DisplayKHR
+                      -> io ()
+acquireWinrtDisplayNV physicalDevice display = liftIO $ do
+  let vkAcquireWinrtDisplayNVPtr = pVkAcquireWinrtDisplayNV (instanceCmds (physicalDevice :: PhysicalDevice))
+  unless (vkAcquireWinrtDisplayNVPtr /= nullFunPtr) $
+    throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkAcquireWinrtDisplayNV is null" Nothing Nothing
+  let vkAcquireWinrtDisplayNV' = mkVkAcquireWinrtDisplayNV vkAcquireWinrtDisplayNVPtr
+  r <- traceAroundEvent "vkAcquireWinrtDisplayNV" (vkAcquireWinrtDisplayNV' (physicalDeviceHandle (physicalDevice)) (display))
+  when (r < SUCCESS) (throwIO (VulkanException r))
+
+
+foreign import ccall
+#if !defined(SAFE_FOREIGN_CALLS)
+  unsafe
+#endif
+  "dynamic" mkVkGetWinrtDisplayNV
+  :: FunPtr (Ptr PhysicalDevice_T -> Word32 -> Ptr DisplayKHR -> IO Result) -> Ptr PhysicalDevice_T -> Word32 -> Ptr DisplayKHR -> IO Result
+
+-- | vkGetWinrtDisplayNV - Query the VkDisplayKHR corresponding to a WinRT
+-- DisplayTarget
+--
+-- = Description
+--
+-- If there is no 'Vulkan.Extensions.Handles.DisplayKHR' corresponding to
+-- @deviceRelativeId@ on @physicalDevice@,
+-- 'Vulkan.Core10.APIConstants.NULL_HANDLE' /must/ be returned in
+-- @pDisplay@.
+--
+-- == Return Codes
+--
+-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
+--
+--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
+--
+-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
+--
+--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
+--
+--     -   'Vulkan.Core10.Enums.Result.ERROR_DEVICE_LOST'
+--
+--     -   'Vulkan.Core10.Enums.Result.ERROR_INITIALIZATION_FAILED'
+--
+-- = See Also
+--
+-- 'Vulkan.Extensions.Handles.DisplayKHR',
+-- 'Vulkan.Core10.Handles.PhysicalDevice'
+getWinrtDisplayNV :: forall io
+                   . (MonadIO io)
+                  => -- | @physicalDevice@ The physical device on which to query the display
+                     -- handle.
+                     --
+                     -- #VUID-vkGetWinrtDisplayNV-physicalDevice-parameter# @physicalDevice@
+                     -- /must/ be a valid 'Vulkan.Core10.Handles.PhysicalDevice' handle
+                     PhysicalDevice
+                  -> -- | @deviceRelativeId@ The value of the
+                     -- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget.adapterrelativeid “AdapterRelativeId”>
+                     -- property of a
+                     -- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget “DisplayTarget”>
+                     -- that is enumerated by a
+                     -- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displayadapter “DisplayAdapter”>
+                     -- with an
+                     -- <https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displayadapter.id “Id”>
+                     -- property matching the @deviceLUID@ property of a
+                     -- 'Vulkan.Core11.Promoted_From_VK_KHR_external_memory_capabilities.PhysicalDeviceIDProperties'
+                     -- for @physicalDevice@.
+                     ("deviceRelativeId" ::: Word32)
+                  -> io (DisplayKHR)
+getWinrtDisplayNV physicalDevice deviceRelativeId = liftIO . evalContT $ do
+  let vkGetWinrtDisplayNVPtr = pVkGetWinrtDisplayNV (instanceCmds (physicalDevice :: PhysicalDevice))
+  lift $ unless (vkGetWinrtDisplayNVPtr /= nullFunPtr) $
+    throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetWinrtDisplayNV is null" Nothing Nothing
+  let vkGetWinrtDisplayNV' = mkVkGetWinrtDisplayNV vkGetWinrtDisplayNVPtr
+  pPDisplay <- ContT $ bracket (callocBytes @DisplayKHR 8) free
+  r <- lift $ traceAroundEvent "vkGetWinrtDisplayNV" (vkGetWinrtDisplayNV' (physicalDeviceHandle (physicalDevice)) (deviceRelativeId) (pPDisplay))
+  lift $ when (r < SUCCESS) (throwIO (VulkanException r))
+  pDisplay <- lift $ peek @DisplayKHR pPDisplay
+  pure $ (pDisplay)
+
+
+type NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION = 1
+
+-- No documentation found for TopLevel "VK_NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION"
+pattern NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION :: forall a . Integral a => a
+pattern NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION = 1
+
+
+type NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME = "VK_NV_acquire_winrt_display"
+
+-- No documentation found for TopLevel "VK_NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME"
+pattern NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
+pattern NV_ACQUIRE_WINRT_DISPLAY_EXTENSION_NAME = "VK_NV_acquire_winrt_display"
+
diff --git a/src/Vulkan/Extensions/VK_NV_clip_space_w_scaling.hs b/src/Vulkan/Extensions/VK_NV_clip_space_w_scaling.hs
--- a/src/Vulkan/Extensions/VK_NV_clip_space_w_scaling.hs
+++ b/src/Vulkan/Extensions/VK_NV_clip_space_w_scaling.hs
@@ -212,6 +212,7 @@
                                                      , pattern NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME
                                                      ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -343,7 +344,7 @@
   let vkCmdSetViewportWScalingNV' = mkVkCmdSetViewportWScalingNV vkCmdSetViewportWScalingNVPtr
   pPViewportWScalings <- ContT $ allocaBytesAligned @ViewportWScalingNV ((Data.Vector.length (viewportWScalings)) * 8) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPViewportWScalings `plusPtr` (8 * (i)) :: Ptr ViewportWScalingNV) (e)) (viewportWScalings)
-  lift $ vkCmdSetViewportWScalingNV' (commandBufferHandle (commandBuffer)) (firstViewport) ((fromIntegral (Data.Vector.length $ (viewportWScalings)) :: Word32)) (pPViewportWScalings)
+  lift $ traceAroundEvent "vkCmdSetViewportWScalingNV" (vkCmdSetViewportWScalingNV' (commandBufferHandle (commandBuffer)) (firstViewport) ((fromIntegral (Data.Vector.length $ (viewportWScalings)) :: Word32)) (pPViewportWScalings))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_NV_cooperative_matrix.hs b/src/Vulkan/Extensions/VK_NV_cooperative_matrix.hs
--- a/src/Vulkan/Extensions/VK_NV_cooperative_matrix.hs
+++ b/src/Vulkan/Extensions/VK_NV_cooperative_matrix.hs
@@ -178,6 +178,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -305,12 +306,12 @@
   let vkGetPhysicalDeviceCooperativeMatrixPropertiesNV' = mkVkGetPhysicalDeviceCooperativeMatrixPropertiesNV vkGetPhysicalDeviceCooperativeMatrixPropertiesNVPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPPropertyCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceCooperativeMatrixPropertiesNV' physicalDevice' (pPPropertyCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV" (vkGetPhysicalDeviceCooperativeMatrixPropertiesNV' physicalDevice' (pPPropertyCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPropertyCount <- lift $ peek @Word32 pPPropertyCount
   pPProperties <- ContT $ bracket (callocBytes @CooperativeMatrixPropertiesNV ((fromIntegral (pPropertyCount)) * 48)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPProperties `advancePtrBytes` (i * 48) :: Ptr CooperativeMatrixPropertiesNV) . ($ ())) [0..(fromIntegral (pPropertyCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceCooperativeMatrixPropertiesNV' physicalDevice' (pPPropertyCount) ((pPProperties))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV" (vkGetPhysicalDeviceCooperativeMatrixPropertiesNV' physicalDevice' (pPPropertyCount) ((pPProperties)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pPropertyCount' <- lift $ peek @Word32 pPPropertyCount
   pProperties' <- lift $ generateM (fromIntegral (pPropertyCount')) (\i -> peekCStruct @CooperativeMatrixPropertiesNV (((pPProperties) `advancePtrBytes` (48 * (i)) :: Ptr CooperativeMatrixPropertiesNV)))
diff --git a/src/Vulkan/Extensions/VK_NV_coverage_reduction_mode.hs b/src/Vulkan/Extensions/VK_NV_coverage_reduction_mode.hs
--- a/src/Vulkan/Extensions/VK_NV_coverage_reduction_mode.hs
+++ b/src/Vulkan/Extensions/VK_NV_coverage_reduction_mode.hs
@@ -147,6 +147,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -281,12 +282,12 @@
   let vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV' = mkVkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNVPtr
   let physicalDevice' = physicalDeviceHandle (physicalDevice)
   pPCombinationCount <- ContT $ bracket (callocBytes @Word32 4) free
-  r <- lift $ vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV' physicalDevice' (pPCombinationCount) (nullPtr)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV" (vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV' physicalDevice' (pPCombinationCount) (nullPtr))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pCombinationCount <- lift $ peek @Word32 pPCombinationCount
   pPCombinations <- ContT $ bracket (callocBytes @FramebufferMixedSamplesCombinationNV ((fromIntegral (pCombinationCount)) * 32)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPCombinations `advancePtrBytes` (i * 32) :: Ptr FramebufferMixedSamplesCombinationNV) . ($ ())) [0..(fromIntegral (pCombinationCount)) - 1]
-  r' <- lift $ vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV' physicalDevice' (pPCombinationCount) ((pPCombinations))
+  r' <- lift $ traceAroundEvent "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV" (vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV' physicalDevice' (pPCombinationCount) ((pPCombinations)))
   lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
   pCombinationCount' <- lift $ peek @Word32 pPCombinationCount
   pCombinations' <- lift $ generateM (fromIntegral (pCombinationCount')) (\i -> peekCStruct @FramebufferMixedSamplesCombinationNV (((pPCombinations) `advancePtrBytes` (32 * (i)) :: Ptr FramebufferMixedSamplesCombinationNV)))
diff --git a/src/Vulkan/Extensions/VK_NV_device_diagnostic_checkpoints.hs b/src/Vulkan/Extensions/VK_NV_device_diagnostic_checkpoints.hs
--- a/src/Vulkan/Extensions/VK_NV_device_diagnostic_checkpoints.hs
+++ b/src/Vulkan/Extensions/VK_NV_device_diagnostic_checkpoints.hs
@@ -114,6 +114,7 @@
                                                               , pattern NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME
                                                               ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -221,7 +222,7 @@
   unless (vkCmdSetCheckpointNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdSetCheckpointNV is null" Nothing Nothing
   let vkCmdSetCheckpointNV' = mkVkCmdSetCheckpointNV vkCmdSetCheckpointNVPtr
-  vkCmdSetCheckpointNV' (commandBufferHandle (commandBuffer)) (checkpointMarker)
+  traceAroundEvent "vkCmdSetCheckpointNV" (vkCmdSetCheckpointNV' (commandBufferHandle (commandBuffer)) (checkpointMarker))
   pure $ ()
 
 
@@ -283,11 +284,11 @@
   let vkGetQueueCheckpointDataNV' = mkVkGetQueueCheckpointDataNV vkGetQueueCheckpointDataNVPtr
   let queue' = queueHandle (queue)
   pPCheckpointDataCount <- ContT $ bracket (callocBytes @Word32 4) free
-  lift $ vkGetQueueCheckpointDataNV' queue' (pPCheckpointDataCount) (nullPtr)
+  lift $ traceAroundEvent "vkGetQueueCheckpointDataNV" (vkGetQueueCheckpointDataNV' queue' (pPCheckpointDataCount) (nullPtr))
   pCheckpointDataCount <- lift $ peek @Word32 pPCheckpointDataCount
   pPCheckpointData <- ContT $ bracket (callocBytes @CheckpointDataNV ((fromIntegral (pCheckpointDataCount)) * 32)) free
   _ <- traverse (\i -> ContT $ pokeZeroCStruct (pPCheckpointData `advancePtrBytes` (i * 32) :: Ptr CheckpointDataNV) . ($ ())) [0..(fromIntegral (pCheckpointDataCount)) - 1]
-  lift $ vkGetQueueCheckpointDataNV' queue' (pPCheckpointDataCount) ((pPCheckpointData))
+  lift $ traceAroundEvent "vkGetQueueCheckpointDataNV" (vkGetQueueCheckpointDataNV' queue' (pPCheckpointDataCount) ((pPCheckpointData)))
   pCheckpointDataCount' <- lift $ peek @Word32 pPCheckpointDataCount
   pCheckpointData' <- lift $ generateM (fromIntegral (pCheckpointDataCount')) (\i -> peekCStruct @CheckpointDataNV (((pPCheckpointData) `advancePtrBytes` (32 * (i)) :: Ptr CheckpointDataNV)))
   pure $ (pCheckpointData')
diff --git a/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs b/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs
--- a/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs
+++ b/src/Vulkan/Extensions/VK_NV_device_generated_commands.hs
@@ -582,6 +582,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -1204,7 +1205,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdExecuteGeneratedCommandsNV is null" Nothing Nothing
   let vkCmdExecuteGeneratedCommandsNV' = mkVkCmdExecuteGeneratedCommandsNV vkCmdExecuteGeneratedCommandsNVPtr
   pGeneratedCommandsInfo <- ContT $ withCStruct (generatedCommandsInfo)
-  lift $ vkCmdExecuteGeneratedCommandsNV' (commandBufferHandle (commandBuffer)) (boolToBool32 (isPreprocessed)) pGeneratedCommandsInfo
+  lift $ traceAroundEvent "vkCmdExecuteGeneratedCommandsNV" (vkCmdExecuteGeneratedCommandsNV' (commandBufferHandle (commandBuffer)) (boolToBool32 (isPreprocessed)) pGeneratedCommandsInfo)
   pure $ ()
 
 
@@ -1290,7 +1291,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdPreprocessGeneratedCommandsNV is null" Nothing Nothing
   let vkCmdPreprocessGeneratedCommandsNV' = mkVkCmdPreprocessGeneratedCommandsNV vkCmdPreprocessGeneratedCommandsNVPtr
   pGeneratedCommandsInfo <- ContT $ withCStruct (generatedCommandsInfo)
-  lift $ vkCmdPreprocessGeneratedCommandsNV' (commandBufferHandle (commandBuffer)) pGeneratedCommandsInfo
+  lift $ traceAroundEvent "vkCmdPreprocessGeneratedCommandsNV" (vkCmdPreprocessGeneratedCommandsNV' (commandBufferHandle (commandBuffer)) pGeneratedCommandsInfo)
   pure $ ()
 
 
@@ -1391,7 +1392,7 @@
   unless (vkCmdBindPipelineShaderGroupNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBindPipelineShaderGroupNV is null" Nothing Nothing
   let vkCmdBindPipelineShaderGroupNV' = mkVkCmdBindPipelineShaderGroupNV vkCmdBindPipelineShaderGroupNVPtr
-  vkCmdBindPipelineShaderGroupNV' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (pipeline) (groupIndex)
+  traceAroundEvent "vkCmdBindPipelineShaderGroupNV" (vkCmdBindPipelineShaderGroupNV' (commandBufferHandle (commandBuffer)) (pipelineBindPoint) (pipeline) (groupIndex))
   pure $ ()
 
 
@@ -1447,7 +1448,7 @@
   let vkGetGeneratedCommandsMemoryRequirementsNV' = mkVkGetGeneratedCommandsMemoryRequirementsNV vkGetGeneratedCommandsMemoryRequirementsNVPtr
   pInfo <- ContT $ withCStruct (info)
   pPMemoryRequirements <- ContT (withZeroCStruct @(MemoryRequirements2 _))
-  lift $ vkGetGeneratedCommandsMemoryRequirementsNV' (deviceHandle (device)) pInfo (forgetExtensions (pPMemoryRequirements))
+  lift $ traceAroundEvent "vkGetGeneratedCommandsMemoryRequirementsNV" (vkGetGeneratedCommandsMemoryRequirementsNV' (deviceHandle (device)) pInfo (forgetExtensions (pPMemoryRequirements)))
   pMemoryRequirements <- lift $ peekCStruct @(MemoryRequirements2 _) pPMemoryRequirements
   pure $ (pMemoryRequirements)
 
@@ -1527,7 +1528,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPIndirectCommandsLayout <- ContT $ bracket (callocBytes @IndirectCommandsLayoutNV 8) free
-  r <- lift $ vkCreateIndirectCommandsLayoutNV' (deviceHandle (device)) pCreateInfo pAllocator (pPIndirectCommandsLayout)
+  r <- lift $ traceAroundEvent "vkCreateIndirectCommandsLayoutNV" (vkCreateIndirectCommandsLayoutNV' (deviceHandle (device)) pCreateInfo pAllocator (pPIndirectCommandsLayout))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pIndirectCommandsLayout <- lift $ peek @IndirectCommandsLayoutNV pPIndirectCommandsLayout
   pure $ (pIndirectCommandsLayout)
@@ -1625,7 +1626,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyIndirectCommandsLayoutNV' (deviceHandle (device)) (indirectCommandsLayout) pAllocator
+  lift $ traceAroundEvent "vkDestroyIndirectCommandsLayoutNV" (vkDestroyIndirectCommandsLayoutNV' (deviceHandle (device)) (indirectCommandsLayout) pAllocator)
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_NV_external_memory_capabilities.hs b/src/Vulkan/Extensions/VK_NV_external_memory_capabilities.hs
--- a/src/Vulkan/Extensions/VK_NV_external_memory_capabilities.hs
+++ b/src/Vulkan/Extensions/VK_NV_external_memory_capabilities.hs
@@ -159,6 +159,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -317,7 +318,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetPhysicalDeviceExternalImageFormatPropertiesNV is null" Nothing Nothing
   let vkGetPhysicalDeviceExternalImageFormatPropertiesNV' = mkVkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNVPtr
   pPExternalImageFormatProperties <- ContT (withZeroCStruct @ExternalImageFormatPropertiesNV)
-  r <- lift $ vkGetPhysicalDeviceExternalImageFormatPropertiesNV' (physicalDeviceHandle (physicalDevice)) (format) (type') (tiling) (usage) (flags) (externalHandleType) (pPExternalImageFormatProperties)
+  r <- lift $ traceAroundEvent "vkGetPhysicalDeviceExternalImageFormatPropertiesNV" (vkGetPhysicalDeviceExternalImageFormatPropertiesNV' (physicalDeviceHandle (physicalDevice)) (format) (type') (tiling) (usage) (flags) (externalHandleType) (pPExternalImageFormatProperties))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pExternalImageFormatProperties <- lift $ peekCStruct @ExternalImageFormatPropertiesNV pPExternalImageFormatProperties
   pure $ (pExternalImageFormatProperties)
diff --git a/src/Vulkan/Extensions/VK_NV_external_memory_win32.hs b/src/Vulkan/Extensions/VK_NV_external_memory_win32.hs
--- a/src/Vulkan/Extensions/VK_NV_external_memory_win32.hs
+++ b/src/Vulkan/Extensions/VK_NV_external_memory_win32.hs
@@ -289,6 +289,7 @@
                                                       , ExternalMemoryHandleTypeFlagsNV
                                                       ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -404,7 +405,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetMemoryWin32HandleNV is null" Nothing Nothing
   let vkGetMemoryWin32HandleNV' = mkVkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNVPtr
   pPHandle <- ContT $ bracket (callocBytes @HANDLE 8) free
-  r <- lift $ vkGetMemoryWin32HandleNV' (deviceHandle (device)) (memory) (handleType) (pPHandle)
+  r <- lift $ traceAroundEvent "vkGetMemoryWin32HandleNV" (vkGetMemoryWin32HandleNV' (deviceHandle (device)) (memory) (handleType) (pPHandle))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pHandle <- lift $ peek @HANDLE pPHandle
   pure $ (pHandle)
diff --git a/src/Vulkan/Extensions/VK_NV_fragment_shading_rate_enums.hs b/src/Vulkan/Extensions/VK_NV_fragment_shading_rate_enums.hs
--- a/src/Vulkan/Extensions/VK_NV_fragment_shading_rate_enums.hs
+++ b/src/Vulkan/Extensions/VK_NV_fragment_shading_rate_enums.hs
@@ -205,6 +205,7 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -397,7 +398,7 @@
     (e0, e1) -> do
       poke (pCombinerOps' :: Ptr FragmentShadingRateCombinerOpKHR) (e0)
       poke (pCombinerOps' `plusPtr` 4 :: Ptr FragmentShadingRateCombinerOpKHR) (e1)
-  lift $ vkCmdSetFragmentShadingRateEnumNV' (commandBufferHandle (commandBuffer)) (shadingRate) (pCombinerOps)
+  lift $ traceAroundEvent "vkCmdSetFragmentShadingRateEnumNV" (vkCmdSetFragmentShadingRateEnumNV' (commandBufferHandle (commandBuffer)) (shadingRate) (pCombinerOps))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_NV_mesh_shader.hs b/src/Vulkan/Extensions/VK_NV_mesh_shader.hs
--- a/src/Vulkan/Extensions/VK_NV_mesh_shader.hs
+++ b/src/Vulkan/Extensions/VK_NV_mesh_shader.hs
@@ -268,6 +268,7 @@
                                             ) where
 
 import Vulkan.CStruct.Utils (FixedArray)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -779,7 +780,7 @@
   unless (vkCmdDrawMeshTasksNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawMeshTasksNV is null" Nothing Nothing
   let vkCmdDrawMeshTasksNV' = mkVkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNVPtr
-  vkCmdDrawMeshTasksNV' (commandBufferHandle (commandBuffer)) (taskCount) (firstTask)
+  traceAroundEvent "vkCmdDrawMeshTasksNV" (vkCmdDrawMeshTasksNV' (commandBufferHandle (commandBuffer)) (taskCount) (firstTask))
   pure $ ()
 
 
@@ -1306,7 +1307,7 @@
   unless (vkCmdDrawMeshTasksIndirectNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawMeshTasksIndirectNV is null" Nothing Nothing
   let vkCmdDrawMeshTasksIndirectNV' = mkVkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNVPtr
-  vkCmdDrawMeshTasksIndirectNV' (commandBufferHandle (commandBuffer)) (buffer) (offset) (drawCount) (stride)
+  traceAroundEvent "vkCmdDrawMeshTasksIndirectNV" (vkCmdDrawMeshTasksIndirectNV' (commandBufferHandle (commandBuffer)) (buffer) (offset) (drawCount) (stride))
   pure $ ()
 
 
@@ -1865,7 +1866,7 @@
   unless (vkCmdDrawMeshTasksIndirectCountNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdDrawMeshTasksIndirectCountNV is null" Nothing Nothing
   let vkCmdDrawMeshTasksIndirectCountNV' = mkVkCmdDrawMeshTasksIndirectCountNV vkCmdDrawMeshTasksIndirectCountNVPtr
-  vkCmdDrawMeshTasksIndirectCountNV' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride)
+  traceAroundEvent "vkCmdDrawMeshTasksIndirectCountNV" (vkCmdDrawMeshTasksIndirectCountNV' (commandBufferHandle (commandBuffer)) (buffer) (offset) (countBuffer) (countBufferOffset) (maxDrawCount) (stride))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_NV_ray_tracing.hs b/src/Vulkan/Extensions/VK_NV_ray_tracing.hs
--- a/src/Vulkan/Extensions/VK_NV_ray_tracing.hs
+++ b/src/Vulkan/Extensions/VK_NV_ray_tracing.hs
@@ -347,7 +347,7 @@
 --
 -- == New or Modified Built-In Variables
 --
--- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIDNV>
+-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIdNV>
 --
 -- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchsize LaunchSizeNV>
 --
@@ -570,6 +570,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Exception.Base (bracket)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
@@ -816,6 +817,9 @@
                      Device
                   -> -- | @pipeline@ is the ray tracing pipeline object containing the shaders.
                      --
+                     -- #VUID-vkCompileDeferredNV-pipeline-04621# @pipeline@ /must/ be a ray
+                     -- tracing pipeline
+                     --
                      -- #VUID-vkCompileDeferredNV-pipeline-02237# @pipeline@ /must/ have been
                      -- created with
                      -- 'Vulkan.Core10.Enums.PipelineCreateFlagBits.PIPELINE_CREATE_DEFER_COMPILE_BIT_NV'
@@ -837,7 +841,7 @@
   unless (vkCompileDeferredNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCompileDeferredNV is null" Nothing Nothing
   let vkCompileDeferredNV' = mkVkCompileDeferredNV vkCompileDeferredNVPtr
-  r <- vkCompileDeferredNV' (deviceHandle (device)) (pipeline) (shader)
+  r <- traceAroundEvent "vkCompileDeferredNV" (vkCompileDeferredNV' (deviceHandle (device)) (pipeline) (shader))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -920,7 +924,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPAccelerationStructure <- ContT $ bracket (callocBytes @AccelerationStructureNV 8) free
-  r <- lift $ vkCreateAccelerationStructureNV' (deviceHandle (device)) pCreateInfo pAllocator (pPAccelerationStructure)
+  r <- lift $ traceAroundEvent "vkCreateAccelerationStructureNV" (vkCreateAccelerationStructureNV' (deviceHandle (device)) pCreateInfo pAllocator (pPAccelerationStructure))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pAccelerationStructure <- lift $ peek @AccelerationStructureNV pPAccelerationStructure
   pure $ (pAccelerationStructure)
@@ -1014,7 +1018,7 @@
   pAllocator <- case (allocator) of
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
-  lift $ vkDestroyAccelerationStructureNV' (deviceHandle (device)) (accelerationStructure) pAllocator
+  lift $ traceAroundEvent "vkDestroyAccelerationStructureNV" (vkDestroyAccelerationStructureNV' (deviceHandle (device)) (accelerationStructure) pAllocator)
   pure $ ()
 
 
@@ -1058,7 +1062,7 @@
   let vkGetAccelerationStructureMemoryRequirementsNV' = mkVkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNVPtr
   pInfo <- ContT $ withCStruct (info)
   pPMemoryRequirements <- ContT (withZeroCStruct @(MemoryRequirements2KHR _))
-  lift $ vkGetAccelerationStructureMemoryRequirementsNV' (deviceHandle (device)) pInfo (forgetExtensions (pPMemoryRequirements))
+  lift $ traceAroundEvent "vkGetAccelerationStructureMemoryRequirementsNV" (vkGetAccelerationStructureMemoryRequirementsNV' (deviceHandle (device)) pInfo (forgetExtensions (pPMemoryRequirements)))
   pMemoryRequirements <- lift $ peekCStruct @(MemoryRequirements2KHR _) pPMemoryRequirements
   pure $ (pMemoryRequirements)
 
@@ -1111,7 +1115,7 @@
   let vkBindAccelerationStructureMemoryNV' = mkVkBindAccelerationStructureMemoryNV vkBindAccelerationStructureMemoryNVPtr
   pPBindInfos <- ContT $ allocaBytesAligned @BindAccelerationStructureMemoryInfoNV ((Data.Vector.length (bindInfos)) * 56) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPBindInfos `plusPtr` (56 * (i)) :: Ptr BindAccelerationStructureMemoryInfoNV) (e) . ($ ())) (bindInfos)
-  r <- lift $ vkBindAccelerationStructureMemoryNV' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (bindInfos)) :: Word32)) (pPBindInfos)
+  r <- lift $ traceAroundEvent "vkBindAccelerationStructureMemoryNV" (vkBindAccelerationStructureMemoryNV' (deviceHandle (device)) ((fromIntegral (Data.Vector.length $ (bindInfos)) :: Word32)) (pPBindInfos))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -1233,7 +1237,7 @@
   unless (vkCmdCopyAccelerationStructureNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdCopyAccelerationStructureNV is null" Nothing Nothing
   let vkCmdCopyAccelerationStructureNV' = mkVkCmdCopyAccelerationStructureNV vkCmdCopyAccelerationStructureNVPtr
-  vkCmdCopyAccelerationStructureNV' (commandBufferHandle (commandBuffer)) (dst) (src) (mode)
+  traceAroundEvent "vkCmdCopyAccelerationStructureNV" (vkCmdCopyAccelerationStructureNV' (commandBufferHandle (commandBuffer)) (dst) (src) (mode))
   pure $ ()
 
 
@@ -1374,7 +1378,7 @@
   let vkCmdWriteAccelerationStructuresPropertiesNV' = mkVkCmdWriteAccelerationStructuresPropertiesNV vkCmdWriteAccelerationStructuresPropertiesNVPtr
   pPAccelerationStructures <- ContT $ allocaBytesAligned @AccelerationStructureNV ((Data.Vector.length (accelerationStructures)) * 8) 8
   lift $ Data.Vector.imapM_ (\i e -> poke (pPAccelerationStructures `plusPtr` (8 * (i)) :: Ptr AccelerationStructureNV) (e)) (accelerationStructures)
-  lift $ vkCmdWriteAccelerationStructuresPropertiesNV' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (accelerationStructures)) :: Word32)) (pPAccelerationStructures) (queryType) (queryPool) (firstQuery)
+  lift $ traceAroundEvent "vkCmdWriteAccelerationStructuresPropertiesNV" (vkCmdWriteAccelerationStructuresPropertiesNV' (commandBufferHandle (commandBuffer)) ((fromIntegral (Data.Vector.length $ (accelerationStructures)) :: Word32)) (pPAccelerationStructures) (queryType) (queryPool) (firstQuery))
   pure $ ()
 
 
@@ -1585,7 +1589,7 @@
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBuildAccelerationStructureNV is null" Nothing Nothing
   let vkCmdBuildAccelerationStructureNV' = mkVkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNVPtr
   pInfo <- ContT $ withCStruct (info)
-  lift $ vkCmdBuildAccelerationStructureNV' (commandBufferHandle (commandBuffer)) pInfo (instanceData) (instanceOffset) (boolToBool32 (update)) (dst) (src) (scratch) (scratchOffset)
+  lift $ traceAroundEvent "vkCmdBuildAccelerationStructureNV" (vkCmdBuildAccelerationStructureNV' (commandBufferHandle (commandBuffer)) pInfo (instanceData) (instanceOffset) (boolToBool32 (update)) (dst) (src) (scratch) (scratchOffset))
   pure $ ()
 
 
@@ -1817,16 +1821,8 @@
 --     referenced by this call /must/ have been queried from the currently
 --     bound ray tracing shader pipeline
 --
--- -   #VUID-vkCmdTraceRaysNV-commandBuffer-02712# If @commandBuffer@ is a
---     protected command buffer, any resource written to by the
---     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
---     point used by this command /must/ not be an unprotected resource
---
--- -   #VUID-vkCmdTraceRaysNV-commandBuffer-02713# If @commandBuffer@ is a
---     protected command buffer, pipeline stages other than the
---     framebuffer-space and compute stages in the
---     'Vulkan.Core10.Handles.Pipeline' object bound to the pipeline bind
---     point /must/ not write to any resource
+-- -   #VUID-vkCmdTraceRaysNV-commandBuffer-04624# @commandBuffer@ /must/
+--     not be a protected command buffer
 --
 -- -   #VUID-vkCmdTraceRaysNV-maxRecursionDepth-03625# This command /must/
 --     not cause a trace ray instruction to be executed from a shader
@@ -2044,7 +2040,7 @@
   unless (vkCmdTraceRaysNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdTraceRaysNV is null" Nothing Nothing
   let vkCmdTraceRaysNV' = mkVkCmdTraceRaysNV vkCmdTraceRaysNVPtr
-  vkCmdTraceRaysNV' (commandBufferHandle (commandBuffer)) (raygenShaderBindingTableBuffer) (raygenShaderBindingOffset) (missShaderBindingTableBuffer) (missShaderBindingOffset) (missShaderBindingStride) (hitShaderBindingTableBuffer) (hitShaderBindingOffset) (hitShaderBindingStride) (callableShaderBindingTableBuffer) (callableShaderBindingOffset) (callableShaderBindingStride) (width) (height) (depth)
+  traceAroundEvent "vkCmdTraceRaysNV" (vkCmdTraceRaysNV' (commandBufferHandle (commandBuffer)) (raygenShaderBindingTableBuffer) (raygenShaderBindingOffset) (missShaderBindingTableBuffer) (missShaderBindingOffset) (missShaderBindingStride) (hitShaderBindingTableBuffer) (hitShaderBindingOffset) (hitShaderBindingStride) (callableShaderBindingTableBuffer) (callableShaderBindingOffset) (callableShaderBindingStride) (width) (height) (depth))
   pure $ ()
 
 
@@ -2117,7 +2113,7 @@
   unless (vkGetAccelerationStructureHandleNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkGetAccelerationStructureHandleNV is null" Nothing Nothing
   let vkGetAccelerationStructureHandleNV' = mkVkGetAccelerationStructureHandleNV vkGetAccelerationStructureHandleNVPtr
-  r <- vkGetAccelerationStructureHandleNV' (deviceHandle (device)) (accelerationStructure) (CSize (dataSize)) (data')
+  r <- traceAroundEvent "vkGetAccelerationStructureHandleNV" (vkGetAccelerationStructureHandleNV' (deviceHandle (device)) (accelerationStructure) (CSize (dataSize)) (data'))
   when (r < SUCCESS) (throwIO (VulkanException r))
 
 
@@ -2238,7 +2234,7 @@
     Nothing -> pure nullPtr
     Just j -> ContT $ withCStruct (j)
   pPPipelines <- ContT $ bracket (callocBytes @Pipeline ((fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) * 8)) free
-  r <- lift $ vkCreateRayTracingPipelinesNV' (deviceHandle (device)) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines)
+  r <- lift $ traceAroundEvent "vkCreateRayTracingPipelinesNV" (vkCreateRayTracingPipelinesNV' (deviceHandle (device)) (pipelineCache) ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32)) (forgetExtensions (pPCreateInfos)) pAllocator (pPPipelines))
   lift $ when (r < SUCCESS) (throwIO (VulkanException r))
   pPipelines <- lift $ generateM (fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) (\i -> peek @Pipeline ((pPPipelines `advancePtrBytes` (8 * (i)) :: Ptr Pipeline)))
   pure $ (r, pPipelines)
@@ -3285,6 +3281,9 @@
 --     'ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV' then the
 --     @geometryType@ member of each geometry in @pGeometries@ /must/ be
 --     the same
+--
+-- -   #VUID-VkAccelerationStructureInfoNV-type-04623# @type@ /must/ not be
+--     'Vulkan.Extensions.VK_KHR_acceleration_structure.ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR'
 --
 -- -   #VUID-VkAccelerationStructureInfoNV-flags-02592# If @flags@ has the
 --     'BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV' bit set,
diff --git a/src/Vulkan/Extensions/VK_NV_ray_tracing.hs-boot b/src/Vulkan/Extensions/VK_NV_ray_tracing.hs-boot
--- a/src/Vulkan/Extensions/VK_NV_ray_tracing.hs-boot
+++ b/src/Vulkan/Extensions/VK_NV_ray_tracing.hs-boot
@@ -347,7 +347,7 @@
 --
 -- == New or Modified Built-In Variables
 --
--- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIDNV>
+-- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchid LaunchIdNV>
 --
 -- -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#interfaces-builtin-variables-launchsize LaunchSizeNV>
 --
diff --git a/src/Vulkan/Extensions/VK_NV_scissor_exclusive.hs b/src/Vulkan/Extensions/VK_NV_scissor_exclusive.hs
--- a/src/Vulkan/Extensions/VK_NV_scissor_exclusive.hs
+++ b/src/Vulkan/Extensions/VK_NV_scissor_exclusive.hs
@@ -130,6 +130,7 @@
                                                   , pattern NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME
                                                   ) where
 
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -296,7 +297,7 @@
   let vkCmdSetExclusiveScissorNV' = mkVkCmdSetExclusiveScissorNV vkCmdSetExclusiveScissorNVPtr
   pPExclusiveScissors <- ContT $ allocaBytesAligned @Rect2D ((Data.Vector.length (exclusiveScissors)) * 16) 4
   lift $ Data.Vector.imapM_ (\i e -> poke (pPExclusiveScissors `plusPtr` (16 * (i)) :: Ptr Rect2D) (e)) (exclusiveScissors)
-  lift $ vkCmdSetExclusiveScissorNV' (commandBufferHandle (commandBuffer)) (firstExclusiveScissor) ((fromIntegral (Data.Vector.length $ (exclusiveScissors)) :: Word32)) (pPExclusiveScissors)
+  lift $ traceAroundEvent "vkCmdSetExclusiveScissorNV" (vkCmdSetExclusiveScissorNV' (commandBufferHandle (commandBuffer)) (firstExclusiveScissor) ((fromIntegral (Data.Vector.length $ (exclusiveScissors)) :: Word32)) (pPExclusiveScissors))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_NV_shading_rate_image.hs b/src/Vulkan/Extensions/VK_NV_shading_rate_image.hs
--- a/src/Vulkan/Extensions/VK_NV_shading_rate_image.hs
+++ b/src/Vulkan/Extensions/VK_NV_shading_rate_image.hs
@@ -312,6 +312,7 @@
 
 import Vulkan.Internal.Utils (enumReadPrec)
 import Vulkan.Internal.Utils (enumShowsPrec)
+import Vulkan.Internal.Utils (traceAroundEvent)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
@@ -484,7 +485,7 @@
   unless (vkCmdBindShadingRateImageNVPtr /= nullFunPtr) $
     throwIO $ IOError Nothing InvalidArgument "" "The function pointer for vkCmdBindShadingRateImageNV is null" Nothing Nothing
   let vkCmdBindShadingRateImageNV' = mkVkCmdBindShadingRateImageNV vkCmdBindShadingRateImageNVPtr
-  vkCmdBindShadingRateImageNV' (commandBufferHandle (commandBuffer)) (imageView) (imageLayout)
+  traceAroundEvent "vkCmdBindShadingRateImageNV" (vkCmdBindShadingRateImageNV' (commandBufferHandle (commandBuffer)) (imageView) (imageLayout))
   pure $ ()
 
 
@@ -581,7 +582,7 @@
   let vkCmdSetViewportShadingRatePaletteNV' = mkVkCmdSetViewportShadingRatePaletteNV vkCmdSetViewportShadingRatePaletteNVPtr
   pPShadingRatePalettes <- ContT $ allocaBytesAligned @ShadingRatePaletteNV ((Data.Vector.length (shadingRatePalettes)) * 16) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPShadingRatePalettes `plusPtr` (16 * (i)) :: Ptr ShadingRatePaletteNV) (e) . ($ ())) (shadingRatePalettes)
-  lift $ vkCmdSetViewportShadingRatePaletteNV' (commandBufferHandle (commandBuffer)) (firstViewport) ((fromIntegral (Data.Vector.length $ (shadingRatePalettes)) :: Word32)) (pPShadingRatePalettes)
+  lift $ traceAroundEvent "vkCmdSetViewportShadingRatePaletteNV" (vkCmdSetViewportShadingRatePaletteNV' (commandBufferHandle (commandBuffer)) (firstViewport) ((fromIntegral (Data.Vector.length $ (shadingRatePalettes)) :: Word32)) (pPShadingRatePalettes))
   pure $ ()
 
 
@@ -677,7 +678,7 @@
   let vkCmdSetCoarseSampleOrderNV' = mkVkCmdSetCoarseSampleOrderNV vkCmdSetCoarseSampleOrderNVPtr
   pPCustomSampleOrders <- ContT $ allocaBytesAligned @CoarseSampleOrderCustomNV ((Data.Vector.length (customSampleOrders)) * 24) 8
   Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPCustomSampleOrders `plusPtr` (24 * (i)) :: Ptr CoarseSampleOrderCustomNV) (e) . ($ ())) (customSampleOrders)
-  lift $ vkCmdSetCoarseSampleOrderNV' (commandBufferHandle (commandBuffer)) (sampleOrderType) ((fromIntegral (Data.Vector.length $ (customSampleOrders)) :: Word32)) (pPCustomSampleOrders)
+  lift $ traceAroundEvent "vkCmdSetCoarseSampleOrderNV" (vkCmdSetCoarseSampleOrderNV' (commandBufferHandle (commandBuffer)) (sampleOrderType) ((fromIntegral (Data.Vector.length $ (customSampleOrders)) :: Word32)) (pPCustomSampleOrders))
   pure $ ()
 
 
diff --git a/src/Vulkan/Extensions/VK_VALVE_mutable_descriptor_type.hs b/src/Vulkan/Extensions/VK_VALVE_mutable_descriptor_type.hs
new file mode 100644
--- /dev/null
+++ b/src/Vulkan/Extensions/VK_VALVE_mutable_descriptor_type.hs
@@ -0,0 +1,461 @@
+{-# language CPP #-}
+-- | = Name
+--
+-- VK_VALVE_mutable_descriptor_type - device extension
+--
+-- == VK_VALVE_mutable_descriptor_type
+--
+-- [__Name String__]
+--     @VK_VALVE_mutable_descriptor_type@
+--
+-- [__Extension Type__]
+--     Device extension
+--
+-- [__Registered Extension Number__]
+--     352
+--
+-- [__Revision__]
+--     1
+--
+-- [__Extension and Version Dependencies__]
+--
+--     -   Requires Vulkan 1.0
+--
+--     -   Requires @VK_KHR_maintenance3@
+--
+-- [__Special Use__]
+--
+--     -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-compatibility-specialuse D3D support>
+--
+-- [__Contact__]
+--
+--     -   Joshua Ashton
+--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?title=VK_VALVE_mutable_descriptor_type:%20&body=@Joshua-Ashton%20 >
+--
+--     -   Hans-Kristian Arntzen
+--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?title=VK_VALVE_mutable_descriptor_type:%20&body=@HansKristian-Work%20 >
+--
+-- == Other Extension Metadata
+--
+-- [__Last Modified Date__]
+--     2020-12-02
+--
+-- [__IP Status__]
+--     No known IP claims.
+--
+-- [__Contributors__]
+--
+--     -   Joshua Ashton, Valve
+--
+--     -   Hans-Kristian Arntzen, Valve
+--
+-- == Description
+--
+-- This extension allows applications to reduce descriptor memory footprint
+-- by allowing a descriptor to be able to mutate to a given list of
+-- descriptor types depending on which descriptor types are written into,
+-- or copied into a descriptor set.
+--
+-- The main use case this extension intends to address is descriptor
+-- indexing with
+-- 'Vulkan.Core12.Enums.DescriptorBindingFlagBits.DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT'
+-- where the descriptor types are completely generic, as this means
+-- applications can allocate one large descriptor set, rather than having
+-- one large descriptor set per descriptor type, which significantly bloats
+-- descriptor memory usage and causes performance issues.
+--
+-- This extension also adds a mechanism to declare that a descriptor pool,
+-- and therefore the descriptor sets that are allocated from it, reside
+-- only in host memory; as such these descriptors can only be
+-- updated\/copied, but not bound.
+--
+-- These features together allow much more efficient emulation of the raw
+-- D3D12 binding model. This extension is primarily intended to be useful
+-- for API layering efforts.
+--
+-- == New Structures
+--
+-- -   'MutableDescriptorTypeListVALVE'
+--
+-- -   Extending
+--     'Vulkan.Core10.DescriptorSet.DescriptorSetLayoutCreateInfo',
+--     'Vulkan.Core10.DescriptorSet.DescriptorPoolCreateInfo':
+--
+--     -   'MutableDescriptorTypeCreateInfoVALVE'
+--
+-- -   Extending
+--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
+--     'Vulkan.Core10.Device.DeviceCreateInfo':
+--
+--     -   'PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'
+--
+-- == New Enum Constants
+--
+-- -   'VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME'
+--
+-- -   'VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION'
+--
+-- -   Extending
+--     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DescriptorPoolCreateFlagBits':
+--
+--     -   'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+--
+-- -   Extending
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DescriptorSetLayoutCreateFlagBits':
+--
+--     -   'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE'
+--
+-- -   Extending 'Vulkan.Core10.Enums.DescriptorType.DescriptorType':
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
+--
+--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE'
+--
+--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE'
+--
+-- == Version History
+--
+-- -   Revision 1, 2020-12-01 (Joshua Ashton, Hans-Kristian Arntzen)
+--
+--     -   Initial specification, squashed from public draft.
+--
+-- = See Also
+--
+-- 'MutableDescriptorTypeCreateInfoVALVE',
+-- 'MutableDescriptorTypeListVALVE',
+-- 'PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'
+--
+-- = Document Notes
+--
+-- For more information, see the
+-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VALVE_mutable_descriptor_type Vulkan Specification>
+--
+-- This page is a generated document. Fixes and changes should be made to
+-- the generator scripts, not directly.
+module Vulkan.Extensions.VK_VALVE_mutable_descriptor_type  ( PhysicalDeviceMutableDescriptorTypeFeaturesVALVE(..)
+                                                           , MutableDescriptorTypeListVALVE(..)
+                                                           , MutableDescriptorTypeCreateInfoVALVE(..)
+                                                           , VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION
+                                                           , pattern VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION
+                                                           , VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME
+                                                           , pattern VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME
+                                                           ) where
+
+import Foreign.Marshal.Alloc (allocaBytesAligned)
+import Foreign.Ptr (nullPtr)
+import Foreign.Ptr (plusPtr)
+import Control.Monad.Trans.Class (lift)
+import Control.Monad.Trans.Cont (evalContT)
+import Data.Vector (generateM)
+import qualified Data.Vector (imapM_)
+import qualified Data.Vector (length)
+import Data.String (IsString)
+import Data.Typeable (Typeable)
+import Foreign.Storable (Storable)
+import Foreign.Storable (Storable(peek))
+import Foreign.Storable (Storable(poke))
+import qualified Foreign.Storable (Storable(..))
+import GHC.Generics (Generic)
+import Foreign.Ptr (Ptr)
+import Data.Word (Word32)
+import Data.Kind (Type)
+import Control.Monad.Trans.Cont (ContT(..))
+import Data.Vector (Vector)
+import Vulkan.CStruct.Utils (advancePtrBytes)
+import Vulkan.Core10.FundamentalTypes (bool32ToBool)
+import Vulkan.Core10.FundamentalTypes (boolToBool32)
+import Vulkan.Core10.FundamentalTypes (Bool32)
+import Vulkan.Core10.Enums.DescriptorType (DescriptorType)
+import Vulkan.CStruct (FromCStruct)
+import Vulkan.CStruct (FromCStruct(..))
+import Vulkan.Core10.Enums.StructureType (StructureType)
+import Vulkan.CStruct (ToCStruct)
+import Vulkan.CStruct (ToCStruct(..))
+import Vulkan.Zero (Zero(..))
+import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE))
+import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE))
+-- | VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE - Structure
+-- describing whether the mutable descriptor type is supported
+--
+-- = Members
+--
+-- The members of the 'PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'
+-- structure describe the following features:
+--
+-- = Description
+--
+-- -   #features-mutableDescriptorType# @mutableDescriptorType@ indicates
+--     that the implementation /must/ support using the
+--     'Vulkan.Core10.Enums.DescriptorType.DescriptorType' of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--     with at least the following descriptor types, where any combination
+--     of the types /must/ be supported:
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_SAMPLED_IMAGE'
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_STORAGE_IMAGE'
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER'
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER'
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_UNIFORM_BUFFER'
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_STORAGE_BUFFER'
+--
+-- -   Additionally, @mutableDescriptorType@ indicates that:
+--
+--     -   Non-uniform descriptor indexing /must/ be supported if all
+--         descriptor types in a 'MutableDescriptorTypeListVALVE' for
+--         'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--         have the corresponding non-uniform indexing features enabled in
+--         'Vulkan.Core12.Promoted_From_VK_EXT_descriptor_indexing.PhysicalDeviceDescriptorIndexingFeatures'.
+--
+--     -   'Vulkan.Core12.Enums.DescriptorBindingFlagBits.DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT'
+--         with @descriptorType@ of
+--         'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--         relaxes the list of required descriptor types to the descriptor
+--         types which have the corresponding update-after-bind feature
+--         enabled in
+--         'Vulkan.Core12.Promoted_From_VK_EXT_descriptor_indexing.PhysicalDeviceDescriptorIndexingFeatures'.
+--
+--     -   Dynamically uniform descriptor indexing /must/ be supported if
+--         all descriptor types in a 'MutableDescriptorTypeListVALVE' for
+--         'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--         have the corresponding dynamic indexing features enabled.
+--
+--     -   'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE'
+--         /must/ be supported.
+--
+--     -   'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+--         /must/ be supported.
+--
+-- == Valid Usage (Implicit)
+--
+-- -   #VUID-VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE-sType-sType#
+--     @sType@ /must/ be
+--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE'
+--
+-- = See Also
+--
+-- 'Vulkan.Core10.FundamentalTypes.Bool32',
+-- 'Vulkan.Core10.Enums.StructureType.StructureType'
+data PhysicalDeviceMutableDescriptorTypeFeaturesVALVE = PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+  { -- No documentation found for Nested "VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE" "mutableDescriptorType"
+    mutableDescriptorType :: Bool }
+  deriving (Typeable, Eq)
+#if defined(GENERIC_INSTANCES)
+deriving instance Generic (PhysicalDeviceMutableDescriptorTypeFeaturesVALVE)
+#endif
+deriving instance Show PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+
+instance ToCStruct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE where
+  withCStruct x f = allocaBytesAligned 24 8 $ \p -> pokeCStruct p x (f p)
+  pokeCStruct p PhysicalDeviceMutableDescriptorTypeFeaturesVALVE{..} f = do
+    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE)
+    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    poke ((p `plusPtr` 16 :: Ptr Bool32)) (boolToBool32 (mutableDescriptorType))
+    f
+  cStructSize = 24
+  cStructAlignment = 8
+  pokeZeroCStruct p f = do
+    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE)
+    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    poke ((p `plusPtr` 16 :: Ptr Bool32)) (boolToBool32 (zero))
+    f
+
+instance FromCStruct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE where
+  peekCStruct p = do
+    mutableDescriptorType <- peek @Bool32 ((p `plusPtr` 16 :: Ptr Bool32))
+    pure $ PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+             (bool32ToBool mutableDescriptorType)
+
+instance Storable PhysicalDeviceMutableDescriptorTypeFeaturesVALVE where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek = peekCStruct
+  poke ptr poked = pokeCStruct ptr poked (pure ())
+
+instance Zero PhysicalDeviceMutableDescriptorTypeFeaturesVALVE where
+  zero = PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+           zero
+
+
+-- | VkMutableDescriptorTypeListVALVE - Structure describing descriptor types
+-- that a given descriptor may mutate to
+--
+-- == Valid Usage
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-descriptorTypeCount-04597#
+--     @descriptorTypeCount@ /must/ not be @0@ if the corresponding binding
+--     is of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04598#
+--     @pDescriptorTypes@ /must/ be a valid pointer to an array of
+--     @descriptorTypeCount@ valid, unique
+--     'Vulkan.Core10.Enums.DescriptorType.DescriptorType' values if the
+--     given binding is of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--     type
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-descriptorTypeCount-04599#
+--     @descriptorTypeCount@ /must/ be @0@ if the corresponding binding is
+--     not of
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04600#
+--     @pDescriptorTypes@ /must/ not contain
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04601#
+--     @pDescriptorTypes@ /must/ not contain
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC'
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04602#
+--     @pDescriptorTypes@ /must/ not contain
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC'
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04603#
+--     @pDescriptorTypes@ /must/ not contain
+--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT'
+--
+-- == Valid Usage (Implicit)
+--
+-- -   #VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-parameter#
+--     If @descriptorTypeCount@ is not @0@, @pDescriptorTypes@ /must/ be a
+--     valid pointer to an array of @descriptorTypeCount@ valid
+--     'Vulkan.Core10.Enums.DescriptorType.DescriptorType' values
+--
+-- = See Also
+--
+-- 'Vulkan.Core10.Enums.DescriptorType.DescriptorType',
+-- 'MutableDescriptorTypeCreateInfoVALVE'
+data MutableDescriptorTypeListVALVE = MutableDescriptorTypeListVALVE
+  { -- | @pDescriptorTypes@ is @NULL@ or a pointer to an array of
+    -- @descriptorTypeCount@
+    -- 'Vulkan.Core10.Enums.DescriptorType.DescriptorType' values which define
+    -- which descriptor types a given binding may mutate to.
+    descriptorTypes :: Vector DescriptorType }
+  deriving (Typeable)
+#if defined(GENERIC_INSTANCES)
+deriving instance Generic (MutableDescriptorTypeListVALVE)
+#endif
+deriving instance Show MutableDescriptorTypeListVALVE
+
+instance ToCStruct MutableDescriptorTypeListVALVE where
+  withCStruct x f = allocaBytesAligned 16 8 $ \p -> pokeCStruct p x (f p)
+  pokeCStruct p MutableDescriptorTypeListVALVE{..} f = evalContT $ do
+    lift $ poke ((p `plusPtr` 0 :: Ptr Word32)) ((fromIntegral (Data.Vector.length $ (descriptorTypes)) :: Word32))
+    pPDescriptorTypes' <- ContT $ allocaBytesAligned @DescriptorType ((Data.Vector.length (descriptorTypes)) * 4) 4
+    lift $ Data.Vector.imapM_ (\i e -> poke (pPDescriptorTypes' `plusPtr` (4 * (i)) :: Ptr DescriptorType) (e)) (descriptorTypes)
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr DescriptorType))) (pPDescriptorTypes')
+    lift $ f
+  cStructSize = 16
+  cStructAlignment = 8
+  pokeZeroCStruct p f = evalContT $ do
+    pPDescriptorTypes' <- ContT $ allocaBytesAligned @DescriptorType ((Data.Vector.length (mempty)) * 4) 4
+    lift $ Data.Vector.imapM_ (\i e -> poke (pPDescriptorTypes' `plusPtr` (4 * (i)) :: Ptr DescriptorType) (e)) (mempty)
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr DescriptorType))) (pPDescriptorTypes')
+    lift $ f
+
+instance FromCStruct MutableDescriptorTypeListVALVE where
+  peekCStruct p = do
+    descriptorTypeCount <- peek @Word32 ((p `plusPtr` 0 :: Ptr Word32))
+    pDescriptorTypes <- peek @(Ptr DescriptorType) ((p `plusPtr` 8 :: Ptr (Ptr DescriptorType)))
+    pDescriptorTypes' <- generateM (fromIntegral descriptorTypeCount) (\i -> peek @DescriptorType ((pDescriptorTypes `advancePtrBytes` (4 * (i)) :: Ptr DescriptorType)))
+    pure $ MutableDescriptorTypeListVALVE
+             pDescriptorTypes'
+
+instance Zero MutableDescriptorTypeListVALVE where
+  zero = MutableDescriptorTypeListVALVE
+           mempty
+
+
+-- | VkMutableDescriptorTypeCreateInfoVALVE - Structure describing the list
+-- of possible active descriptor types for mutable type descriptors
+--
+-- = Description
+--
+-- If @mutableDescriptorTypeListCount@ is zero or if this structure is not
+-- included in the @pNext@ chain, the 'MutableDescriptorTypeListVALVE' for
+-- each element is considered to be zero or @NULL@ for each member.
+-- Otherwise, the descriptor set layout binding at
+-- 'Vulkan.Core10.DescriptorSet.DescriptorSetLayoutCreateInfo'::@pBindings@[i]
+-- uses the descriptor type lists in
+-- 'MutableDescriptorTypeCreateInfoVALVE'::@pMutableDescriptorTypeLists@[i].
+--
+-- == Valid Usage (Implicit)
+--
+-- -   #VUID-VkMutableDescriptorTypeCreateInfoVALVE-sType-sType# @sType@
+--     /must/ be
+--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE'
+--
+-- -   #VUID-VkMutableDescriptorTypeCreateInfoVALVE-pMutableDescriptorTypeLists-parameter#
+--     If @mutableDescriptorTypeListCount@ is not @0@,
+--     @pMutableDescriptorTypeLists@ /must/ be a valid pointer to an array
+--     of @mutableDescriptorTypeListCount@ valid
+--     'MutableDescriptorTypeListVALVE' structures
+--
+-- = See Also
+--
+-- 'MutableDescriptorTypeListVALVE',
+-- 'Vulkan.Core10.Enums.StructureType.StructureType'
+data MutableDescriptorTypeCreateInfoVALVE = MutableDescriptorTypeCreateInfoVALVE
+  { -- | @pMutableDescriptorTypeLists@ is a pointer to an array of
+    -- 'MutableDescriptorTypeListVALVE' structures.
+    mutableDescriptorTypeLists :: Vector MutableDescriptorTypeListVALVE }
+  deriving (Typeable)
+#if defined(GENERIC_INSTANCES)
+deriving instance Generic (MutableDescriptorTypeCreateInfoVALVE)
+#endif
+deriving instance Show MutableDescriptorTypeCreateInfoVALVE
+
+instance ToCStruct MutableDescriptorTypeCreateInfoVALVE where
+  withCStruct x f = allocaBytesAligned 32 8 $ \p -> pokeCStruct p x (f p)
+  pokeCStruct p MutableDescriptorTypeCreateInfoVALVE{..} f = evalContT $ do
+    lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE)
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    lift $ poke ((p `plusPtr` 16 :: Ptr Word32)) ((fromIntegral (Data.Vector.length $ (mutableDescriptorTypeLists)) :: Word32))
+    pPMutableDescriptorTypeLists' <- ContT $ allocaBytesAligned @MutableDescriptorTypeListVALVE ((Data.Vector.length (mutableDescriptorTypeLists)) * 16) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPMutableDescriptorTypeLists' `plusPtr` (16 * (i)) :: Ptr MutableDescriptorTypeListVALVE) (e) . ($ ())) (mutableDescriptorTypeLists)
+    lift $ poke ((p `plusPtr` 24 :: Ptr (Ptr MutableDescriptorTypeListVALVE))) (pPMutableDescriptorTypeLists')
+    lift $ f
+  cStructSize = 32
+  cStructAlignment = 8
+  pokeZeroCStruct p f = evalContT $ do
+    lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE)
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    pPMutableDescriptorTypeLists' <- ContT $ allocaBytesAligned @MutableDescriptorTypeListVALVE ((Data.Vector.length (mempty)) * 16) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPMutableDescriptorTypeLists' `plusPtr` (16 * (i)) :: Ptr MutableDescriptorTypeListVALVE) (e) . ($ ())) (mempty)
+    lift $ poke ((p `plusPtr` 24 :: Ptr (Ptr MutableDescriptorTypeListVALVE))) (pPMutableDescriptorTypeLists')
+    lift $ f
+
+instance FromCStruct MutableDescriptorTypeCreateInfoVALVE where
+  peekCStruct p = do
+    mutableDescriptorTypeListCount <- peek @Word32 ((p `plusPtr` 16 :: Ptr Word32))
+    pMutableDescriptorTypeLists <- peek @(Ptr MutableDescriptorTypeListVALVE) ((p `plusPtr` 24 :: Ptr (Ptr MutableDescriptorTypeListVALVE)))
+    pMutableDescriptorTypeLists' <- generateM (fromIntegral mutableDescriptorTypeListCount) (\i -> peekCStruct @MutableDescriptorTypeListVALVE ((pMutableDescriptorTypeLists `advancePtrBytes` (16 * (i)) :: Ptr MutableDescriptorTypeListVALVE)))
+    pure $ MutableDescriptorTypeCreateInfoVALVE
+             pMutableDescriptorTypeLists'
+
+instance Zero MutableDescriptorTypeCreateInfoVALVE where
+  zero = MutableDescriptorTypeCreateInfoVALVE
+           mempty
+
+
+type VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION = 1
+
+-- No documentation found for TopLevel "VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION"
+pattern VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION :: forall a . Integral a => a
+pattern VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION = 1
+
+
+type VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME = "VK_VALVE_mutable_descriptor_type"
+
+-- No documentation found for TopLevel "VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME"
+pattern VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
+pattern VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME = "VK_VALVE_mutable_descriptor_type"
+
diff --git a/src/Vulkan/Extensions/VK_VALVE_mutable_descriptor_type.hs-boot b/src/Vulkan/Extensions/VK_VALVE_mutable_descriptor_type.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Vulkan/Extensions/VK_VALVE_mutable_descriptor_type.hs-boot
@@ -0,0 +1,167 @@
+{-# language CPP #-}
+-- | = Name
+--
+-- VK_VALVE_mutable_descriptor_type - device extension
+--
+-- == VK_VALVE_mutable_descriptor_type
+--
+-- [__Name String__]
+--     @VK_VALVE_mutable_descriptor_type@
+--
+-- [__Extension Type__]
+--     Device extension
+--
+-- [__Registered Extension Number__]
+--     352
+--
+-- [__Revision__]
+--     1
+--
+-- [__Extension and Version Dependencies__]
+--
+--     -   Requires Vulkan 1.0
+--
+--     -   Requires @VK_KHR_maintenance3@
+--
+-- [__Special Use__]
+--
+--     -   <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-compatibility-specialuse D3D support>
+--
+-- [__Contact__]
+--
+--     -   Joshua Ashton
+--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?title=VK_VALVE_mutable_descriptor_type:%20&body=@Joshua-Ashton%20 >
+--
+--     -   Hans-Kristian Arntzen
+--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?title=VK_VALVE_mutable_descriptor_type:%20&body=@HansKristian-Work%20 >
+--
+-- == Other Extension Metadata
+--
+-- [__Last Modified Date__]
+--     2020-12-02
+--
+-- [__IP Status__]
+--     No known IP claims.
+--
+-- [__Contributors__]
+--
+--     -   Joshua Ashton, Valve
+--
+--     -   Hans-Kristian Arntzen, Valve
+--
+-- == Description
+--
+-- This extension allows applications to reduce descriptor memory footprint
+-- by allowing a descriptor to be able to mutate to a given list of
+-- descriptor types depending on which descriptor types are written into,
+-- or copied into a descriptor set.
+--
+-- The main use case this extension intends to address is descriptor
+-- indexing with
+-- 'Vulkan.Core12.Enums.DescriptorBindingFlagBits.DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT'
+-- where the descriptor types are completely generic, as this means
+-- applications can allocate one large descriptor set, rather than having
+-- one large descriptor set per descriptor type, which significantly bloats
+-- descriptor memory usage and causes performance issues.
+--
+-- This extension also adds a mechanism to declare that a descriptor pool,
+-- and therefore the descriptor sets that are allocated from it, reside
+-- only in host memory; as such these descriptors can only be
+-- updated\/copied, but not bound.
+--
+-- These features together allow much more efficient emulation of the raw
+-- D3D12 binding model. This extension is primarily intended to be useful
+-- for API layering efforts.
+--
+-- == New Structures
+--
+-- -   'MutableDescriptorTypeListVALVE'
+--
+-- -   Extending
+--     'Vulkan.Core10.DescriptorSet.DescriptorSetLayoutCreateInfo',
+--     'Vulkan.Core10.DescriptorSet.DescriptorPoolCreateInfo':
+--
+--     -   'MutableDescriptorTypeCreateInfoVALVE'
+--
+-- -   Extending
+--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
+--     'Vulkan.Core10.Device.DeviceCreateInfo':
+--
+--     -   'PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'
+--
+-- == New Enum Constants
+--
+-- -   'VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME'
+--
+-- -   'VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION'
+--
+-- -   Extending
+--     'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DescriptorPoolCreateFlagBits':
+--
+--     -   'Vulkan.Core10.Enums.DescriptorPoolCreateFlagBits.DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE'
+--
+-- -   Extending
+--     'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DescriptorSetLayoutCreateFlagBits':
+--
+--     -   'Vulkan.Core10.Enums.DescriptorSetLayoutCreateFlagBits.DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE'
+--
+-- -   Extending 'Vulkan.Core10.Enums.DescriptorType.DescriptorType':
+--
+--     -   'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_VALVE'
+--
+-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
+--
+--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE'
+--
+--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE'
+--
+-- == Version History
+--
+-- -   Revision 1, 2020-12-01 (Joshua Ashton, Hans-Kristian Arntzen)
+--
+--     -   Initial specification, squashed from public draft.
+--
+-- = See Also
+--
+-- 'MutableDescriptorTypeCreateInfoVALVE',
+-- 'MutableDescriptorTypeListVALVE',
+-- 'PhysicalDeviceMutableDescriptorTypeFeaturesVALVE'
+--
+-- = Document Notes
+--
+-- For more information, see the
+-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_VALVE_mutable_descriptor_type Vulkan Specification>
+--
+-- This page is a generated document. Fixes and changes should be made to
+-- the generator scripts, not directly.
+module Vulkan.Extensions.VK_VALVE_mutable_descriptor_type  ( MutableDescriptorTypeCreateInfoVALVE
+                                                           , MutableDescriptorTypeListVALVE
+                                                           , PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+                                                           ) where
+
+import Data.Kind (Type)
+import Vulkan.CStruct (FromCStruct)
+import Vulkan.CStruct (ToCStruct)
+data MutableDescriptorTypeCreateInfoVALVE
+
+instance ToCStruct MutableDescriptorTypeCreateInfoVALVE
+instance Show MutableDescriptorTypeCreateInfoVALVE
+
+instance FromCStruct MutableDescriptorTypeCreateInfoVALVE
+
+
+data MutableDescriptorTypeListVALVE
+
+instance ToCStruct MutableDescriptorTypeListVALVE
+instance Show MutableDescriptorTypeListVALVE
+
+instance FromCStruct MutableDescriptorTypeListVALVE
+
+
+data PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+
+instance ToCStruct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+instance Show PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+
+instance FromCStruct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE
+
diff --git a/src/Vulkan/Version.hs b/src/Vulkan/Version.hs
--- a/src/Vulkan/Version.hs
+++ b/src/Vulkan/Version.hs
@@ -15,11 +15,11 @@
 import Data.Word (Word32)
 
 pattern HEADER_VERSION :: Word32
-pattern HEADER_VERSION = 163
+pattern HEADER_VERSION = 164
 
 
 pattern HEADER_VERSION_COMPLETE :: Word32
-pattern HEADER_VERSION_COMPLETE = MAKE_VERSION 1 2 163
+pattern HEADER_VERSION_COMPLETE = MAKE_VERSION 1 2 164
 
 
 pattern MAKE_VERSION :: Word32 -> Word32 -> Word32 -> Word32
diff --git a/vulkan.cabal b/vulkan.cabal
--- a/vulkan.cabal
+++ b/vulkan.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           vulkan
-version:        3.8
+version:        3.8.1
 synopsis:       Bindings to the Vulkan graphics API.
 category:       Graphics
 homepage:       https://github.com/expipiplus1/vulkan#readme
@@ -32,6 +32,11 @@
   manual: True
   default: False
 
+flag trace-calls
+  description: Inserts calls to Debug.Trace.traceEventIO around every Vulkan call.
+  manual: True
+  default: False
+
 library
   exposed-modules:
       Vulkan
@@ -432,6 +437,7 @@
       Vulkan.Extensions.VK_MVK_ios_surface
       Vulkan.Extensions.VK_MVK_macos_surface
       Vulkan.Extensions.VK_NN_vi_surface
+      Vulkan.Extensions.VK_NV_acquire_winrt_display
       Vulkan.Extensions.VK_NV_clip_space_w_scaling
       Vulkan.Extensions.VK_NV_compute_shader_derivatives
       Vulkan.Extensions.VK_NV_cooperative_matrix
@@ -470,6 +476,7 @@
       Vulkan.Extensions.VK_QCOM_render_pass_store_ops
       Vulkan.Extensions.VK_QCOM_render_pass_transform
       Vulkan.Extensions.VK_QCOM_rotated_copy_commands
+      Vulkan.Extensions.VK_VALVE_mutable_descriptor_type
       Vulkan.NamedType
       Vulkan.SPIRVRequirements
       Vulkan.Version
@@ -496,4 +503,6 @@
     cpp-options: -DSAFE_FOREIGN_CALLS
   if flag(generic-instances)
     cpp-options: -DGENERIC_INSTANCES
+  if flag(trace-calls)
+    cpp-options: -DTRACE_CALLS
   default-language: Haskell2010
