packages feed

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

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables, RankNTypes, TypeApplications #-}
{-# LANGUAGE GADTs, TypeFamilies #-}
{-# LANGUAGE DataKinds, PolyKinds #-}
{-# LANGUAGE KindSignatures, TypeOperators #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Descriptor.Internal (

	-- * EXTENSION NAME

	indexingExtensionName,

	-- * BUFFER INFO

	BufferInfo(..), bufferInfoToMiddle,

	-- * IMAGE INFO

	ImageInfo(..), imageInfoToMiddle,
	ImageInfoNoSampler(..), imageInfoNoSamplerToMiddle

	) where

import Gpu.Vulkan.Object qualified as VObj

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

import qualified Gpu.Vulkan.Sampler.Type as Sampler
import qualified Gpu.Vulkan.Image.Enum as Image
import qualified Gpu.Vulkan.ImageView as ImageView
import qualified Gpu.Vulkan.ImageView.Type as ImageView

import Gpu.Vulkan.Sampler.Middle as Sampler.M

import Gpu.Vulkan.PhysicalDevice qualified as PhysicalDevice

indexingExtensionName :: PhysicalDevice.ExtensionName
indexingExtensionName = PhysicalDevice.ExtensionName M.indexingExtensionName

data BufferInfo sm sb nm obj i = forall objs .
	(Show (Buffer.Binded sm sb nm objs), VObj.OffsetRange obj objs i) =>
	BufferInfo (Buffer.Binded sm sb nm objs)

deriving instance Show (BufferInfo sm sb nm obj i)

bufferInfoToMiddle :: forall sb sm nm obj i .
	BufferInfo sm sb nm obj i -> M.BufferInfo
bufferInfoToMiddle (BufferInfo (Buffer.Binded lns b)) = M.BufferInfo {
	M.bufferInfoBuffer = b,
	M.bufferInfoOffset = ost,
	M.bufferInfoRange = rng }
	where (ost, rng) = VObj.offsetRange @obj @_ @i 0 lns

data ImageInfo ss fmt nm si = ImageInfo {
	imageInfoSampler :: Sampler.S ss,
	imageInfoImageView :: ImageView.I fmt nm si,
	imageInfoImageLayout :: Image.Layout }
	deriving Show

imageInfoToMiddle ::
	ImageInfo ss fmt nm si -> M.ImageInfo
imageInfoToMiddle ImageInfo {
	imageInfoSampler = s,
	imageInfoImageView = ImageView.I iv,
	imageInfoImageLayout = lyt } = M.ImageInfo {
	M.imageInfoSampler = Sampler.sToMiddle s,
	M.imageInfoImageView = iv,
	M.imageInfoImageLayout = lyt }

data ImageInfoNoSampler fmt nm si = ImageInfoNoSampler {
	imageInfoNoSamplerImageView :: ImageView.I fmt nm si,
	imageInfoNoSamplerImageLayout :: Image.Layout }
	deriving Show

imageInfoNoSamplerToMiddle ::
	ImageInfoNoSampler fmt nm si -> M.ImageInfo
imageInfoNoSamplerToMiddle ImageInfoNoSampler {
	imageInfoNoSamplerImageView = ImageView.I iv,
	imageInfoNoSamplerImageLayout = lyt } = M.ImageInfo {
	M.imageInfoSampler = Sampler.M.Null,
	M.imageInfoImageView = iv,
	M.imageInfoImageLayout = lyt }