{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
{-# LANGUAGE GADTs, TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures, TypeOperators #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Gpu.Vulkan.Queue.Middle.Internal (
submit, waitIdle, Q(..)
) where
import Foreign.Marshal.Array
import Data.HeteroParList qualified as HeteroParList
import Gpu.Vulkan.Middle
import Gpu.Vulkan.Exception.Middle.Internal
import Gpu.Vulkan.Exception.Enum
import Gpu.Vulkan.Fence.Middle.Internal qualified as Fence.M
import Gpu.Vulkan.Queue.Core qualified as C
newtype Q = Q C.Q deriving Int -> Q -> ShowS
[Q] -> ShowS
Q -> String
(Int -> Q -> ShowS) -> (Q -> String) -> ([Q] -> ShowS) -> Show Q
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Q -> ShowS
showsPrec :: Int -> Q -> ShowS
$cshow :: Q -> String
show :: Q -> String
$cshowList :: [Q] -> ShowS
showList :: [Q] -> ShowS
Show
submit :: SubmitInfoListToCore ns =>
Q -> HeteroParList.PL SubmitInfo ns -> Maybe Fence.M.F -> IO ()
submit :: forall (ns :: [Maybe (*)]).
SubmitInfoListToCore ns =>
Q -> PL SubmitInfo ns -> Maybe F -> IO ()
submit (Q Q
q) PL SubmitInfo ns
sis Maybe F
mf = PL SubmitInfo ns -> ([SubmitInfo] -> IO ()) -> IO ()
forall (ns :: [Maybe (*)]) a.
SubmitInfoListToCore ns =>
PL SubmitInfo ns -> ([SubmitInfo] -> IO a) -> IO ()
forall a. PL SubmitInfo ns -> ([SubmitInfo] -> IO a) -> IO ()
submitInfoListToCore PL SubmitInfo ns
sis \[SubmitInfo]
csis ->
let sic :: Int
sic = [SubmitInfo] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [SubmitInfo]
csis in Int -> (Ptr SubmitInfo -> IO ()) -> IO ()
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
sic \Ptr SubmitInfo
psis -> do
Ptr SubmitInfo -> [SubmitInfo] -> IO ()
forall a. Storable a => Ptr a -> [a] -> IO ()
pokeArray Ptr SubmitInfo
psis [SubmitInfo]
csis
Int32
r <- Q -> Word32 -> Ptr SubmitInfo -> F -> IO Int32
C.submit Q
q (Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sic) Ptr SubmitInfo
psis
(F -> IO Int32) -> F -> IO Int32
forall a b. (a -> b) -> a -> b
$ Maybe F -> F
Fence.M.maybeFToCore Maybe F
mf
Result -> IO ()
throwUnlessSuccess (Result -> IO ()) -> Result -> IO ()
forall a b. (a -> b) -> a -> b
$ Int32 -> Result
Result Int32
r
waitIdle :: Q -> IO ()
waitIdle :: Q -> IO ()
waitIdle (Q Q
q) = Result -> IO ()
throwUnlessSuccess (Result -> IO ()) -> (Int32 -> Result) -> Int32 -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int32 -> Result
Result (Int32 -> IO ()) -> IO Int32 -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Q -> IO Int32
C.waitIdle Q
q