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