packages feed

gpu-vulkan-0.1.0.137: src/Gpu/Vulkan/Memory/OffsetSize.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments, TupleSections #-}
{-# LANGUAGE ScopedTypeVariables, RankNTypes, TypeApplications #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures, TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Memory.OffsetSize (

	-- * OFFSET SIZE

	offsetSize, OffsetSize,

	) where

import Prelude hiding (map, read)
import GHC.TypeLits
import Gpu.Vulkan.Object qualified as VObj
import Data.TypeLevel.Tuple.Uncurry
import qualified Data.HeteroParList as HeteroParList
import Data.HeteroParList (pattern (:**))

import qualified Gpu.Vulkan.Device.Type as Device
import qualified Gpu.Vulkan.Device.Middle as Device.M
import qualified Gpu.Vulkan.Buffer.Type as Buffer

import Gpu.Vulkan.Memory.Type
import Gpu.Vulkan.Memory.ImageBuffer

offsetSize :: forall nm obj ibargs i sd sm . OffsetSize nm obj ibargs i =>
	Device.D sd -> M sm ibargs -> Device.M.Size ->
	IO (Device.M.Size, Device.M.Size)
offsetSize dvc m ost =
	readM m >>= \(ibs, _mm) -> offsetSize' @nm @obj @ibargs @i dvc ibs ost

class ObjectLength nm obj ibargs =>
	OffsetSize (nm :: Symbol) (obj :: VObj.O) ibargs (i :: Nat) where
	offsetSize' ::
		Device.D sd -> HeteroParList.PL (U2 ImageBuffer) ibargs ->
		Device.M.Size -> IO (Device.M.Size, Device.M.Size)

instance (VObj.OffsetRange obj objs i, VObj.LengthOf obj objs) =>
	OffsetSize nm obj ('(sib, 'BufferArg nm objs) ': ibargs) i where
	offsetSize' dvc ((U2 ib@(Buffer (Buffer.B lns _))) :** _ibs) ost =
		(<$> adjustOffsetSize dvc ib ost) \(ost', _sz) ->
		VObj.offsetSize @obj @_ @i ost' lns

instance {-# OVERLAPPABLE #-}
	OffsetSize nm obj ibargs i =>
	OffsetSize nm obj ('(sib, ib) ': ibargs) i where
	offsetSize' dvc (U2 ib :** ibs) ost =
		adjustOffsetSize dvc ib ost >>=
		offsetSize' @nm @obj @_ @i dvc ibs . uncurry (+)