14 const std::shared_ptr<SignalSourceContainer>& container)
16 auto wc = std::dynamic_pointer_cast<WindowContainer>(container);
18 error<std::invalid_argument>(
21 std::source_location::current(),
22 "WindowAccessProcessor requires a WindowContainer");
25 const auto& s = wc->get_structure();
26 m_width =
static_cast<uint32_t
>(s.get_width());
27 m_height =
static_cast<uint32_t
>(s.get_height());
32 wc->get_window()->set_capture_enabled(
true);
34 "WindowAccessProcessor: capture was not enabled for '{}'; enabling now",
35 wc->get_window()->get_create_info().title);
43 container->mark_ready_for_processing(
true);
46 "WindowAccessProcessor attached: {}x{} format={} bpp={}",
53 const std::shared_ptr<SignalSourceContainer>& container)
62 auto wc = std::dynamic_pointer_cast<WindowContainer>(container);
64 wc->get_window()->set_capture_enabled(
false);
66 "WindowAccessProcessor detached: capture disabled for '{}', restoring previous state",
67 wc->get_window()->get_create_info().title);
73 const std::shared_ptr<SignalSourceContainer>& container)
75 auto wc = std::dynamic_pointer_cast<WindowContainer>(container);
78 "WindowAccessProcessor::process — container is not a WindowContainer");
82 const auto& window = wc->get_window();
86 "WindowAccessProcessor: no completed frame available for '{}'",
87 window->get_create_info().title);
99 "WindowAccessProcessor: '{}' resized to {}x{} format={}",
107 auto& processed = container->get_processed_data();
112 const bool has_data = std::visit(
113 [](
const auto& v) {
return !v.empty(); }, processed[0]);
117 "WindowAccessProcessor: readback returned no data for '{}'",
118 window->get_create_info().title);
124 const auto* src = std::get_if<std::vector<uint8_t>>(&processed[0]);
126 if (uint8_t* dst = wc->mutable_frame_ptr(wc->get_write_head())) {
127 std::memcpy(dst, src->data(), src->size());
128 wc->advance_write_head();
#define MF_INFO(comp, ctx,...)
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
size_t m_last_readback_bytes
Core::GraphicsSurfaceInfo::SurfaceFormat m_surface_format
std::atomic< bool > m_is_processing
void process(const std::shared_ptr< SignalSourceContainer > &container) override
Execute a full-surface pixel readback.
void on_attach(const std::shared_ptr< SignalSourceContainer > &container) override
Attach to a WindowContainer.
bool m_previous_window_capture_supported
void on_detach(const std::shared_ptr< SignalSourceContainer > &container) override
Release all cached state.
vk::Format to_vk_format(GraphicsSurfaceInfo::SurfaceFormat fmt)
uint32_t vk_format_bytes_per_pixel(vk::Format fmt)
Byte width of a single pixel for a given Vulkan format.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
@ ERROR
Container is in an error state and cannot proceed.
@ PROCESSING
Container is actively being processed.
@ PROCESSED
Container has completed processing and results are available.
bool is_readback_available(const std::shared_ptr< Core::Window > &window)
Check whether a completed frame is currently available for readback.
std::pair< uint32_t, uint32_t > query_surface_extent(const std::shared_ptr< Core::Window > &window)
Query the current pixel dimensions of the window's swapchain.
DataAccess readback_region(const std::shared_ptr< Core::Window > &window, uint32_t x_offset, uint32_t y_offset, uint32_t pixel_width, uint32_t pixel_height, DataVariant &out_variant)
Read a pixel rectangle from the last completed swapchain frame into a DataVariant whose element type ...
Core::GraphicsSurfaceInfo::SurfaceFormat query_surface_format(const std::shared_ptr< Core::Window > &window)
Query the actual vk::Format in use by the window's live swapchain, translated back to the MayaFlux su...
@ B8G8R8A8_SRGB
Most common - 8-bit SRGB.