61 uint32_t frame_capacity = 60);
73 [[nodiscard]] std::shared_ptr<Core::Window>
get_window()
const {
return m_window; }
89 [[nodiscard]] uint8_t* mutable_frame_ptr(uint32_t frame_index);
97 [[nodiscard]] uint32_t
get_write_head()
const {
return m_write_head.load(); }
100 void advance_write_head();
106 [[nodiscard]] std::vector<DataDimension> get_dimensions()
const override;
107 [[nodiscard]] uint64_t get_total_elements()
const override;
108 [[nodiscard]]
MemoryLayout get_memory_layout()
const override;
117 [[nodiscard]] std::vector<DataVariant> get_region_data(
const Region& region)
const override;
129 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image()
const;
144 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image(
145 const std::shared_ptr<Buffers::VKBuffer>& staging)
const;
151 [[nodiscard]] std::shared_ptr<Core::VKImage> image_at(uint32_t frame_index)
const;
158 [[nodiscard]] std::shared_ptr<Core::VKImage> image_at(
159 const std::shared_ptr<Buffers::VKBuffer>& staging,
160 uint32_t frame_index)
const;
173 [[nodiscard]] std::shared_ptr<Core::VKImage> region_to_image(
const Region& region)
const;
175 void set_region_data(
const Region& region,
const std::vector<DataVariant>& data)
override;
177 [[nodiscard]] std::vector<DataVariant> get_region_group_data(
const RegionGroup& group)
const override;
178 [[nodiscard]] std::vector<DataVariant> get_segments_data(
const std::vector<RegionSegment>& segments)
const override;
180 [[nodiscard]]
double get_value_at(
const std::vector<uint64_t>& coordinates)
const override;
181 void set_value_at(
const std::vector<uint64_t>& coordinates,
double value)
override;
183 [[nodiscard]] uint64_t coordinates_to_linear_index(
const std::vector<uint64_t>& coordinates)
const override;
184 [[nodiscard]] std::vector<uint64_t> linear_index_to_coordinates(uint64_t linear_index)
const override;
186 void clear()
override;
187 void lock()
override;
188 void unlock()
override;
189 bool try_lock()
override;
191 [[nodiscard]]
const void* get_raw_data()
const override;
192 [[nodiscard]]
bool has_data()
const override;
204 [[nodiscard]] std::unordered_map<std::string, RegionGroup> get_all_region_groups()
const override;
211 void load_region(
const Region& region)
override;
216 void unload_region(
const Region& region)
override;
221 [[nodiscard]]
bool is_region_loaded(
const Region& region)
const override;
230 void register_state_change_callback(
231 std::function<
void(
const std::shared_ptr<SignalSourceContainer>&,
ProcessingState)> callback)
override;
232 void unregister_state_change_callback()
override;
234 [[nodiscard]]
bool is_ready_for_processing()
const override;
235 void mark_ready_for_processing(
bool ready)
override;
237 void create_default_processor()
override;
238 void process_default()
override;
240 void set_default_processor(
const std::shared_ptr<DataProcessor>& processor)
override;
241 [[nodiscard]] std::shared_ptr<DataProcessor> get_default_processor()
const override;
243 [[nodiscard]] std::shared_ptr<DataProcessingChain> get_processing_chain()
override;
244 void set_processing_chain(
const std::shared_ptr<DataProcessingChain>& chain)
override;
246 [[nodiscard]] uint64_t get_frame_size()
const override;
247 [[nodiscard]] uint64_t get_num_frames()
const override;
248 [[nodiscard]] std::span<const double> get_frame(uint64_t frame_index)
const override;
249 void get_frames(std::span<double> output, uint64_t start_frame, uint64_t num_frames)
const override;
257 uint32_t register_dimension_reader(uint32_t dimension_index)
override;
258 void unregister_dimension_reader(uint32_t dimension_index)
override;
259 [[nodiscard]]
bool has_active_readers()
const override;
260 void mark_dimension_consumed(uint32_t dimension_index, uint32_t reader_id)
override;
261 [[nodiscard]]
bool all_dimensions_consumed()
const override;
263 [[nodiscard]] std::vector<DataVariant>& get_processed_data()
override;
264 [[nodiscard]]
const std::vector<DataVariant>& get_processed_data()
const override;
265 [[nodiscard]]
const std::vector<DataVariant>& get_data()
override;
270 [[nodiscard]]
DataAccess channel_data(
size_t channel_index)
override;
271 [[nodiscard]] std::vector<DataAccess> all_channel_data()
override;
285 std::atomic<ProcessingState> m_processing_state { ProcessingState::IDLE };
286 std::atomic<bool> m_ready_for_processing {
false };
295 std::atomic<uint32_t> m_registered_readers { 0 };
296 std::atomic<uint32_t> m_consumed_readers { 0 };
297 std::atomic<uint32_t> m_next_reader_id { 0 };
298 std::atomic<uint32_t> m_write_head { 0 };
299 uint32_t m_frame_capacity { 1 };
300 std::atomic<uint64_t> m_frames_written { 0 };
302 void setup_dimensions();