{-# language CPP #-}
-- | = Name
--
-- VK_KHR_display_swapchain - device extension
--
-- == VK_KHR_display_swapchain
--
-- [__Name String__]
--     @VK_KHR_display_swapchain@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     4
--
-- [__Revision__]
--     10
--
-- [__Ratification Status__]
--     Ratified
--
-- [__Extension and Version Dependencies__]
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_swapchain VK_KHR_swapchain>
--     and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_display VK_KHR_display>
--
-- [__Contact__]
--
--     -   James Jones
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_KHR_display_swapchain] @cubanismo%0A*Here describe the issue or question you have about the VK_KHR_display_swapchain extension* >
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2017-03-13
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   James Jones, NVIDIA
--
--     -   Jeff Vigil, Qualcomm
--
--     -   Jesse Hall, Google
--
-- == Description
--
-- This extension provides an API to create a swapchain directly on a
-- device’s display without any underlying window system.
--
-- == New Commands
--
-- -   'createSharedSwapchainsKHR'
--
-- == New Structures
--
-- -   Extending 'Vulkan.Extensions.VK_KHR_swapchain.PresentInfoKHR':
--
--     -   'DisplayPresentInfoKHR'
--
-- == New Enum Constants
--
-- -   'KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME'
--
-- -   'KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.Result.Result':
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_INCOMPATIBLE_DISPLAY_KHR'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR'
--
-- == Issues
--
-- 1) Should swapchains sharing images each hold a reference to the images,
-- or should it be up to the application to destroy the swapchains and
-- images in an order that avoids the need for reference counting?
--
-- __RESOLVED__: Take a reference. The lifetime of presentable images is
-- already complex enough.
--
-- 2) Should the @srcRect@ and @dstRect@ parameters be specified as part of
-- the presentation command, or at swapchain creation time?
--
-- __RESOLVED__: As part of the presentation command. This allows moving
-- and scaling the image on the screen without the need to respecify the
-- mode or create a new swapchain and presentable images.
--
-- 3) Should @srcRect@ and @dstRect@ be specified as rects, or separate
-- offset\/extent values?
--
-- __RESOLVED__: As rects. Specifying them separately might make it easier
-- for hardware to expose support for one but not the other, but in such
-- cases applications must just take care to obey the reported capabilities
-- and not use non-zero offsets or extents that require scaling, as
-- appropriate.
--
-- 4) How can applications create multiple swapchains that use the same
-- images?
--
-- __RESOLVED__: By calling 'createSharedSwapchainsKHR'.
--
-- An earlier resolution used
-- 'Vulkan.Extensions.VK_KHR_swapchain.createSwapchainKHR', chaining
-- multiple 'Vulkan.Extensions.VK_KHR_swapchain.SwapchainCreateInfoKHR'
-- structures through @pNext@. In order to allow each swapchain to also
-- allow other extension structs, a level of indirection was used:
-- 'Vulkan.Extensions.VK_KHR_swapchain.SwapchainCreateInfoKHR'::@pNext@
-- pointed to a different structure, which had both @sType@ and @pNext@
-- members for additional extensions, and also had a pointer to the next
-- 'Vulkan.Extensions.VK_KHR_swapchain.SwapchainCreateInfoKHR' structure.
-- The number of swapchains to be created could only be found by walking
-- this linked list of alternating structures, and the @pSwapchains@ out
-- parameter was reinterpreted to be an array of
-- 'Vulkan.Extensions.Handles.SwapchainKHR' handles.
--
-- Another option considered was a method to specify a “shared” swapchain
-- when creating a new swapchain, such that groups of swapchains using the
-- same images could be built up one at a time. This was deemed unusable
-- because drivers need to know all of the displays an image will be used
-- on when determining which internal formats and layouts to use for that
-- image.
--
-- == Examples
--
-- Note
--
-- The example code for the @VK_KHR_display@ and @VK_KHR_display_swapchain@
-- extensions was removed from the appendix after revision 1.0.43. The
-- display swapchain creation example code was ported to the cube demo that
-- is shipped with the official Khronos SDK, and is being kept up-to-date
-- in that location (see:
-- <https://github.com/KhronosGroup/Vulkan-Tools/blob/master/cube/cube.c>).
--
-- == Version History
--
-- -   Revision 1, 2015-07-29 (James Jones)
--
--     -   Initial draft
--
-- -   Revision 2, 2015-08-21 (Ian Elliott)
--
--     -   Renamed this extension and all of its enumerations, types,
--         functions, etc. This makes it compliant with the proposed
--         standard for Vulkan extensions.
--
--     -   Switched from “revision” to “version”, including use of the
--         VK_MAKE_VERSION macro in the header file.
--
-- -   Revision 3, 2015-09-01 (James Jones)
--
--     -   Restore single-field revision number.
--
-- -   Revision 4, 2015-09-08 (James Jones)
--
--     -   Allow creating multiple swapchains that share the same images
--         using a single call to vkCreateSwapchainKHR().
--
-- -   Revision 5, 2015-09-10 (Alon Or-bach)
--
--     -   Removed underscores from SWAP_CHAIN in two enums.
--
-- -   Revision 6, 2015-10-02 (James Jones)
--
--     -   Added support for smart panels\/buffered displays.
--
-- -   Revision 7, 2015-10-26 (Ian Elliott)
--
--     -   Renamed from VK_EXT_KHR_display_swapchain to
--         VK_KHR_display_swapchain.
--
-- -   Revision 8, 2015-11-03 (Daniel Rakos)
--
--     -   Updated sample code based on the changes to VK_KHR_swapchain.
--
-- -   Revision 9, 2015-11-10 (Jesse Hall)
--
--     -   Replaced VkDisplaySwapchainCreateInfoKHR with
--         vkCreateSharedSwapchainsKHR, changing resolution of issue #4.
--
-- -   Revision 10, 2017-03-13 (James Jones)
--
--     -   Closed all remaining issues. The specification and
--         implementations have been shipping with the proposed resolutions
--         for some time now.
--
--     -   Removed the sample code and noted it has been integrated into
--         the official Vulkan SDK cube demo.
--
-- == See Also
--
-- 'DisplayPresentInfoKHR', 'createSharedSwapchainsKHR'
--
-- == Document Notes
--
-- For more information, see the
-- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VK_KHR_display_swapchain Vulkan Specification>
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_KHR_display_swapchain  ( createSharedSwapchainsKHR
                                                   , DisplayPresentInfoKHR(..)
                                                   , KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION
                                                   , pattern KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION
                                                   , KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME
                                                   , pattern KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME
                                                   , SurfaceKHR(..)
                                                   , SwapchainKHR(..)
                                                   , SwapchainCreateInfoKHR(..)
                                                   , PresentModeKHR(..)
                                                   , ColorSpaceKHR(..)
                                                   , CompositeAlphaFlagBitsKHR(..)
                                                   , CompositeAlphaFlagsKHR
                                                   , SurfaceTransformFlagBitsKHR(..)
                                                   , SurfaceTransformFlagsKHR
                                                   , SwapchainCreateFlagBitsKHR(..)
                                                   , SwapchainCreateFlagsKHR
                                                   ) where

import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Exception.Base (bracket)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Marshal.Alloc (callocBytes)
import Foreign.Marshal.Alloc (free)
import GHC.Base (when)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Data.Vector (generateM)
import qualified Data.Vector (imapM_)
import qualified Data.Vector (length)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero(..))
import Control.Monad.IO.Class (MonadIO)
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 GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import Data.Word (Word32)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.CStruct.Extends (forgetExtensions)
import Vulkan.CStruct.Extends (pokeSomeCStruct)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.AllocationCallbacks (AllocationCallbacks)
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Core10.Handles (Device(Device))
import Vulkan.Dynamic (DeviceCmds(pVkCreateSharedSwapchainsKHR))
import Vulkan.Core10.Handles (Device_T)
import Vulkan.Core10.FundamentalTypes (Rect2D)
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import Vulkan.CStruct.Extends (SomeStruct)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Extensions.VK_KHR_swapchain (SwapchainCreateInfoKHR)
import Vulkan.Extensions.Handles (SwapchainKHR)
import Vulkan.Extensions.Handles (SwapchainKHR(..))
import Vulkan.Exception (VulkanException(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
import Vulkan.Extensions.VK_KHR_surface (ColorSpaceKHR(..))
import Vulkan.Extensions.VK_KHR_surface (CompositeAlphaFlagBitsKHR(..))
import Vulkan.Extensions.VK_KHR_surface (CompositeAlphaFlagsKHR)
import Vulkan.Extensions.VK_KHR_surface (PresentModeKHR(..))
import Vulkan.Extensions.Handles (SurfaceKHR(..))
import Vulkan.Extensions.VK_KHR_surface (SurfaceTransformFlagBitsKHR(..))
import Vulkan.Extensions.VK_KHR_surface (SurfaceTransformFlagsKHR)
import Vulkan.Extensions.VK_KHR_swapchain (SwapchainCreateFlagBitsKHR(..))
import Vulkan.Extensions.VK_KHR_swapchain (SwapchainCreateFlagsKHR)
import Vulkan.Extensions.VK_KHR_swapchain (SwapchainCreateInfoKHR(..))
import Vulkan.Extensions.Handles (SwapchainKHR(..))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCreateSharedSwapchainsKHR
  :: FunPtr (Ptr Device_T -> Word32 -> Ptr (SomeStruct SwapchainCreateInfoKHR) -> Ptr AllocationCallbacks -> Ptr SwapchainKHR -> IO Result) -> Ptr Device_T -> Word32 -> Ptr (SomeStruct SwapchainCreateInfoKHR) -> Ptr AllocationCallbacks -> Ptr SwapchainKHR -> IO Result

-- | vkCreateSharedSwapchainsKHR - Create multiple swapchains that share
-- presentable images
--
-- = Description
--
-- 'createSharedSwapchainsKHR' is similar to
-- 'Vulkan.Extensions.VK_KHR_swapchain.createSwapchainKHR', except that it
-- takes an array of
-- 'Vulkan.Extensions.VK_KHR_swapchain.SwapchainCreateInfoKHR' structures,
-- and returns an array of swapchain objects.
--
-- The swapchain creation parameters that affect the properties and number
-- of presentable images /must/ match between all the swapchains. If the
-- displays used by any of the swapchains do not use the same presentable
-- image layout or are incompatible in a way that prevents sharing images,
-- swapchain creation will fail with the result code
-- 'Vulkan.Core10.Enums.Result.ERROR_INCOMPATIBLE_DISPLAY_KHR'. If any
-- error occurs, no swapchains will be created. Images presented to
-- multiple swapchains /must/ be re-acquired from all of them before being
-- modified. After destroying one or more of the swapchains, the remaining
-- swapchains and the presentable images /can/ continue to be used.
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCreateSharedSwapchainsKHR-device-parameter# @device@ /must/
--     be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkCreateSharedSwapchainsKHR-pCreateInfos-parameter#
--     @pCreateInfos@ /must/ be a valid pointer to an array of
--     @swapchainCount@ valid
--     'Vulkan.Extensions.VK_KHR_swapchain.SwapchainCreateInfoKHR'
--     structures
--
-- -   #VUID-vkCreateSharedSwapchainsKHR-pAllocator-parameter# If
--     @pAllocator@ is not @NULL@, @pAllocator@ /must/ be a valid pointer
--     to a valid 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks'
--     structure
--
-- -   #VUID-vkCreateSharedSwapchainsKHR-pSwapchains-parameter#
--     @pSwapchains@ /must/ be a valid pointer to an array of
--     @swapchainCount@ 'Vulkan.Extensions.Handles.SwapchainKHR' handles
--
-- -   #VUID-vkCreateSharedSwapchainsKHR-swapchainCount-arraylength#
--     @swapchainCount@ /must/ be greater than @0@
--
-- == Host Synchronization
--
-- -   Host access to @pCreateInfos@[].surface /must/ be externally
--     synchronized
--
-- -   Host access to @pCreateInfos@[].oldSwapchain /must/ be externally
--     synchronized
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_INCOMPATIBLE_DISPLAY_KHR'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_DEVICE_LOST'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_SURFACE_LOST_KHR'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_display_swapchain VK_KHR_display_swapchain>,
-- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks',
-- 'Vulkan.Core10.Handles.Device',
-- 'Vulkan.Extensions.VK_KHR_swapchain.SwapchainCreateInfoKHR',
-- 'Vulkan.Extensions.Handles.SwapchainKHR'
createSharedSwapchainsKHR :: forall io
                           . (MonadIO io)
                          => -- | @device@ is the device to create the swapchains for.
                             Device
                          -> -- | @pCreateInfos@ is a pointer to an array of
                             -- 'Vulkan.Extensions.VK_KHR_swapchain.SwapchainCreateInfoKHR' structures
                             -- specifying the parameters of the created swapchains.
                             ("createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR))
                          -> -- | @pAllocator@ is the allocator used for host memory allocated for the
                             -- swapchain objects when there is no more specific allocator available
                             -- (see
                             -- <https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#memory-allocation Memory Allocation>).
                             ("allocator" ::: Maybe AllocationCallbacks)
                          -> io (("swapchains" ::: Vector SwapchainKHR))
createSharedSwapchainsKHR :: forall (io :: * -> *).
MonadIO io =>
Device
-> ("createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR))
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ("swapchains" ::: Vector SwapchainKHR)
createSharedSwapchainsKHR Device
device "createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR)
createInfos "allocator" ::: Maybe AllocationCallbacks
allocator = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT forall a b. (a -> b) -> a -> b
$ do
  let vkCreateSharedSwapchainsKHRPtr :: FunPtr
  (Ptr Device_T
   -> ("swapchainCount" ::: Word32)
   -> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pSwapchains" ::: Ptr SwapchainKHR)
   -> IO Result)
vkCreateSharedSwapchainsKHRPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> ("swapchainCount" ::: Word32)
      -> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
      -> ("pAllocator" ::: Ptr AllocationCallbacks)
      -> ("pSwapchains" ::: Ptr SwapchainKHR)
      -> IO Result)
pVkCreateSharedSwapchainsKHR (case Device
device of Device{DeviceCmds
$sel:deviceCmds:Device :: Device -> DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> ("swapchainCount" ::: Word32)
   -> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pSwapchains" ::: Ptr SwapchainKHR)
   -> IO Result)
vkCreateSharedSwapchainsKHRPtr forall a. Eq a => a -> a -> Bool
/= forall a. FunPtr a
nullFunPtr) forall a b. (a -> b) -> a -> b
$
    forall e a. Exception e => e -> IO a
throwIO forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkCreateSharedSwapchainsKHR is null" forall a. Maybe a
Nothing forall a. Maybe a
Nothing
  let vkCreateSharedSwapchainsKHR' :: Ptr Device_T
-> ("swapchainCount" ::: Word32)
-> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pSwapchains" ::: Ptr SwapchainKHR)
-> IO Result
vkCreateSharedSwapchainsKHR' = FunPtr
  (Ptr Device_T
   -> ("swapchainCount" ::: Word32)
   -> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pSwapchains" ::: Ptr SwapchainKHR)
   -> IO Result)
-> Ptr Device_T
-> ("swapchainCount" ::: Word32)
-> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pSwapchains" ::: Ptr SwapchainKHR)
-> IO Result
mkVkCreateSharedSwapchainsKHR FunPtr
  (Ptr Device_T
   -> ("swapchainCount" ::: Word32)
   -> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
   -> ("pAllocator" ::: Ptr AllocationCallbacks)
   -> ("pSwapchains" ::: Ptr SwapchainKHR)
   -> IO Result)
vkCreateSharedSwapchainsKHRPtr
  Ptr (SwapchainCreateInfoKHR Any)
pPCreateInfos <- forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @(SwapchainCreateInfoKHR _) ((forall a. Vector a -> Int
Data.Vector.length ("createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR)
createInfos)) forall a. Num a => a -> a -> a
* Int
104)
  forall (m :: * -> *) a b.
Monad m =>
(Int -> a -> m b) -> Vector a -> m ()
Data.Vector.imapM_ (\Int
i SomeStruct SwapchainCreateInfoKHR
e -> forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall (a :: [*] -> *) b.
(forall (es :: [*]).
 (Extendss a es, PokeChain es) =>
 ToCStruct (a es)) =>
Ptr (SomeStruct a) -> SomeStruct a -> IO b -> IO b
pokeSomeCStruct (forall (a :: [*] -> *) (es :: [*]).
Ptr (a es) -> Ptr (SomeStruct a)
forgetExtensions (Ptr (SwapchainCreateInfoKHR Any)
pPCreateInfos forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
104 forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr (SwapchainCreateInfoKHR _))) (SomeStruct SwapchainCreateInfoKHR
e) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (a -> b) -> a -> b
$ ())) ("createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR)
createInfos)
  "pAllocator" ::: Ptr AllocationCallbacks
pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks
allocator) of
    "allocator" ::: Maybe AllocationCallbacks
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Ptr a
nullPtr
    Just AllocationCallbacks
j -> forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
withCStruct (AllocationCallbacks
j)
  "pSwapchains" ::: Ptr SwapchainKHR
pPSwapchains <- forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT forall a b. (a -> b) -> a -> b
$ forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (forall a. Int -> IO (Ptr a)
callocBytes @SwapchainKHR ((forall a b. (Integral a, Num b) => a -> b
fromIntegral ((forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Vector a -> Int
Data.Vector.length forall a b. (a -> b) -> a -> b
$ ("createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR)
createInfos)) :: Word32))) forall a. Num a => a -> a -> a
* Int
8)) forall a. Ptr a -> IO ()
free
  Result
r <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall a. String -> IO a -> IO a
traceAroundEvent String
"vkCreateSharedSwapchainsKHR" (Ptr Device_T
-> ("swapchainCount" ::: Word32)
-> ("pCreateInfos" ::: Ptr (SomeStruct SwapchainCreateInfoKHR))
-> ("pAllocator" ::: Ptr AllocationCallbacks)
-> ("pSwapchains" ::: Ptr SwapchainKHR)
-> IO Result
vkCreateSharedSwapchainsKHR'
                                                                (Device -> Ptr Device_T
deviceHandle (Device
device))
                                                                ((forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Vector a -> Int
Data.Vector.length forall a b. (a -> b) -> a -> b
$ ("createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR)
createInfos)) :: Word32))
                                                                (forall (a :: [*] -> *) (es :: [*]).
Ptr (a es) -> Ptr (SomeStruct a)
forgetExtensions (Ptr (SwapchainCreateInfoKHR Any)
pPCreateInfos))
                                                                "pAllocator" ::: Ptr AllocationCallbacks
pAllocator
                                                                ("pSwapchains" ::: Ptr SwapchainKHR
pPSwapchains))
  forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Result
