{-# LINE 1 "src/Gpu/Vulkan/Pipeline/MultisampleState/Middle/Internal.hsc" #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# LANGUAGE StandaloneDeriving, GeneralizedNewtypeDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Pipeline.MultisampleState.Middle.Internal (
	CreateInfo(..), CreateFlags, createInfoToCore ) where

import Foreign.Ptr
import Foreign.Storable
import Foreign.Storable.PeekPoke
import Foreign.C.Enum
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.Bits
import Data.Word

import Gpu.Vulkan.Base.Middle.Internal

import Gpu.Vulkan.Sample.Middle.Internal as Sample
import Gpu.Vulkan.Sample.Enum as Sample

import qualified Gpu.Vulkan.Pipeline.MultisampleState.Core as C



enum "CreateFlags" ''Word32
{-# LINE 31 "src/Gpu/Vulkan/Pipeline/MultisampleState/Middle/Internal.hsc" #-}
	[''Show, ''Eq, ''Storable, ''Bits] [("CreateFlagsZero", 0)]

data CreateInfo mn = CreateInfo {
	forall (mn :: Maybe (*)). CreateInfo mn -> M mn
createInfoNext :: TMaybe.M mn,
	forall (mn :: Maybe (*)). CreateInfo mn -> CreateFlags
createInfoFlags :: CreateFlags,
	forall (mn :: Maybe (*)). CreateInfo mn -> CountAndMask
createInfoRasterizationSamplesAndMask :: Sample.CountAndMask,
	forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoSampleShadingEnable :: Bool,
	forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoMinSampleShading :: Float,
	forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoAlphaToCoverageEnable :: Bool,
	forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoAlphaToOneEnable :: Bool }

deriving instance Show (TMaybe.M mn) => Show (CreateInfo mn)

createInfoToCore :: WithPoked (TMaybe.M mn) =>
	CreateInfo mn -> (Ptr C.CreateInfo -> IO a) -> IO ()
createInfoToCore :: forall (mn :: Maybe (*)) a.
WithPoked (M mn) =>
CreateInfo mn -> (Ptr CreateInfo -> IO a) -> IO ()
createInfoToCore CreateInfo {
	createInfoNext :: forall (mn :: Maybe (*)). CreateInfo mn -> M mn
createInfoNext = M mn
mnxt,
	createInfoFlags :: forall (mn :: Maybe (*)). CreateInfo mn -> CreateFlags
createInfoFlags = CreateFlags Word32
flgs,
	createInfoRasterizationSamplesAndMask :: forall (mn :: Maybe (*)). CreateInfo mn -> CountAndMask
createInfoRasterizationSamplesAndMask = CountAndMask
cm,
	createInfoSampleShadingEnable :: forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoSampleShadingEnable = Bool -> Word32
boolToBool32 -> Word32
sse,
	createInfoMinSampleShading :: forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoMinSampleShading = Float
mss,
	createInfoAlphaToCoverageEnable :: forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoAlphaToCoverageEnable = Bool -> Word32
boolToBool32 -> Word32
ace,
	createInfoAlphaToOneEnable :: forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoAlphaToOneEnable = Bool -> Word32
boolToBool32 -> Word32
aoe } Ptr CreateInfo -> IO a
f =
	M mn -> (forall s. PtrS s (M mn) -> IO ()) -> IO ()
forall a b.
WithPoked a =>
a -> (forall s. PtrS s a -> IO b) -> IO b
forall b. M mn -> (forall s. PtrS s (M mn) -> IO b) -> IO b
withPoked' M mn
mnxt \PtrS s (M mn)
pnxt -> PtrS s (M mn) -> (Ptr (M mn) -> IO a) -> IO ()
forall s a b. PtrS s a -> (Ptr a -> IO b) -> IO ()
withPtrS PtrS s (M mn)
pnxt \(Ptr (M mn) -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr -> Ptr ()
pnxt') ->
	CountAndMask -> ((CountFlagBits, Ptr Word32) -> IO a) -> IO a
forall a.
CountAndMask -> ((CountFlagBits, Ptr Word32) -> IO a) -> IO a
countAndMaskToCore CountAndMask
cm \(Sample.CountFlagBits Word32
c, Ptr Word32
m) ->
	let ci :: CreateInfo
ci = C.CreateInfo {
		createInfoSType :: ()
C.createInfoSType = (),
		createInfoPNext :: Ptr ()
C.createInfoPNext = Ptr ()
pnxt',
		createInfoFlags :: Word32
C.createInfoFlags = Word32
flgs,
		createInfoRasterizationSamples :: Word32
C.createInfoRasterizationSamples = Word32
c,
		createInfoSampleShadingEnable :: Word32
C.createInfoSampleShadingEnable = Word32
sse,
		createInfoMinSampleShading :: Float
C.createInfoMinSampleShading = Float
mss,
		createInfoPSampleMask :: Ptr Word32
C.createInfoPSampleMask = Ptr Word32
m,
		createInfoAlphaToCoverageEnable :: Word32
C.createInfoAlphaToCoverageEnable = Word32
ace,
		createInfoAlphaToOneEnable :: Word32
C.createInfoAlphaToOneEnable = Word32
aoe } in
	CreateInfo -> (Ptr CreateInfo -> IO a) -> IO a
forall a b. Pokable a => a -> (Ptr a -> IO b) -> IO b
withPoked CreateInfo
ci Ptr CreateInfo -> IO a
f