{-# LINE 1 "src/Gpu/Vulkan/Pipeline/RasterizationState/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.RasterizationState.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.Enum

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



enum "CreateFlags" ''Word32
{-# LINE 30 "src/Gpu/Vulkan/Pipeline/RasterizationState/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 -> Bool
createInfoDepthClampEnable :: Bool,
	forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoRasterizerDiscardEnable :: Bool,
	forall (mn :: Maybe (*)). CreateInfo mn -> PolygonMode
createInfoPolygonMode :: PolygonMode,
	forall (mn :: Maybe (*)). CreateInfo mn -> CullModeFlags
createInfoCullMode :: CullModeFlags,
	forall (mn :: Maybe (*)). CreateInfo mn -> FrontFace
createInfoFrontFace :: FrontFace,
	forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoDepthBiasEnable :: Bool,
	forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoDepthBiasConstantFactor :: Float,
	forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoDepthBiasClamp :: Float,
	forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoDepthBiasSlopeFactor :: Float,
	forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoLineWidth :: Float }

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,
	createInfoDepthClampEnable :: forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoDepthClampEnable = Bool -> Word32
boolToBool32 -> Word32
dce,
	createInfoRasterizerDiscardEnable :: forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoRasterizerDiscardEnable = Bool -> Word32
boolToBool32 -> Word32
rde,
	createInfoPolygonMode :: forall (mn :: Maybe (*)). CreateInfo mn -> PolygonMode
createInfoPolygonMode = PolygonMode Word32
pm,
	createInfoCullMode :: forall (mn :: Maybe (*)). CreateInfo mn -> CullModeFlags
createInfoCullMode = CullModeFlagBits Word32
cm,
	createInfoFrontFace :: forall (mn :: Maybe (*)). CreateInfo mn -> FrontFace
createInfoFrontFace = FrontFace Word32
ff,
	createInfoDepthBiasEnable :: forall (mn :: Maybe (*)). CreateInfo mn -> Bool
createInfoDepthBiasEnable = Bool -> Word32
boolToBool32 -> Word32
dbe,
	createInfoDepthBiasConstantFactor :: forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoDepthBiasConstantFactor = Float
dbcf,
	createInfoDepthBiasClamp :: forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoDepthBiasClamp = Float
dbc,
	createInfoDepthBiasSlopeFactor :: forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoDepthBiasSlopeFactor = Float
dbsf,
	createInfoLineWidth :: forall (mn :: Maybe (*)). CreateInfo mn -> Float
createInfoLineWidth = Float
lw } 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') ->
	let	ci :: CreateInfo
ci = C.CreateInfo {
			createInfoSType :: ()
C.createInfoSType = (),
			createInfoPNext :: Ptr ()
C.createInfoPNext = Ptr ()
pnxt',
			createInfoFlags :: Word32
C.createInfoFlags = Word32
flgs,
			createInfoDepthClampEnable :: Word32
C.createInfoDepthClampEnable = Word32
dce,
			createInfoRasterizerDiscardEnable :: Word32
C.createInfoRasterizerDiscardEnable = Word32
rde,
			createInfoPolygonMode :: Word32
C.createInfoPolygonMode = Word32
pm,
			createInfoCullMode :: Word32
C.createInfoCullMode = Word32
cm,
			createInfoFrontFace :: Word32
C.createInfoFrontFace = Word32
ff,
			createInfoDepthBiasEnable :: Word32
C.createInfoDepthBiasEnable = Word32
dbe,
			createInfoDepthBiasConstantFactor :: Float
C.createInfoDepthBiasConstantFactor = Float
dbcf,
			createInfoDepthBiasClamp :: Float
C.createInfoDepthBiasClamp = Float
dbc,
			createInfoDepthBiasSlopeFactor :: Float
C.createInfoDepthBiasSlopeFactor = Float
dbsf,
			createInfoLineWidth :: Float
C.createInfoLineWidth = Float
lw } 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