packages feed

gpu-vulkan-middle-0.1.0.65: src/Gpu/Vulkan/Sparse/Buffer/Middle/Internal.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Sparse.Buffer.Middle.Internal where

import Foreign.Marshal.Array
import Control.Arrow

import Gpu.Vulkan.Buffer.Middle.Internal qualified as Buffer
import Gpu.Vulkan.Sparse.Middle.Internal

import Gpu.Vulkan.Sparse.Buffer.Core qualified as C

data MemoryBindInfo = MemoryBindInfo {
	memoryBindInfoBuffer :: Buffer.B,
	memoryBindInfoBinds :: [MemoryBind] }

memoryBindInfoToCore :: MemoryBindInfo -> (C.MemoryBindInfo -> IO a) -> IO a
memoryBindInfoToCore MemoryBindInfo {
	memoryBindInfoBuffer = Buffer.B bffr,
	memoryBindInfoBinds = length &&& id -> (bndc, bnds) } f = do
	cbnds <- memoryBindToCore `mapM` bnds
	allocaArray bndc \pbnds -> do
		pokeArray pbnds cbnds
		f C.MemoryBindInfo {
			C.memoryBindInfoBuffer = bffr,
			C.memoryBindInfoBindCount = fromIntegral bndc,
			C.memoryBindInfoPBinds = pbnds }