graphics pipeline creation complete for now
This commit is contained in:
parent
bbd1e85970
commit
8daf97ff90
1 changed files with 79 additions and 10 deletions
|
@ -4,6 +4,7 @@
|
||||||
module GraphicsPipeline where
|
module GraphicsPipeline where
|
||||||
|
|
||||||
import Linear
|
import Linear
|
||||||
|
import Control.Monad (unless)
|
||||||
import Control.Monad.IO.Class (liftIO)
|
import Control.Monad.IO.Class (liftIO)
|
||||||
import Control.Monad.Trans.Resource
|
import Control.Monad.Trans.Resource
|
||||||
import Data.Bits
|
import Data.Bits
|
||||||
|
@ -12,6 +13,7 @@ import qualified Data.Vector as V
|
||||||
import Foreign.C.Types (CInt)
|
import Foreign.C.Types (CInt)
|
||||||
import qualified Vulkan as Vk
|
import qualified Vulkan as Vk
|
||||||
import qualified Vulkan.Zero as Vk
|
import qualified Vulkan.Zero as Vk
|
||||||
|
import qualified Vulkan.CStruct.Extends as Vk
|
||||||
|
|
||||||
loadShader
|
loadShader
|
||||||
:: (MonadResource m)
|
:: (MonadResource m)
|
||||||
|
@ -32,19 +34,21 @@ loadShader logicalDevice shaderPath = do
|
||||||
Vk.destroyShaderModule logicalDevice shaderModule Nothing
|
Vk.destroyShaderModule logicalDevice shaderModule Nothing
|
||||||
)
|
)
|
||||||
|
|
||||||
createGraphicsPipeline
|
createGraphicsPipelines
|
||||||
:: (MonadResource m)
|
:: (MonadResource m)
|
||||||
=> Vk.ShaderModule
|
=> Vk.ShaderModule
|
||||||
-> Vk.ShaderModule
|
-> Vk.ShaderModule
|
||||||
-> BS.ByteString
|
-> BS.ByteString
|
||||||
-> V2 CInt
|
-> V2 CInt
|
||||||
|
-> Vk.Format
|
||||||
-> Vk.Device
|
-> Vk.Device
|
||||||
-> m Vk.Pipeline
|
-> m (V.Vector Vk.Pipeline)
|
||||||
createGraphicsPipeline
|
createGraphicsPipelines
|
||||||
vertexShaderModule
|
vertexShaderModule
|
||||||
fragmentShaderModule
|
fragmentShaderModule
|
||||||
stageName
|
stageName
|
||||||
(V2 width height)
|
(V2 width height)
|
||||||
|
swapchainImageFormat
|
||||||
logicalDevice
|
logicalDevice
|
||||||
= do
|
= do
|
||||||
|
|
||||||
|
@ -59,7 +63,7 @@ createGraphicsPipeline
|
||||||
, Vk.name = stageName
|
, Vk.name = stageName
|
||||||
}
|
}
|
||||||
pipelineStagesCreateInfos =
|
pipelineStagesCreateInfos =
|
||||||
V.fromList
|
V.fromList $ map Vk.SomeStruct
|
||||||
[ vertexShaderStageCreateInfo
|
[ vertexShaderStageCreateInfo
|
||||||
, fragmentShaderStageCreateInfo
|
, fragmentShaderStageCreateInfo
|
||||||
]
|
]
|
||||||
|
@ -68,14 +72,14 @@ createGraphicsPipeline
|
||||||
[ Vk.DYNAMIC_STATE_VIEWPORT
|
[ Vk.DYNAMIC_STATE_VIEWPORT
|
||||||
, Vk.DYNAMIC_STATE_SCISSOR
|
, Vk.DYNAMIC_STATE_SCISSOR
|
||||||
]
|
]
|
||||||
dynamicStateCreateInfo = Vk.zero
|
pipelineDynamicStateCreateInfo = Vk.zero
|
||||||
{ Vk.dynamicStates = dynamicStates
|
{ Vk.dynamicStates = dynamicStates
|
||||||
}
|
}
|
||||||
vertexInputCreateInfo = Vk.zero
|
pipelineVertexInputCreateInfo = Vk.zero
|
||||||
{ Vk.vertexBindingDescriptions = V.empty -- Fill me?
|
{ Vk.vertexBindingDescriptions = V.empty -- Fill me?
|
||||||
, Vk.vertexAttributeDescriptions = V.empty -- Fill me?
|
, Vk.vertexAttributeDescriptions = V.empty -- Fill me?
|
||||||
}
|
}
|
||||||
inputAssemblyStateCreateInfo = Vk.zero
|
pipelineInputAssemblyStateCreateInfo = Vk.zero
|
||||||
{ Vk.topology = Vk.PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
|
{ Vk.topology = Vk.PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
|
||||||
, Vk.primitiveRestartEnable = False
|
, Vk.primitiveRestartEnable = False
|
||||||
}
|
}
|
||||||
|
@ -107,7 +111,7 @@ createGraphicsPipeline
|
||||||
, Vk.depthBiasClamp = 0
|
, Vk.depthBiasClamp = 0
|
||||||
, Vk.depthBiasSlopeFactor = 0
|
, Vk.depthBiasSlopeFactor = 0
|
||||||
}
|
}
|
||||||
multisamplingCreateInfo = Vk.zero
|
pipelineMultisamplingCreateInfo = Vk.zero
|
||||||
{ Vk.sampleShadingEnable = False
|
{ Vk.sampleShadingEnable = False
|
||||||
, Vk.rasterizationSamples = Vk.SAMPLE_COUNT_1_BIT
|
, Vk.rasterizationSamples = Vk.SAMPLE_COUNT_1_BIT
|
||||||
}
|
}
|
||||||
|
@ -125,7 +129,7 @@ createGraphicsPipeline
|
||||||
, Vk.dstAlphaBlendFactor = Vk.BLEND_FACTOR_ZERO
|
, Vk.dstAlphaBlendFactor = Vk.BLEND_FACTOR_ZERO
|
||||||
, Vk.alphaBlendOp = Vk.BLEND_OP_ADD
|
, Vk.alphaBlendOp = Vk.BLEND_OP_ADD
|
||||||
}
|
}
|
||||||
colorBlendStateCreateInfo = Vk.zero
|
pipelineColorBlendStateCreateInfo = Vk.zero
|
||||||
{ Vk.logicOpEnable = False
|
{ Vk.logicOpEnable = False
|
||||||
, Vk.attachments = V.singleton colorBlendAttachment
|
, Vk.attachments = V.singleton colorBlendAttachment
|
||||||
}
|
}
|
||||||
|
@ -138,4 +142,69 @@ createGraphicsPipeline
|
||||||
Vk.destroyPipelineLayout logicalDevice pipelineLayout Nothing
|
Vk.destroyPipelineLayout logicalDevice pipelineLayout Nothing
|
||||||
)
|
)
|
||||||
|
|
||||||
error "createGraphicsPipeline: implementation invomplete"
|
let colorAttachmentDescription = (Vk.zero :: Vk.AttachmentDescription)
|
||||||
|
{ Vk.format = swapchainImageFormat
|
||||||
|
, Vk.samples = Vk.SAMPLE_COUNT_1_BIT
|
||||||
|
, Vk.loadOp = Vk.ATTACHMENT_LOAD_OP_CLEAR
|
||||||
|
, Vk.storeOp = Vk.ATTACHMENT_STORE_OP_STORE
|
||||||
|
, Vk.stencilLoadOp = Vk.ATTACHMENT_LOAD_OP_DONT_CARE
|
||||||
|
, Vk.stencilStoreOp = Vk.ATTACHMENT_STORE_OP_DONT_CARE
|
||||||
|
, Vk.initialLayout = Vk.IMAGE_LAYOUT_UNDEFINED
|
||||||
|
, Vk.finalLayout = Vk.IMAGE_LAYOUT_PRESENT_SRC_KHR
|
||||||
|
}
|
||||||
|
colorAttachmentReference = (Vk.zero :: Vk.AttachmentReference)
|
||||||
|
{ Vk.attachment = 0
|
||||||
|
, Vk.layout = Vk.IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
|
||||||
|
}
|
||||||
|
subpassDescriptor = (Vk.zero :: Vk.SubpassDescription)
|
||||||
|
{ Vk.pipelineBindPoint = Vk.PIPELINE_BIND_POINT_GRAPHICS
|
||||||
|
, Vk.colorAttachments = V.singleton colorAttachmentReference
|
||||||
|
}
|
||||||
|
renderPassCreateInfo = Vk.zero
|
||||||
|
{ Vk.attachments = V.singleton colorAttachmentDescription
|
||||||
|
, Vk.subpasses = V.singleton subpassDescriptor
|
||||||
|
, Vk.dependencies = V.empty
|
||||||
|
} :: Vk.RenderPassCreateInfo '[]
|
||||||
|
pipelineRenderPass <- snd <$> allocate
|
||||||
|
(Vk.createRenderPass logicalDevice renderPassCreateInfo Nothing)
|
||||||
|
(\renderPass -> do
|
||||||
|
putStrLn "destroying render pass"
|
||||||
|
Vk.destroyRenderPass logicalDevice renderPass Nothing
|
||||||
|
)
|
||||||
|
|
||||||
|
let pipelineCreateInfo = Vk.zero
|
||||||
|
{ Vk.stageCount = 2
|
||||||
|
, Vk.stages = pipelineStagesCreateInfos
|
||||||
|
, Vk.vertexInputState = Nothing -- pipelineVertexInputCreateInfo
|
||||||
|
, Vk.inputAssemblyState = Just pipelineInputAssemblyStateCreateInfo
|
||||||
|
, Vk.viewportState = Just $ Vk.SomeStruct pipelineViewportStateCreateInfo
|
||||||
|
, Vk.rasterizationState = Just $ Vk.SomeStruct pipelineRasterizationStateCreateInfo
|
||||||
|
, Vk.multisampleState = Just $ Vk.SomeStruct pipelineMultisamplingCreateInfo
|
||||||
|
, Vk.colorBlendState = Just $ Vk.SomeStruct pipelineColorBlendStateCreateInfo
|
||||||
|
, Vk.dynamicState = Just pipelineDynamicStateCreateInfo
|
||||||
|
, Vk.layout = pipelineLayout
|
||||||
|
, Vk.renderPass = pipelineRenderPass
|
||||||
|
, Vk.subpass = 0
|
||||||
|
, Vk.basePipelineHandle = Vk.NULL_HANDLE
|
||||||
|
, Vk.basePipelineIndex = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
snd <$> allocate
|
||||||
|
(do
|
||||||
|
(result, pipelines) <- Vk.createGraphicsPipelines
|
||||||
|
logicalDevice
|
||||||
|
Vk.NULL_HANDLE
|
||||||
|
(V.singleton (Vk.SomeStruct pipelineCreateInfo))
|
||||||
|
Nothing
|
||||||
|
unless (result == Vk.SUCCESS) $
|
||||||
|
error "createGraphicsPiepelines: Failed creating pipelines"
|
||||||
|
return pipelines
|
||||||
|
)
|
||||||
|
(\pipelines -> do
|
||||||
|
V.mapM_
|
||||||
|
(\pipeline -> do
|
||||||
|
putStrLn "destroying pipeline"
|
||||||
|
Vk.destroyPipeline logicalDevice pipeline Nothing
|
||||||
|
)
|
||||||
|
pipelines
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in a new issue