r forall a. Ord a => a -> a -> Bool
< Result
SUCCESS) (forall e a. Exception e => e -> IO a
throwIO (Result -> VulkanException
VulkanException Result
r))
  "swapchains" ::: Vector SwapchainKHR
pSwapchains <- forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> m a) -> m (Vector a)
generateM (forall a b. (Integral a, Num b) => a -> b
fromIntegral ((forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Vector a -> Int
Data.Vector.length forall a b. (a -> b) -> a -> b
$ ("createInfos" ::: Vector (SomeStruct SwapchainCreateInfoKHR)
createInfos)) :: Word32))) (\Int
i -> forall a. Storable a => Ptr a -> IO a
peek @SwapchainKHR (("pSwapchains" ::: Ptr SwapchainKHR
pPSwapchains forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
8 forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr SwapchainKHR)))
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ ("swapchains" ::: Vector SwapchainKHR
pSwapchains)


-- | VkDisplayPresentInfoKHR - Structure describing parameters of a queue
-- presentation to a swapchain
--
-- = Description
--
-- If the extent of the @srcRect@ and @dstRect@ are not equal, the
-- presented pixels will be scaled accordingly.
--
-- == Valid Usage
--
-- -   #VUID-VkDisplayPresentInfoKHR-srcRect-01257# @srcRect@ /must/
--     specify a rectangular region that is a subset of the image being
--     presented
--
-- -   #VUID-VkDisplayPresentInfoKHR-dstRect-01258# @dstRect@ /must/
--     specify a rectangular region that is a subset of the @visibleRegion@
--     parameter of the display mode the swapchain being presented uses
--
-- -   #VUID-VkDisplayPresentInfoKHR-persistentContent-01259# If the
--     @persistentContent@ member of the
--     'Vulkan.Extensions.VK_KHR_display.DisplayPropertiesKHR' structure
--     returned by
--     'Vulkan.Extensions.VK_KHR_display.getPhysicalDeviceDisplayPropertiesKHR'
--     for the display the present operation targets is
--     'Vulkan.Core10.FundamentalTypes.FALSE', then @persistent@ /must/ be
--     'Vulkan.Core10.FundamentalTypes.FALSE'
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkDisplayPresentInfoKHR-sType-sType# @sType@ /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_display_swapchain VK_KHR_display_swapchain>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.FundamentalTypes.Rect2D',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data DisplayPresentInfoKHR = DisplayPresentInfoKHR
  { -- | @srcRect@ is a rectangular region of pixels to present. It /must/ be a
    -- subset of the image being presented. If 'DisplayPresentInfoKHR' is not
    -- specified, this region will be assumed to be the entire presentable
    -- image.
    DisplayPresentInfoKHR -> Rect2D
srcRect :: Rect2D
  , -- | @dstRect@ is a rectangular region within the visible region of the
    -- swapchain’s display mode. If 'DisplayPresentInfoKHR' is not specified,
    -- this region will be assumed to be the entire visible region of the
    -- swapchain’s mode. If the specified rectangle is a subset of the display
    -- mode’s visible region, content from display planes below the swapchain’s
    -- plane will be visible outside the rectangle. If there are no planes
    -- below the swapchain’s, the area outside the specified rectangle will be
    -- black. If portions of the specified rectangle are outside of the
    -- display’s visible region, pixels mapping only to those portions of the
    -- rectangle will be discarded.
    DisplayPresentInfoKHR -> Rect2D
dstRect :: Rect2D
  , -- | @persistent@: If this is 'Vulkan.Core10.FundamentalTypes.TRUE', the
    -- display engine will enable buffered mode on displays that support it.
    -- This allows the display engine to stop sending content to the display
    -- until a new image is presented. The display will instead maintain a copy
    -- of the last presented image. This allows less power to be used, but
    -- /may/ increase presentation latency. If 'DisplayPresentInfoKHR' is not
    -- specified, persistent mode will not be used.
    DisplayPresentInfoKHR -> Bool
persistent :: Bool
  }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (DisplayPresentInfoKHR)
