修复若干bug

This commit is contained in:
2026-08-02 12:48:37 +08:00
parent 63b97c1bb2
commit 6d000f43b4
21 changed files with 495 additions and 233 deletions
+9 -11
View File
@@ -29,7 +29,7 @@ public:
return rendering.load(std::memory_order_acquire);
}
bool destroying() const {
return destroying_flag.load(std::memory_order_acquire);
return !context || context->destroying.load(std::memory_order_acquire);
}
Refresh_Runtime_Snapshot refresh_runtime_snapshot(std::uint64_t now_ns = steady_now_ns()) const {
return {
@@ -43,7 +43,7 @@ public:
};
}
bool submit_render_once() {
if (!rendering.load(std::memory_order_acquire) || destroying_flag.load(std::memory_order_acquire))
if (!rendering.load(std::memory_order_acquire) || destroying())
return false;
if (!root)
return false;
@@ -189,16 +189,16 @@ public:
if (job->worker_stat)
frame.worker = *job->worker_stat;
bool valid_generation = job->generation == generation.load(std::memory_order_acquire);
bool valid_context = !destroying_flag.load(std::memory_order_acquire) && context && !context->destroying.load(std::memory_order_acquire);
job->frame_lease.reset();
bool valid_context = !destroying();
if (!valid_generation || !valid_context || !frame.render_end_ns) {
job->frame_lease.reset();
frame.outcome = Frame_Outcome::Cancelled;
pipeline.render_job_state = Frame_Job_State::Idle;
supersede_update_states(job->buffer->presented_update_states);
trigger_refresh_strategy(Refresh_Trigger::Render_Finished, &frame);
return;
}
auto publish_result = pipeline.try_publish_rendered_frame(steady_now_ns());
auto publish_result = pipeline.try_publish_rendered_frame(std::move(job->frame_lease), steady_now_ns());
if (publish_result.superseded_frame_record) {
trigger_refresh_strategy(Refresh_Trigger::Frame_Returned, publish_result.superseded_frame_record.get());
collect_frame(publish_result.superseded_frame_record);
@@ -420,7 +420,6 @@ public:
Plot_Frame_Pipeline pipeline;
std::weak_ptr<Presentation_Sink> sink;
std::atomic_bool rendering{false};
std::atomic_bool destroying_flag{false};
std::atomic<std::uint64_t> latest_input_time_ns{0};
std::atomic<std::uint64_t> pending_input_count{0};
bool strategy_started{};
@@ -444,7 +443,6 @@ Plot_Core::Plot_Core(std::unique_ptr<Refresh_Strategy> strategy)
Global::instance()->render_scheduler().register_plot(this);
}
Plot_Core::~Plot_Core() {
d->destroying_flag.store(true, std::memory_order_release);
d->context->destroying.store(true, std::memory_order_release);
d->generation.fetch_add(1, std::memory_order_acq_rel);
Global::instance()->render_scheduler().remove_plot(this);
@@ -512,7 +510,7 @@ void Plot_Core::dispatch_event(const Event& event) {
d->dispatch_event(event);
}
void Plot_Core::mark_render_state_dirty() {
if (d->destroying_flag.load(std::memory_order_acquire))
if (d->destroying())
return;
std::uint64_t now_ns = steady_now_ns();
d->pipeline.advance_edit_version();
@@ -523,14 +521,14 @@ void Plot_Core::mark_render_state_dirty() {
});
}
void Plot_Core::request_manual_refresh() {
if (d->destroying_flag.load(std::memory_order_acquire))
if (d->destroying())
return;
d->post_scheduler_action([data = d]() {
data->trigger_refresh_strategy(Refresh_Trigger::Manual_Request);
});
}
void Plot_Core::start_render() {
if (d->destroying_flag.load(std::memory_order_acquire))
if (d->destroying())
return;
d->rendering.store(true, std::memory_order_release);
d->post_scheduler_action([data = d]() {
@@ -562,7 +560,7 @@ Present_Frame_Lease Plot_Core::begin_present() {
result.is_new_frame = consumed.has_new_frame;
result.update_was_pending = consumed.present_request_was_pending;
if (consumed.lease)
result.lease_ = std::make_unique<Plot_Frame_Lease>(std::move(consumed.lease));
result.lease_.emplace(std::move(consumed.lease));
if (!result.new_frame() && result.request_was_pending()) {
d->post_scheduler_action([data = d]() {
data->trigger_refresh_strategy(Refresh_Trigger::Paint_Finished);