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;
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 uint32_t frame_index,
160 const std::shared_ptr<Buffers::VKBuffer>& staging)
const;
174 [[nodiscard]] std::shared_ptr<Core::VKImage> region_to_image(
const Region& region)
const;
176 void set_region_data(
const Region& region,
const std::vector<DataVariant>& data)
override;
178 [[nodiscard]] std::vector<DataVariant> get_region_group_data(
const RegionGroup& group)
const override;
179 [[nodiscard]] std::vector<DataVariant> get_segments_data(
const std::vector<RegionSegment>& segments)
const 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;
188 [[nodiscard]]
const void* get_raw_data()
const override;
189 [[nodiscard]]
bool has_data()
const override;
201 [[nodiscard]] std::unordered_map<std::string, RegionGroup> get_all_region_groups()
const override;
208 void load_region(
const Region& region)
override;
213 void unload_region(
const Region& region)
override;
218 [[nodiscard]]
bool is_region_loaded(
const Region& region)
const override;
225 void handle_surface_resize();
241 [[nodiscard]] std::span<const float> processed_frame_as_float(uint32_t frame_index = 0)
const;
252 void invalidate_float_frame_cache(uint32_t frame_index = 0);
261 void register_state_change_callback(
263 void unregister_state_change_callback()
override;
265 [[nodiscard]]
bool is_ready_for_processing()
const override;
266 void mark_ready_for_processing(
bool ready)
override;
268 void create_default_processor()
override;
269 void process_default()
override;
271 void set_default_processor(
const std::shared_ptr<DataProcessor>& processor)
override;
272 [[nodiscard]] std::shared_ptr<DataProcessor> get_default_processor()
const override;
274 [[nodiscard]] std::shared_ptr<DataProcessingChain> get_processing_chain()
override;
275 void set_processing_chain(
const std::shared_ptr<DataProcessingChain>&
chain)
override;
277 [[nodiscard]] uint64_t get_frame_size()
const override;
278 [[nodiscard]] uint64_t get_num_frames()
const override;
286 uint32_t register_dimension_reader(uint32_t dimension_index)
override;
287 void unregister_dimension_reader(uint32_t dimension_index)
override;
288 [[nodiscard]]
bool has_active_readers()
const override;
289 void mark_dimension_consumed(uint32_t dimension_index, uint32_t reader_id)
override;
290 [[nodiscard]]
bool all_dimensions_consumed()
const override;
292 [[nodiscard]] std::vector<DataVariant>& get_processed_data()
override;
293 [[nodiscard]]
const std::vector<DataVariant>& get_processed_data()
const override;
294 [[nodiscard]]
const std::vector<DataVariant>& get_data()
override;
299 [[nodiscard]]
DataAccess channel_data(
size_t channel_index)
override;
300 [[nodiscard]] std::vector<DataAccess> all_channel_data()
override;
303 [[nodiscard]]
auto get_frame_span_impl(uint64_t frame_index)
const ->
DataSpanVariant override;
304 void get_frames_impl(
void* output,
size_t count, uint64_t start_frame, uint64_t num_frames,
const std::type_info&
type)
const override;
306 void get_value_impl(
const std::vector<uint64_t>&
coords,
307 void*
out,
const std::type_info&
type)
const override;
310 const void* in,
const std::type_info&
type)
override { }
339 std::atomic<ProcessingState> m_processing_state { ProcessingState::IDLE };
340 std::atomic<bool> m_ready_for_processing {
false };
348 std::atomic<uint32_t> m_registered_readers { 0 };
349 std::atomic<uint32_t> m_consumed_readers { 0 };
350 std::atomic<uint32_t> m_next_reader_id { 0 };
351 std::atomic<uint32_t> m_write_head { 0 };
352 uint32_t m_frame_capacity { 1 };
353 std::atomic<uint64_t> m_frames_written { 0 };
355 void setup_dimensions();
357 [[nodiscard]] std::optional<PixelSnapshot> snapshot_pixels(
358 std::optional<uint32_t> frame_index = std::nullopt)
const;
359 [[nodiscard]]
auto get_frame_typed(uint64_t frame_index)
const -> std::span<const uint8_t>;
360 void get_frames_typed(std::span<uint8_t> output, uint64_t start_frame, uint64_t num_frames)
const;