Build vertex input state from config.
418{
419 if (!config.vertex_bindings.empty() || !config.vertex_attributes.empty()) {
421 "Using explicit vertex bindings/attributes from config "
422 "({} bindings, {} attributes)",
423 config.vertex_bindings.size(), config.vertex_attributes.size());
424
425 for (const auto& binding : config.vertex_bindings) {
426 vk::VertexInputBindingDescription vk_binding;
427 vk_binding.binding = binding.binding;
428 vk_binding.stride = binding.stride;
429 vk_binding.inputRate = binding.input_rate;
430 bindings.push_back(vk_binding);
431 }
432
433 for (const auto& attribute : config.vertex_attributes) {
434 vk::VertexInputAttributeDescription vk_attr;
435 vk_attr.location = attribute.location;
436 vk_attr.binding = attribute.binding;
437 vk_attr.format = attribute.format;
438 vk_attr.offset = attribute.offset;
439 attributes.push_back(vk_attr);
440 }
441 } else if (
442 config.use_vertex_shader_reflection
443 && config.vertex_shader
444 && config.vertex_shader->has_vertex_input()) {
445
447 "Using vertex input from shader reflection");
448 const auto& vertex_input = config.vertex_shader->get_vertex_input();
449
450 for (const auto& binding : vertex_input.bindings) {
451 vk::VertexInputBindingDescription vk_binding;
452 vk_binding.binding = binding.binding;
453 vk_binding.stride = binding.stride;
454 vk_binding.inputRate = binding.rate;
455 bindings.push_back(vk_binding);
456 }
457
458 for (const auto& attribute : vertex_input.attributes) {
459 vk::VertexInputAttributeDescription vk_attr;
460 vk_attr.location = attribute.location;
461 vk_attr.binding = 0;
462 vk_attr.format = attribute.format;
463 vk_attr.offset = attribute.offset;
464 attributes.push_back(vk_attr);
465 }
466 } else {
468 "No vertex input: using empty vertex state (full-screen quad or compute)");
469 }
470
471 vk::PipelineVertexInputStateCreateInfo vertex_input;
472 if (config.mesh_shader) {
474 "Mesh shading pipeline — vertex input ignored");
475 vertex_input.vertexBindingDescriptionCount = 0;
476 vertex_input.vertexAttributeDescriptionCount = 0;
477 return vertex_input;
478 }
479
480 vertex_input.vertexBindingDescriptionCount = static_cast<uint32_t>(bindings.size());
481 vertex_input.pVertexBindingDescriptions = bindings.empty() ? nullptr : bindings.data();
482 vertex_input.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributes.size());
483 vertex_input.pVertexAttributeDescriptions = attributes.empty() ? nullptr : attributes.data();
484
485 return vertex_input;
486}
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.