packages feed

gpu-vulkan-middle-0.1.0.74: src/Gpu/Vulkan/Device/GroupDevice/Middle/Internal.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Device.GroupDevice.Middle.Internal where

import Foreign.Ptr
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Storable
import Foreign.Storable.PeekPoke
import Control.Arrow
import Data.TypeLevel.Maybe qualified as TMaybe

import Gpu.Vulkan.PhysicalDevice.Middle.Internal qualified as PhysicalDevice
import Gpu.Vulkan.Device.GroupDevice.Core qualified as C

data CreateInfo mn = CreateInfo {
	createInfoNext :: TMaybe.M mn,
	createInfoPhysicalDevices :: [PhysicalDevice.P] }

deriving instance Show (TMaybe.M mn) => Show (CreateInfo mn)

instance WithPoked (TMaybe.M mn) => WithPoked (CreateInfo mn) where
	withPoked' ci f = alloca \pci -> do
		createInfoToCore ci $ \cci -> poke pci cci
		f . ptrS $ castPtr pci

createInfoToCore :: WithPoked (TMaybe.M mn) =>
	CreateInfo mn -> (C.CreateInfo -> IO a) -> IO ()
createInfoToCore CreateInfo {
	createInfoNext = mnxt,
	createInfoPhysicalDevices = (id &&& length) -> (pds, pdc)
	} f =
	putStrLn "createInfoToCore begin" >>
	withPoked' mnxt \pnxt -> withPtrS pnxt \(castPtr -> pnxt') ->
	allocaArray pdc \ppds -> do
		pokeArray ppds (phdToCore <$> pds)
		() <$ f C.CreateInfo {
			C.createInfoSType = (),
			C.createInfoPNext = pnxt',
			C.createInfoPhysicalDeviceCount = fromIntegral pdc,
			C.createInfoPPhysicalDevices = ppds }
	where
	phdToCore (PhysicalDevice.P p) = p