Build vertex input state from config.
394{
395 if (!config.vertex_bindings.empty() || !config.vertex_attributes.empty()) {
397 "Using explicit vertex bindings/attributes from config "
398 "({} bindings, {} attributes)",
399 config.vertex_bindings.size(), config.vertex_attributes.size());
400
401 for (const auto& binding : config.vertex_bindings) {
402 vk::VertexInputBindingDescription vk_binding;
403 vk_binding.binding = binding.binding;
404 vk_binding.stride = binding.stride;
405 vk_binding.inputRate = binding.input_rate;
406 bindings.push_back(vk_binding);
407 }
408
409 for (const auto& attribute : config.vertex_attributes) {
410 vk::VertexInputAttributeDescription vk_attr;
411 vk_attr.location = attribute.location;
412 vk_attr.binding = attribute.binding;
413 vk_attr.format = attribute.format;
414 vk_attr.offset = attribute.offset;
415 attributes.push_back(vk_attr);
416 }
417 } else if (
418 config.use_vertex_shader_reflection
419 && config.vertex_shader
420 && config.vertex_shader->has_vertex_input()) {
421
423 "Using vertex input from shader reflection");
424 const auto& vertex_input = config.vertex_shader->get_vertex_input();
425
426 for (const auto& binding : vertex_input.bindings) {
427 vk::VertexInputBindingDescription vk_binding;
428 vk_binding.binding = binding.binding;
429 vk_binding.stride = binding.stride;
430 vk_binding.inputRate = binding.rate;
431 bindings.push_back(vk_binding);
432 }
433
434 for (const auto& attribute : vertex_input.attributes) {
435 vk::VertexInputAttributeDescription vk_attr;
436 vk_attr.location = attribute.location;
437 vk_attr.binding = 0;
438 vk_attr.format = attribute.format;
439 vk_attr.offset = attribute.offset;
440 attributes.push_back(vk_attr);
441 }
442 } else {
444 "No vertex input: using empty vertex state (full-screen quad or compute)");
445 }
446
447 vk::PipelineVertexInputStateCreateInfo vertex_input;
448 vertex_input.vertexBindingDescriptionCount = static_cast<uint32_t>(bindings.size());
449 vertex_input.pVertexBindingDescriptions = bindings.empty() ? nullptr : bindings.data();
450 vertex_input.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributes.size());
451 vertex_input.pVertexAttributeDescriptions = attributes.empty() ? nullptr : attributes.data();
452
453 return vertex_input;
454}
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.