明面上没bug了

This commit is contained in:
2026-08-02 00:06:33 +08:00
parent e4772d9214
commit 85aecd0a06
36 changed files with 2994 additions and 1392 deletions
+45 -36
View File
@@ -4,7 +4,9 @@
namespace renderive {
Plot_Frame::Plot_Frame() : presented_update_states(memory_resource(Memory_Domain::Update_Completion)) {}
Plot_Frame::Plot_Frame()
: presented_update_states(memory_resource(Memory_Domain::Update_Completion)),
metadata(std::make_shared<Frame_Lifecycle_Record>()) {}
Plot_Frame_Lease::Plot_Frame_Lease(Plot_Frame* buffer, Triple_Role_Buffer_Control* control, Triple_Buffer_Lease lease)
: frame(buffer), control(control), lease(lease) {}
@@ -70,7 +72,7 @@ const Plot_Frame* Plot_Frame_Pipeline::frame_by_role(std::uint8_t role) const {
}
Plot_Frame_Lease Plot_Frame_Pipeline::try_begin_render() {
auto record = frame_control.try_mark_use_role(Frame_Rendering);
auto record = frame_control.try_acquire_role(Frame_Rendering);
if (record.result != Triple_Buffer_Result::Success) {
++attempts.render_role_busy_count;
return {};
@@ -81,32 +83,39 @@ Plot_Frame_Lease Plot_Frame_Pipeline::try_begin_render() {
Plot_Frame_Pipeline::Frame_Publish_Result Plot_Frame_Pipeline::try_publish_rendered(std::uint64_t now_ns) {
Frame_Publish_Result result;
Plot_Frame* rendered = frame_by_role(Frame_Rendering);
Plot_Frame* old_middle = frame_by_role(Frame_Middle);
const Plot_Frame* painting = frame_by_role(Frame_Painting);
bool supersede_middle = buffer_version_newer(old_middle->version.load(std::memory_order_acquire), painting->version.load(std::memory_order_acquire));
auto swap = frame_control.try_swap_role(Frame_Rendering, Frame_Middle, [this](const Triple_Buffer_View& view) {
const Plot_Frame* rendering = frame_by_index(view[Frame_Rendering]);
const Plot_Frame* middle = frame_by_index(view[Frame_Middle]);
return buffer_version_newer(rendering->version.load(std::memory_order_acquire), middle->version.load(std::memory_order_acquire));
}, [this, &result, now_ns](const Triple_Buffer_View& old_view, const Triple_Buffer_View& new_view) {
Plot_Frame* rendered = frame_by_index(old_view[Frame_Rendering]);
Plot_Frame* old_middle = frame_by_index(old_view[Frame_Middle]);
const Plot_Frame* painting = frame_by_index(old_view[Frame_Painting]);
bool supersede_middle = buffer_version_newer(old_middle->version.load(std::memory_order_acquire), painting->version.load(std::memory_order_acquire));
rendered->metadata->transition_12_ns = now_ns;
rendered->metadata->wait_12_ns = now_ns > rendered->metadata->render_end_ns ? now_ns - rendered->metadata->render_end_ns : 0;
if (supersede_middle && old_middle->metadata && old_middle->metadata->frame_id) {
old_middle->metadata->superseded_time_ns = now_ns;
old_middle->metadata->outcome = Frame_Outcome::Superseded;
result.superseded_middle = old_middle->metadata;
supersede_update_states(old_middle->presented_update_states);
}
Plot_Frame* next_rendering = frame_by_index(new_view[Frame_Rendering]);
next_rendering->metadata = std::make_shared<Frame_Lifecycle_Record>();
next_rendering->metadata->render_role_enter_ns = now_ns;
});
if (swap.result != Triple_Buffer_Result::Success) {
rendered->metadata.outcome = Frame_Outcome::Publish_Dropped;
result.dropped_frame = rendered;
rendered->metadata->outcome = Frame_Outcome::Publish_Dropped;
result.dropped_frame = rendered->metadata;
supersede_update_states(rendered->presented_update_states);
++attempts.publish_dropped_count;
return result;
}
rendered->metadata.transition_12_ns = now_ns;
rendered->metadata.wait_12_ns = now_ns > rendered->metadata.render_end_ns ? now_ns - rendered->metadata.render_end_ns : 0;
frame_by_role(Frame_Rendering)->metadata.render_role_enter_ns = now_ns;
if (supersede_middle && old_middle->metadata.frame_id) {
old_middle->metadata.superseded_time_ns = now_ns;
old_middle->metadata.outcome = Frame_Outcome::Superseded;
result.superseded_middle = old_middle;
}
Frame_Publish_Result update_result = request_paint_update(now_ns);
update_result.superseded_middle = result.superseded_middle;
update_result.dropped_frame = result.dropped_frame;
@@ -119,14 +128,14 @@ Plot_Frame_Pipeline::Frame_Publish_Result Plot_Frame_Pipeline::request_paint_upd
return result;
Plot_Frame* middle = frame_by_role(Frame_Middle);
if (paint_request_pending.load(std::memory_order_acquire)) {
middle->metadata.update_request_id = pending_update_request_id.load(std::memory_order_acquire);
middle->metadata.update_request_time_ns = pending_update_request_time.load(std::memory_order_acquire);
middle->metadata->update_request_id = pending_update_request_id.load(std::memory_order_acquire);
middle->metadata->update_request_time_ns = pending_update_request_time.load(std::memory_order_acquire);
return result;
}
result.update_request_id = ++next_update_request_id;
result.update_request_time = now_ns;
middle->metadata.update_request_id = result.update_request_id;
middle->metadata.update_request_time_ns = result.update_request_time;
middle->metadata->update_request_id = result.update_request_id;
middle->metadata->update_request_time_ns = result.update_request_time;
pending_update_request_id.store(result.update_request_id, std::memory_order_release);
pending_update_request_time.store(result.update_request_time, std::memory_order_release);
paint_request_pending.store(true, std::memory_order_release);
@@ -138,36 +147,36 @@ Plot_Frame_Pipeline::Frame_Publish_Result Plot_Frame_Pipeline::request_paint_upd
Plot_Frame_Pipeline::Frame_Consume_Result Plot_Frame_Pipeline::try_begin_paint(std::uint64_t now_ns) {
Frame_Consume_Result result;
result.update_was_pending = paint_request_pending.exchange(false, std::memory_order_acq_rel);
bool pending = paint_request_pending.load(std::memory_order_acquire);
if (middle_has_new_frame()) {
Plot_Frame* old_painting = frame_by_role(Frame_Painting);
Plot_Frame* new_painting = frame_by_role(Frame_Middle);
auto swap = frame_control.try_swap_role(Frame_Middle, Frame_Painting, [this](const Triple_Buffer_View& view) {
const Plot_Frame* middle = frame_by_index(view[Frame_Middle]);
const Plot_Frame* painting = frame_by_index(view[Frame_Painting]);
return buffer_version_newer(middle->version.load(std::memory_order_acquire), painting->version.load(std::memory_order_acquire));
});
if (swap.result == Triple_Buffer_Result::Success) {
}, [this, &result, now_ns](const Triple_Buffer_View& old_view, const Triple_Buffer_View&) {
Plot_Frame* old_painting = frame_by_index(old_view[Frame_Painting]);
Plot_Frame* new_painting = frame_by_index(old_view[Frame_Middle]);
result.new_frame = true;
if (old_painting->metadata.frame_id && old_painting->metadata.paint_end_ns) {
old_painting->metadata.transition_32_ns = now_ns;
old_painting->metadata.wait_32_ns = now_ns > old_painting->metadata.paint_end_ns ? now_ns - old_painting->metadata.paint_end_ns : 0;
if (old_painting->metadata && old_painting->metadata->frame_id && old_painting->metadata->paint_end_ns) {
old_painting->metadata->transition_32_ns = now_ns;
old_painting->metadata->wait_32_ns = now_ns > old_painting->metadata->paint_end_ns ? now_ns - old_painting->metadata->paint_end_ns : 0;
result.returned_frame = old_painting->metadata;
result.has_returned_frame = true;
}
new_painting->metadata.transition_23_ns = now_ns;
new_painting->metadata.wait_23_ns = now_ns > new_painting->metadata.transition_12_ns ? now_ns - new_painting->metadata.transition_12_ns : 0;
}
else {
new_painting->metadata->transition_23_ns = now_ns;
new_painting->metadata->wait_23_ns = now_ns > new_painting->metadata->transition_12_ns ? now_ns - new_painting->metadata->transition_12_ns : 0;
});
if (swap.result != Triple_Buffer_Result::Success) {
result.paint_acquire_dropped = true;
++attempts.paint_role_busy_count;
}
}
auto record = frame_control.try_mark_use_role(Frame_Painting);
if (record.result == Triple_Buffer_Result::Success)
auto record = frame_control.try_acquire_role(Frame_Painting);
if (record.result == Triple_Buffer_Result::Success) {
result.lease = {frame_by_index(record.lease.index), &frame_control, record.lease};
result.update_was_pending = pending && paint_request_pending.exchange(false, std::memory_order_acq_rel);
}
else {
result.paint_acquire_dropped = true;
++attempts.paint_role_busy_count;