#endif
deriving instance Show DisplayPresentInfoKHR

instance ToCStruct DisplayPresentInfoKHR where
  withCStruct :: forall b.
DisplayPresentInfoKHR
-> (Ptr DisplayPresentInfoKHR -> IO b) -> IO b
withCStruct DisplayPresentInfoKHR
x Ptr DisplayPresentInfoKHR -> IO b
f = forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
56 forall a b. (a -> b) -> a -> b
$ \Ptr DisplayPresentInfoKHR
p -> forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr DisplayPresentInfoKHR
p DisplayPresentInfoKHR
x (Ptr DisplayPresentInfoKHR -> IO b
f Ptr DisplayPresentInfoKHR
p)
  pokeCStruct :: forall b.
Ptr DisplayPresentInfoKHR -> DisplayPresentInfoKHR -> IO b -> IO b
pokeCStruct Ptr DisplayPresentInfoKHR
p DisplayPresentInfoKHR{Bool
Rect2D
persistent :: Bool
dstRect :: Rect2D
srcRect :: Rect2D
$sel:persistent:DisplayPresentInfoKHR :: DisplayPresentInfoKHR -> Bool
$sel:dstRect:DisplayPresentInfoKHR :: DisplayPresentInfoKHR -> Rect2D
$sel:srcRect:DisplayPresentInfoKHR :: DisplayPresentInfoKHR -> Rect2D
..} IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Rect2D)) (Rect2D
srcRect)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr Rect2D)) (Rect2D
dstRect)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
persistent))
    IO b
