#include "Renderable.h" #include namespace renderive { std::ostream& operator<<(std::ostream& stream, const Range& range) { stream << "Range(" << range.origin << ", " << range.target << ")"; return stream; } Render_Edit_Guard::Render_Edit_Guard(Render_Data* data, Triple_Buffer_Lease lease) : data(data), lease(lease) {} Render_Edit_Guard::~Render_Edit_Guard() { if (!data) return; ++data->state_by_index(lease.index)->version; auto q = data->q_ptr; data->unmark_state(lease); if (q) q->mark_render_dirty(); } void Render_Data::mark_input_dirty(Triple_Buffer_Lease lease, bool notify_render) { Input_Buffer_Slot& slot = input_slot_by_index(lease.index); slot.version = ++input_version; slot.pending = true; if (notify_render && q_ptr) q_ptr->mark_render_dirty(); } void Render_Data::set_input_completion(Triple_Buffer_Lease lease, std::shared_ptr state) { Input_Buffer_Slot& slot = input_slot_by_index(lease.index); if (slot.completion_state && slot.completion_state != state) slot.completion_state->complete_all({}, Update_Outcome::Superseded); slot.completion_state = std::move(state); } void Render_Data::drain_committed_update_states(std::pmr::vector>& output) { for (auto& state : committed_update_states) output.push_back(std::move(state)); committed_update_states.clear(); } void Render_Data::clear_input_role(std::uint8_t role) { Input_Buffer_Slot& slot = input_slot(role); if (slot.completion_state) { if (role == Input_Render) { slot.completion_state->complete_until(Update_Stage::Committed); committed_update_states.push_back(std::move(slot.completion_state)); } else { slot.completion_state->complete_all({}, Update_Outcome::Superseded); slot.completion_state.reset(); } } slot.data->clear(); slot.pending = false; } void Render_Data::cancel_pending_completions() { for (Input_Buffer_Slot& slot : input_buffers) { if (slot.completion_state) { slot.completion_state->complete_all(std::make_error_code(std::errc::operation_canceled), Update_Outcome::Cancelled); slot.completion_state.reset(); } } cancel_update_states(committed_update_states); } } // namespace renderive