{-# language CPP #-}
module Vulkan.Extensions.VK_KHR_shared_presentable_image  ( getSwapchainStatusKHR
                                                          , SharedPresentSurfaceCapabilitiesKHR(..)
                                                          , KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION
                                                          , pattern KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION
                                                          , KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME
                                                          , pattern KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME
                                                          , SwapchainKHR(..)
                                                          , PresentModeKHR(..)
                                                          ) where

import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Foreign.Marshal.Alloc (allocaBytesAligned)
import GHC.Base (when)
import GHC.IO (throwIO)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
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.Kind (Type)
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Dynamic (DeviceCmds(pVkGetSwapchainStatusKHR))
import Vulkan.Core10.Handles (Device_T)
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.Core10.Enums.ImageUsageFlagBits (ImageUsageFlags)
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Extensions.Handles (SwapchainKHR)
import Vulkan.Extensions.Handles (SwapchainKHR(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Exception (VulkanException(..))
import Vulkan.Zero (Zero(..))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
import Vulkan.Extensions.VK_KHR_surface (PresentModeKHR(..))
import Vulkan.Extensions.Handles (SwapchainKHR(..))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkGetSwapchainStatusKHR
  :: FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result) -> Ptr Device_T -> SwapchainKHR -> IO Result

-- | vkGetSwapchainStatusKHR - Get a swapchain’s status
--
-- == Valid Usage (Implicit)
--
-- -   @device@ /must/ be a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   @swapchain@ /must/ be a valid
--     'Vulkan.Extensions.Handles.SwapchainKHR' handle
--
-- -   Both of @device@, and @swapchain@ /must/ have been created,
--     allocated, or retrieved from the same
--     'Vulkan.Core10.Handles.Instance'
--
-- == Host Synchronization
--
-- -   Host access to @swapchain@ /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'
--
--     -   'Vulkan.Core10.Enums.Result.SUBOPTIMAL_KHR'
--
-- [<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_DEVICE_LOST'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DATE_KHR'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_SURFACE_LOST_KHR'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT'
--
-- = See Also
--
-- 'Vulkan.Core10.Handles.Device', 'Vulkan.Extensions.Handles.SwapchainKHR'
getSwapchainStatusKHR :: forall io
                       . (MonadIO io)
                      => -- | @device@ is the device associated with @swapchain@.
                         Device
                      -> -- | @swapchain@ is the swapchain to query.
                         SwapchainKHR
                      -> io (Result)
getSwapchainStatusKHR :: Device -> SwapchainKHR -> io Result
getSwapchainStatusKHR device :: Device
device swapchain :: SwapchainKHR
swapchain = IO Result -> io Result
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Result -> io Result) -> IO Result -> io Result
forall a b. (a -> b) -> a -> b
$ do
  let vkGetSwapchainStatusKHRPtr :: FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result)
vkGetSwapchainStatusKHRPtr = DeviceCmds -> FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result)
pVkGetSwapchainStatusKHR (Device -> DeviceCmds
deviceCmds (Device
device :: Device))
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result)
vkGetSwapchainStatusKHRPtr FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result)
-> FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result) -> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument "" "The function pointer for vkGetSwapchainStatusKHR is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkGetSwapchainStatusKHR' :: Ptr Device_T -> SwapchainKHR -> IO Result
vkGetSwapchainStatusKHR' = FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result)
-> Ptr Device_T -> SwapchainKHR -> IO Result
mkVkGetSwapchainStatusKHR FunPtr (Ptr Device_T -> SwapchainKHR -> IO Result)
vkGetSwapchainStatusKHRPtr
  Result
r <- Ptr Device_T -> SwapchainKHR -> IO Result
vkGetSwapchainStatusKHR' (Device -> Ptr Device_T
deviceHandle (Device
device)) (SwapchainKHR
swapchain)
  Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Result