f
  cStructSize :: Int
cStructSize = Int
56
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr DisplayPresentInfoKHR -> IO b -> IO b
pokeZeroCStruct Ptr DisplayPresentInfoKHR
p IO b
f = do
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (forall a. Ptr a
nullPtr)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Rect2D)) (forall a. Zero a => a
zero)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr Rect2D)) (forall a. Zero a => a
zero)
    forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (forall a. Zero a => a
zero))
    IO b
f

instance FromCStruct DisplayPresentInfoKHR where
  peekCStruct :: Ptr DisplayPresentInfoKHR -> IO DisplayPresentInfoKHR
peekCStruct Ptr DisplayPresentInfoKHR
p = do
    Rect2D
srcRect <- forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @Rect2D ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Rect2D))
    Rect2D
dstRect <- forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @Rect2D ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr Rect2D))
    Bool32
persistent <- forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr DisplayPresentInfoKHR
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
48 :: Ptr Bool32))
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Rect2D -> Rect2D -> Bool -> DisplayPresentInfoKHR
DisplayPresentInfoKHR
             Rect2D
srcRect Rect2D
dstRect (Bool32 -> Bool
bool32ToBool Bool32
persistent)

instance Storable DisplayPresentInfoKHR where
  sizeOf :: DisplayPresentInfoKHR -> Int
