63 const std::shared_ptr<Core::VKImage>& texture,
68 "Cannot bind null texture to binding {}", binding);
74 sampler = loom.get_default_sampler();
82 foundry.update_descriptor_image(
85 texture->get_image_view(),
87 vk::ImageLayout::eShaderReadOnlyOptimal);
91 "Bound texture to binding {}", binding);
95 const std::string& descriptor_name,
96 const std::shared_ptr<Core::VKImage>& texture,
102 "No binding configured for descriptor '{}'", descriptor_name);
106 bind_texture(binding_it->second.binding, texture, sampler);
113 "Vertex shader not loaded");
119 "Fragment shader not loaded");
127 "Target window not set");
140 "Render pass not set");
149 "Cannot initialize pipeline: buffer is null");
152 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
170 const auto& vertex_info = it->second;
176 std::map<uint32_t, std::vector<std::pair<std::string, ShaderBinding>>> bindings_by_set;
178 bindings_by_set[binding.set].emplace_back(name, binding);
181 for (
const auto& [set_index, set_bindings] : bindings_by_set) {
182 std::vector<Portal::Graphics::DescriptorBindingConfig>
set_config;
183 for (
const auto& [name, binding] : set_bindings) {
184 set_config.emplace_back(binding.set, binding.binding, binding.type);
194 "Failed to create render pipeline");
203 "Failed to allocate descriptor sets for pipeline");
209 foundry.update_descriptor_image(
212 tex_binding.texture->get_image_view(),
214 vk::ImageLayout::eShaderReadOnlyOptimal);
218 "Allocated {} descriptor sets and updated {} texture bindings",
227 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
233 if (vk_buffer->has_vertex_layout()) {
234 auto vertex_layout = vk_buffer->get_vertex_layout();
235 if (vertex_layout.has_value()) {
237 .semantic_layout = vertex_layout.value(),
238 .use_reflection =
false
256 auto vertex_layout = vk_buffer->get_vertex_layout();
257 if (!vertex_layout.has_value()) {
259 "VKBuffer has no vertex layout set. Use buffer->set_vertex_layout()");
263 if (vertex_layout->vertex_count == 0) {
265 "Vertex layout has zero vertices, skipping draw");
269 if (vertex_layout->attributes.empty()) {
271 "Vertex layout has no attributes");
284 uint32_t width = 0, height = 0;
287 if (width > 0 && height > 0) {
288 auto cmd = foundry.get_command_buffer(cmd_id);
290 vk::Viewport viewport { 0.0F, 0.0F,
static_cast<float>(width),
static_cast<float>(height), 0.0F, 1.0F };
291 cmd.setViewport(0, 1, &viewport);
293 vk::Rect2D scissor { { 0, 0 }, { width, height } };
294 cmd.setScissor(0, 1, &scissor);
303 flow.bind_vertex_buffers(cmd_id, { vk_buffer });
305 flow.draw(cmd_id, vertex_layout->vertex_count);
307 flow.end_render_pass(cmd_id);
316 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
317 if (vk_buffer && vk_buffer->has_vertex_layout()) {
318 auto vertex_layout = vk_buffer->get_vertex_layout();
319 if (vertex_layout.has_value()) {
321 "RenderProcessor: Auto-injecting vertex layout "
322 "({} vertices, {} attributes)",
323 vertex_layout->vertex_count,
324 vertex_layout->attributes.size());
327 m_buffer_info[vk_buffer] = { .semantic_layout = vertex_layout.value(), .use_reflection =
false };
380 "RenderProcessor cleanup complete");
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
ProcessingToken m_processing_token
void bind_texture(uint32_t binding, const std::shared_ptr< Core::VKImage > &texture, vk::Sampler sampler=nullptr)
Bind a texture to a descriptor binding point.
void initialize_pipeline(const std::shared_ptr< Buffer > &buffer) override
Portal::Graphics::ShaderID m_fragment_shader_id
std::unordered_map< std::shared_ptr< VKBuffer >, VertexInfo > m_buffer_info
Registry::Service::DisplayService * m_display_service
Portal::Graphics::ShaderID m_geometry_shader_id
Portal::Graphics::RenderPassID m_render_pass_id
void set_tess_eval_shader(const std::string &tess_eval_path)
void set_target_window(std::shared_ptr< Core::Window > window)
void set_render_pass(Portal::Graphics::RenderPassID render_pass_id)
void processing_function(std::shared_ptr< Buffer > buffer) override
The core processing function that must be implemented by derived classes.
void set_tess_control_shader(const std::string &tess_control_path)
Portal::Graphics::ShaderID m_tess_control_shader_id
void on_attach(std::shared_ptr< Buffer > buffer) override
Called when this processor is attached to a buffer.
std::unordered_map< uint32_t, TextureBinding > m_texture_bindings
void set_geometry_shader(const std::string &geometry_path)
Portal::Graphics::PrimitiveTopology m_primitive_topology
void set_fragment_shader(const std::string &fragment_path)
Portal::Graphics::PolygonMode m_polygon_mode
Portal::Graphics::CullMode m_cull_mode
std::shared_ptr< Core::Window > m_target_window
RenderProcessor(const ShaderProcessorConfig &config)
Portal::Graphics::ShaderID m_tess_eval_shader_id
Portal::Graphics::RenderPipelineID m_render_pipeline_id
Portal::Graphics::ShaderID m_shader_id
ShaderProcessorConfig m_config
void set_config(const ShaderProcessorConfig &config)
Update entire configuration.
void on_attach(std::shared_ptr< Buffer > buffer) override
Called when this processor is attached to a buffer.
bool m_needs_pipeline_rebuild
std::vector< Portal::Graphics::DescriptorSetID > m_descriptor_set_ids
Generic compute shader processor for VKBuffers.
void register_window_for_rendering(const std::shared_ptr< Core::Window > &window, RenderPassID render_pass_id)
Associate a window with a render pass for rendering.
ShaderID load_shader(const std::string &content, std::optional< ShaderStage > stage=std::nullopt, const std::string &entry_point="main")
Universal shader loader - auto-detects source type.
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
constexpr RenderPipelineID INVALID_RENDER_PIPELINE
MAYAFLUX_API TextureLoom & get_texture_manager()
Get the global texture manager instance.
constexpr RenderPassID INVALID_RENDER_PASS
constexpr ShaderID INVALID_SHADER
MAYAFLUX_API RenderFlow & get_render_flow()
Get the global render flow instance.
MAYAFLUX_API ShaderFoundry & get_shader_foundry()
Get the global shader compiler instance.
std::unordered_map< std::string, ShaderBinding > bindings
std::string shader_path
Path to shader file.
Complete configuration for shader processor.
ShaderID tess_eval_shader
Optional.
std::optional< Kakshya::VertexLayout > semantic_vertex_layout
std::vector< std::vector< DescriptorBindingConfig > > descriptor_sets
ShaderID tess_control_shader
Optional.
bool use_vertex_shader_reflection
std::vector< BlendAttachmentConfig > blend_attachments
PrimitiveTopology topology
ShaderID geometry_shader
Optional.
RasterizationConfig rasterization
Complete render pipeline configuration.
std::function< int(const std::shared_ptr< void > &)> get_swapchain_format
Get actual swapchain format for a window.
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.