#pragma once #include "../architecture/Frame_Scheduler.h" #include "../architecture/Update_Completion.h" #include "../base/Geometry.h" #include "Flow_Diagnostics.h" #include "Frame_Flow_Host.h" #include "Present_Surface_Lease.h" #include "Render_Surface.h" #include #include #include #include namespace renderive { class Frame_Flow { public: virtual ~Frame_Flow() = default; virtual void attach(Frame_Flow_Host& host) = 0; [[nodiscard]] virtual Frame_Flow_Runtime_Snapshot runtime_snapshot(std::uint64_t now_ns, bool destroying) const = 0; virtual void advance_edit_version() = 0; virtual void cancel_all_update_states() = 0; [[nodiscard]] virtual Render_Frame_Surface begin_render_frame() = 0; virtual void cancel_render_frame(Render_Frame_Surface&& surface) = 0; virtual void discard_render_frame(Render_Frame_Surface&& surface) = 0; [[nodiscard]] virtual Render_Surface_Publish_Result publish_rendered_frame(Render_Frame_Surface&& surface, std::uint64_t now_ns) = 0; [[nodiscard]] virtual Render_Surface_Publish_Result request_present(std::uint64_t now_ns) = 0; [[nodiscard]] virtual Present_Surface_Lease begin_present(std::uint64_t now_ns, std::shared_ptr& returned_frame_record) = 0; [[nodiscard]] virtual std::shared_ptr end_present(Present_Surface_Lease&& surface, std::uint64_t paint_begin_ns, std::uint64_t paint_end_ns) = 0; virtual void activate_view(std::uint64_t now_ns) = 0; virtual void deactivate_view() = 0; [[nodiscard]] virtual bool view_active() const = 0; virtual void notify_model_dirty(std::uint64_t now_ns) = 0; virtual void notify_viewport_changed(Size viewport, std::uint64_t now_ns) = 0; virtual void notify_render_finished(Frame_Lifecycle_Record& frame, std::uint64_t now_ns) = 0; virtual void notify_paint_finished(std::uint64_t now_ns) = 0; virtual void notify_frame_returned(Frame_Lifecycle_Record& frame, std::uint64_t now_ns) = 0; virtual void notify_timer_fired(std::uint64_t now_ns) = 0; virtual void drain_frame_update_states(std::pmr::vector>& output) = 0; [[nodiscard]] virtual Flow_Diagnostics diagnostics() const = 0; virtual void shutdown() = 0; }; } // namespace renderive