Files
Renderive/Core/architecture/Render_Data.cpp
T
2026-08-01 20:09:45 +08:00

61 lines
2.3 KiB
C++

#include "Renderable.h"
#include <ostream>
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<Update_State> 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<std::shared_ptr<Update_State>>& 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