{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PatternSynonyms #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.ShaderModule.Internal (

	-- * CREATE AND DESTROY

	create, destroy, M.CreateInfo(..), M.CreateFlags

	) where

import Foreign.Storable.PeekPoke
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.TypeLevel.ParMaybe qualified as TPMaybe
import Data.TypeLevel.Tuple.Uncurry

import qualified Gpu.Vulkan.AllocationCallbacks as AllocationCallbacks
import qualified Gpu.Vulkan.AllocationCallbacks.Type as AllocationCallbacks
import qualified Gpu.Vulkan.Device.Type as Device
import qualified Gpu.Vulkan.ShaderModule.Middle as M

create :: (WithPoked (TMaybe.M mn), AllocationCallbacks.ToMiddle mscc) =>
	Device.D sd -> M.CreateInfo mn sknd -> TPMaybe.M (U2 AllocationCallbacks.A) mscc -> IO (M.S sknd)
create :: forall (mn :: Maybe (*)) (mscc :: Maybe (*, *)) sd
       (sknd :: ShaderKind).
(WithPoked (M mn), ToMiddle mscc) =>
D sd -> CreateInfo mn sknd -> M (U2 A) mscc -> IO (S sknd)
create (Device.D D
dvc) CreateInfo mn sknd
m M (U2 A) mscc
mac =
	D -> CreateInfo mn sknd -> M A (Snd mscc) -> IO (S sknd)
forall (mn :: Maybe (*)) (sknd :: ShaderKind) (mc :: Maybe (*)).
WithPoked (M mn) =>
D -> CreateInfo mn sknd -> M A mc -> IO (S sknd)
M.create D
dvc CreateInfo mn sknd
m (M A (Snd mscc) -> IO (S sknd)) -> M A (Snd mscc) -> IO (S sknd)
forall a b. (a -> b) -> a -> b
$ M (U2 A) mscc -> M A (Snd mscc)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle M (U2 A) mscc
mac

destroy :: AllocationCallbacks.ToMiddle mscc =>
	Device.D sd -> M.S sknd -> TPMaybe.M (U2 AllocationCallbacks.A) mscc -> IO ()
destroy :: forall (mscc :: Maybe (*, *)) sd (sknd :: ShaderKind).
ToMiddle mscc =>
D sd -> S sknd -> M (U2 A) mscc -> IO ()
destroy (Device.D D
dvc) S sknd
mm M (U2 A) mscc
mac =
	D -> S sknd -> M A (Snd mscc) -> IO ()
forall (sknd :: ShaderKind) (md :: Maybe (*)).
D -> S sknd -> M A md -> IO ()
M.destroy D
dvc S sknd
mm (M A (Snd mscc) -> IO ()) -> M A (Snd mscc) -> IO ()
forall a b. (a -> b) -> a -> b
$ M (U2 A) mscc -> M A (Snd mscc)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle M (U2 A) mscc
mac