63 uint32_t frame_capacity = 60);
75 [[nodiscard]] std::shared_ptr<Core::Window>
get_window()
const {
return m_window; }
91 [[nodiscard]] uint8_t* mutable_frame_ptr(uint32_t frame_index);
99 [[nodiscard]] uint32_t
get_write_head()
const {
return m_write_head.load(); }
102 void advance_write_head();
108 [[nodiscard]] std::vector<DataDimension> get_dimensions()
const override;
109 [[nodiscard]] uint64_t get_total_elements()
const override;
110 [[nodiscard]]
MemoryLayout get_memory_layout()
const override;
119 [[nodiscard]] std::vector<DataVariant> get_region_data(
const Region& region)
const override;
131 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image()
const;
146 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image(
147 const std::shared_ptr<Buffers::VKBuffer>& staging)
const;
153 [[nodiscard]] std::shared_ptr<Core::VKImage> image_at(uint32_t frame_index)
const;
160 [[nodiscard]] std::shared_ptr<Core::VKImage> image_at(
161 uint32_t frame_index,
162 const std::shared_ptr<Buffers::VKBuffer>& staging)
const;
175 [[nodiscard]] std::shared_ptr<Core::VKImage> region_to_image(
const Region& region)
const;
177 void set_region_data(
const Region& region,
const std::vector<DataVariant>& data)
override;
179 [[nodiscard]] std::vector<DataVariant> get_region_group_data(
const RegionGroup& group)
const override;
180 [[nodiscard]] std::vector<DataVariant> get_segments_data(
const std::vector<RegionSegment>& segments)
const override;
184 [[nodiscard]] uint64_t coordinates_to_linear_index(
const std::vector<uint64_t>& coordinates)
const override;
185 [[nodiscard]] std::vector<uint64_t> linear_index_to_coordinates(uint64_t linear_index)
const override;
187 void clear()
override;
189 [[nodiscard]]
const void* get_raw_data()
const override;
190 [[nodiscard]]
bool has_data()
const override;
202 [[nodiscard]] std::unordered_map<std::string, RegionGroup> get_all_region_groups()
const override;
209 void load_region(
const Region& region)
override;
214 void unload_region(
const Region& region)
override;
219 [[nodiscard]]
bool is_region_loaded(
const Region& region)
const override;
226 void handle_surface_resize();
242 [[nodiscard]] std::span<const float> processed_frame_as_float(uint32_t frame_index = 0)
const;
253 void invalidate_float_frame_cache(uint32_t frame_index = 0);
262 void register_state_change_callback(
263 std::function<
void(
const std::shared_ptr<SignalSourceContainer>&,
ProcessingState)> callback)
override;
264 void unregister_state_change_callback()
override;
266 [[nodiscard]]
bool is_ready_for_processing()
const override;
267 void mark_ready_for_processing(
bool ready)
override;
269 void create_default_processor()
override;
270 void process_default()
override;
272 void set_default_processor(
const std::shared_ptr<DataProcessor>& processor)
override;
273 [[nodiscard]] std::shared_ptr<DataProcessor> get_default_processor()
const override;
275 [[nodiscard]] std::shared_ptr<DataProcessingChain> get_processing_chain()
override;
276 void set_processing_chain(
const std::shared_ptr<DataProcessingChain>& chain)
override;
278 [[nodiscard]] uint64_t get_frame_size()
const override;
279 [[nodiscard]] uint64_t get_num_frames()
const override;
287 uint32_t register_dimension_reader(uint32_t dimension_index)
override;
288 void unregister_dimension_reader(uint32_t dimension_index)
override;
289 [[nodiscard]]
bool has_active_readers()
const override;
290 void mark_dimension_consumed(uint32_t dimension_index, uint32_t reader_id)
override;
291 [[nodiscard]]
bool all_dimensions_consumed()
const override;
293 [[nodiscard]] std::vector<DataVariant>& get_processed_data()
override;
294 [[nodiscard]]
const std::vector<DataVariant>& get_processed_data()
const override;
295 [[nodiscard]]
const std::vector<DataVariant>& get_data()
override;
300 [[nodiscard]]
DataAccess channel_data(
size_t channel_index)
override;
301 [[nodiscard]] std::vector<DataAccess> all_channel_data()
override;
304 [[nodiscard]]
auto get_frame_span_impl(uint64_t frame_index)
const ->
DataSpanVariant override;
305 void get_frames_impl(
void*
output,
size_t count, uint64_t start_frame, uint64_t num_frames,
const std::type_info& type)
const override;
307 void get_value_impl(
const std::vector<uint64_t>& coords,
308 void* out,
const std::type_info& type)
const override;
311 const void* in,
const std::type_info& type)
override { }
328 std::atomic<ProcessingState> m_processing_state { ProcessingState::IDLE };
329 std::atomic<bool> m_ready_for_processing {
false };
337 std::atomic<uint32_t> m_registered_readers { 0 };
338 std::atomic<uint32_t> m_consumed_readers { 0 };
339 std::atomic<uint32_t> m_next_reader_id { 0 };
340 std::atomic<uint32_t> m_write_head { 0 };
341 uint32_t m_frame_capacity { 1 };
342 std::atomic<uint64_t> m_frames_written { 0 };
344 void setup_dimensions();
346 [[nodiscard]]
auto get_frame_typed(uint64_t frame_index)
const -> std::span<const uint8_t>;
347 void get_frames_typed(std::span<uint8_t>
output, uint64_t start_frame, uint64_t num_frames)
const;