module Vulkan.Utils.VulkanContext
( VulkanContext (..)
, RecycledResources (..)
, mkVulkanContext
) where
import Control.Concurrent.Chan.Unagi
import qualified Vulkan.Core10 as Vk
import Vulkan.Utils.QueueAssignment (QueueFamilyIndex)
import Vulkan.Utils.Queues (Queues (..))
data VulkanContext = VulkanContext
{ VulkanContext -> Instance
vcInstance :: Vk.Instance
, VulkanContext -> PhysicalDevice
vcPhysicalDevice :: Vk.PhysicalDevice
, VulkanContext -> Device
vcDevice :: Vk.Device
, VulkanContext -> Queues (QueueFamilyIndex, Queue)
vcQueues :: Queues (QueueFamilyIndex, Vk.Queue)
, VulkanContext -> RecycledResources -> IO ()
vcRecycleBin :: RecycledResources -> IO ()
, VulkanContext
-> IO (Either (IO RecycledResources) RecycledResources)
vcRecycleNib :: IO (Either (IO RecycledResources) RecycledResources)
}
data RecycledResources = RecycledResources
{ RecycledResources -> Semaphore
rrImageAvailable :: Vk.Semaphore
, RecycledResources -> CommandPool
rrCommandPool :: Vk.CommandPool
}
mkVulkanContext
:: Vk.Instance
-> Vk.PhysicalDevice
-> Vk.Device
-> Queues (QueueFamilyIndex, Vk.Queue)
-> IO VulkanContext
mkVulkanContext :: Instance
-> PhysicalDevice
-> Device
-> Queues (QueueFamilyIndex, Queue)
-> IO VulkanContext
mkVulkanContext Instance
vcInstance PhysicalDevice
vcPhysicalDevice Device
vcDevice Queues (QueueFamilyIndex, Queue)
vcQueues = do
(binW, binR) <- IO (InChan RecycledResources, OutChan RecycledResources)
forall a. IO (InChan a, OutChan a)
newChan
let
vcRecycleBin = InChan RecycledResources -> RecycledResources -> IO ()
forall a. InChan a -> a -> IO ()
writeChan InChan RecycledResources
binW
vcRecycleNib = do
(try, block) <- OutChan RecycledResources
-> IO (Element RecycledResources, IO RecycledResources)
forall a. OutChan a -> IO (Element a, IO a)
tryReadChan OutChan RecycledResources
binR
maybe (Left block) Right <$> tryRead try
pure VulkanContext{..}