63 static constexpr uint32_t WEIGHT_SLOTS = 30;
85 std::optional<Portal::Graphics::FitMode> fit = Portal::Graphics::FitMode::STRETCH);
89 void setup_rendering(
const RenderConfig& config)
override;
105 void set_fit(std::optional<Portal::Graphics::FitMode> fit,
117 void set_layer_fit(uint32_t layer, std::optional<Portal::Graphics::FitMode> fit)
119 m_layer_fit[layer] = fit;
128 void enable_layer_data();
138 void set_layer_params(uint32_t layer,
const glm::vec4&
values);
149 void set_layer_timing(uint32_t layer,
const glm::vec4&
values);
157 bool submit_layer(uint32_t layer, std::span<const uint8_t>
pixels);
177 bool submit_layer(uint32_t layer,
const std::shared_ptr<Core::VKImage>&
image);
185 template <
typename Source>
188 if (!submit_layer(m_write_head, source)) {
191 m_write_head = (m_write_head + 1) % m_layers;
204 void set_weight(uint32_t layer,
float weight);
210 void set_weights(std::span<const float> weights);
218 void set_mode(uint32_t
mode);
229 void set_push_constants(
const void* data,
size_t size);
232 template <
typename T>
235 set_push_constants(&block,
sizeof(T));
240 uint32_t layer_count {};
242 std::array<float, WEIGHT_SLOTS> weights {};
247 uint32_t m_write_head {};
248 bool m_layer_mode {};
249 std::optional<Portal::Graphics::FitMode> m_fit { Portal::Graphics::FitMode::STRETCH };
251 std::unordered_map<uint32_t, std::optional<Portal::Graphics::FitMode>>
m_layer_fit;
262 void enter_layer_mode();
264 void clear_layer(uint32_t layer);
265 void bind_layer_data();
266 void write_layer_value(
size_t index,
const glm::vec4&
values);
267 [[nodiscard]] std::optional<Portal::Graphics::FitMode> fit_for(uint32_t layer)
const;
const std::vector< float > * pixels
std::vector< std::byte > values
void set_fit(std::optional< Portal::Graphics::FitMode > fit, Portal::Graphics::FilterMode filter=Portal::Graphics::FilterMode::LINEAR)
Choose what happens to a frame whose extent differs from the layer.
uint32_t get_write_head() const
The layer the next push_layer writes.
std::shared_ptr< VKBuffer > m_source_staging
size_t get_layer_byte_size() const
Bytes in one layer.
void set_push_constants(const T &block)
Replace the default push constants with a block of type T.
bool has_layer_data() const
Whether the per-layer buffer exists.
std::unordered_map< uint32_t, std::optional< Portal::Graphics::FitMode > > m_layer_fit
std::shared_ptr< VKBuffer > m_layer_staging
std::shared_ptr< VKBuffer > m_layer_data
void set_layer_fit(uint32_t layer, std::optional< Portal::Graphics::FitMode > fit)
Give one layer its own fit, replacing the one from set_fit for that layer.
uint32_t get_layer_count() const
Number of layers.
bool push_layer(const Source &source)
Write a frame at the write head and advance it, wrapping at the last layer.
std::vector< uint8_t > m_blank
Portal::Graphics::ImageCacheEntry m_source_cache
std::vector< glm::vec4 > m_layer_values
std::vector< uint8_t > m_custom_push
A TextureBuffer whose image is a stack of layers, composed in one draw.
A hybrid buffer managing both a textured quad geometry and its pixel data.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
ImageFormat
User-friendly image format enum.
FilterMode
Texture filtering mode.
Raw image data loaded from file or read back from a GPU image.
Describes a DynamicVideoStream so it can be built by designated initializer.
Image retained by the producing owner.
Unified rendering configuration for graphics buffers.