r Result -> Result -> Bool
forall a. Ord a => a -> a -> Bool
< Result
SUCCESS) (VulkanException -> IO ()
forall e a. Exception e => e -> IO a
throwIO (Result -> VulkanException
VulkanException Result
r))
  Result -> IO Result
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Result -> IO Result) -> Result -> IO Result
forall a b. (a -> b) -> a -> b
$ (Result
r)


-- | VkSharedPresentSurfaceCapabilitiesKHR - structure describing
-- capabilities of a surface for shared presentation
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- 'Vulkan.Core10.Enums.ImageUsageFlagBits.ImageUsageFlags',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data SharedPresentSurfaceCapabilitiesKHR = SharedPresentSurfaceCapabilitiesKHR
  { -- | @sharedPresentSupportedUsageFlags@ is a bitmask of
    -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.ImageUsageFlagBits' representing
    -- the ways the application /can/ use the shared presentable image from a
    -- swapchain created with 'Vulkan.Extensions.VK_KHR_surface.PresentModeKHR'
    -- set to
    -- 'Vulkan.Extensions.VK_KHR_surface.PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR'
    -- or
    -- 'Vulkan.Extensions.VK_KHR_surface.PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR'
    -- for the surface on the specified device.
    -- 'Vulkan.Core10.Enums.ImageUsageFlagBits.IMAGE_USAGE_COLOR_ATTACHMENT_BIT'
    -- /must/ be included in the set but implementations /may/ support
    -- additional usages.
    SharedPresentSurfaceCapabilitiesKHR -> ImageUsageFlags
sharedPresentSupportedUsageFlags :: ImageUsageFlags }
  deriving (Typeable, SharedPresentSurfaceCapabilitiesKHR
-> SharedPresentSurfaceCapabilitiesKHR -> Bool
(SharedPresentSurfaceCapabilitiesKHR
 -> SharedPresentSurfaceCapabilitiesKHR -> Bool)
-> (SharedPresentSurfaceCapabilitiesKHR
    -> SharedPresentSurfaceCapabilitiesKHR -> Bool)
-> Eq SharedPresentSurfaceCapabilitiesKHR
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SharedPresentSurfaceCapabilitiesKHR
-> SharedPresentSurfaceCapabilitiesKHR -> Bool
$c/= :: SharedPresentSurfaceCapabilitiesKHR
-> SharedPresentSurfaceCapabilitiesKHR -> Bool
== :: SharedPresentSurfaceCapabilitiesKHR
-> SharedPresentSurfaceCapabilitiesKHR -> Bool
$c== :: SharedPresentSurfaceCapabilitiesKHR
-> SharedPresentSurfaceCapabilitiesKHR -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (SharedPresentSurfaceCapabilitiesKHR)
#endif
deriving instance Show SharedPresentSurfaceCapabilitiesKHR

instance ToCStruct SharedPresentSurfaceCapabilitiesKHR where
  withCStruct :: SharedPresentSurfaceCapabilitiesKHR
-> (Ptr SharedPresentSurfaceCapabilitiesKHR -> IO b) -> IO b
withCStruct x :: SharedPresentSurfaceCapabilitiesKHR
x f :: Ptr SharedPresentSurfaceCapabilitiesKHR -> IO b
f = Int
-> Int -> (Ptr SharedPresentSurfaceCapabilitiesKHR -> IO b) -> IO b
forall a b. Int -> Int -> (Ptr a -> IO b) -> IO b
allocaBytesAligned 24 8 ((Ptr SharedPresentSurfaceCapabilitiesKHR -> IO b) -> IO b)
-> (Ptr SharedPresentSurfaceCapabilitiesKHR -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \p :: Ptr SharedPresentSurfaceCapabilitiesKHR
p -> Ptr SharedPresentSurfaceCapabilitiesKHR
-> SharedPresentSurfaceCapabilitiesKHR -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr SharedPresentSurfaceCapabilitiesKHR
p SharedPresentSurfaceCapabilitiesKHR
x (Ptr SharedPresentSurfaceCapabilitiesKHR -> IO b
f Ptr SharedPresentSurfaceCapabilitiesKHR
p)
  pokeCStruct :: Ptr SharedPresentSurfaceCapabilitiesKHR
-> SharedPresentSurfaceCapabilitiesKHR -> IO b -> IO b
pokeCStruct p :: Ptr SharedPresentSurfaceCapabilitiesKHR
p SharedPresentSurfaceCapabilitiesKHR{..} f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SharedPresentSurfaceCapabilitiesKHR
p Ptr SharedPresentSurfaceCapabilitiesKHR -> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SharedPresentSurfaceCapabilitiesKHR
p Ptr SharedPresentSurfaceCapabilitiesKHR -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr ImageUsageFlags -> ImageUsageFlags -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SharedPresentSurfaceCapabilitiesKHR
p Ptr SharedPresentSurfaceCapabilitiesKHR
-> Int -> Ptr ImageUsageFlags
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr ImageUsageFlags)) (ImageUsageFlags
sharedPresentSupportedUsageFlags)
    IO b
