26 const std::string& name,
27 std::function<
float()> reader,
33 b.reader = std::move(reader);
39 const std::string& name,
40 std::function<
float()> reader,
41 const std::string& descriptor_name,
42 uint32_t binding_index,
48 "FormaBindingsProcessor::bind_descriptor: null reader for '{}'", name);
54 b.reader = std::move(reader);
62 .binding_index = binding_index,
64 .gpu_buffer = gpu_buf,
65 .buffer_size =
sizeof(float),
83 std::vector<std::string> names;
105 "FormaBindingsProcessor: binding '{}' has no reader", name);
109 const float value =
b.reader();
130 const std::shared_ptr<VKBuffer>& buffer)
132 auto& staging = buffer->get_pipeline_context().push_constant_staging;
133 const size_t end =
static_cast<size_t>(pc.
offset) + pc.
size;
135 if (staging.size() < end)
138 if (pc.
size ==
sizeof(
float)) {
139 std::memcpy(staging.data() + pc.
offset, &value,
sizeof(
float));
140 }
else if (pc.
size ==
sizeof(
double)) {
141 auto promoted =
static_cast<double>(value);
142 std::memcpy(staging.data() + pc.
offset, &promoted,
sizeof(
double));
146 "FormaBindingsProcessor: PC write offset={} value={}", pc.
offset, value);
152 const std::shared_ptr<VKBuffer>& attached)
156 auto& bindings_list = attached->get_pipeline_context().descriptor_buffer_bindings;
158 for (
auto& entry : bindings_list) {
160 entry.buffer_info.buffer = desc.
gpu_buffer->get_buffer();
161 entry.buffer_info.offset = 0;
162 entry.buffer_info.range =
sizeof(float);
167 bindings_list.push_back({
171 ? vk::DescriptorType::eUniformBuffer
172 : vk::DescriptorType::eStorageBuffer,
173 .buffer_info = vk::DescriptorBufferInfo {
174 desc.
gpu_buffer->get_buffer(), 0,
sizeof(float) },
185 auto buf = std::make_shared<VKBuffer>(
194 error<std::runtime_error>(
197 std::source_location::current(),
198 "FormaBindingsProcessor: no BufferService available");
201 svc->initialize_buffer(buf);
#define MF_ERROR(comp, ctx,...)
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_DEBUG(comp, ctx,...)
bool m_needs_descriptor_rebuild
void bind_buffer(const std::string &descriptor_name, const std::shared_ptr< VKBuffer > &buffer)
Bind a VKBuffer to a named shader descriptor.
Abstract base class for shader-based buffer processing.
@ UNIFORM
Uniform buffer (host-visible)
@ COMPUTE
Storage buffer for compute shaders (device-local)
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
void upload_to_gpu(const void *data, size_t size, const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging)
Upload raw data to GPU buffer (auto-detects host-visible vs device-local)
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
@ UNKNOWN
Unknown or undefined modality.
DescriptorRole
Semantic descriptor type — maps to Vulkan descriptor types internally.
@ UNIFORM
Small, read-only, frequently updated (scalars, param structs)
Backend buffer management service interface.