45 return {0,
sizeof(
Vertex), vk::VertexInputRate::eVertex};
51 vk::VertexInputAttributeDescription vertexPosition {0, 0, vk::Format::eR32G32Sfloat, offsetof(
Vertex,
position)};
52 vk::VertexInputAttributeDescription vertexColor {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(
Vertex,
color)};
54 return {vertexPosition, vertexColor};
60 : m_renderPass(renderPass)
61 , m_device(m_renderPass.getDevice())
62 , m_pipelineLayout(m_device)
63 , m_shaders(
std::move(shaders))
68 for (
Shader &shader : m_shaders) {
75 for (
Shader &shader : m_shaders) {
79 m_shaders = std::move(shaders);
81 for (
Shader &shader : m_shaders) {
89 shaderStages.
reserve(m_shaders.size());
91 vk::ShaderStageFlagBits stage;
93 for (
Shader &shader : m_shaders) {
95 switch (shader.getType()) {
97 stage = vk::ShaderStageFlagBits::eVertex;
100 stage = vk::ShaderStageFlagBits::eFragment;
103 stage = vk::ShaderStageFlagBits::eTessellationControl;
106 stage = vk::ShaderStageFlagBits::eTessellationEvaluation;
109 stage = vk::ShaderStageFlagBits::eGeometry;
112 stage = vk::ShaderStageFlagBits::eCompute;
115 stage = vk::ShaderStageFlagBits::eRaygenKHR;
118 stage = vk::ShaderStageFlagBits::eAnyHitKHR;
121 stage = vk::ShaderStageFlagBits::eClosestHitKHR;
124 stage = vk::ShaderStageFlagBits::eMissKHR;
127 stage = vk::ShaderStageFlagBits::eIntersectionKHR;
130 stage = vk::ShaderStageFlagBits::eCallableKHR;
135 shaderStages.
push_back({{}, stage, *shader,
"main"});
139 auto vertexAttributeDescriptions = Vertex::getAttributeDescriptions<vk::VertexInputAttributeDescription>();
141 vk::PipelineVertexInputStateCreateInfo vertexInputStateCreateInfo {
143 vertexBindingDescriptions,
144 vertexAttributeDescriptions};
146 vk::PipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo {{}, vk::PrimitiveTopology::eTriangleList, VK_FALSE};
148 vk::PipelineViewportStateCreateInfo viewportStateCreateInfo {{}, 1,
nullptr, 1,
nullptr};
150 vk::PipelineRasterizationStateCreateInfo rasterizationStateCreateInfo {
154 vk::PolygonMode::eFill,
155 vk::CullModeFlagBits::eBack,
156 vk::FrontFace::eClockwise,
163 vk::PipelineMultisampleStateCreateInfo multisampleStateCreateInfo {{}, vk::SampleCountFlagBits::e1, VK_FALSE, 1};
165 vk::PipelineColorBlendAttachmentState colorBlendAttachmentState {
167 vk::BlendFactor::eSrcAlpha,
168 vk::BlendFactor::eOneMinusSrcAlpha,
170 vk::BlendFactor::eOne,
171 vk::BlendFactor::eZero,
173 vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA};
177 vk::PipelineColorBlendStateCreateInfo colorBlendStateCreateInfo {
181 colorBlendAttachmentStates,
185 vk::PipelineDynamicStateCreateInfo dynamicStateCreateInfo {{}, dynamicStates};
187 vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo {
190 &vertexInputStateCreateInfo,
191 &inputAssemblyStateCreateInfo,
193 &viewportStateCreateInfo,
194 &rasterizationStateCreateInfo,
195 &multisampleStateCreateInfo,
197 &colorBlendStateCreateInfo,
198 &dynamicStateCreateInfo,
203 m_handle = m_device->createGraphicsPipeline(VK_NULL_HANDLE, graphicsPipelineCreateInfo).value;
void removeDependency(HandleBase &handle)
void destroy()
Destroys a handle, including its dependents.
void addDependency(HandleBase &handle)
Pipeline(RenderPass &renderPass, Vector< Shader > shaders={})
void setShaders(Vector< Shader > shaders)
void destroyImpl() override
bool createImpl() override
Handle wrapper for Vulkan Render Pass.
static T getBindingDescription()
static std::array< T, 2 > getAttributeDescriptions()