63 const std::shared_ptr<Core::VKImage>&
image,
73 [[nodiscard]] uint32_t
get_layer_count()
const {
return static_cast<uint32_t
>(m_data.size()); }
87 void from_image(
const std::shared_ptr<Core::VKImage>&
image, uint32_t layer = 0);
103 const std::shared_ptr<Core::VKImage>&
image,
104 const std::shared_ptr<Buffers::VKBuffer>& staging,
117 void from_image_array(
const std::shared_ptr<Core::VKImage>&
image);
133 void from_image_array(
134 const std::shared_ptr<Core::VKImage>&
image,
135 const std::shared_ptr<Buffers::VKBuffer>& staging);
145 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image(uint32_t layer = 0)
const;
159 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image(
161 const std::shared_ptr<Buffers::VKBuffer>& staging)
const;
177 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image_array()
const;
194 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image_array(
195 const std::shared_ptr<Buffers::VKBuffer>& staging)
const;
212 [[nodiscard]] std::span<const uint8_t> pixel_bytes(uint32_t layer = 0)
const;
218 [[nodiscard]] std::span<uint8_t> pixel_bytes(uint32_t layer = 0);
224 [[nodiscard]] std::span<const uint8_t> as_uint8(uint32_t layer = 0)
const;
233 [[nodiscard]] std::span<const uint16_t> as_uint16(uint32_t layer = 0)
const;
239 [[nodiscard]] std::span<const float> as_float(uint32_t layer = 0)
const;
246 void set_pixels(std::span<const uint8_t> data, uint32_t layer = 0);
254 void set_pixels(std::span<const uint16_t> data, uint32_t layer = 0);
262 void set_pixels(std::span<const float> data, uint32_t layer = 0);
284 [[nodiscard]] uint32_t
get_width()
const {
return m_width; }
285 [[nodiscard]] uint32_t
get_height()
const {
return m_height; }
290 [[nodiscard]]
size_t row_stride()
const {
return static_cast<size_t>(m_width) * m_bpp; }
293 [[nodiscard]]
size_t byte_size()
const {
return static_cast<size_t>(m_width) * m_height * m_bpp; }
299 [[nodiscard]] std::vector<DataDimension> get_dimensions()
const override;
300 [[nodiscard]] uint64_t get_total_elements()
const override;
301 [[nodiscard]]
MemoryLayout get_memory_layout()
const override;
303 [[nodiscard]] uint64_t get_frame_size()
const override;
304 [[nodiscard]] uint64_t get_num_frames()
const override;
306 [[nodiscard]] std::vector<DataVariant> get_region_data(
const Region& region)
const override;
307 [[nodiscard]] std::vector<DataVariant> get_segments_data(
308 const std::vector<RegionSegment>& segments)
const override;
311 [[nodiscard]] std::type_index value_element_type()
const override;
312 [[nodiscard]] uint64_t coordinates_to_linear_index(
const std::vector<uint64_t>& coords)
const override;
313 [[nodiscard]] std::vector<uint64_t> linear_index_to_coordinates(uint64_t index)
const override;
314 void clear()
override;
330 void set_region_data(
const Region& region,
331 const std::vector<DataVariant>& data)
override;
335 void register_state_change_callback(
336 std::function<
void(
const std::shared_ptr<SignalSourceContainer>&,
ProcessingState)> cb)
override;
337 void unregister_state_change_callback()
override;
339 [[nodiscard]]
bool is_ready_for_processing()
const override;
340 void mark_ready_for_processing(
bool ready)
override;
342 [[nodiscard]] std::vector<DataVariant>& get_processed_data()
override;
343 [[nodiscard]]
const std::vector<DataVariant>& get_processed_data()
const override;
344 [[nodiscard]]
const std::vector<DataVariant>& get_data()
override;
352 [[nodiscard]]
DataAccess channel_data(
size_t channel_index)
override;
353 [[nodiscard]] std::vector<DataAccess> all_channel_data()
override;
364 [[nodiscard]] std::unordered_map<std::string, RegionGroup> get_all_region_groups()
const override;
367 [[nodiscard]]
const void* get_raw_data()
const override;
368 [[nodiscard]]
bool has_data()
const override;
378 return m_processing_token.compare_exchange_strong(expected, ch);
382 return m_processing_token.load() == ch;
393 std::shared_ptr<DataProcessingChain> get_processing_chain()
override;
423 return get_frame_typed(frame_index);
426 void get_frames_impl(
void*
output,
size_t count, uint64_t start_frame, uint64_t num_frames,
const std::type_info& type)
const override;
428 void get_value_impl(
const std::vector<uint64_t>& coords,
429 void* out,
const std::type_info& type)
const override;
431 void set_value_impl(
const std::vector<uint64_t>& coords,
432 const void* in,
const std::type_info& type)
override;
435 void setup_dimensions();
438 uint32_t m_height {};
440 uint32_t m_channels {};
453 std::atomic<ProcessingState> m_processing_state { ProcessingState::IDLE };
454 std::atomic<bool> m_ready_for_processing {
false };
455 std::atomic<int> m_processing_token { -1 };
467 [[nodiscard]]
auto get_frame_typed(uint64_t frame_index)
const ->
DataSpanVariant;
468 void get_frames_typed(
void*
output,
size_t count, uint64_t start_frame, uint64_t num_frames,
const std::type_info& type)
const;
470 template <
typename T>
471 [[nodiscard]]
auto get_frame_typed_as(uint64_t frame_index)
const -> std::span<const T>;
473 template <
typename T>
474 void get_frames_typed_as(std::span<T>
output, uint64_t start_frame, uint64_t num_frames)
const;
void set_processing_chain(const std::shared_ptr< DataProcessingChain > &c) override
Set the processing chain for this container.
void set_structure(ContainerDataStructure s) override
Set the data structure for this container.
TextureContainer(const std::shared_ptr< Core::VKImage > &image, Portal::Graphics::ImageFormat format)
Construct from an existing VKImage, downloading its pixel data.
ContainerDataStructure & get_structure() override
Get the data structure defining this container's layout.
TextureContainer(uint32_t width, uint32_t height, Portal::Graphics::ImageFormat format, uint32_t layers=1)
Construct an empty container with declared dimensions.
std::function< void(const std::shared_ptr< SignalSourceContainer > &, ProcessingState)> m_state_cb
auto get_frame_span_impl(uint64_t frame_index) const -> DataSpanVariant override
Implementation-specific method to retrieve a frame span.
void set_default_processor(const std::shared_ptr< DataProcessor > &p) override
Set the default data processor for this container.
size_t row_stride() const
Byte count of one complete pixel row.
std::shared_ptr< DataProcessor > get_default_processor() const override
Get the current default data processor.
std::vector< double > m_frame_cache
Row cache backing the double span returned by get_frame().
TextureContainer & operator=(const TextureContainer &)=delete
bool is_region_loaded(const Region &) const override
Check if a region is loaded in memory.
std::vector< DataVariant > get_region_group_data(const RegionGroup &) const override
Get data for multiple regions efficiently.
TextureContainer & operator=(TextureContainer &&)=delete
SignalSourceContainer wrapping GPU texture data as addressable pixel bytes.