new modules
This commit is contained in:
parent
d3636f890e
commit
9dca7c85e0
2 changed files with 98 additions and 0 deletions
32
src/Memory.hs
Normal file
32
src/Memory.hs
Normal file
|
@ -0,0 +1,32 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE DuplicateRecordFields #-}
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
module Memory where
|
||||
|
||||
import Control.Monad.Trans.Resource
|
||||
|
||||
import qualified VulkanMemoryAllocator as VMA
|
||||
import qualified Vulkan.Core10 as Vk
|
||||
import qualified Vulkan.Zero as Vk
|
||||
|
||||
initAllocator
|
||||
:: (MonadResource m, MonadFail m)
|
||||
=> Vk.PhysicalDevice
|
||||
-> Vk.Device
|
||||
-> Vk.Instance
|
||||
-> m VMA.Allocator
|
||||
initAllocator physicalDevice device instance' = do
|
||||
let allocatorInfo = Vk.zero
|
||||
{ VMA.physicalDevice = Vk.physicalDeviceHandle physicalDevice
|
||||
, VMA.device = Vk.deviceHandle device
|
||||
, VMA.instance' = Vk.instanceHandle instance'
|
||||
} :: VMA.AllocatorCreateInfo
|
||||
|
||||
(_, allocator) <- allocate
|
||||
(VMA.createAllocator allocatorInfo)
|
||||
(\allocator -> do
|
||||
print ("destroying allocator" :: String)
|
||||
VMA.destroyAllocator allocator
|
||||
)
|
||||
|
||||
return allocator
|
66
src/Mesh.hs
Normal file
66
src/Mesh.hs
Normal file
|
@ -0,0 +1,66 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE DuplicateRecordFields #-}
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
module Mesh where
|
||||
|
||||
import Control.Monad.IO.Class
|
||||
import Control.Monad.Trans.Resource
|
||||
|
||||
import qualified Data.Vector as V
|
||||
|
||||
import Foreign
|
||||
|
||||
import Linear (V3(..))
|
||||
|
||||
import qualified VulkanMemoryAllocator as VMA
|
||||
import qualified Vulkan.Core10 as Vk
|
||||
import qualified Vulkan.Zero as Vk
|
||||
|
||||
-- internal imports
|
||||
|
||||
import Types
|
||||
|
||||
loadMeshes
|
||||
:: V.Vector Vertex
|
||||
loadMeshes =
|
||||
V.fromList
|
||||
[ Vertex (V3 0.5 0.5 0) (V3 0 1 0) undefined
|
||||
, Vertex (V3 (-0.5) 0.5 0) (V3 0 1 0) undefined
|
||||
, Vertex (V3 0 (-0.5) 0) (V3 0 1 0) undefined
|
||||
]
|
||||
|
||||
uploadMesh
|
||||
:: (MonadResource m, MonadFail m)
|
||||
=> V.Vector Vertex
|
||||
-> VMA.Allocator
|
||||
-> m Mesh
|
||||
uploadMesh vertices allocator = do
|
||||
let bufferCreateInfo = Vk.zero
|
||||
{ Vk.size = fromIntegral $ sizeOf (undefined :: Vertex)
|
||||
, Vk.usage = Vk.BUFFER_USAGE_VERTEX_BUFFER_BIT
|
||||
}
|
||||
allocationCreateInfo = Vk.zero
|
||||
{ VMA.usage = VMA.MEMORY_USAGE_CPU_TO_GPU
|
||||
} :: VMA.AllocationCreateInfo
|
||||
(_, mesh) <- allocate
|
||||
(do
|
||||
(buffer, allocation, _) <- VMA.createBuffer allocator bufferCreateInfo allocationCreateInfo
|
||||
return (Mesh vertices (AllocatedBuffer buffer allocation))
|
||||
)
|
||||
(\(Mesh _ (AllocatedBuffer buffer allocation)) -> do
|
||||
print ("destroying mesh" :: String)
|
||||
VMA.destroyBuffer allocator buffer allocation
|
||||
)
|
||||
|
||||
(dataReleaseKey, dataPtr) <- allocate
|
||||
(VMA.mapMemory allocator (bufferAllocation $ meshBuffer mesh))
|
||||
(\_ -> VMA.unmapMemory allocator (bufferAllocation $ meshBuffer mesh))
|
||||
|
||||
liftIO $ mapM_ (\(idx, vertex) ->
|
||||
poke (castPtr (dataPtr `plusPtr` idx)) vertex
|
||||
)
|
||||
(zip [0..] (V.toList vertices))
|
||||
|
||||
release dataReleaseKey
|
||||
|
||||
return mesh
|
Loading…
Reference in a new issue