61 lines
2.3 KiB
C++
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
|