gpu-vulkan-0.1.0.162: src/Gpu/Vulkan/Queue.hs
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Gpu.Vulkan.Queue (
-- * SUBMIT AND WAIT IDLE
submit, submit2, M.waitIdle, M.Q,
-- * TYPE SYNONYM
Index,
-- * SPARSE RESOURCES
bindSparse, BindSparseInfo(..), BindSparseInfosToMiddle,
-- * ENUM
module Gpu.Vulkan.Queue.Enum
) where
import Data.TypeLevel.Tuple.Uncurry
import Data.TypeLevel.Tuple.MapIndex
import Data.HeteroParList qualified as HeteroParList
import Data.Word
import Gpu.Vulkan.Internal
import qualified Gpu.Vulkan.Fence.Type as Fence
import Gpu.Vulkan.Queue.Middle qualified as M
import Gpu.Vulkan.Queue.Enum
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.HeteroParList (pattern (:**))
import Data.HeteroParList qualified as HPList
import Foreign.Storable.PeekPoke
import Gpu.Vulkan.Device qualified as Device
import Gpu.Vulkan.Semaphore.Internal qualified as Semaphore
import Gpu.Vulkan.Sparse.Buffer.Internal qualified as Sparse.Buffer
import Gpu.Vulkan.Sparse.Image.Internal qualified as Sparse.Image
import Control.Monad
import Debug
submit :: SubmitInfoListToMiddle sias => M.Q ->
HeteroParList.PL (U4 SubmitInfo) sias -> Maybe (Fence.F sf) -> IO ()
submit q sis mf =
M.submit q (submitInfoListToMiddle sis) $ (\(Fence.F f) -> f) <$> mf
submit2 :: SubmitInfo2ListToMiddle sias => M.Q ->
HeteroParList.PL (U4 SubmitInfo2) sias -> Maybe (Fence.F sf) -> IO ()
submit2 q sis mf =
M.submit2 q (submitInfo2ListToMiddle sis) $ (\(Fence.F f) -> f) <$> mf
type Index = Word32
bindSparse :: (
BindSparseInfosToMiddle ias,
HPList.ToListWithCCpsM' WithPoked TMaybe.M (M0_6 ias) ) =>
Device.D sd -> M.Q ->
HPList.PL (U6 BindSparseInfo) ias -> Maybe (Fence.F sf) -> IO ()
bindSparse dv q is mf = do
let mmf = case mf of
Just (Fence.F f) -> Just f
Nothing -> Nothing
when debug $ putStrLn
"Gpu.Vulkan.Queue.bindSparse: before bindSparseInfoToMiddle"
mis <- bindSparseInfosToMiddle dv is
when debug $ putStrLn
"Gpu.Vulkan.Queue.bindSparse: before M.bindSparse"
M.bindSparse q mis mmf
data BindSparseInfo mn swss bbs iobs ibs ssss = BindSparseInfo {
bindSparseInfoNext :: TMaybe.M mn,
bindSparseInfoWaitSemaphores :: HPList.PL Semaphore.S swss,
bindSparseInfoBufferBinds ::
HPList.PL (U4 Sparse.Buffer.MemoryBindInfo) bbs,
bindSparseInfoImageOpaqueBinds ::
HPList.PL (U4 Sparse.Image.OpaqueMemoryBindInfo) iobs,
bindSparseInfoImageBinds ::
HPList.PL (U4 Sparse.Image.MemoryBindInfo) ibs,
bindSparseInfoSignalSemaphores :: HPList.PL Semaphore.S ssss }
bindSparseInfoToMiddle :: (
Sparse.Buffer.MemoryBindInfosToMiddle bbs,
Sparse.Image.OpaqueMemoryBindInfosToMiddle iobs,
Sparse.Image.MemoryBindInfosToMiddle ibs ) =>
Device.D sd ->
BindSparseInfo mn swss bbs iobs ibs ssss -> IO (M.BindSparseInfo mn)
bindSparseInfoToMiddle dv BindSparseInfo {
bindSparseInfoNext = mn,
bindSparseInfoWaitSemaphores =
HPList.toList (\(Semaphore.S s) -> s) -> wss,
bindSparseInfoBufferBinds = bbs,
bindSparseInfoImageOpaqueBinds = iobs,
bindSparseInfoImageBinds = ibs,
bindSparseInfoSignalSemaphores =
HPList.toList (\(Semaphore.S s) -> s) -> sss
} = do
mbbs <- Sparse.Buffer.memoryBindInfosToMiddle dv bbs
miobs <- Sparse.Image.opaqueMemoryBindInfosToMiddle dv iobs
mibs <- Sparse.Image.memoryBindInfosToMiddle dv ibs
pure M.BindSparseInfo {
M.bindSparseInfoNext = mn,
M.bindSparseInfoWaitSemaphores = wss,
M.bindSparseInfoBufferBinds = mbbs,
M.bindSparseInfoImageOpaqueBinds = miobs,
M.bindSparseInfoImageBinds = mibs,
M.bindSparseInfoSignalSemaphores = sss }
class BindSparseInfosToMiddle bsias where
bindSparseInfosToMiddle :: Device.D sd ->
HPList.PL (U6 BindSparseInfo) bsias ->
IO (HPList.PL M.BindSparseInfo (M0_6 bsias))
instance BindSparseInfosToMiddle '[] where
bindSparseInfosToMiddle _ HPList.Nil = pure HPList.Nil
instance (
Sparse.Buffer.MemoryBindInfosToMiddle bbs,
Sparse.Image.OpaqueMemoryBindInfosToMiddle iobs,
Sparse.Image.MemoryBindInfosToMiddle ibs,
BindSparseInfosToMiddle bsias ) =>
BindSparseInfosToMiddle
('(mn, swss, bbs, iobs, ibs, ssss) ': bsias) where
bindSparseInfosToMiddle dv (U6 i :** is) = (:**)
<$> bindSparseInfoToMiddle dv i
<*> bindSparseInfosToMiddle dv is
-- instance BindSparse