packages feed

gpu-vulkan-0.1.0.137: src/Gpu/Vulkan/VertexInput/Internal.hs

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments, LambdaCase #-}
{-# LANGUAGE DataKinds, PolyKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGe MultiParamTypeClasses, AllowAmbiguousTypes #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.VertexInput.Internal (
	Rate(..),
	M.AttributeDescription(..),
	BindingDescription(..),

	bindingDescriptionFromRaw,
	bindingDescriptionToMiddle,

	) where

import Data.Word
import Data.TypeLevel.TypeVal qualified as TypeVal

import Gpu.Vulkan.VertexInput.Middle qualified as M
import Gpu.Vulkan.VertexInput.Enum qualified as M

data Rate = RateVertex | RateInstance deriving Show

instance TypeVal.T 'RateVertex Rate where t = RateVertex
instance TypeVal.T 'RateInstance Rate where t = RateInstance

data BindingDescription = BindingDescription {
	bindingDescriptionBinding :: Word32,
	bindingDescriptionStride :: Word32,
	bindingDescriptionInputRate :: Rate }
	deriving Show

type SizeAlignment = (Int, Int)

bindingDescriptionFromRaw :: [(SizeAlignment, Rate)] -> [BindingDescription]
bindingDescriptionFromRaw sars = (<$> zip [0 ..] sars)
	\(b, ((fromIntegral -> sz, _algn), r)) -> BindingDescription b sz r

bindingDescriptionToMiddle :: BindingDescription -> M.BindingDescription
bindingDescriptionToMiddle BindingDescription {
	bindingDescriptionBinding = bdg,
	bindingDescriptionStride = strd,
	bindingDescriptionInputRate = rt } = M.BindingDescription {
	M.bindingDescriptionBinding = bdg,
	M.bindingDescriptionStride = strd,
	M.bindingDescriptionInputRate = rateToEnum rt }
	where rateToEnum = \case
		RateVertex -> M.RateVertex; RateInstance -> M.RateInstance