59 const std::shared_ptr<Core::VKImage>&
image,
69 [[nodiscard]] uint32_t
get_layer_count()
const {
return static_cast<uint32_t
>(m_data.size()); }
83 void from_image(
const std::shared_ptr<Core::VKImage>&
image, uint32_t layer = 0);
93 [[nodiscard]] std::shared_ptr<Core::VKImage> to_image(uint32_t layer = 0)
const;
110 [[nodiscard]] std::span<const uint8_t> pixel_bytes(uint32_t layer = 0)
const;
116 [[nodiscard]] std::span<uint8_t> pixel_bytes(uint32_t layer = 0);
122 [[nodiscard]] std::span<const uint8_t> as_uint8(uint32_t layer = 0)
const;
131 [[nodiscard]] std::span<const uint16_t> as_uint16(uint32_t layer = 0)
const;
137 [[nodiscard]] std::span<const float> as_float(uint32_t layer = 0)
const;
144 void set_pixels(std::span<const uint8_t> data, uint32_t layer = 0);
152 void set_pixels(std::span<const uint16_t> data, uint32_t layer = 0);
160 void set_pixels(std::span<const float> data, uint32_t layer = 0);
166 [[nodiscard]] uint32_t
get_width()
const {
return m_width; }
167 [[nodiscard]] uint32_t
get_height()
const {
return m_height; }
172 [[nodiscard]]
size_t row_stride()
const {
return static_cast<size_t>(m_width) * m_bpp; }
175 [[nodiscard]]
size_t byte_size()
const {
return static_cast<size_t>(m_width) * m_height * m_bpp; }
181 [[nodiscard]] std::vector<DataDimension> get_dimensions()
const override;
182 [[nodiscard]] uint64_t get_total_elements()
const override;
183 [[nodiscard]]
MemoryLayout get_memory_layout()
const override;
185 [[nodiscard]] uint64_t get_frame_size()
const override;
186 [[nodiscard]] uint64_t get_num_frames()
const override;
188 [[nodiscard]] std::vector<DataVariant> get_region_data(
const Region& region)
const override;
189 [[nodiscard]] std::vector<DataVariant> get_segments_data(
190 const std::vector<RegionSegment>& segments)
const override;
193 [[nodiscard]]
double get_value_at(
const std::vector<uint64_t>& coordinates)
const override;
194 void set_value_at(
const std::vector<uint64_t>& coordinates,
double value)
override;
195 [[nodiscard]] uint64_t coordinates_to_linear_index(
const std::vector<uint64_t>& coords)
const override;
196 [[nodiscard]] std::vector<uint64_t> linear_index_to_coordinates(uint64_t index)
const override;
197 void clear()
override;
213 [[nodiscard]] std::span<const double> get_frame(uint64_t frame_index)
const override;
227 void get_frames(std::span<double> output,
228 uint64_t start_frame, uint64_t num_frames)
const override;
240 void set_region_data(
const Region& region,
241 const std::vector<DataVariant>& data)
override;
245 void register_state_change_callback(
246 std::function<
void(
const std::shared_ptr<SignalSourceContainer>&,
ProcessingState)> cb)
override;
247 void unregister_state_change_callback()
override;
249 [[nodiscard]]
bool is_ready_for_processing()
const override;
250 void mark_ready_for_processing(
bool ready)
override;
252 [[nodiscard]] std::vector<DataVariant>& get_processed_data()
override;
253 [[nodiscard]]
const std::vector<DataVariant>& get_processed_data()
const override;
254 [[nodiscard]]
const std::vector<DataVariant>& get_data()
override;
262 [[nodiscard]]
DataAccess channel_data(
size_t channel_index)
override;
263 [[nodiscard]] std::vector<DataAccess> all_channel_data()
override;
274 [[nodiscard]] std::unordered_map<std::string, RegionGroup> get_all_region_groups()
const override;
277 void lock()
override;
278 void unlock()
override;
279 [[nodiscard]]
bool try_lock()
override;
281 [[nodiscard]]
const void* get_raw_data()
const override;
282 [[nodiscard]]
bool has_data()
const override;
292 return m_processing_token.compare_exchange_strong(expected, ch);
296 return m_processing_token.load() == ch;
335 void setup_dimensions();
338 uint32_t m_height {};
340 uint32_t m_channels {};
350 std::atomic<ProcessingState> m_processing_state { ProcessingState::IDLE };
351 std::atomic<bool> m_ready_for_processing {
false };
352 std::atomic<int> m_processing_token { -1 };
Type-erased accessor for NDData with semantic view construction.
Data-driven interface for managing arbitrary processable signal sources.
void unload_region(const Region &) override
No-op.
void load_region(const Region &) override
No-op.
std::unordered_map< std::string, RegionGroup > m_region_groups
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.
std::vector< DataVariant > m_channel_cache
Backing storage for per-channel DataVariants returned by channel_data().
~TextureContainer() override=default
TextureContainer(const std::shared_ptr< Core::VKImage > &image, Portal::Graphics::ImageFormat format)
Construct from an existing VKImage, downloading its pixel data.
TextureContainer(const TextureContainer &)=delete
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::shared_ptr< DataProcessingChain > get_processing_chain() override
Get the current processing chain for this container.
uint32_t get_height() const
bool has_active_readers() const override
No-op.
TextureContainer(TextureContainer &&)=delete
std::function< void(const std::shared_ptr< SignalSourceContainer > &, ProcessingState)> m_state_cb
std::vector< DataVariant > m_processed_data
void unregister_dimension_reader(uint32_t) override
No-op.
bool all_dimensions_consumed() const override
No-op.
const ContainerDataStructure & get_structure() const override
void set_default_processor(const std::shared_ptr< DataProcessor > &p) override
Set the default data processor for this container.
std::shared_mutex m_data_mutex
void mark_buffers_for_removal() override
No-op.
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::shared_ptr< DataProcessingChain > m_chain
uint32_t register_dimension_reader(uint32_t) override
No-op.
Portal::Graphics::ImageFormat get_format() const
void process_default() override
No-op.
std::vector< double > m_frame_cache
Row cache backing the double span returned by get_frame().
bool try_acquire_processing_token(int ch)
ContainerDataStructure m_structure
void reset_processing_token()
uint32_t get_width() const
std::vector< DataVariant > m_data
void create_default_processor() override
No-op.
TextureContainer & operator=(const TextureContainer &)=delete
uint32_t get_layer_count() const
bool is_region_loaded(const Region &) const override
Check if a region is loaded in memory.
uint32_t get_channel_count() const
void mark_buffers_for_processing(bool) override
No-op.
std::vector< DataVariant > get_region_group_data(const RegionGroup &) const override
Get data for multiple regions efficiently.
bool has_processing_token(int ch) const
std::shared_ptr< DataProcessor > m_processor
TextureContainer & operator=(TextureContainer &&)=delete
void mark_dimension_consumed(uint32_t, uint32_t) override
No-op.
size_t byte_size() const
Total byte count of the pixel buffer.
SignalSourceContainer wrapping GPU texture data as addressable pixel bytes.
ProcessingState
Represents the current processing lifecycle state of a container.
std::optional< RegionGroup > get_region_group(const std::unordered_map< std::string, RegionGroup > &groups, const std::string &name)
Get a RegionGroup by name from a group map.
void add_region_group(std::unordered_map< std::string, RegionGroup > &groups, const RegionGroup &group)
Add a RegionGroup to a group map.
MemoryLayout
Memory layout for multi-dimensional data.
void remove_region_group(std::unordered_map< std::string, RegionGroup > &groups, const std::string &name)
Remove a RegionGroup by name from a group map.
ImageFormat
User-friendly image format enum.
Container structure for consistent dimension ordering.
Organizes related signal regions into a categorized collection.
Represents a point or span in N-dimensional space.