Create graphics pipeline from configuration.
Validates shaders, creates pipeline layout, and creates pipeline.
196{
197 if (!device) {
199 "Cannot create graphics pipeline with null device");
200 return false;
201 }
202
205
208 "Shader validation failed");
209 return false;
210 }
211
215 "Failed to create pipeline layout");
216 return false;
217 }
218
219 std::vector<vk::PipelineShaderStageCreateInfo> shader_stages;
220 if (config.vertex_shader) {
221 shader_stages.push_back(config.vertex_shader->get_stage_create_info());
222 }
223 if (config.fragment_shader) {
224 shader_stages.push_back(config.fragment_shader->get_stage_create_info());
225 }
226 if (config.geometry_shader) {
227 shader_stages.push_back(config.geometry_shader->get_stage_create_info());
228 }
229 if (config.tess_control_shader) {
230 shader_stages.push_back(config.tess_control_shader->get_stage_create_info());
231 }
232 if (config.tess_evaluation_shader) {
233 shader_stages.push_back(config.tess_evaluation_shader->get_stage_create_info());
234 }
235
236 std::vector<vk::VertexInputBindingDescription> vertex_bindings;
237 std::vector<vk::VertexInputAttributeDescription> vertex_attributes;
239
242
243 std::vector<vk::Viewport> viewports;
244 std::vector<vk::Rect2D> scissors;
246
250
251 std::vector<vk::PipelineColorBlendAttachmentState> blend_attachments;
253
255
256 vk::GraphicsPipelineCreateInfo pipeline_info;
257 pipeline_info.stageCount = static_cast<uint32_t>(shader_stages.size());
258 pipeline_info.pStages = shader_stages.data();
259 pipeline_info.pVertexInputState = &vertex_input_state;
260 pipeline_info.pInputAssemblyState = &input_assembly_state;
261 pipeline_info.pTessellationState = (config.tess_control_shader || config.tess_evaluation_shader)
262 ? &tessellation_state
263 : nullptr;
264
265 pipeline_info.pViewportState = &viewport_state;
266 pipeline_info.pRasterizationState = &rasterization_state;
267 pipeline_info.pMultisampleState = &multisample_state;
268 pipeline_info.pDepthStencilState = &depth_stencil_state;
269 pipeline_info.pColorBlendState = &color_blend_state;
270 pipeline_info.pDynamicState = config.dynamic_states.empty() ? nullptr : &dynamic_state;
272 pipeline_info.basePipelineHandle = nullptr;
273 pipeline_info.basePipelineIndex = -1;
274
275 vk::PipelineRenderingCreateInfo rendering_create_info;
276 rendering_create_info.colorAttachmentCount = static_cast<uint32_t>(config.color_attachment_formats.size());
277 rendering_create_info.pColorAttachmentFormats = config.color_attachment_formats.data();
278 rendering_create_info.depthAttachmentFormat = config.depth_attachment_format;
279 rendering_create_info.stencilAttachmentFormat = config.stencil_attachment_format;
280
281 pipeline_info.pNext = &rendering_create_info;
282 pipeline_info.renderPass = nullptr;
283 pipeline_info.subpass = 0;
284
286 "Creating pipeline for dynamic rendering ({} color attachments)",
287 config.color_attachment_formats.size());
288
289 try {
290 auto result = device.createGraphicsPipeline(config.cache, pipeline_info);
291 if (result.result != vk::Result::eSuccess) {
293 "Failed to create graphics pipeline: {}", vk::to_string(result.result));
294 device.destroyPipelineLayout(
m_layout);
296 return false;
297 }
299 } catch (const vk::SystemError& e) {
301 "Failed to create graphics pipeline: {}", e.what());
302 device.destroyPipelineLayout(
m_layout);
304 return false;
305 }
306
308 "Graphics pipeline created ({} shader stages)", shader_stages.size());
309
310 return true;
311}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
bool validate_shaders(const GraphicsPipelineConfig &config)
Validate shader stages.
GraphicsPipelineConfig m_config
vk::PipelineDepthStencilStateCreateInfo build_depth_stencil_state(const GraphicsPipelineConfig &config)
Build depth stencil state.
vk::PipelineInputAssemblyStateCreateInfo build_input_assembly_state(const GraphicsPipelineConfig &config)
Build input assembly state.
vk::PipelineMultisampleStateCreateInfo build_multisample_state(const GraphicsPipelineConfig &config)
Build multisample state.
vk::PipelineRasterizationStateCreateInfo build_rasterization_state(const GraphicsPipelineConfig &config)
Build rasterization state.
vk::PipelineVertexInputStateCreateInfo build_vertex_input_state(const GraphicsPipelineConfig &config, std::vector< vk::VertexInputBindingDescription > &bindings, std::vector< vk::VertexInputAttributeDescription > &attributes)
Build vertex input state from config.
vk::PipelineTessellationStateCreateInfo build_tessellation_state(const GraphicsPipelineConfig &config)
Build tessellation state.
vk::PipelineLayout m_layout
vk::PipelineLayout create_pipeline_layout(vk::Device device, const GraphicsPipelineConfig &config)
Create pipeline layout from config.
vk::PipelineColorBlendStateCreateInfo build_color_blend_state(const GraphicsPipelineConfig &config, std::vector< vk::PipelineColorBlendAttachmentState > &attachments)
Build color blend state.
vk::PipelineDynamicStateCreateInfo build_dynamic_state(const GraphicsPipelineConfig &config)
Build dynamic state.
vk::PipelineViewportStateCreateInfo build_viewport_state(const GraphicsPipelineConfig &config, std::vector< vk::Viewport > &viewports, std::vector< vk::Rect2D > &scissors)
Build viewport state.
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.