26 std::vector<Core::VertexBinding>,
27 std::vector<Core::VertexAttribute>>
28 translate_semantic_layout(
const Kakshya::VertexLayout& layout)
35 "Translated semantic vertex layout: {} bindings, {} attributes",
36 vk_bindings.size(), vk_attributes.size());
38 return { vk_bindings, vk_attributes };
51 "RenderFlow already initialized (static flag)");
57 "RenderFlow already initialized");
62 if (!foundry->is_initialized()) {
64 "ShaderFoundry must be initialized before RenderFlow");
71 if (!display_service) {
73 "DisplayService not found in BackendRegistry");
82 "RenderFlow initialized");
93 "RenderFlow stopped");
103 "Shutting down RenderFlow...");
107 "Cannot shutdown RenderFlow: ShaderFoundry not initialized");
115 "Cannot shutdown RenderFlow: Vulkan device is null");
129 "RenderFlow shutdown complete");
142 return vk::PrimitiveTopology::ePointList;
144 return vk::PrimitiveTopology::eLineList;
146 return vk::PrimitiveTopology::eLineStrip;
148 return vk::PrimitiveTopology::eTriangleList;
150 return vk::PrimitiveTopology::eTriangleStrip;
152 return vk::PrimitiveTopology::eTriangleFan;
154 return vk::PrimitiveTopology::eTriangleList;
162 return vk::PolygonMode::eFill;
164 return vk::PolygonMode::eLine;
166 return vk::PolygonMode::ePoint;
168 return vk::PolygonMode::eFill;
176 return vk::CullModeFlagBits::eNone;
178 return vk::CullModeFlagBits::eFront;
180 return vk::CullModeFlagBits::eBack;
182 return vk::CullModeFlagBits::eFrontAndBack;
184 return vk::CullModeFlagBits::eBack;
188 vk::CompareOp to_vk_compare_op(
CompareOp op)
192 return vk::CompareOp::eNever;
194 return vk::CompareOp::eLess;
196 return vk::CompareOp::eEqual;
198 return vk::CompareOp::eLessOrEqual;
200 return vk::CompareOp::eGreater;
202 return vk::CompareOp::eNotEqual;
204 return vk::CompareOp::eGreaterOrEqual;
206 return vk::CompareOp::eAlways;
208 return vk::CompareOp::eLess;
212 vk::BlendFactor to_vk_blend_factor(
BlendFactor factor)
216 return vk::BlendFactor::eZero;
218 return vk::BlendFactor::eOne;
220 return vk::BlendFactor::eSrcColor;
222 return vk::BlendFactor::eOneMinusSrcColor;
224 return vk::BlendFactor::eDstColor;
226 return vk::BlendFactor::eOneMinusDstColor;
228 return vk::BlendFactor::eSrcAlpha;
230 return vk::BlendFactor::eOneMinusSrcAlpha;
232 return vk::BlendFactor::eDstAlpha;
234 return vk::BlendFactor::eOneMinusDstAlpha;
236 return vk::BlendFactor::eOne;
240 vk::BlendOp to_vk_blend_op(
BlendOp op)
244 return vk::BlendOp::eAdd;
246 return vk::BlendOp::eSubtract;
248 return vk::BlendOp::eReverseSubtract;
250 return vk::BlendOp::eMin;
252 return vk::BlendOp::eMax;
254 return vk::BlendOp::eAdd;
265 const std::vector<vk::Format>& color_formats,
266 vk::Format depth_format)
270 "RenderFlow not initialized");
276 "Pipeline requires either mesh shader or vertex shader");
280 if (color_formats.empty()) {
282 "At least one color format required for dynamic rendering pipeline");
313 "Pipeline using semantic VertexLayout ({} vertices, {} attributes)",
317 auto [vk_bindings, vk_attributes] = translate_semantic_layout(
326 "Pipeline using explicit vertex config ({} bindings, {} attributes)",
331 vk_binding.
binding = binding.binding;
332 vk_binding.stride = binding.stride;
333 vk_binding.input_rate = binding.per_instance ? vk::VertexInputRate::eInstance : vk::VertexInputRate::eVertex;
340 vk_attr.binding = attr.binding;
341 vk_attr.format = attr.format;
342 vk_attr.offset = attr.offset;
349 "Pipeline will use shader reflection for vertex input");
360 "Polygon mode {} needs fillModeNonSolid, which this device lacks; drawing filled",
387 std::vector<vk::DescriptorSetLayout> layouts;
388 vk::DescriptorSetLayout state_vt_layout {};
391 std::vector<vk::DescriptorSetLayoutBinding> set0_bindings;
393 vk::DescriptorSetLayoutBinding vt_b;
395 vt_b.descriptorType = vk::DescriptorType::eUniformBuffer;
396 vt_b.descriptorCount = 1;
397 vt_b.stageFlags = vk::ShaderStageFlagBits::eVertex;
398 set0_bindings.push_back(vt_b);
402 if (binding.set == 0 && binding.binding != 0) {
403 vk::DescriptorSetLayoutBinding vk_b;
404 vk_b.binding = binding.binding;
405 vk_b.descriptorType = binding.type;
406 vk_b.descriptorCount = binding.count > 0 ? binding.count : 1;
407 vk_b.stageFlags = vk::ShaderStageFlagBits::eVertex
408 | vk::ShaderStageFlagBits::eFragment;
409 set0_bindings.push_back(vk_b);
414 vk::DescriptorSetLayoutCreateInfo layout_info;
415 layout_info.bindingCount =
static_cast<uint32_t
>(set0_bindings.size());
416 layout_info.pBindings = set0_bindings.data();
418 layouts.push_back(vt_layout);
419 state_vt_layout = vt_layout;
423 bool all_set_zero = std::ranges::all_of(desc_set,
424 [](
const auto&
b) {
return b.set == 0; });
428 std::vector<vk::DescriptorSetLayoutBinding> bindings;
429 for (
const auto& binding : desc_set) {
430 if (binding.set == 0)
432 vk::DescriptorSetLayoutBinding vk_b;
433 vk_b.binding = binding.binding;
434 vk_b.descriptorType = binding.type;
435 vk_b.descriptorCount = binding.count > 0 ? binding.count : 1;
436 vk_b.stageFlags = vk::ShaderStageFlagBits::eVertex
437 | vk::ShaderStageFlagBits::eFragment;
438 bindings.push_back(vk_b);
441 if (bindings.empty())
444 vk::DescriptorSetLayoutCreateInfo layout_info;
445 layout_info.bindingCount =
static_cast<uint32_t
>(bindings.size());
446 layout_info.pBindings = bindings.data();
453 vk::ShaderStageFlags push_constant_stages;
456 push_constant_stages = vk::ShaderStageFlagBits::eMeshEXT;
458 push_constant_stages |= vk::ShaderStageFlagBits::eTaskEXT;
461 push_constant_stages |= vk::ShaderStageFlagBits::eFragment;
464 push_constant_stages = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment;
466 push_constant_stages |= vk::ShaderStageFlagBits::eGeometry;
469 push_constant_stages |= vk::ShaderStageFlagBits::eTessellationControl;
472 push_constant_stages |= vk::ShaderStageFlagBits::eTessellationEvaluation;
477 vk::PushConstantRange range;
478 range.stageFlags = push_constant_stages;
488 vk::DynamicState::eViewport,
489 vk::DynamicState::eScissor
492 auto pipeline = std::make_shared<Core::VKGraphicsPipeline>();
495 "Failed to create VKGraphicsPipeline for dynamic rendering");
497 for (
auto layout : layouts) {
509 state.
layout = pipeline->get_layout();
514 "Dynamic rendering pipeline created (ID: {}, {} color attachments)",
515 pipeline_id, color_formats.size());
529 if (it->second.pipeline) {
530 it->second.pipeline->cleanup(
device);
533 for (
auto layout : it->second.layouts) {
535 device.destroyDescriptorSetLayout(layout);
542 "Destroyed graphics pipeline (ID: {})", pipeline_id);
550 if (state.pipeline) {
551 state.pipeline->cleanup(
device);
554 for (
auto layout : state.layouts) {
556 device.destroyDescriptorSetLayout(layout);
563 "Cleaned up all graphics pipelines");
573 return it->second.view_transform_layout;
582 const std::shared_ptr<Core::Window>&
window,
583 vk::Image swapchain_image,
584 const std::array<float, 4>& clear_color,
585 vk::ImageView depth_image_view)
590 "Invalid command buffer ID: {}", cmd_id);
596 "Cannot begin rendering for null window");
600 if (!swapchain_image) {
602 "Cannot begin rendering with null swapchain image");
609 "Window '{}' not registered for rendering. "
610 "Call register_window_for_rendering() first.",
611 window->get_create_info().title);
614 it->second.swapchain_image = swapchain_image;
622 "Invalid swapchain extent for window '{}': {}x{}",
630 "Failed to get image view for window '{}'",
631 window->get_create_info().title);
635 vk::ImageMemoryBarrier pre_barrier {};
636 pre_barrier.oldLayout = vk::ImageLayout::eUndefined;
637 pre_barrier.newLayout = vk::ImageLayout::eColorAttachmentOptimal;
638 pre_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
639 pre_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
640 pre_barrier.image = swapchain_image;
641 pre_barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
642 pre_barrier.subresourceRange.baseMipLevel = 0;
643 pre_barrier.subresourceRange.levelCount = 1;
644 pre_barrier.subresourceRange.baseArrayLayer = 0;
645 pre_barrier.subresourceRange.layerCount = 1;
646 pre_barrier.srcAccessMask = vk::AccessFlagBits::eNone;
647 pre_barrier.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
650 vk::PipelineStageFlagBits::eTopOfPipe,
651 vk::PipelineStageFlagBits::eColorAttachmentOutput,
652 vk::DependencyFlags {},
657 vk::RenderingAttachmentInfo color_attachment {};
658 color_attachment.sType = vk::StructureType::eRenderingAttachmentInfo;
659 color_attachment.pNext =
nullptr;
660 color_attachment.imageView = image_view;
661 color_attachment.imageLayout = vk::ImageLayout::eColorAttachmentOptimal;
662 color_attachment.resolveMode = vk::ResolveModeFlagBits::eNone;
663 color_attachment.resolveImageView =
nullptr;
664 color_attachment.resolveImageLayout = vk::ImageLayout::eUndefined;
665 color_attachment.loadOp = vk::AttachmentLoadOp::eClear;
666 color_attachment.storeOp = vk::AttachmentStoreOp::eStore;
669 color_attachment.clearValue.color = vk::ClearColorValue(clear_color);
671 color_attachment.clearValue.color = vk::ClearColorValue(
window->get_create_info().clear_color);
674 vk::RenderingAttachmentInfo depth_attachment {};
675 if (depth_image_view) {
676 depth_attachment.sType = vk::StructureType::eRenderingAttachmentInfo;
677 depth_attachment.pNext =
nullptr;
678 depth_attachment.imageView = depth_image_view;
679 depth_attachment.imageLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
680 depth_attachment.resolveMode = vk::ResolveModeFlagBits::eNone;
681 depth_attachment.resolveImageView =
nullptr;
682 depth_attachment.resolveImageLayout = vk::ImageLayout::eUndefined;
683 depth_attachment.loadOp = vk::AttachmentLoadOp::eClear;
684 depth_attachment.storeOp = vk::AttachmentStoreOp::eDontCare;
685 depth_attachment.clearValue.depthStencil = vk::ClearDepthStencilValue { 1.0F, 0 };
688 vk::RenderingInfo rendering_info {};
689 rendering_info.sType = vk::StructureType::eRenderingInfo;
690 rendering_info.pNext =
nullptr;
691 rendering_info.flags = vk::RenderingFlagBits::eContentsSecondaryCommandBuffers;
692 rendering_info.renderArea.offset = vk::Offset2D { 0, 0 };
693 rendering_info.renderArea.extent = vk::Extent2D {
width,
height };
694 rendering_info.layerCount = 1;
695 rendering_info.colorAttachmentCount = 1;
696 rendering_info.pColorAttachments = &color_attachment;
697 rendering_info.pDepthAttachment = depth_image_view ? &depth_attachment :
nullptr;
698 rendering_info.pStencilAttachment =
nullptr;
700 cmd.beginRendering(rendering_info);
703 "Began dynamic rendering for window '{}' ({}x{}, depth: {})",
705 depth_image_view ?
"yes" :
"no");
710 const std::shared_ptr<Core::Window>&
window)
715 "Invalid command buffer ID: {}", cmd_id);
724 "No swapchain image tracked for window '{}'",
725 window->get_create_info().title);
729 vk::ImageMemoryBarrier post_barrier {};
730 post_barrier.oldLayout = vk::ImageLayout::eColorAttachmentOptimal;
731 post_barrier.newLayout = vk::ImageLayout::ePresentSrcKHR;
732 post_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
733 post_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
734 post_barrier.image = it->second.swapchain_image;
735 post_barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
736 post_barrier.subresourceRange.baseMipLevel = 0;
737 post_barrier.subresourceRange.levelCount = 1;
738 post_barrier.subresourceRange.baseArrayLayer = 0;
739 post_barrier.subresourceRange.layerCount = 1;
740 post_barrier.srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
741 post_barrier.dstAccessMask = vk::AccessFlagBits::eNone;
744 vk::PipelineStageFlagBits::eColorAttachmentOutput,
745 vk::PipelineStageFlagBits::eBottomOfPipe,
746 vk::DependencyFlags {},
751 it->second.swapchain_image =
nullptr;
754 "Ended dynamic rendering for window '{}'",
755 window->get_create_info().title);
767 "Invalid pipeline ID: {}", pipeline_id);
774 "Invalid command buffer ID: {}", cmd_id);
778 pipeline_it->second.pipeline->bind(
cmd);
783 const std::vector<std::shared_ptr<Buffers::VKBuffer>>& buffers,
784 uint32_t first_binding)
789 "Invalid command buffer ID: {}", cmd_id);
793 std::vector<vk::Buffer> vk_buffers;
794 std::vector<vk::DeviceSize> offsets(buffers.size(), 0);
796 vk_buffers.reserve(buffers.size());
797 for (
const auto& buf : buffers) {
798 vk_buffers.push_back(buf->get_buffer());
801 cmd.bindVertexBuffers(first_binding, vk_buffers, offsets);
806 const std::shared_ptr<Buffers::VKBuffer>&
buffer,
807 vk::IndexType index_type)
812 "Invalid command buffer ID: {}", cmd_id);
816 cmd.bindIndexBuffer(
buffer->get_index_buffer(), 0, index_type);
822 const std::vector<DescriptorSetID>& descriptor_sets,
828 "Invalid pipeline ID: {}", pipeline_id);
835 "Invalid command buffer ID: {}", cmd_id);
839 std::vector<vk::DescriptorSet> vk_sets;
840 vk_sets.reserve(descriptor_sets.size());
841 for (
auto ds_id : descriptor_sets) {
845 cmd.bindDescriptorSets(
846 vk::PipelineBindPoint::eGraphics,
847 pipeline_it->second.layout,
863 "Invalid pipeline ID: {}", pipeline_id);
870 "Invalid command buffer ID: {}", cmd_id);
875 pipeline_it->second.layout,
876 pipeline_it->second.push_constant_stages,
878 static_cast<uint32_t
>(
size),
884 uint32_t vertex_count,
885 uint32_t instance_count,
886 uint32_t first_vertex,
887 uint32_t first_instance)
892 "Invalid command buffer ID: {}", cmd_id);
896 cmd.draw(vertex_count, instance_count, first_vertex, first_instance);
901 uint32_t index_count,
902 uint32_t instance_count,
903 uint32_t first_index,
904 int32_t vertex_offset,
905 uint32_t first_instance)
912 cmd.drawIndexed(index_count, instance_count, first_index,
913 vertex_offset, first_instance);
918 uint32_t group_count_x,
919 uint32_t group_count_y,
920 uint32_t group_count_z)
925 "Invalid command buffer ID: {}", cmd_id);
929 cmd.drawMeshTasksEXT(group_count_x, group_count_y, group_count_z);
934 const std::shared_ptr<Buffers::VKBuffer>&
buffer,
943 cmd.drawMeshTasksIndirectEXT(
buffer->get_buffer(),
offset, draw_count, stride);
954 "Cannot register null window");
958 if (!
window->is_graphics_registered()) {
960 "Window '{}' not registered with graphics backend yet.",
961 window->get_create_info().title);
970 "Registered window '{}' for dynamic rendering",
971 window->get_create_info().title);
987 "Unregistered window '{}' from rendering",
988 window->get_create_info().title);
999 std::vector<std::shared_ptr<Core::Window>> windows;
1003 if (
auto window = association.window.lock()) {
1004 windows.push_back(
window);
1017 return *
static_cast<vk::ImageView*
>(view_ptr);
1026 uint32_t first_layout_index)
1031 "Invalid pipeline ID: {}", pipeline_id);
1035 const auto& layouts = pipeline_it->second.layouts;
1036 std::vector<DescriptorSetID> descriptor_set_ids;
1038 for (uint32_t i = first_layout_index; i < layouts.size(); ++i) {
1042 "Failed to allocate descriptor set for pipeline {}", pipeline_id);
1045 descriptor_set_ids.push_back(ds_id);
1049 "Allocated {} descriptor sets for pipeline {} (starting at layout index {})",
1050 descriptor_set_ids.size(), pipeline_id, first_layout_index);
1052 return descriptor_set_ids;
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::shared_ptr< NetworkGeometryBuffer > buffer
std::weak_ptr< Core::Window > window
PrimitiveTopology topology
vk::PhysicalDevice device
void bind_pipeline(CommandBufferID cmd_id, RenderPipelineID pipeline)
Bind graphics pipeline.
void push_constants(CommandBufferID cmd_id, RenderPipelineID pipeline, const void *data, size_t size, uint32_t offset=0)
Push constants.
void register_window_for_rendering(const std::shared_ptr< Core::Window > &window)
Register a window for dynamic rendering.
std::unordered_map< std::shared_ptr< Core::Window >, WindowRenderAssociation > m_window_associations
std::vector< DescriptorSetID > allocate_pipeline_descriptors(RenderPipelineID pipeline, uint32_t first_layout_index=0)
Allocate descriptor sets for pipeline.
void begin_rendering(CommandBufferID cmd_id, const std::shared_ptr< Core::Window > &window, vk::Image swapchain_image, const std::array< float, 4 > &clear_color=default_color, vk::ImageView depth_image_view=nullptr)
Begin dynamic rendering to a window.
vk::ImageView get_current_image_view(const std::shared_ptr< Core::Window > &window)
Get current image view for window.
void destroy_pipeline(RenderPipelineID pipeline_id)
Destroy a graphics pipeline.
void bind_vertex_buffers(CommandBufferID cmd_id, const std::vector< std::shared_ptr< Buffers::VKBuffer > > &buffers, uint32_t first_binding=0)
Bind vertex buffers.
vk::DescriptorSetLayout get_view_transform_layout(RenderPipelineID pipeline_id) const
Return the reserved ViewTransform UBO layout for a pipeline.
std::vector< std::shared_ptr< Core::Window > > get_registered_windows() const
Get all registered windows.
void end_rendering(CommandBufferID cmd_id, const std::shared_ptr< Core::Window > &window)
End dynamic rendering.
void draw_indexed(CommandBufferID cmd_id, uint32_t index_count, uint32_t instance_count=1, uint32_t first_index=0, int32_t vertex_offset=0, uint32_t first_instance=0)
Indexed draw command.
std::unordered_map< RenderPipelineID, PipelineState > m_pipelines
bool is_initialized() const
void bind_index_buffer(CommandBufferID cmd_id, const std::shared_ptr< Buffers::VKBuffer > &buffer, vk::IndexType index_type=vk::IndexType::eUint32)
Bind index buffer.
ShaderFoundry * m_shader_foundry
void draw_mesh_tasks(CommandBufferID cmd_id, uint32_t group_count_x, uint32_t group_count_y=1, uint32_t group_count_z=1)
Draw mesh tasks (mesh shading pipeline only)
bool is_window_registered(const std::shared_ptr< Core::Window > &window) const
Check if a window is registered for rendering.
void draw(CommandBufferID cmd_id, uint32_t vertex_count, uint32_t instance_count=1, uint32_t first_vertex=0, uint32_t first_instance=0)
Draw command.
void draw_mesh_tasks_indirect(CommandBufferID cmd_id, const std::shared_ptr< Buffers::VKBuffer > &buffer, vk::DeviceSize offset=0, uint32_t draw_count=1, uint32_t stride=sizeof(VkDrawMeshTasksIndirectCommandEXT))
Draw mesh tasks indirect.
void unregister_window(const std::shared_ptr< Core::Window > &window)
Unregister a window from rendering.
Registry::Service::DisplayService * m_display_service
std::atomic< uint64_t > m_next_pipeline_id
RenderPipelineID create_pipeline(const RenderPipelineConfig &config, const std::vector< vk::Format > &color_formats, vk::Format depth_format=vk::Format::eUndefined)
Create graphics pipeline for dynamic rendering (no render pass object)
void bind_descriptor_sets(CommandBufferID cmd_id, RenderPipelineID pipeline, const std::vector< DescriptorSetID > &descriptor_sets, uint32_t first_set=0)
Bind descriptor sets.
static bool s_initialized
vk::DescriptorSet get_descriptor_set(DescriptorSetID descriptor_set_id)
Get Vulkan descriptor set handle from DescriptorSetID.
vk::Device get_device() const
Get logical device handle.
std::shared_ptr< Core::VKShaderModule > get_vk_shader_module(ShaderID shader_id)
bool is_initialized() const
Check if compiler is initialized.
static ShaderFoundry & instance()
vk::CommandBuffer get_command_buffer(CommandBufferID cmd_id)
Get Vulkan command buffer handle from CommandBufferID.
vk::PhysicalDevice get_physical_device() const
Get physical device handle.
DescriptorSetID allocate_descriptor_set(vk::DescriptorSetLayout layout)
Allocate descriptor set for a pipeline.
static std::pair< std::vector< Core::VertexBinding >, std::vector< Core::VertexAttribute > > translate_layout(const Kakshya::VertexLayout &layout, uint32_t binding_index=0)
Translate a semantic vertex layout to Vulkan binding/attribute descriptions.
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
@ Rendering
GPU rendering operations (graphics pipeline, frame rendering)
@ Portal
High-level user-facing API layer.
PolygonMode
Rasterization polygon mode.
constexpr RenderPipelineID INVALID_RENDER_PIPELINE
const std::array< float, 4 > default_color
CullMode
Face culling mode.
uint64_t RenderPipelineID
constexpr ShaderID INVALID_SHADER
BlendOp
Blending operation.
BlendFactor
Blending factor.
PrimitiveTopology
Vertex assembly primitive topology.
CompareOp
Depth/stencil comparison operation.
constexpr DescriptorSetID INVALID_DESCRIPTOR_SET
vk::BlendOp alpha_blend_op
vk::BlendFactor dst_alpha_blend_factor
vk::BlendFactor src_alpha_blend_factor
vk::BlendFactor dst_color_blend_factor
vk::BlendOp color_blend_op
vk::BlendFactor src_color_blend_factor
std::vector< ColorBlendAttachment > color_blend_attachments
bool use_vertex_shader_reflection
vk::CompareOp depth_compare_op
std::vector< vk::Format > color_attachment_formats
vk::PrimitiveTopology topology
std::shared_ptr< VKShaderModule > task_shader
std::shared_ptr< VKShaderModule > fragment_shader
std::shared_ptr< VKShaderModule > mesh_shader
std::vector< vk::DynamicState > dynamic_states
std::vector< vk::PushConstantRange > push_constant_ranges
vk::PolygonMode polygon_mode
std::shared_ptr< VKShaderModule > vertex_shader
std::vector< vk::DescriptorSetLayout > descriptor_set_layouts
std::vector< VertexBinding > vertex_bindings
bool primitive_restart_enable
vk::CullModeFlags cull_mode
std::vector< VertexAttribute > vertex_attributes
std::shared_ptr< VKShaderModule > geometry_shader
vk::Format depth_attachment_format
std::shared_ptr< VKShaderModule > tess_evaluation_shader
std::shared_ptr< VKShaderModule > tess_control_shader
Configuration for creating a graphics pipeline.
CompareOp depth_compare_op
std::vector< vk::DescriptorSetLayout > layouts
vk::DescriptorSetLayout view_transform_layout
vk::ShaderStageFlags push_constant_stages
std::shared_ptr< Core::VKGraphicsPipeline > pipeline
vk::PipelineLayout layout
std::vector< ShaderID > shader_ids
std::weak_ptr< Core::Window > window
std::vector< std::vector< DescriptorBindingInfo > > descriptor_sets
std::vector< Core::VertexAttribute > vertex_attributes
ShaderID tess_eval_shader
Optional.
std::vector< Core::VertexBinding > vertex_bindings
std::optional< Kakshya::VertexLayout > semantic_vertex_layout
ShaderID tess_control_shader
Optional.
bool use_vertex_shader_reflection
std::vector< BlendAttachmentConfig > blend_attachments
DepthStencilConfig depth_stencil
ShaderID mesh_shader
Optional.
size_t push_constant_size
PrimitiveTopology topology
ShaderID geometry_shader
Optional.
ShaderID task_shader
Optional.
RasterizationConfig rasterization
Complete render pipeline configuration.
std::function< void *(const std::shared_ptr< void > &)> get_current_image_view
Get current swapchain image view for rendering.
std::function< void(const std::shared_ptr< void > &, uint32_t &, uint32_t &)> get_swapchain_extent
Get swapchain extent for a window.
Backend display and presentation service interface.