sizeOf ~DisplayPresentInfoKHR
_ = Int
56
  alignment :: DisplayPresentInfoKHR -> Int
alignment ~DisplayPresentInfoKHR
_ = Int
8
  peek :: Ptr DisplayPresentInfoKHR -> IO DisplayPresentInfoKHR
peek = forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr DisplayPresentInfoKHR -> DisplayPresentInfoKHR -> IO ()
poke Ptr DisplayPresentInfoKHR
ptr DisplayPresentInfoKHR
poked = forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr DisplayPresentInfoKHR
ptr DisplayPresentInfoKHR
poked (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero DisplayPresentInfoKHR where
  zero :: DisplayPresentInfoKHR
zero = Rect2D -> Rect2D -> Bool -> DisplayPresentInfoKHR
DisplayPresentInfoKHR
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero
           forall a. Zero a => a
zero


type KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION = 10

-- No documentation found for TopLevel "VK_KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION"
pattern KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION :: forall a . Integral a => a
pattern $bKHR_DISPLAY_SWAPCHAIN_SPEC_VERSION :: forall a. Integral a => a
$mKHR_DISPLAY_SWAPCHAIN_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
KHR_DISPLAY_SWAPCHAIN_SPEC_VERSION = 10


type KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME = "VK_KHR_display_swapchain"

-- No documentation found for TopLevel "VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME"
pattern KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bKHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
$mKHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME = "VK_KHR_display_swapchain"