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) ? &tessellation_state : nullptr;
262 pipeline_info.pViewportState = &viewport_state;
263 pipeline_info.pRasterizationState = &rasterization_state;
264 pipeline_info.pMultisampleState = &multisample_state;
265 pipeline_info.pDepthStencilState = &depth_stencil_state;
266 pipeline_info.pColorBlendState = &color_blend_state;
267 pipeline_info.pDynamicState = config.dynamic_states.empty() ? nullptr : &dynamic_state;
269 pipeline_info.renderPass = config.render_pass;
270 pipeline_info.subpass = config.subpass;
271 pipeline_info.basePipelineHandle = nullptr;
272 pipeline_info.basePipelineIndex = -1;
273
274 try {
275 auto result = device.createGraphicsPipeline(config.cache, pipeline_info);
276 if (result.result != vk::Result::eSuccess) {
278 "Failed to create graphics pipeline: {}", vk::to_string(result.result));
279 device.destroyPipelineLayout(
m_layout);
281 return false;
282 }
284 } catch (const vk::SystemError& e) {
286 "Failed to create graphics pipeline: {}", e.what());
287 device.destroyPipelineLayout(
m_layout);
289 return false;
290 }
291
293 "Graphics pipeline created ({} shader stages)", shader_stages.size());
294
295 return true;
296}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(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.