add the module
This commit is contained in:
parent
216879b97a
commit
a9715e1767
1 changed files with 122 additions and 0 deletions
122
src/CommandBuffer.hs
Normal file
122
src/CommandBuffer.hs
Normal file
|
@ -0,0 +1,122 @@
|
|||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE DuplicateRecordFields #-}
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
module CommandBuffer where
|
||||
|
||||
import Control.Monad
|
||||
import Control.Monad.Loops
|
||||
import Control.Monad.IO.Class
|
||||
import Control.Monad.Trans.Resource
|
||||
import Data.Bits
|
||||
import qualified Data.Vector as V
|
||||
import Data.Word
|
||||
import Foreign.C.Types (CInt)
|
||||
import Linear
|
||||
import qualified SDL hiding (V2)
|
||||
import qualified Control.Concurrent.STM as STM
|
||||
import qualified Vulkan as Vk
|
||||
import qualified Vulkan.Zero as Vk
|
||||
|
||||
-- internal imports
|
||||
|
||||
import Devices
|
||||
import qualified Vulkan.Dynamic as Vk
|
||||
|
||||
createCommandPool
|
||||
:: (MonadResource m)
|
||||
=> Vk.PhysicalDevice
|
||||
-> Vk.Device
|
||||
-> m Vk.CommandPool
|
||||
createCommandPool physicalDevice logicalDevice = do
|
||||
|
||||
queueFamilyIndex <- getQueueFamily physicalDevice Vk.QUEUE_GRAPHICS_BIT
|
||||
|
||||
let poolCreateInfo = Vk.zero
|
||||
{ Vk.flags = Vk.COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
|
||||
, Vk.queueFamilyIndex = queueFamilyIndex
|
||||
} :: Vk.CommandPoolCreateInfo
|
||||
|
||||
snd <$> allocate
|
||||
(Vk.createCommandPool logicalDevice poolCreateInfo Nothing)
|
||||
(\commandPool -> do
|
||||
putStrLn "destroying comman pool"
|
||||
Vk.destroyCommandPool logicalDevice commandPool Nothing
|
||||
)
|
||||
|
||||
createCommandBuffer
|
||||
:: (MonadResource m)
|
||||
=> Vk.CommandPool
|
||||
-> Vk.Device
|
||||
-> m (V.Vector Vk.CommandBuffer)
|
||||
createCommandBuffer commandPool logicalDevice = do
|
||||
|
||||
let commandBufferAllocationInfo = Vk.zero
|
||||
{ Vk.commandPool = commandPool
|
||||
, Vk.level = Vk.COMMAND_BUFFER_LEVEL_PRIMARY
|
||||
, Vk.commandBufferCount = 1
|
||||
}
|
||||
|
||||
Vk.allocateCommandBuffers logicalDevice commandBufferAllocationInfo
|
||||
|
||||
recordCommandBuffer
|
||||
:: (MonadResource m)
|
||||
=> Vk.CommandBuffer
|
||||
-> Vk.RenderPass
|
||||
-> Vk.Framebuffer
|
||||
-> V2 CInt
|
||||
-> Vk.Pipeline
|
||||
-> m ()
|
||||
recordCommandBuffer commandBuffer renderPass frameBuffer (V2 width height) graphicsPipeline = do
|
||||
|
||||
let commandBufferBeginInfo = Vk.zero
|
||||
{ Vk.flags = Vk.COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
|
||||
, Vk.inheritanceInfo = Nothing
|
||||
}
|
||||
|
||||
Vk.beginCommandBuffer commandBuffer commandBufferBeginInfo
|
||||
|
||||
let renderPassInfo = Vk.zero
|
||||
{ Vk.renderPass = renderPass
|
||||
, Vk.framebuffer = frameBuffer
|
||||
, Vk.renderArea = Vk.Rect2D
|
||||
{ offset = Vk.Offset2D
|
||||
{ Vk.x = 0
|
||||
, Vk.y = 0
|
||||
}
|
||||
, extent = Vk.Extent2D
|
||||
{ Vk.width = fromIntegral width
|
||||
, Vk.height = fromIntegral height
|
||||
}
|
||||
}
|
||||
, Vk.clearValues = V.singleton (Vk.Color $ Vk.Float32 0 0 0 1)
|
||||
}
|
||||
|
||||
Vk.cmdBeginRenderPass commandBuffer renderPassInfo Vk.SUBPASS_CONTENTS_INLINE
|
||||
|
||||
Vk.cmdBindPipeline commandBuffer Vk.PIPELINE_BIND_POINT_GRAPHICS graphicsPipeline
|
||||
|
||||
let viewport = Vk.zero
|
||||
{ Vk.x = 0
|
||||
, Vk.y = 0
|
||||
, Vk.width = fromIntegral width
|
||||
, Vk.height = fromIntegral height
|
||||
, Vk.minDepth = 0
|
||||
, Vk.maxDepth = 0
|
||||
}
|
||||
scissor = Vk.Rect2D
|
||||
{ Vk.offset = Vk.Offset2D
|
||||
{ Vk.x = 0
|
||||
, Vk.y = 0
|
||||
}
|
||||
, Vk.extent = Vk.Extent2D
|
||||
{ Vk.width = fromIntegral width
|
||||
, Vk.height = fromIntegral height
|
||||
}
|
||||
}
|
||||
|
||||
Vk.cmdSetViewport commandBuffer 0 (V.singleton viewport)
|
||||
Vk.cmdSetScissor commandBuffer 0 (V.singleton scissor)
|
||||
|
||||
Vk.cmdDraw commandBuffer 3 1 0 0
|
||||
|
||||
Vk.cmdEndRenderPass commandBuffer
|
Loading…
Reference in a new issue