diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,12 @@
 
 ## WIP
 
+## [3.6.12] - 2020-11-03
+
+  - Bump API version to v1.2.159
+  - Include enum aliases defined in `<enums>` sections, until now only those
+    enum aliases in `features` or `extensions` were used.
+
 ## [3.6.11.1] - 2020-11-01
 
 - Raise bound on base
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: vulkan
-version: "3.6.11.1"
+version: "3.6.12"
 synopsis: Bindings to the Vulkan graphics API.
 category: Graphics
 maintainer: Joe Hermaszewski <live.long.and.prosper@monoid.al>
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -368,37 +368,79 @@
 source to point to this repo, the dependencies haven't changed for a while, so
 any version of nixpkgs from the last 3 months should do the trick.
 
-### Building on Windows
+### Building on Windows with Cabal
 
 - Clone this repo
-- Install stack
-  - https://docs.haskellstack.org/en/stable/install_and_upgrade/#windows
+- Install GHC and Cabal
+  - I downloaded the GHC binary package from
+    [here](https://www.haskell.org/ghc/download_ghc_8_8_4.html), extracted it
+    and added the `bin` directory to `PATH`.
+  - I downloaded the cabal-install binary package from [here](https://www.haskell.org/cabal/download.html)
 - Make sure your graphics driver has installed `vulkan-1.dll` in `C:/windows/system32`
 - Install the LunarG Vulkan SDK
   - https://vulkan.lunarg.com/sdk/home#windows
   - Remember the installation directory, use in place of `C:/VulkanSDK/1.2.135.0` below
   - We will link against `vulkan-1.lib` from this installation
   - We will use the `glslangValidator` from this installation, make sure it's
-    in your `PATH` or otherwise made available to `stack`
-- Install the system dependencies via stack
-  - pkg-config
-  - SDL2
-  - `stack exec -- pacman -S mingw-w64-x86_64-pkg-config mingw-w64-x86_64-SDL2`
-  - Note that the above command will also install mingw's `libvulkan-1.dll`.
-    Make sure that the Vulkan DLL linked by GHC is the same one that SDL
-    loads at runtime. By default SDL will load
-    `vulkan-1.dll`<sup>[1](#sdl-load)</sup>, so if you intend to use mingw's
-    `libvulkan-1.dll` make sure to either set the `SDL_VULKAN_LIBRARY`
-    environment variable to `"libvulkan-1.dll"` or pass `Just
-    "libvulkan-1.dll"` to [SDL's
-    `vkLoadLibrary`](https://hackage.haskell.org/package/sdl2-2.5.0.0/docs/SDL-Video-Vulkan.html#v:vkLoadLibrary)
-    before creating a window.
-- Build the packages
-  - `stack --extra-lib-dirs C:/VulkanSDK/1.2.135.0/Lib build`
-  - You can add `extra-lib-dirs: [ C:/VulkanSDK/1.2.135.0/Lib ]` to your `stack.yaml` 
-    instead of using the command line option here.
-- Run an example program
-  - `stack --extra-lib-dirs C:/VulkanSDK/1.2.135.0/Lib run resize`
+    in your `PATH` or otherwise made available to `ghc`
+- Install `pkg-config` or `pkg-config-lite` (for the `sdl2` package), perform any one of:
+  - Install using chocolatey: `choco install pkgconfiglite`
+  - Install from SourceForge: Download from
+    [here](https://sourceforge.net/projects/pkgconfiglite/files/) and put the
+    binary in your `PATH`
+  - Install by following the instructions
+    [here](https://stackoverflow.com/questions/1710922/how-to-install-pkg-config-in-windows)
+  - Patch SDL2 to not require pkg-config with [this
+    patch](https://gist.github.com/anonymous/9d1060281ed7127a54d2)
+- Install SDL2 (condensed instructions from
+  [here](https://gist.github.com/anonymous/9d1060281ed7127a54d2)):
+  - Navigate to <https://www.libsdl.org/download-2.0.php>
+  - Download the Mingw64 development library
+  - Extract the `x86_64-w64-mingw32` directory somwhere, I installed it as `~/AppData/Roaming/local/SDL2`
+  - Copy the `lib/pkgconfig/sdl2.pc` file to `~/AppData/Roaming/local/lib/pkgconfig/sdl2.pc`
+- Inform Cabal about header and library locations by adding the following to
+  `cabal.project.local`, changed accodingly for your install paths for SDL2 and
+  the Vulkan SDK.
+  
+    ```
+    package sdl2
+      extra-lib-dirs: C:/Users/ms/AppData/Roaming/local/SDL2/lib/
+      extra-include-dirs: C:/Users/ms/AppData/Roaming/local/SDL2/include/SDL2/
+
+    package vulkan
+      extra-lib-dirs: C:/VulkanSDK/1.2.135.0/lib/
+
+    package vulkan-utils
+      extra-include-dirs: C:/VulkanSDK/1.2.135.0/Include/
+
+    package VulkanMemoryAllocator
+      extra-include-dirs: C:/VulkanSDK/1.2.135.0/Include/
+    ```
+
+- Run `cabal build examples` to build the examples
+- Run `cabal run resize` to run the `resize` example.
+
+### Building on Windows with Stack
+
+Stack is currently (2020-11-02) bundled with an msys2 installation which is
+too old to use the package repositories (see
+https://github.com/commercialhaskell/stack/issues/5300) so installing the
+Vulkan SDK, `SDL2` and `pkg-config` is not possible with the bundled package
+manager.
+
+Nevertheless, it should be possible to use Stack by adding the following to
+`stack.yaml` (changed appropriately according to SDL2 and VulkanSDK install
+locations) and building after following the instructions above.
+
+```yaml
+extra-lib-dirs:
+- C:/Users/ms/AppData/Roaming/local/SDL2/lib/
+- C:/VulkanSDK/1.2.135.0/lib/
+
+extra-include-dirs:
+- C:/Users/ms/AppData/Roaming/local/SDL2/include/SDL2/
+- C:/VulkanSDK/1.2.135.0/Include/
+```
 
 ## Examples
 
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
@@ -119,6 +119,7 @@
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_ray_tracing (CopyAccelerationStructureToMemoryInfoKHR)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_copy_commands2 (CopyBufferInfo2KHR)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_copy_commands2 (CopyBufferToImageInfo2KHR)
+import {-# SOURCE #-} Vulkan.Extensions.VK_QCOM_rotated_copy_commands (CopyCommandTransformInfoQCOM)
 import {-# SOURCE #-} Vulkan.Core10.DescriptorSet (CopyDescriptorSet)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_copy_commands2 (CopyImageInfo2KHR)
 import {-# SOURCE #-} Vulkan.Extensions.VK_KHR_copy_commands2 (CopyImageToBufferInfo2KHR)
@@ -741,6 +742,7 @@
   Extends BufferCreateInfo ExternalMemoryBufferCreateInfo = ()
   Extends BufferCreateInfo BufferOpaqueCaptureAddressCreateInfo = ()
   Extends BufferCreateInfo BufferDeviceAddressCreateInfoEXT = ()
+  Extends BufferImageCopy2KHR CopyCommandTransformInfoQCOM = ()
   Extends CommandBufferBeginInfo DeviceGroupCommandBufferBeginInfo = ()
   Extends CommandBufferInheritanceInfo CommandBufferInheritanceConditionalRenderingInfoEXT = ()
   Extends CommandBufferInheritanceInfo CommandBufferInheritanceRenderPassTransformInfoQCOM = ()
@@ -843,6 +845,7 @@
   Extends GraphicsPipelineCreateInfo PipelineCreationFeedbackCreateInfoEXT = ()
   Extends GraphicsPipelineCreateInfo PipelineCompilerControlCreateInfoAMD = ()
   Extends GraphicsPipelineCreateInfo PipelineFragmentShadingRateStateCreateInfoKHR = ()
+  Extends ImageBlit2KHR CopyCommandTransformInfoQCOM = ()
   Extends ImageCreateInfo DedicatedAllocationImageCreateInfoNV = ()
   Extends ImageCreateInfo ExternalMemoryImageCreateInfoNV = ()
   Extends ImageCreateInfo ExternalMemoryImageCreateInfo = ()
@@ -1415,6 +1418,7 @@
   STRUCTURE_TYPE_DEFERRED_OPERATION_INFO_KHR -> go @DeferredOperationInfoKHR
   STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT -> go @PhysicalDeviceExtendedDynamicStateFeaturesEXT
   STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM -> go @RenderPassTransformBeginInfoQCOM
+  STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM -> go @CopyCommandTransformInfoQCOM
   STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM -> go @CommandBufferInheritanceRenderPassTransformInfoQCOM
   STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV -> go @PhysicalDeviceDiagnosticsConfigFeaturesNV
   STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV -> go @DeviceDiagnosticsConfigCreateInfoNV
@@ -1722,6 +1726,7 @@
 {-# complete (::&) :: DeferredOperationInfoKHR #-}
 {-# complete (::&) :: PhysicalDeviceExtendedDynamicStateFeaturesEXT #-}
 {-# complete (::&) :: RenderPassTransformBeginInfoQCOM #-}
+{-# complete (::&) :: CopyCommandTransformInfoQCOM #-}
 {-# complete (::&) :: CommandBufferInheritanceRenderPassTransformInfoQCOM #-}
 {-# complete (::&) :: PhysicalDeviceDiagnosticsConfigFeaturesNV #-}
 {-# complete (::&) :: DeviceDiagnosticsConfigCreateInfoNV #-}
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
@@ -5187,11 +5187,6 @@
 -- -   If @commandBuffer@ is a protected command buffer, then @dstImage@
 --     /must/ not be an unprotected image
 --
--- -   @srcBuffer@ /must/ be large enough to contain all buffer locations
---     that are accessed according to
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
---     for each element of @pRegions@
---
 -- -   The image region specified by each element of @pRegions@ /must/ be a
 --     region that is contained within @dstImage@ if the @dstImage@’s
 --     'Vulkan.Core10.Enums.Format.Format' is not a
@@ -5200,6 +5195,11 @@
 --     copied to if the @dstImage@’s 'Vulkan.Core10.Enums.Format.Format' is
 --     a multi-planar format
 --
+-- -   @srcBuffer@ /must/ be large enough to contain all buffer locations
+--     that are accessed according to
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
+--     for each element of @pRegions@
+--
 -- -   The union of all source regions, and the union of all destination
 --     regions, specified by the elements of @pRegions@, /must/ not overlap
 --     in memory
@@ -5273,18 +5273,6 @@
 --     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_DEPTH_BIT' or
 --     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_STENCIL_BIT'.
 --
--- -   If @dstImage@ does not have either a depth\/stencil or a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
---     then for each element of @pRegions@, @bufferOffset@ /must/ be a
---     multiple of the format’s texel block size
---
--- -   If @dstImage@ has a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
---     then for each element of @pRegions@, @bufferOffset@ /must/ be a
---     multiple of the element size of the compatible format for the format
---     and the @aspectMask@ of the @imageSubresource@ as defined in
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-compatible-planes ???>
---
 -- -   For each element of @pRegions@, @imageOffset.x@ and
 --     (@imageExtent.width@ + @imageOffset.x@) /must/ both be greater than
 --     or equal to @0@ and less than or equal to the width of the specified
@@ -5300,6 +5288,18 @@
 --     of a
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
 --
+-- -   If @dstImage@ does not have either a depth\/stencil or a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
+--     then for each element of @pRegions@, @bufferOffset@ /must/ be a
+--     multiple of the format’s texel block size
+--
+-- -   If @dstImage@ has a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
+--     then for each element of @pRegions@, @bufferOffset@ /must/ be a
+--     multiple of the element size of the compatible format for the format
+--     and the @aspectMask@ of the @imageSubresource@ as defined in
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-compatible-planes ???>
+--
 -- -   If @dstImage@ is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', then for each element
 --     of @pRegions@, @imageOffset.y@ /must/ be @0@ and
@@ -5501,11 +5501,6 @@
 -- -   If @commandBuffer@ is a protected command buffer, then @dstBuffer@
 --     /must/ not be an unprotected buffer
 --
--- -   @dstBuffer@ /must/ be large enough to contain all buffer locations
---     that are accessed according to
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
---     for each element of @pRegions@
---
 -- -   The image region specified by each element of @pRegions@ /must/ be a
 --     region that is contained within @srcImage@ if the @srcImage@’s
 --     'Vulkan.Core10.Enums.Format.Format' is not a
@@ -5514,6 +5509,11 @@
 --     copied if the @srcImage@’s 'Vulkan.Core10.Enums.Format.Format' is a
 --     multi-planar format
 --
+-- -   @dstBuffer@ /must/ be large enough to contain all buffer locations
+--     that are accessed according to
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
+--     for each element of @pRegions@
+--
 -- -   The union of all source regions, and the union of all destination
 --     regions, specified by the elements of @pRegions@, /must/ not overlap
 --     in memory
@@ -5578,32 +5578,32 @@
 -- -   If @srcImage@ has a depth\/stencil format, the @bufferOffset@ member
 --     of any element of @pRegions@ /must/ be a multiple of @4@
 --
--- -   If @srcImage@ does not have either a depth\/stencil or a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
---     then for each element of @pRegions@, @bufferOffset@ /must/ be a
---     multiple of the format’s texel block size
---
--- -   If @srcImage@ has a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
---     then for each element of @pRegions@, @bufferOffset@ /must/ be a
---     multiple of the element size of the compatible format for the format
---     and the @aspectMask@ of the @imageSubresource@ as defined in
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-compatible-planes ???>
---
--- -   For each element of @pRegions@, @imageOffset.x@ and
+-- -   For each element of @pRegions@ , @imageOffset.x@ and
 --     (@imageExtent.width@ + @imageOffset.x@) /must/ both be greater than
 --     or equal to @0@ and less than or equal to the width of the specified
 --     @imageSubresource@ of @srcImage@ where this refers to the width of
 --     the /plane/ of the image involved in the copy in the case of a
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
 --
--- -   For each element of @pRegions@, @imageOffset.y@ and
+-- -   For each element of @pRegions@ , @imageOffset.y@ and
 --     (imageExtent.height + @imageOffset.y@) /must/ both be greater than
 --     or equal to @0@ and less than or equal to the height of the
 --     specified @imageSubresource@ of @srcImage@ where this refers to the
 --     height of the /plane/ of the image involved in the copy in the case
 --     of a
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
+--
+-- -   If @srcImage@ does not have either a depth\/stencil or a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
+--     then for each element of @pRegions@, @bufferOffset@ /must/ be a
+--     multiple of the format’s texel block size
+--
+-- -   If @srcImage@ has a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
+--     then for each element of @pRegions@, @bufferOffset@ /must/ be a
+--     multiple of the element size of the compatible format for the format
+--     and the @aspectMask@ of the @imageSubresource@ as defined in
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-compatible-planes ???>
 --
 -- -   If @srcImage@ is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', then for each element
diff --git a/src/Vulkan/Core10/Enums/StencilFaceFlagBits.hs b/src/Vulkan/Core10/Enums/StencilFaceFlagBits.hs
--- a/src/Vulkan/Core10/Enums/StencilFaceFlagBits.hs
+++ b/src/Vulkan/Core10/Enums/StencilFaceFlagBits.hs
@@ -1,5 +1,6 @@
 {-# language CPP #-}
-module Vulkan.Core10.Enums.StencilFaceFlagBits  ( StencilFaceFlagBits( STENCIL_FACE_FRONT_BIT
+module Vulkan.Core10.Enums.StencilFaceFlagBits  ( pattern STENCIL_FRONT_AND_BACK
+                                                , StencilFaceFlagBits( STENCIL_FACE_FRONT_BIT
                                                                      , STENCIL_FACE_BACK_BIT
                                                                      , STENCIL_FACE_FRONT_AND_BACK
                                                                      , ..
@@ -22,6 +23,10 @@
 import Text.Read.Lex (Lexeme(Ident))
 import Vulkan.Core10.FundamentalTypes (Flags)
 import Vulkan.Zero (Zero)
+-- No documentation found for TopLevel "VK_STENCIL_FRONT_AND_BACK"
+pattern STENCIL_FRONT_AND_BACK = STENCIL_FACE_FRONT_AND_BACK
+
+
 -- | VkStencilFaceFlagBits - Bitmask specifying sets of stencil state for
 -- which to update the compare mask
 --
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
@@ -62,6 +62,7 @@
                                                         , STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR
                                                         , STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR
                                                         , STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT
+                                                        , STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM
                                                         , STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT
                                                         , STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT
                                                         , STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV
@@ -561,6 +562,7 @@
 -- 'Vulkan.Extensions.VK_KHR_ray_tracing.CopyAccelerationStructureToMemoryInfoKHR',
 -- 'Vulkan.Extensions.VK_KHR_copy_commands2.CopyBufferInfo2KHR',
 -- 'Vulkan.Extensions.VK_KHR_copy_commands2.CopyBufferToImageInfo2KHR',
+-- 'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM',
 -- 'Vulkan.Core10.DescriptorSet.CopyDescriptorSet',
 -- 'Vulkan.Extensions.VK_KHR_copy_commands2.CopyImageInfo2KHR',
 -- 'Vulkan.Extensions.VK_KHR_copy_commands2.CopyImageToBufferInfo2KHR',
@@ -1096,6 +1098,8 @@
 pattern STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR = StructureType 1000337000
 -- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT"
 pattern STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT = StructureType 1000335000
+-- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM"
+pattern STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM = StructureType 1000333000
 -- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT"
 pattern STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = StructureType 1000332001
 -- No documentation found for Nested "VkStructureType" "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT"
@@ -1963,6 +1967,7 @@
              STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
              STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR,
              STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT,
+             STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM,
              STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT,
              STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT,
              STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV,
@@ -2431,6 +2436,7 @@
     STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR -> showString "STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR"
     STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR -> showString "STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR"
     STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT -> showString "STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT"
+    STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM -> showString "STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM"
     STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT -> showString "STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT"
     STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT -> showString "STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT"
     STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV -> showString "STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV"
@@ -2899,6 +2905,7 @@
                             , ("STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR", pure STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR)
                             , ("STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR", pure STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR)
                             , ("STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT", pure STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT)
+                            , ("STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM", pure STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM)
                             , ("STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT", pure STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT)
                             , ("STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT", pure STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT)
                             , ("STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV", pure STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV)
diff --git a/src/Vulkan/Core11/Enums/ExternalSemaphoreHandleTypeFlagBits.hs b/src/Vulkan/Core11/Enums/ExternalSemaphoreHandleTypeFlagBits.hs
--- a/src/Vulkan/Core11/Enums/ExternalSemaphoreHandleTypeFlagBits.hs
+++ b/src/Vulkan/Core11/Enums/ExternalSemaphoreHandleTypeFlagBits.hs
@@ -1,5 +1,6 @@
 {-# language CPP #-}
-module Vulkan.Core11.Enums.ExternalSemaphoreHandleTypeFlagBits  ( ExternalSemaphoreHandleTypeFlagBits( EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT
+module Vulkan.Core11.Enums.ExternalSemaphoreHandleTypeFlagBits  ( pattern EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT
+                                                                , ExternalSemaphoreHandleTypeFlagBits( EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT
                                                                                                      , EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
                                                                                                      , EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT
                                                                                                      , EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT
@@ -24,6 +25,10 @@
 import Text.Read.Lex (Lexeme(Ident))
 import Vulkan.Core10.FundamentalTypes (Flags)
 import Vulkan.Zero (Zero)
+-- No documentation found for TopLevel "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT"
+pattern EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT = EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT
+
+
 -- | VkExternalSemaphoreHandleTypeFlagBits - Bitmask of valid external
 -- semaphore handle types
 --
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
@@ -743,6 +743,12 @@
 -- -   @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2'
 --
+-- -   @pNext@ /must/ be @NULL@ or a pointer to a valid instance of
+--     'Vulkan.Core12.Promoted_From_VK_KHR_separate_depth_stencil_layouts.AttachmentDescriptionStencilLayout'
+--
+-- -   The @sType@ value of each struct in the @pNext@ chain /must/ be
+--     unique
+--
 -- -   @flags@ /must/ be a valid combination of
 --     'Vulkan.Core10.Enums.AttachmentDescriptionFlagBits.AttachmentDescriptionFlagBits'
 --     values
@@ -1004,6 +1010,12 @@
 -- -   @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2'
 --
+-- -   @pNext@ /must/ be @NULL@ or a pointer to a valid instance of
+--     'Vulkan.Core12.Promoted_From_VK_KHR_separate_depth_stencil_layouts.AttachmentReferenceStencilLayout'
+--
+-- -   The @sType@ value of each struct in the @pNext@ chain /must/ be
+--     unique
+--
 -- -   @layout@ /must/ be a valid
 --     'Vulkan.Core10.Enums.ImageLayout.ImageLayout' value
 --
@@ -1220,6 +1232,11 @@
 --     @aspectMask@ member /must/ not include
 --     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_METADATA_BIT'
 --
+-- -   If the @attachment@ member of any element of @pInputAttachments@ is
+--     not 'Vulkan.Core10.APIConstants.ATTACHMENT_UNUSED', then the
+--     @aspectMask@ member /must/ not include
+--     @VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT@ for any index @i@
+--
 -- -   An attachment /must/ not be used in both @pDepthStencilAttachment@
 --     and @pColorAttachments@
 --
@@ -1235,6 +1252,16 @@
 -- -   @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2'
 --
+-- -   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_KHR_fragment_shading_rate.FragmentShadingRateAttachmentInfoKHR'
+--     or
+--     'Vulkan.Core12.Promoted_From_VK_KHR_depth_stencil_resolve.SubpassDescriptionDepthStencilResolve'
+--
+-- -   The @sType@ value of each struct in the @pNext@ chain /must/ be
+--     unique
+--
 -- -   @flags@ /must/ be a valid combination of
 --     'Vulkan.Core10.Enums.SubpassDescriptionFlagBits.SubpassDescriptionFlagBits'
 --     values
@@ -1526,6 +1553,8 @@
 --
 -- -   @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2'
+--
+-- -   @pNext@ /must/ be @NULL@
 --
 -- -   @srcStageMask@ /must/ be a valid combination of
 --     'Vulkan.Core10.Enums.PipelineStageFlagBits.PipelineStageFlagBits'
diff --git a/src/Vulkan/Extensions.hs b/src/Vulkan/Extensions.hs
--- a/src/Vulkan/Extensions.hs
+++ b/src/Vulkan/Extensions.hs
@@ -217,6 +217,7 @@
                           , module Vulkan.Extensions.VK_QCOM_render_pass_shader_resolve
                           , 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
                           ) where
 import Vulkan.Extensions.Handles
 import Vulkan.Extensions.VK_AMD_buffer_marker
@@ -436,4 +437,5 @@
 import Vulkan.Extensions.VK_QCOM_render_pass_shader_resolve
 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
 
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
@@ -4,6 +4,8 @@
                                               , destroyDebugReportCallbackEXT
                                               , debugReportMessageEXT
                                               , pattern STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT
+                                              , pattern DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT
+                                              , pattern DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT
                                               , DebugReportCallbackCreateInfoEXT(..)
                                               , DebugReportFlagBitsEXT( DEBUG_REPORT_INFORMATION_BIT_EXT
                                                                       , DEBUG_REPORT_WARNING_BIT_EXT
@@ -366,6 +368,14 @@
 
 -- No documentation found for TopLevel "VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT"
 pattern STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT
+
+
+-- No documentation found for TopLevel "VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT"
+pattern DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT
+
+
+-- No documentation found for TopLevel "VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT"
+pattern DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT = DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT
 
 
 -- | VkDebugReportCallbackCreateInfoEXT - Structure specifying parameters of
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
@@ -1,8 +1,9 @@
 {-# language CPP #-}
 module Vulkan.Extensions.VK_EXT_display_surface_counter  ( getPhysicalDeviceSurfaceCapabilities2EXT
                                                          , pattern STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT
+                                                         , pattern SURFACE_COUNTER_VBLANK_EXT
                                                          , SurfaceCapabilities2EXT(..)
-                                                         , SurfaceCounterFlagBitsEXT( SURFACE_COUNTER_VBLANK_EXT
+                                                         , SurfaceCounterFlagBitsEXT( SURFACE_COUNTER_VBLANK_BIT_EXT
                                                                                     , ..
                                                                                     )
                                                          , SurfaceCounterFlagsEXT
@@ -156,6 +157,10 @@
 pattern STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT
 
 
+-- No documentation found for TopLevel "VK_SURFACE_COUNTER_VBLANK_EXT"
+pattern SURFACE_COUNTER_VBLANK_EXT = SURFACE_COUNTER_VBLANK_BIT_EXT
+
+
 -- | VkSurfaceCapabilities2EXT - Structure describing capabilities of a
 -- surface
 --
@@ -203,7 +208,7 @@
     -- indicating the supported surface counter types.
     --
     -- @supportedSurfaceCounters@ /must/ not include
-    -- 'SURFACE_COUNTER_VBLANK_EXT' unless the surface queried is a
+    -- 'SURFACE_COUNTER_VBLANK_BIT_EXT' unless the surface queried is a
     -- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#wsi-display-surfaces display surface>
     supportedSurfaceCounters :: SurfaceCounterFlagsEXT
   }
@@ -284,20 +289,20 @@
 newtype SurfaceCounterFlagBitsEXT = SurfaceCounterFlagBitsEXT Flags
   deriving newtype (Eq, Ord, Storable, Zero, Bits)
 
--- | 'SURFACE_COUNTER_VBLANK_EXT' specifies a counter incrementing once every
--- time a vertical blanking period occurs on the display associated with
--- the surface.
-pattern SURFACE_COUNTER_VBLANK_EXT = SurfaceCounterFlagBitsEXT 0x00000001
+-- | 'SURFACE_COUNTER_VBLANK_BIT_EXT' specifies a counter incrementing once
+-- every time a vertical blanking period occurs on the display associated
+-- with the surface.
+pattern SURFACE_COUNTER_VBLANK_BIT_EXT = SurfaceCounterFlagBitsEXT 0x00000001
 
 type SurfaceCounterFlagsEXT = SurfaceCounterFlagBitsEXT
 
 instance Show SurfaceCounterFlagBitsEXT where
   showsPrec p = \case
-    SURFACE_COUNTER_VBLANK_EXT -> showString "SURFACE_COUNTER_VBLANK_EXT"
+    SURFACE_COUNTER_VBLANK_BIT_EXT -> showString "SURFACE_COUNTER_VBLANK_BIT_EXT"
     SurfaceCounterFlagBitsEXT x -> showParen (p >= 11) (showString "SurfaceCounterFlagBitsEXT 0x" . showHex x)
 
 instance Read SurfaceCounterFlagBitsEXT where
-  readPrec = parens (choose [("SURFACE_COUNTER_VBLANK_EXT", pure SURFACE_COUNTER_VBLANK_EXT)]
+  readPrec = parens (choose [("SURFACE_COUNTER_VBLANK_BIT_EXT", pure SURFACE_COUNTER_VBLANK_BIT_EXT)]
                      +++
                      prec 10 (do
                        expectP (Ident "SurfaceCounterFlagBitsEXT")
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
@@ -98,6 +98,12 @@
 
 -- | vkCreatePrivateDataSlotEXT - Create a slot for private data storage
 --
+-- == Valid Usage
+--
+-- -   The
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-privateData privateData>
+--     feature /must/ be enabled
+--
 -- == Valid Usage (Implicit)
 --
 -- -   @device@ /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
diff --git a/src/Vulkan/Extensions/VK_INTEL_shader_integer_functions2.hs b/src/Vulkan/Extensions/VK_INTEL_shader_integer_functions2.hs
--- a/src/Vulkan/Extensions/VK_INTEL_shader_integer_functions2.hs
+++ b/src/Vulkan/Extensions/VK_INTEL_shader_integer_functions2.hs
@@ -55,7 +55,7 @@
 -- 'Vulkan.Core10.Enums.StructureType.StructureType'
 data PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL = PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL
   { -- | @shaderIntegerFunctions2@ indicates that the implementation supports the
-    -- @ShaderIntegerFunctions2INTEL@ SPIR-V capability.
+    -- @IntegerFunctions2INTEL@ SPIR-V capability.
     shaderIntegerFunctions2 :: Bool }
   deriving (Typeable, Eq)
 #if defined(GENERIC_INSTANCES)
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
@@ -25,8 +25,10 @@
 import Vulkan.CStruct.Utils (FixedArray)
 import Control.Monad (unless)
 import Control.Monad.IO.Class (liftIO)
+import Data.Typeable (eqT)
 import Foreign.Marshal.Alloc (allocaBytesAligned)
 import GHC.IO (throwIO)
+import GHC.Ptr (castPtr)
 import GHC.Ptr (nullFunPtr)
 import Foreign.Ptr (nullPtr)
 import Foreign.Ptr (plusPtr)
@@ -37,6 +39,7 @@
 import qualified Data.Vector (length)
 import Control.Monad.IO.Class (MonadIO)
 import Data.String (IsString)
+import Data.Type.Equality ((:~:)(Refl))
 import Data.Typeable (Typeable)
 import Foreign.Storable (Storable)
 import Foreign.Storable (Storable(peek))
@@ -52,11 +55,16 @@
 import Control.Monad.Trans.Cont (ContT(..))
 import Data.Vector (Vector)
 import Vulkan.CStruct.Utils (advancePtrBytes)
+import Vulkan.CStruct.Extends (forgetExtensions)
 import Vulkan.CStruct.Utils (lowerArrayPtr)
+import Vulkan.CStruct.Extends (peekSomeCStruct)
+import Vulkan.CStruct.Extends (pokeSomeCStruct)
 import Vulkan.Core10.Handles (Buffer)
+import Vulkan.CStruct.Extends (Chain)
 import Vulkan.Core10.Handles (CommandBuffer)
 import Vulkan.Core10.Handles (CommandBuffer(..))
 import Vulkan.Core10.Handles (CommandBuffer_T)
+import {-# SOURCE #-} Vulkan.Extensions.VK_QCOM_rotated_copy_commands (CopyCommandTransformInfoQCOM)
 import Vulkan.Dynamic (DeviceCmds(pVkCmdBlitImage2KHR))
 import Vulkan.Dynamic (DeviceCmds(pVkCmdCopyBuffer2KHR))
 import Vulkan.Dynamic (DeviceCmds(pVkCmdCopyBufferToImage2KHR))
@@ -64,6 +72,9 @@
 import Vulkan.Dynamic (DeviceCmds(pVkCmdCopyImageToBuffer2KHR))
 import Vulkan.Dynamic (DeviceCmds(pVkCmdResolveImage2KHR))
 import Vulkan.Core10.FundamentalTypes (DeviceSize)
+import Vulkan.CStruct.Extends (Extends)
+import Vulkan.CStruct.Extends (Extendss)
+import Vulkan.CStruct.Extends (Extensible(..))
 import Vulkan.Core10.FundamentalTypes (Extent3D)
 import Vulkan.Core10.Enums.Filter (Filter)
 import Vulkan.CStruct (FromCStruct)
@@ -72,6 +83,11 @@
 import Vulkan.Core10.Enums.ImageLayout (ImageLayout)
 import Vulkan.Core10.CommandBufferBuilding (ImageSubresourceLayers)
 import Vulkan.Core10.FundamentalTypes (Offset3D)
+import Vulkan.CStruct.Extends (PeekChain)
+import Vulkan.CStruct.Extends (PeekChain(..))
+import Vulkan.CStruct.Extends (PokeChain)
+import Vulkan.CStruct.Extends (PokeChain(..))
+import Vulkan.CStruct.Extends (SomeStruct)
 import Vulkan.Core10.Enums.StructureType (StructureType)
 import Vulkan.CStruct (ToCStruct)
 import Vulkan.CStruct (ToCStruct(..))
@@ -781,8 +797,12 @@
 -- -   @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_IMAGE_BLIT_2_KHR'
 --
--- -   @pNext@ /must/ be @NULL@
+-- -   @pNext@ /must/ be @NULL@ or a pointer to a valid instance of
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
 --
+-- -   The @sType@ value of each struct in the @pNext@ chain /must/ be
+--     unique
+--
 -- -   @srcSubresource@ /must/ be a valid
 --     'Vulkan.Core10.CommandBufferBuilding.ImageSubresourceLayers'
 --     structure
@@ -797,8 +817,10 @@
 -- 'Vulkan.Core10.CommandBufferBuilding.ImageSubresourceLayers',
 -- 'Vulkan.Core10.FundamentalTypes.Offset3D',
 -- 'Vulkan.Core10.Enums.StructureType.StructureType'
-data ImageBlit2KHR = ImageBlit2KHR
-  { -- | @srcSubresource@ is the subresource to blit from.
+data ImageBlit2KHR (es :: [Type]) = ImageBlit2KHR
+  { -- | @pNext@ is @NULL@ or a pointer to a structure extending this structure.
+    next :: Chain es
+  , -- | @srcSubresource@ is the subresource to blit from.
     srcSubresource :: ImageSubresourceLayers
   , -- | @srcOffsets@ is a pointer to an array of two
     -- 'Vulkan.Core10.FundamentalTypes.Offset3D' structures specifying the
@@ -813,15 +835,25 @@
   }
   deriving (Typeable)
 #if defined(GENERIC_INSTANCES)
-deriving instance Generic (ImageBlit2KHR)
+deriving instance Generic (ImageBlit2KHR (es :: [Type]))
 #endif
-deriving instance Show ImageBlit2KHR
+deriving instance Show (Chain es) => Show (ImageBlit2KHR es)
 
-instance ToCStruct ImageBlit2KHR where
+instance Extensible ImageBlit2KHR where
+  extensibleType = STRUCTURE_TYPE_IMAGE_BLIT_2_KHR
+  setNext x next = x{next = next}
+  getNext ImageBlit2KHR{..} = next
+  extends :: forall e b proxy. Typeable e => proxy e -> (Extends ImageBlit2KHR e => b) -> Maybe b
+  extends _ f
+    | Just Refl <- eqT @e @CopyCommandTransformInfoQCOM = Just f
+    | otherwise = Nothing
+
+instance (Extendss ImageBlit2KHR es, PokeChain es) => ToCStruct (ImageBlit2KHR es) where
   withCStruct x f = allocaBytesAligned 96 8 $ \p -> pokeCStruct p x (f p)
   pokeCStruct p ImageBlit2KHR{..} f = evalContT $ do
     lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMAGE_BLIT_2_KHR)
-    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    pNext'' <- fmap castPtr . ContT $ withChain (next)
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext''
     ContT $ pokeCStruct ((p `plusPtr` 16 :: Ptr ImageSubresourceLayers)) (srcSubresource) . ($ ())
     let pSrcOffsets' = lowerArrayPtr ((p `plusPtr` 32 :: Ptr (FixedArray 2 Offset3D)))
     case (srcOffsets) of
@@ -839,7 +871,8 @@
   cStructAlignment = 8
   pokeZeroCStruct p f = evalContT $ do
     lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_IMAGE_BLIT_2_KHR)
-    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    pNext' <- fmap castPtr . ContT $ withZeroChain @es
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext'
     ContT $ pokeCStruct ((p `plusPtr` 16 :: Ptr ImageSubresourceLayers)) (zero) . ($ ())
     let pSrcOffsets' = lowerArrayPtr ((p `plusPtr` 32 :: Ptr (FixedArray 2 Offset3D)))
     case ((zero, zero)) of
@@ -854,8 +887,10 @@
         ContT $ pokeCStruct (pDstOffsets' `plusPtr` 12 :: Ptr Offset3D) (e1) . ($ ())
     lift $ f
 
-instance FromCStruct ImageBlit2KHR where
+instance (Extendss ImageBlit2KHR es, PeekChain es) => FromCStruct (ImageBlit2KHR es) where
   peekCStruct p = do
+    pNext <- peek @(Ptr ()) ((p `plusPtr` 8 :: Ptr (Ptr ())))
+    next <- peekChain (castPtr pNext)
     srcSubresource <- peekCStruct @ImageSubresourceLayers ((p `plusPtr` 16 :: Ptr ImageSubresourceLayers))
     let psrcOffsets = lowerArrayPtr @Offset3D ((p `plusPtr` 32 :: Ptr (FixedArray 2 Offset3D)))
     srcOffsets0 <- peekCStruct @Offset3D ((psrcOffsets `advancePtrBytes` 0 :: Ptr Offset3D))
@@ -865,10 +900,11 @@
     dstOffsets0 <- peekCStruct @Offset3D ((pdstOffsets `advancePtrBytes` 0 :: Ptr Offset3D))
     dstOffsets1 <- peekCStruct @Offset3D ((pdstOffsets `advancePtrBytes` 12 :: Ptr Offset3D))
     pure $ ImageBlit2KHR
-             srcSubresource ((srcOffsets0, srcOffsets1)) dstSubresource ((dstOffsets0, dstOffsets1))
+             next srcSubresource ((srcOffsets0, srcOffsets1)) dstSubresource ((dstOffsets0, dstOffsets1))
 
-instance Zero ImageBlit2KHR where
+instance es ~ '[] => Zero (ImageBlit2KHR es) where
   zero = ImageBlit2KHR
+           ()
            zero
            (zero, zero)
            zero
@@ -900,8 +936,12 @@
 -- -   @sType@ /must/ be
 --     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR'
 --
--- -   @pNext@ /must/ be @NULL@
+-- -   @pNext@ /must/ be @NULL@ or a pointer to a valid instance of
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
 --
+-- -   The @sType@ value of each struct in the @pNext@ chain /must/ be
+--     unique
+--
 -- -   @imageSubresource@ /must/ be a valid
 --     'Vulkan.Core10.CommandBufferBuilding.ImageSubresourceLayers'
 --     structure
@@ -914,8 +954,10 @@
 -- 'Vulkan.Core10.CommandBufferBuilding.ImageSubresourceLayers',
 -- 'Vulkan.Core10.FundamentalTypes.Offset3D',
 -- 'Vulkan.Core10.Enums.StructureType.StructureType'
-data BufferImageCopy2KHR = BufferImageCopy2KHR
-  { -- | @bufferOffset@ is the offset in bytes from the start of the buffer
+data BufferImageCopy2KHR (es :: [Type]) = BufferImageCopy2KHR
+  { -- | @pNext@ is @NULL@ or a pointer to a structure extending this structure.
+    next :: Chain es
+  , -- | @bufferOffset@ is the offset in bytes from the start of the buffer
     -- object where the image data is copied from or to.
     bufferOffset :: DeviceSize
   , -- | @bufferRowLength@ and @bufferImageHeight@ specify in texels a subregion
@@ -940,15 +982,25 @@
   }
   deriving (Typeable)
 #if defined(GENERIC_INSTANCES)
-deriving instance Generic (BufferImageCopy2KHR)
+deriving instance Generic (BufferImageCopy2KHR (es :: [Type]))
 #endif
-deriving instance Show BufferImageCopy2KHR
+deriving instance Show (Chain es) => Show (BufferImageCopy2KHR es)
 
-instance ToCStruct BufferImageCopy2KHR where
+instance Extensible BufferImageCopy2KHR where
+  extensibleType = STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR
+  setNext x next = x{next = next}
+  getNext BufferImageCopy2KHR{..} = next
+  extends :: forall e b proxy. Typeable e => proxy e -> (Extends BufferImageCopy2KHR e => b) -> Maybe b
+  extends _ f
+    | Just Refl <- eqT @e @CopyCommandTransformInfoQCOM = Just f
+    | otherwise = Nothing
+
+instance (Extendss BufferImageCopy2KHR es, PokeChain es) => ToCStruct (BufferImageCopy2KHR es) where
   withCStruct x f = allocaBytesAligned 72 8 $ \p -> pokeCStruct p x (f p)
   pokeCStruct p BufferImageCopy2KHR{..} f = evalContT $ do
     lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR)
-    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    pNext'' <- fmap castPtr . ContT $ withChain (next)
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext''
     lift $ poke ((p `plusPtr` 16 :: Ptr DeviceSize)) (bufferOffset)
     lift $ poke ((p `plusPtr` 24 :: Ptr Word32)) (bufferRowLength)
     lift $ poke ((p `plusPtr` 28 :: Ptr Word32)) (bufferImageHeight)
@@ -960,7 +1012,8 @@
   cStructAlignment = 8
   pokeZeroCStruct p f = evalContT $ do
     lift $ poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR)
-    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    pNext' <- fmap castPtr . ContT $ withZeroChain @es
+    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext'
     lift $ poke ((p `plusPtr` 16 :: Ptr DeviceSize)) (zero)
     lift $ poke ((p `plusPtr` 24 :: Ptr Word32)) (zero)
     lift $ poke ((p `plusPtr` 28 :: Ptr Word32)) (zero)
@@ -969,8 +1022,10 @@
     ContT $ pokeCStruct ((p `plusPtr` 60 :: Ptr Extent3D)) (zero) . ($ ())
     lift $ f
 
-instance FromCStruct BufferImageCopy2KHR where
+instance (Extendss BufferImageCopy2KHR es, PeekChain es) => FromCStruct (BufferImageCopy2KHR es) where
   peekCStruct p = do
+    pNext <- peek @(Ptr ()) ((p `plusPtr` 8 :: Ptr (Ptr ())))
+    next <- peekChain (castPtr pNext)
     bufferOffset <- peek @DeviceSize ((p `plusPtr` 16 :: Ptr DeviceSize))
     bufferRowLength <- peek @Word32 ((p `plusPtr` 24 :: Ptr Word32))
     bufferImageHeight <- peek @Word32 ((p `plusPtr` 28 :: Ptr Word32))
@@ -978,10 +1033,11 @@
     imageOffset <- peekCStruct @Offset3D ((p `plusPtr` 48 :: Ptr Offset3D))
     imageExtent <- peekCStruct @Extent3D ((p `plusPtr` 60 :: Ptr Extent3D))
     pure $ BufferImageCopy2KHR
-             bufferOffset bufferRowLength bufferImageHeight imageSubresource imageOffset imageExtent
+             next bufferOffset bufferRowLength bufferImageHeight imageSubresource imageOffset imageExtent
 
-instance Zero BufferImageCopy2KHR where
+instance es ~ '[] => Zero (BufferImageCopy2KHR es) where
   zero = BufferImageCopy2KHR
+           ()
            zero
            zero
            zero
@@ -1814,6 +1870,17 @@
 --     of @pRegions@, @dstOffset@[0].z /must/ be @0@ and @dstOffset@[1].z
 --     /must/ be @1@
 --
+-- -   If any element of @pRegions@ contains
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, then @srcImage@ and @dstImage@ /must/ not be a
+--     block-compressed image.
+--
+-- -   If any element of @pRegions@ contains
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, then the @srcImage@ /must/ be of type
+--     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' and /must/ not be a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>.
+--
 -- == Valid Usage (Implicit)
 --
 -- -   @sType@ /must/ be
@@ -1859,7 +1926,7 @@
     dstImageLayout :: ImageLayout
   , -- | @pRegions@ is a pointer to an array of 'ImageBlit2KHR' structures
     -- specifying the regions to blit.
-    regions :: Vector ImageBlit2KHR
+    regions :: Vector (SomeStruct ImageBlit2KHR)
   , -- | @filter@ is a 'Vulkan.Core10.Enums.Filter.Filter' specifying the filter
     -- to apply if the blits require scaling.
     filter' :: Filter
@@ -1880,9 +1947,9 @@
     lift $ poke ((p `plusPtr` 32 :: Ptr Image)) (dstImage)
     lift $ poke ((p `plusPtr` 40 :: Ptr ImageLayout)) (dstImageLayout)
     lift $ poke ((p `plusPtr` 44 :: Ptr Word32)) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32))
-    pPRegions' <- ContT $ allocaBytesAligned @ImageBlit2KHR ((Data.Vector.length (regions)) * 96) 8
-    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPRegions' `plusPtr` (96 * (i)) :: Ptr ImageBlit2KHR) (e) . ($ ())) (regions)
-    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr ImageBlit2KHR))) (pPRegions')
+    pPRegions' <- ContT $ allocaBytesAligned @(ImageBlit2KHR _) ((Data.Vector.length (regions)) * 96) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPRegions' `plusPtr` (96 * (i)) :: Ptr (ImageBlit2KHR _))) (e) . ($ ())) (regions)
+    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr (ImageBlit2KHR _)))) (pPRegions')
     lift $ poke ((p `plusPtr` 56 :: Ptr Filter)) (filter')
     lift $ f
   cStructSize = 64
@@ -1894,9 +1961,9 @@
     lift $ poke ((p `plusPtr` 24 :: Ptr ImageLayout)) (zero)
     lift $ poke ((p `plusPtr` 32 :: Ptr Image)) (zero)
     lift $ poke ((p `plusPtr` 40 :: Ptr ImageLayout)) (zero)
-    pPRegions' <- ContT $ allocaBytesAligned @ImageBlit2KHR ((Data.Vector.length (mempty)) * 96) 8
-    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPRegions' `plusPtr` (96 * (i)) :: Ptr ImageBlit2KHR) (e) . ($ ())) (mempty)
-    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr ImageBlit2KHR))) (pPRegions')
+    pPRegions' <- ContT $ allocaBytesAligned @(ImageBlit2KHR _) ((Data.Vector.length (mempty)) * 96) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPRegions' `plusPtr` (96 * (i)) :: Ptr (ImageBlit2KHR _))) (e) . ($ ())) (mempty)
+    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr (ImageBlit2KHR _)))) (pPRegions')
     lift $ poke ((p `plusPtr` 56 :: Ptr Filter)) (zero)
     lift $ f
 
@@ -1907,8 +1974,8 @@
     dstImage <- peek @Image ((p `plusPtr` 32 :: Ptr Image))
     dstImageLayout <- peek @ImageLayout ((p `plusPtr` 40 :: Ptr ImageLayout))
     regionCount <- peek @Word32 ((p `plusPtr` 44 :: Ptr Word32))
-    pRegions <- peek @(Ptr ImageBlit2KHR) ((p `plusPtr` 48 :: Ptr (Ptr ImageBlit2KHR)))
-    pRegions' <- generateM (fromIntegral regionCount) (\i -> peekCStruct @ImageBlit2KHR ((pRegions `advancePtrBytes` (96 * (i)) :: Ptr ImageBlit2KHR)))
+    pRegions <- peek @(Ptr (ImageBlit2KHR _)) ((p `plusPtr` 48 :: Ptr (Ptr (ImageBlit2KHR a))))
+    pRegions' <- generateM (fromIntegral regionCount) (\i -> peekSomeCStruct (forgetExtensions ((pRegions `advancePtrBytes` (96 * (i)) :: Ptr (ImageBlit2KHR _)))))
     filter' <- peek @Filter ((p `plusPtr` 56 :: Ptr Filter))
     pure $ BlitImageInfo2KHR
              srcImage srcImageLayout dstImage dstImageLayout pRegions' filter'
@@ -1928,19 +1995,40 @@
 --
 -- == Valid Usage
 --
--- -   @srcBuffer@ /must/ be large enough to contain all buffer locations
---     that are accessed according to
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
---     for each element of @pRegions@
---
--- -   The image region specified by each element of @pRegions@ /must/ be a
---     region that is contained within @dstImage@ if the @dstImage@’s
---     'Vulkan.Core10.Enums.Format.Format' is not a
+-- -   If the image region specified by each element of @pRegions@ does not
+--     contain
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, it /must/ be a region that is contained within
+--     @dstImage@ if the @dstImage@’s 'Vulkan.Core10.Enums.Format.Format'
+--     is not a
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
 --     and /must/ be a region that is contained within the plane being
 --     copied to if the @dstImage@’s 'Vulkan.Core10.Enums.Format.Format' is
 --     a multi-planar format
 --
+-- -   If the image region specified by each element of @pRegions@ does
+--     contain
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, the rotated destination region as described in
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-rotation-addressing>
+--     /must/ be contained within @dstImage@.
+--
+-- -   If any element of @pRegions@ contains
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, then the @dstImage@ /must/ not be a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#blocked-image blocked image>.
+--
+-- -   If any element of @pRegions@ contains
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, then the @dstImage@ /must/ be of type
+--     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D' and /must/ not be a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>.
+--
+-- -   @srcBuffer@ /must/ be large enough to contain all buffer locations
+--     that are accessed according to
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
+--     for each element of @pRegions@
+--
 -- -   The union of all source regions, and the union of all destination
 --     regions, specified by the elements of @pRegions@, /must/ not overlap
 --     in memory
@@ -2014,6 +2102,24 @@
 --     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_DEPTH_BIT' or
 --     'Vulkan.Core10.Enums.ImageAspectFlagBits.IMAGE_ASPECT_STENCIL_BIT'.
 --
+-- -   For each element of @pRegions@ not containing
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, , @imageOffset.x@ and (@imageExtent.width@ +
+--     @imageOffset.x@) /must/ both be greater than or equal to @0@ and
+--     less than or equal to the width of the specified @imageSubresource@
+--     of @dstImage@ where this refers to the width of the /plane/ of the
+--     image involved in the copy in the case of a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
+--
+-- -   For each element of @pRegions@ not containing
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, , @imageOffset.y@ and (imageExtent.height +
+--     @imageOffset.y@) /must/ both be greater than or equal to @0@ and
+--     less than or equal to the height of the specified @imageSubresource@
+--     of @dstImage@ where this refers to the height of the /plane/ of the
+--     image involved in the copy in the case of a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
+--
 -- -   If @dstImage@ does not have either a depth\/stencil or a
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
 --     then for each element of @pRegions@, @bufferOffset@ /must/ be a
@@ -2026,21 +2132,6 @@
 --     and the @aspectMask@ of the @imageSubresource@ as defined in
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-compatible-planes ???>
 --
--- -   For each element of @pRegions@, @imageOffset.x@ and
---     (@imageExtent.width@ + @imageOffset.x@) /must/ both be greater than
---     or equal to @0@ and less than or equal to the width of the specified
---     @imageSubresource@ of @dstImage@ where this refers to the width of
---     the /plane/ of the image involved in the copy in the case of a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
---
--- -   For each element of @pRegions@, @imageOffset.y@ and
---     (imageExtent.height + @imageOffset.y@) /must/ both be greater than
---     or equal to @0@ and less than or equal to the height of the
---     specified @imageSubresource@ of @dstImage@ where this refers to the
---     height of the /plane/ of the image involved in the copy in the case
---     of a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
---
 -- -   If @dstImage@ is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', then for each element
 --     of @pRegions@, @imageOffset.y@ /must/ be @0@ and
@@ -2158,7 +2249,7 @@
     dstImageLayout :: ImageLayout
   , -- | @pRegions@ is a pointer to an array of 'BufferImageCopy2KHR' structures
     -- specifying the regions to copy.
-    regions :: Vector BufferImageCopy2KHR
+    regions :: Vector (SomeStruct BufferImageCopy2KHR)
   }
   deriving (Typeable)
 #if defined(GENERIC_INSTANCES)
@@ -2175,9 +2266,9 @@
     lift $ poke ((p `plusPtr` 24 :: Ptr Image)) (dstImage)
     lift $ poke ((p `plusPtr` 32 :: Ptr ImageLayout)) (dstImageLayout)
     lift $ poke ((p `plusPtr` 36 :: Ptr Word32)) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32))
-    pPRegions' <- ContT $ allocaBytesAligned @BufferImageCopy2KHR ((Data.Vector.length (regions)) * 72) 8
-    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPRegions' `plusPtr` (72 * (i)) :: Ptr BufferImageCopy2KHR) (e) . ($ ())) (regions)
-    lift $ poke ((p `plusPtr` 40 :: Ptr (Ptr BufferImageCopy2KHR))) (pPRegions')
+    pPRegions' <- ContT $ allocaBytesAligned @(BufferImageCopy2KHR _) ((Data.Vector.length (regions)) * 72) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPRegions' `plusPtr` (72 * (i)) :: Ptr (BufferImageCopy2KHR _))) (e) . ($ ())) (regions)
+    lift $ poke ((p `plusPtr` 40 :: Ptr (Ptr (BufferImageCopy2KHR _)))) (pPRegions')
     lift $ f
   cStructSize = 48
   cStructAlignment = 8
@@ -2187,9 +2278,9 @@
     lift $ poke ((p `plusPtr` 16 :: Ptr Buffer)) (zero)
     lift $ poke ((p `plusPtr` 24 :: Ptr Image)) (zero)
     lift $ poke ((p `plusPtr` 32 :: Ptr ImageLayout)) (zero)
-    pPRegions' <- ContT $ allocaBytesAligned @BufferImageCopy2KHR ((Data.Vector.length (mempty)) * 72) 8
-    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPRegions' `plusPtr` (72 * (i)) :: Ptr BufferImageCopy2KHR) (e) . ($ ())) (mempty)
-    lift $ poke ((p `plusPtr` 40 :: Ptr (Ptr BufferImageCopy2KHR))) (pPRegions')
+    pPRegions' <- ContT $ allocaBytesAligned @(BufferImageCopy2KHR _) ((Data.Vector.length (mempty)) * 72) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPRegions' `plusPtr` (72 * (i)) :: Ptr (BufferImageCopy2KHR _))) (e) . ($ ())) (mempty)
+    lift $ poke ((p `plusPtr` 40 :: Ptr (Ptr (BufferImageCopy2KHR _)))) (pPRegions')
     lift $ f
 
 instance FromCStruct CopyBufferToImageInfo2KHR where
@@ -2198,8 +2289,8 @@
     dstImage <- peek @Image ((p `plusPtr` 24 :: Ptr Image))
     dstImageLayout <- peek @ImageLayout ((p `plusPtr` 32 :: Ptr ImageLayout))
     regionCount <- peek @Word32 ((p `plusPtr` 36 :: Ptr Word32))
-    pRegions <- peek @(Ptr BufferImageCopy2KHR) ((p `plusPtr` 40 :: Ptr (Ptr BufferImageCopy2KHR)))
-    pRegions' <- generateM (fromIntegral regionCount) (\i -> peekCStruct @BufferImageCopy2KHR ((pRegions `advancePtrBytes` (72 * (i)) :: Ptr BufferImageCopy2KHR)))
+    pRegions <- peek @(Ptr (BufferImageCopy2KHR _)) ((p `plusPtr` 40 :: Ptr (Ptr (BufferImageCopy2KHR a))))
+    pRegions' <- generateM (fromIntegral regionCount) (\i -> peekSomeCStruct (forgetExtensions ((pRegions `advancePtrBytes` (72 * (i)) :: Ptr (BufferImageCopy2KHR _)))))
     pure $ CopyBufferToImageInfo2KHR
              srcBuffer dstImage dstImageLayout pRegions'
 
@@ -2216,19 +2307,40 @@
 --
 -- == Valid Usage
 --
--- -   @dstBuffer@ /must/ be large enough to contain all buffer locations
---     that are accessed according to
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
---     for each element of @pRegions@
---
--- -   The image region specified by each element of @pRegions@ /must/ be a
---     region that is contained within @srcImage@ if the @srcImage@’s
---     'Vulkan.Core10.Enums.Format.Format' is not a
+-- -   If the image region specified by each element of @pRegions@ does not
+--     contain
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, it /must/ be a region that is contained within
+--     @srcImage@ if the @srcImage@’s 'Vulkan.Core10.Enums.Format.Format'
+--     is not a
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
 --     and /must/ be a region that is contained within the plane being
 --     copied if the @srcImage@’s 'Vulkan.Core10.Enums.Format.Format' is a
 --     multi-planar format
 --
+-- -   If the image region specified by each element of @pRegions@ does
+--     contain
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, the rotated source region as described in
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-rotation-addressing>
+--     /must/ be contained within @srcImage@.
+--
+-- -   If any element of @pRegions@ contains
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, then the @srcImage@ /must/ not be a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#blocked-image blocked image>
+--
+-- -   If any element of @pRegions@ contains
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, then the @srcImage@ /must/ be of type
+--     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_2D', and /must/ not be a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>.
+--
+-- -   @dstBuffer@ /must/ be large enough to contain all buffer locations
+--     that are accessed according to
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#copies-buffers-images-addressing Buffer and Image Addressing>,
+--     for each element of @pRegions@
+--
 -- -   The union of all source regions, and the union of all destination
 --     regions, specified by the elements of @pRegions@, /must/ not overlap
 --     in memory
@@ -2293,6 +2405,24 @@
 -- -   If @srcImage@ has a depth\/stencil format, the @bufferOffset@ member
 --     of any element of @pRegions@ /must/ be a multiple of @4@
 --
+-- -   For each element of @pRegions@ not containing
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, , @imageOffset.x@ and (@imageExtent.width@ +
+--     @imageOffset.x@) /must/ both be greater than or equal to @0@ and
+--     less than or equal to the width of the specified @imageSubresource@
+--     of @srcImage@ where this refers to the width of the /plane/ of the
+--     image involved in the copy in the case of a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
+--
+-- -   For each element of @pRegions@ not containing
+--     'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM'
+--     in its @pNext@ chain, , @imageOffset.y@ and (imageExtent.height +
+--     @imageOffset.y@) /must/ both be greater than or equal to @0@ and
+--     less than or equal to the height of the specified @imageSubresource@
+--     of @srcImage@ where this refers to the height of the /plane/ of the
+--     image involved in the copy in the case of a
+--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
+--
 -- -   If {imageparam} does not have either a depth\/stencil or a
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>,
 --     then for each element of @pRegions@, @bufferOffset@ /must/ be a
@@ -2305,21 +2435,6 @@
 --     and the @aspectMask@ of the @imageSubresource@ as defined in
 --     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-compatible-planes ???>
 --
--- -   For each element of @pRegions@, @imageOffset.x@ and
---     (@imageExtent.width@ + @imageOffset.x@) /must/ both be greater than
---     or equal to @0@ and less than or equal to the width of the specified
---     @imageSubresource@ of {imageparam} where this refers to the width of
---     the /plane/ of the image involved in the copy in the case of a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
---
--- -   For each element of @pRegions@, @imageOffset.y@ and
---     (imageExtent.height + @imageOffset.y@) /must/ both be greater than
---     or equal to @0@ and less than or equal to the height of the
---     specified @imageSubresource@ of {imageparam} where this refers to
---     the height of the /plane/ of the image involved in the copy in the
---     case of a
---     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#formats-requiring-sampler-ycbcr-conversion multi-planar format>
---
 -- -   If {imageparam} is of type
 --     'Vulkan.Core10.Enums.ImageType.IMAGE_TYPE_1D', then for each element
 --     of @pRegions@, @imageOffset.y@ /must/ be @0@ and
@@ -2437,7 +2552,7 @@
     dstBuffer :: Buffer
   , -- | @pRegions@ is a pointer to an array of 'BufferImageCopy2KHR' structures
     -- specifying the regions to copy.
-    regions :: Vector BufferImageCopy2KHR
+    regions :: Vector (SomeStruct BufferImageCopy2KHR)
   }
   deriving (Typeable)
 #if defined(GENERIC_INSTANCES)
@@ -2454,9 +2569,9 @@
     lift $ poke ((p `plusPtr` 24 :: Ptr ImageLayout)) (srcImageLayout)
     lift $ poke ((p `plusPtr` 32 :: Ptr Buffer)) (dstBuffer)
     lift $ poke ((p `plusPtr` 40 :: Ptr Word32)) ((fromIntegral (Data.Vector.length $ (regions)) :: Word32))
-    pPRegions' <- ContT $ allocaBytesAligned @BufferImageCopy2KHR ((Data.Vector.length (regions)) * 72) 8
-    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPRegions' `plusPtr` (72 * (i)) :: Ptr BufferImageCopy2KHR) (e) . ($ ())) (regions)
-    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr BufferImageCopy2KHR))) (pPRegions')
+    pPRegions' <- ContT $ allocaBytesAligned @(BufferImageCopy2KHR _) ((Data.Vector.length (regions)) * 72) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPRegions' `plusPtr` (72 * (i)) :: Ptr (BufferImageCopy2KHR _))) (e) . ($ ())) (regions)
+    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr (BufferImageCopy2KHR _)))) (pPRegions')
     lift $ f
   cStructSize = 56
   cStructAlignment = 8
@@ -2466,9 +2581,9 @@
     lift $ poke ((p `plusPtr` 16 :: Ptr Image)) (zero)
     lift $ poke ((p `plusPtr` 24 :: Ptr ImageLayout)) (zero)
     lift $ poke ((p `plusPtr` 32 :: Ptr Buffer)) (zero)
-    pPRegions' <- ContT $ allocaBytesAligned @BufferImageCopy2KHR ((Data.Vector.length (mempty)) * 72) 8
-    Data.Vector.imapM_ (\i e -> ContT $ pokeCStruct (pPRegions' `plusPtr` (72 * (i)) :: Ptr BufferImageCopy2KHR) (e) . ($ ())) (mempty)
-    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr BufferImageCopy2KHR))) (pPRegions')
+    pPRegions' <- ContT $ allocaBytesAligned @(BufferImageCopy2KHR _) ((Data.Vector.length (mempty)) * 72) 8
+    Data.Vector.imapM_ (\i e -> ContT $ pokeSomeCStruct (forgetExtensions (pPRegions' `plusPtr` (72 * (i)) :: Ptr (BufferImageCopy2KHR _))) (e) . ($ ())) (mempty)
+    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr (BufferImageCopy2KHR _)))) (pPRegions')
     lift $ f
 
 instance FromCStruct CopyImageToBufferInfo2KHR where
@@ -2477,8 +2592,8 @@
     srcImageLayout <- peek @ImageLayout ((p `plusPtr` 24 :: Ptr ImageLayout))
     dstBuffer <- peek @Buffer ((p `plusPtr` 32 :: Ptr Buffer))
     regionCount <- peek @Word32 ((p `plusPtr` 40 :: Ptr Word32))
-    pRegions <- peek @(Ptr BufferImageCopy2KHR) ((p `plusPtr` 48 :: Ptr (Ptr BufferImageCopy2KHR)))
-    pRegions' <- generateM (fromIntegral regionCount) (\i -> peekCStruct @BufferImageCopy2KHR ((pRegions `advancePtrBytes` (72 * (i)) :: Ptr BufferImageCopy2KHR)))
+    pRegions <- peek @(Ptr (BufferImageCopy2KHR _)) ((p `plusPtr` 48 :: Ptr (Ptr (BufferImageCopy2KHR a))))
+    pRegions' <- generateM (fromIntegral regionCount) (\i -> peekSomeCStruct (forgetExtensions ((pRegions `advancePtrBytes` (72 * (i)) :: Ptr (BufferImageCopy2KHR _)))))
     pure $ CopyImageToBufferInfo2KHR
              srcImage srcImageLayout dstBuffer pRegions'
 
diff --git a/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs-boot b/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs-boot
--- a/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs-boot
+++ b/src/Vulkan/Extensions/VK_KHR_copy_commands2.hs-boot
@@ -13,7 +13,11 @@
                                                 ) where
 
 import Data.Kind (Type)
+import {-# SOURCE #-} Vulkan.CStruct.Extends (Chain)
+import {-# SOURCE #-} Vulkan.CStruct.Extends (Extendss)
 import Vulkan.CStruct (FromCStruct)
+import {-# SOURCE #-} Vulkan.CStruct.Extends (PeekChain)
+import {-# SOURCE #-} Vulkan.CStruct.Extends (PokeChain)
 import Vulkan.CStruct (ToCStruct)
 data BlitImageInfo2KHR
 
@@ -31,12 +35,13 @@
 instance FromCStruct BufferCopy2KHR
 
 
-data BufferImageCopy2KHR
+type role BufferImageCopy2KHR nominal
+data BufferImageCopy2KHR (es :: [Type])
 
-instance ToCStruct BufferImageCopy2KHR
-instance Show BufferImageCopy2KHR
+instance (Extendss BufferImageCopy2KHR es, PokeChain es) => ToCStruct (BufferImageCopy2KHR es)
+instance Show (Chain es) => Show (BufferImageCopy2KHR es)
 
-instance FromCStruct BufferImageCopy2KHR
+instance (Extendss BufferImageCopy2KHR es, PeekChain es) => FromCStruct (BufferImageCopy2KHR es)
 
 
 data CopyBufferInfo2KHR
@@ -71,12 +76,13 @@
 instance FromCStruct CopyImageToBufferInfo2KHR
 
 
-data ImageBlit2KHR
+type role ImageBlit2KHR nominal
+data ImageBlit2KHR (es :: [Type])
 
-instance ToCStruct ImageBlit2KHR
-instance Show ImageBlit2KHR
+instance (Extendss ImageBlit2KHR es, PokeChain es) => ToCStruct (ImageBlit2KHR es)
+instance Show (Chain es) => Show (ImageBlit2KHR es)
 
-instance FromCStruct ImageBlit2KHR
+instance (Extendss ImageBlit2KHR es, PeekChain es) => FromCStruct (ImageBlit2KHR es)
 
 
 data ImageCopy2KHR
diff --git a/src/Vulkan/Extensions/VK_KHR_device_group_creation.hs b/src/Vulkan/Extensions/VK_KHR_device_group_creation.hs
--- a/src/Vulkan/Extensions/VK_KHR_device_group_creation.hs
+++ b/src/Vulkan/Extensions/VK_KHR_device_group_creation.hs
@@ -2,8 +2,8 @@
 module Vulkan.Extensions.VK_KHR_device_group_creation  ( pattern STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR
                                                        , pattern STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR
                                                        , pattern MEMORY_HEAP_MULTI_INSTANCE_BIT_KHR
-                                                       , enumeratePhysicalDeviceGroupsKHR
                                                        , pattern MAX_DEVICE_GROUP_SIZE_KHR
+                                                       , enumeratePhysicalDeviceGroupsKHR
                                                        , PhysicalDeviceGroupPropertiesKHR
                                                        , DeviceGroupDeviceCreateInfoKHR
                                                        , KHR_DEVICE_GROUP_CREATION_SPEC_VERSION
@@ -33,12 +33,12 @@
 pattern MEMORY_HEAP_MULTI_INSTANCE_BIT_KHR = MEMORY_HEAP_MULTI_INSTANCE_BIT
 
 
--- No documentation found for TopLevel "vkEnumeratePhysicalDeviceGroupsKHR"
-enumeratePhysicalDeviceGroupsKHR = enumeratePhysicalDeviceGroups
-
-
 -- No documentation found for TopLevel "VK_MAX_DEVICE_GROUP_SIZE_KHR"
 pattern MAX_DEVICE_GROUP_SIZE_KHR = MAX_DEVICE_GROUP_SIZE
+
+
+-- No documentation found for TopLevel "vkEnumeratePhysicalDeviceGroupsKHR"
+enumeratePhysicalDeviceGroupsKHR = enumeratePhysicalDeviceGroups
 
 
 -- No documentation found for TopLevel "VkPhysicalDeviceGroupPropertiesKHR"
diff --git a/src/Vulkan/Extensions/VK_KHR_external_memory_capabilities.hs b/src/Vulkan/Extensions/VK_KHR_external_memory_capabilities.hs
--- a/src/Vulkan/Extensions/VK_KHR_external_memory_capabilities.hs
+++ b/src/Vulkan/Extensions/VK_KHR_external_memory_capabilities.hs
@@ -14,8 +14,8 @@
                                                               , pattern EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR
                                                               , pattern EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR
                                                               , pattern EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR
-                                                              , getPhysicalDeviceExternalBufferPropertiesKHR
                                                               , pattern LUID_SIZE_KHR
+                                                              , getPhysicalDeviceExternalBufferPropertiesKHR
                                                               , ExternalMemoryHandleTypeFlagsKHR
                                                               , ExternalMemoryFeatureFlagsKHR
                                                               , ExternalMemoryHandleTypeFlagBitsKHR
@@ -130,12 +130,12 @@
 pattern EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR = EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT
 
 
--- No documentation found for TopLevel "vkGetPhysicalDeviceExternalBufferPropertiesKHR"
-getPhysicalDeviceExternalBufferPropertiesKHR = getPhysicalDeviceExternalBufferProperties
-
-
 -- No documentation found for TopLevel "VK_LUID_SIZE_KHR"
 pattern LUID_SIZE_KHR = LUID_SIZE
+
+
+-- No documentation found for TopLevel "vkGetPhysicalDeviceExternalBufferPropertiesKHR"
+getPhysicalDeviceExternalBufferPropertiesKHR = getPhysicalDeviceExternalBufferProperties
 
 
 -- No documentation found for TopLevel "VkExternalMemoryHandleTypeFlagsKHR"
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
@@ -3,6 +3,11 @@
                                                    , getPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
                                                    , acquireProfilingLockKHR
                                                    , releaseProfilingLockKHR
+                                                   , pattern QUERY_SCOPE_COMMAND_BUFFER_KHR
+                                                   , pattern QUERY_SCOPE_RENDER_PASS_KHR
+                                                   , pattern QUERY_SCOPE_COMMAND_KHR
+                                                   , pattern PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR
+                                                   , pattern PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR
                                                    , PhysicalDevicePerformanceQueryFeaturesKHR(..)
                                                    , PhysicalDevicePerformanceQueryPropertiesKHR(..)
                                                    , PerformanceCounterKHR(..)
@@ -37,8 +42,8 @@
                                                                                  , PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR
                                                                                  , ..
                                                                                  )
-                                                   , PerformanceCounterDescriptionFlagBitsKHR( PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR
-                                                                                             , PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR
+                                                   , PerformanceCounterDescriptionFlagBitsKHR( PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR
+                                                                                             , PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR
                                                                                              , ..
                                                                                              )
                                                    , PerformanceCounterDescriptionFlagsKHR
@@ -380,6 +385,26 @@
   pure $ ()
 
 
+-- No documentation found for TopLevel "VK_QUERY_SCOPE_COMMAND_BUFFER_KHR"
+pattern QUERY_SCOPE_COMMAND_BUFFER_KHR = PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR
+
+
+-- No documentation found for TopLevel "VK_QUERY_SCOPE_RENDER_PASS_KHR"
+pattern QUERY_SCOPE_RENDER_PASS_KHR = PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR
+
+
+-- No documentation found for TopLevel "VK_QUERY_SCOPE_COMMAND_KHR"
+pattern QUERY_SCOPE_COMMAND_KHR = PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR
+
+
+-- No documentation found for TopLevel "VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR"
+pattern PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR
+
+
+-- No documentation found for TopLevel "VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR"
+pattern PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR
+
+
 -- | VkPhysicalDevicePerformanceQueryFeaturesKHR - Structure describing
 -- performance query support for an implementation
 --
@@ -1082,25 +1107,26 @@
 newtype PerformanceCounterDescriptionFlagBitsKHR = PerformanceCounterDescriptionFlagBitsKHR Flags
   deriving newtype (Eq, Ord, Storable, Zero, Bits)
 
--- | 'PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR' specifies
--- that recording the counter /may/ have a noticeable performance impact.
-pattern PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = PerformanceCounterDescriptionFlagBitsKHR 0x00000001
--- | 'PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR' specifies
--- that concurrently recording the counter while other submitted command
--- buffers are running /may/ impact the accuracy of the recording.
-pattern PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = PerformanceCounterDescriptionFlagBitsKHR 0x00000002
+-- | 'PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR'
+-- specifies that recording the counter /may/ have a noticeable performance
+-- impact.
+pattern PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR = PerformanceCounterDescriptionFlagBitsKHR 0x00000001
+-- | 'PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR'
+-- specifies that concurrently recording the counter while other submitted
+-- command buffers are running /may/ impact the accuracy of the recording.
+pattern PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR = PerformanceCounterDescriptionFlagBitsKHR 0x00000002
 
 type PerformanceCounterDescriptionFlagsKHR = PerformanceCounterDescriptionFlagBitsKHR
 
 instance Show PerformanceCounterDescriptionFlagBitsKHR where
   showsPrec p = \case
-    PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR -> showString "PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR"
-    PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR -> showString "PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR"
+    PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR -> showString "PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR"
+    PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR -> showString "PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR"
     PerformanceCounterDescriptionFlagBitsKHR x -> showParen (p >= 11) (showString "PerformanceCounterDescriptionFlagBitsKHR 0x" . showHex x)
 
 instance Read PerformanceCounterDescriptionFlagBitsKHR where
-  readPrec = parens (choose [("PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR", pure PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR)
-                            , ("PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR", pure PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR)]
+  readPrec = parens (choose [("PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR", pure PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR)
+                            , ("PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR", pure PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR)]
                      +++
                      prec 10 (do
                        expectP (Ident "PerformanceCounterDescriptionFlagBitsKHR")
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
@@ -4,6 +4,7 @@
                                          , getPhysicalDeviceSurfaceCapabilitiesKHR
                                          , getPhysicalDeviceSurfaceFormatsKHR
                                          , getPhysicalDeviceSurfacePresentModesKHR
+                                         , pattern COLORSPACE_SRGB_NONLINEAR_KHR
                                          , SurfaceCapabilitiesKHR(..)
                                          , SurfaceFormatKHR(..)
                                          , PresentModeKHR( PRESENT_MODE_IMMEDIATE_KHR
@@ -547,6 +548,10 @@
   pure $ ((r'), pPresentModes')
 
 
+-- No documentation found for TopLevel "VK_COLORSPACE_SRGB_NONLINEAR_KHR"
+pattern COLORSPACE_SRGB_NONLINEAR_KHR = COLOR_SPACE_SRGB_NONLINEAR_KHR
+
+
 -- | VkSurfaceCapabilitiesKHR - Structure describing capabilities of a
 -- surface
 --
@@ -891,12 +896,11 @@
 -- Note
 --
 -- In the initial release of the @VK_KHR_surface@ and @VK_KHR_swapchain@
--- extensions, the token @VK_COLORSPACE_SRGB_NONLINEAR_KHR@ was used.
--- Starting in the 2016-05-13 updates to the extension branches, matching
--- release 1.0.13 of the core API specification,
--- 'COLOR_SPACE_SRGB_NONLINEAR_KHR' is used instead for consistency with
--- Vulkan naming rules. The older enum is still available for backwards
--- compatibility.
+-- extensions, the token 'COLORSPACE_SRGB_NONLINEAR_KHR' was used. Starting
+-- in the 2016-05-13 updates to the extension branches, matching release
+-- 1.0.13 of the core API specification, 'COLOR_SPACE_SRGB_NONLINEAR_KHR'
+-- is used instead for consistency with Vulkan naming rules. The older enum
+-- is still available for backwards compatibility.
 --
 -- Note
 --
@@ -1168,6 +1172,7 @@
 -- = See Also
 --
 -- 'Vulkan.Extensions.VK_QCOM_render_pass_transform.CommandBufferInheritanceRenderPassTransformInfoQCOM',
+-- 'Vulkan.Extensions.VK_QCOM_rotated_copy_commands.CopyCommandTransformInfoQCOM',
 -- 'Vulkan.Extensions.VK_KHR_display.DisplaySurfaceCreateInfoKHR',
 -- 'Vulkan.Extensions.VK_QCOM_render_pass_transform.RenderPassTransformBeginInfoQCOM',
 -- 'Vulkan.Extensions.VK_EXT_display_surface_counter.SurfaceCapabilities2EXT',
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
@@ -49,11 +49,11 @@
                                             , pattern ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV
                                             , pattern ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV
                                             , pattern ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV
+                                            , pattern SHADER_UNUSED_NV
                                             , destroyAccelerationStructureNV
                                             , bindAccelerationStructureMemoryNV
                                             , cmdWriteAccelerationStructuresPropertiesNV
                                             , getRayTracingShaderGroupHandlesNV
-                                            , pattern SHADER_UNUSED_NV
                                             , RayTracingShaderGroupCreateInfoNV(..)
                                             , RayTracingPipelineCreateInfoNV(..)
                                             , GeometryTrianglesNV(..)
@@ -1538,6 +1538,10 @@
 pattern ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV = ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_KHR
 
 
+-- No documentation found for TopLevel "VK_SHADER_UNUSED_NV"
+pattern SHADER_UNUSED_NV = SHADER_UNUSED_KHR
+
+
 -- No documentation found for TopLevel "vkDestroyAccelerationStructureNV"
 destroyAccelerationStructureNV = destroyAccelerationStructureKHR
 
@@ -1552,10 +1556,6 @@
 
 -- No documentation found for TopLevel "vkGetRayTracingShaderGroupHandlesNV"
 getRayTracingShaderGroupHandlesNV = getRayTracingShaderGroupHandlesKHR
-
-
--- No documentation found for TopLevel "VK_SHADER_UNUSED_NV"
-pattern SHADER_UNUSED_NV = SHADER_UNUSED_KHR
 
 
 -- | VkRayTracingShaderGroupCreateInfoNV - Structure specifying shaders in a
diff --git a/src/Vulkan/Extensions/VK_QCOM_rotated_copy_commands.hs b/src/Vulkan/Extensions/VK_QCOM_rotated_copy_commands.hs
new file mode 100644
--- /dev/null
+++ b/src/Vulkan/Extensions/VK_QCOM_rotated_copy_commands.hs
@@ -0,0 +1,104 @@
+{-# language CPP #-}
+module Vulkan.Extensions.VK_QCOM_rotated_copy_commands  ( CopyCommandTransformInfoQCOM(..)
+                                                        , QCOM_rotated_copy_commands_SPEC_VERSION
+                                                        , pattern QCOM_rotated_copy_commands_SPEC_VERSION
+                                                        , QCOM_rotated_copy_commands_EXTENSION_NAME
+                                                        , pattern QCOM_rotated_copy_commands_EXTENSION_NAME
+                                                        , SurfaceTransformFlagBitsKHR(..)
+                                                        , SurfaceTransformFlagsKHR
+                                                        ) where
+
+import Foreign.Marshal.Alloc (allocaBytesAligned)
+import Foreign.Ptr (nullPtr)
+import Foreign.Ptr (plusPtr)
+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.Kind (Type)
+import Vulkan.CStruct (FromCStruct)
+import Vulkan.CStruct (FromCStruct(..))
+import Vulkan.Core10.Enums.StructureType (StructureType)
+import Vulkan.Extensions.VK_KHR_surface (SurfaceTransformFlagBitsKHR)
+import Vulkan.CStruct (ToCStruct)
+import Vulkan.CStruct (ToCStruct(..))
+import Vulkan.Zero (Zero(..))
+import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM))
+import Vulkan.Extensions.VK_KHR_surface (SurfaceTransformFlagBitsKHR(..))
+import Vulkan.Extensions.VK_KHR_surface (SurfaceTransformFlagsKHR)
+-- | VkCopyCommandTransformInfoQCOM - Structure describing transform
+-- parameters of rotated copy command
+--
+-- == Valid Usage (Implicit)
+--
+-- = See Also
+--
+-- 'Vulkan.Core10.Enums.StructureType.StructureType',
+-- 'Vulkan.Extensions.VK_KHR_surface.SurfaceTransformFlagBitsKHR'
+data CopyCommandTransformInfoQCOM = CopyCommandTransformInfoQCOM
+  { -- | @transform@ is a
+    -- 'Vulkan.Extensions.VK_KHR_surface.SurfaceTransformFlagBitsKHR' value
+    -- describing the transform to be applied.
+    --
+    -- @transform@ /must/ be
+    -- 'Vulkan.Extensions.VK_KHR_surface.SURFACE_TRANSFORM_IDENTITY_BIT_KHR',
+    -- 'Vulkan.Extensions.VK_KHR_surface.SURFACE_TRANSFORM_ROTATE_90_BIT_KHR',
+    -- 'Vulkan.Extensions.VK_KHR_surface.SURFACE_TRANSFORM_ROTATE_180_BIT_KHR',
+    -- or
+    -- 'Vulkan.Extensions.VK_KHR_surface.SURFACE_TRANSFORM_ROTATE_270_BIT_KHR'
+    transform :: SurfaceTransformFlagBitsKHR }
+  deriving (Typeable, Eq)
+#if defined(GENERIC_INSTANCES)
+deriving instance Generic (CopyCommandTransformInfoQCOM)
+#endif
+deriving instance Show CopyCommandTransformInfoQCOM
+
+instance ToCStruct CopyCommandTransformInfoQCOM where
+  withCStruct x f = allocaBytesAligned 24 8 $ \p -> pokeCStruct p x (f p)
+  pokeCStruct p CopyCommandTransformInfoQCOM{..} f = do
+    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM)
+    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    poke ((p `plusPtr` 16 :: Ptr SurfaceTransformFlagBitsKHR)) (transform)
+    f
+  cStructSize = 24
+  cStructAlignment = 8
+  pokeZeroCStruct p f = do
+    poke ((p `plusPtr` 0 :: Ptr StructureType)) (STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM)
+    poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) (nullPtr)
+    poke ((p `plusPtr` 16 :: Ptr SurfaceTransformFlagBitsKHR)) (zero)
+    f
+
+instance FromCStruct CopyCommandTransformInfoQCOM where
+  peekCStruct p = do
+    transform <- peek @SurfaceTransformFlagBitsKHR ((p `plusPtr` 16 :: Ptr SurfaceTransformFlagBitsKHR))
+    pure $ CopyCommandTransformInfoQCOM
+             transform
+
+instance Storable CopyCommandTransformInfoQCOM where
+  sizeOf ~_ = 24
+  alignment ~_ = 8
+  peek = peekCStruct
+  poke ptr poked = pokeCStruct ptr poked (pure ())
+
+instance Zero CopyCommandTransformInfoQCOM where
+  zero = CopyCommandTransformInfoQCOM
+           zero
+
+
+type QCOM_rotated_copy_commands_SPEC_VERSION = 0
+
+-- No documentation found for TopLevel "VK_QCOM_rotated_copy_commands_SPEC_VERSION"
+pattern QCOM_rotated_copy_commands_SPEC_VERSION :: forall a . Integral a => a
+pattern QCOM_rotated_copy_commands_SPEC_VERSION = 0
+
+
+type QCOM_rotated_copy_commands_EXTENSION_NAME = "VK_QCOM_rotated_copy_commands"
+
+-- No documentation found for TopLevel "VK_QCOM_rotated_copy_commands_EXTENSION_NAME"
+pattern QCOM_rotated_copy_commands_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
+pattern QCOM_rotated_copy_commands_EXTENSION_NAME = "VK_QCOM_rotated_copy_commands"
+
diff --git a/src/Vulkan/Extensions/VK_QCOM_rotated_copy_commands.hs-boot b/src/Vulkan/Extensions/VK_QCOM_rotated_copy_commands.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Vulkan/Extensions/VK_QCOM_rotated_copy_commands.hs-boot
@@ -0,0 +1,13 @@
+{-# language CPP #-}
+module Vulkan.Extensions.VK_QCOM_rotated_copy_commands  (CopyCommandTransformInfoQCOM) where
+
+import Data.Kind (Type)
+import Vulkan.CStruct (FromCStruct)
+import Vulkan.CStruct (ToCStruct)
+data CopyCommandTransformInfoQCOM
+
+instance ToCStruct CopyCommandTransformInfoQCOM
+instance Show CopyCommandTransformInfoQCOM
+
+instance FromCStruct CopyCommandTransformInfoQCOM
+
diff --git a/src/Vulkan/Version.hs b/src/Vulkan/Version.hs
--- a/src/Vulkan/Version.hs
+++ b/src/Vulkan/Version.hs
@@ -14,11 +14,11 @@
 import Data.Word (Word32)
 
 pattern HEADER_VERSION :: Word32
-pattern HEADER_VERSION = 158
+pattern HEADER_VERSION = 159
 
 
 pattern HEADER_VERSION_COMPLETE :: Word32
-pattern HEADER_VERSION_COMPLETE = MAKE_VERSION 1 2 158
+pattern HEADER_VERSION_COMPLETE = MAKE_VERSION 1 2 159
 
 
 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.6.11.1
+version:        3.6.12
 synopsis:       Bindings to the Vulkan graphics API.
 category:       Graphics
 homepage:       https://github.com/expipiplus1/vulkan#readme
@@ -465,6 +465,7 @@
       Vulkan.Extensions.VK_QCOM_render_pass_shader_resolve
       Vulkan.Extensions.VK_QCOM_render_pass_store_ops
       Vulkan.Extensions.VK_QCOM_render_pass_transform
+      Vulkan.Extensions.VK_QCOM_rotated_copy_commands
       Vulkan.NamedType
       Vulkan.Version
       Vulkan.Zero