f
  cStructSize :: Int
cStructSize = 24
  cStructAlignment :: Int
cStructAlignment = 8
  pokeZeroCStruct :: Ptr SharedPresentSurfaceCapabilitiesKHR -> IO b -> IO b
pokeZeroCStruct p :: Ptr SharedPresentSurfaceCapabilitiesKHR
p f :: IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SharedPresentSurfaceCapabilitiesKHR
p Ptr SharedPresentSurfaceCapabilitiesKHR -> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr SharedPresentSurfaceCapabilitiesKHR
p Ptr SharedPresentSurfaceCapabilitiesKHR -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    IO b
f

instance FromCStruct SharedPresentSurfaceCapabilitiesKHR where
  peekCStruct :: Ptr SharedPresentSurfaceCapabilitiesKHR
-> IO SharedPresentSurfaceCapabilitiesKHR
peekCStruct p :: Ptr SharedPresentSurfaceCapabilitiesKHR
p = do
    ImageUsageFlags
sharedPresentSupportedUsageFlags <- Ptr ImageUsageFlags -> IO ImageUsageFlags
forall a. Storable a => Ptr a -> IO a
peek @ImageUsageFlags ((Ptr SharedPresentSurfaceCapabilitiesKHR
p Ptr SharedPresentSurfaceCapabilitiesKHR
-> Int -> Ptr ImageUsageFlags
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` 16 :: Ptr ImageUsageFlags))
    SharedPresentSurfaceCapabilitiesKHR
-> IO SharedPresentSurfaceCapabilitiesKHR
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SharedPresentSurfaceCapabilitiesKHR
 -> IO SharedPresentSurfaceCapabilitiesKHR)
-> SharedPresentSurfaceCapabilitiesKHR
-> IO SharedPresentSurfaceCapabilitiesKHR
forall a b. (a -> b) -> a -> b
$ ImageUsageFlags -> SharedPresentSurfaceCapabilitiesKHR
SharedPresentSurfaceCapabilitiesKHR
             ImageUsageFlags
sharedPresentSupportedUsageFlags

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

instance Zero SharedPresentSurfaceCapabilitiesKHR where
  zero :: SharedPresentSurfaceCapabilitiesKHR
zero = ImageUsageFlags -> SharedPresentSurfaceCapabilitiesKHR
SharedPresentSurfaceCapabilitiesKHR
           ImageUsageFlags
forall a. Zero a => a
zero


type KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION"
pattern KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION :: forall a . Integral a => a
pattern $bKHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION :: a
$mKHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION :: forall r a. Integral a => a -> (Void# -> r) -> (Void# -> r) -> r
KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION = 1


type KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME = "VK_KHR_shared_presentable_image"

-- No documentation found for TopLevel "VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME"
pattern KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $bKHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME :: a
$mKHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME :: forall r a.
(Eq a, IsString a) =>
a -> (Void# -> r) -> (Void# -> r) -> r
KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME = "VK_KHR_shared_presentable_image"