29 error<std::runtime_error>(
32 std::source_location::current(),
33 "MeshProcessor requires a valid BufferService");
36 auto mesh_buf = std::dynamic_pointer_cast<MeshBuffer>(buffer);
39 "MeshProcessor: attached to non-MeshBuffer — detaching");
43 if (!mesh_buf->m_mesh_data.is_valid()) {
45 "MeshProcessor: MeshData is not valid on attach — no GPU resources allocated");
58 mesh_buf->clear_vertices_dirty();
59 mesh_buf->clear_indices_dirty();
61 mesh_buf->set_vertex_layout(mesh_buf->m_mesh_data.layout);
64 "MeshProcessor: initialised — {} vertices, {} indices ({} faces), stride {}",
65 mesh_buf->get_vertex_count(),
66 mesh_buf->get_index_count(),
67 mesh_buf->get_face_count(),
68 mesh_buf->m_mesh_data.layout.stride_bytes);
94 "MeshProcessor: re-uploaded vertex data ({} bytes)",
104 "MeshProcessor: re-uploaded index data ({} indices)",
115 const auto* vb = std::get_if<std::vector<uint8_t>>(
116 &buf->m_mesh_data.vertex_variant);
117 const auto* ib = std::get_if<std::vector<uint32_t>>(
118 &buf->m_mesh_data.index_variant);
120 if (!vb || vb->empty() || !ib || ib->empty()) {
122 "MeshProcessor::allocate_gpu_buffers: empty vertex or index data");
126 if (!buf->is_host_visible()) {
130 const size_t idx_bytes = ib->size() *
sizeof(uint32_t);
140 "MeshProcessor: allocated vertex buffer ({} bytes) + index buffer ({} bytes)",
141 vb->size(), idx_bytes);
146 const auto* vb = std::get_if<std::vector<uint8_t>>(
147 &buf->m_mesh_data.vertex_variant);
148 if (!vb || vb->empty()) {
155 std::dynamic_pointer_cast<VKBuffer>(buf),
161 const auto* ib = std::get_if<std::vector<uint32_t>>(
162 &buf->m_mesh_data.index_variant);
169 ib->size() *
sizeof(uint32_t),
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
ProcessingToken m_processing_token
void link_index_resources()
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
std::shared_ptr< VKBuffer > m_vertex_staging
void allocate_gpu_buffers(const std::shared_ptr< MeshBuffer > &buf)
void upload_vertices(const std::shared_ptr< MeshBuffer > &buf)
std::shared_ptr< VKBuffer > m_index_staging
std::shared_ptr< MeshBuffer > m_mesh_buffer
std::shared_ptr< VKBuffer > m_gpu_index_buffer
void upload_indices(const std::shared_ptr< MeshBuffer > &buf)
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
void initialize_buffer_service()
Registry::Service::BufferService * m_buffer_service
void ensure_initialized(const std::shared_ptr< VKBuffer > &buffer)
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
void upload_resizing(const void *data, size_t size, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging, float growth_factor)
Upload size bytes to target, growing both buffers first if needed.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
std::shared_ptr< VKBuffer > create_staging_buffer(size_t size)
Create staging buffer for transfers.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
@ UNKNOWN
Unknown or undefined modality.
Backend buffer management service interface.