修复若干bug
This commit is contained in:
+9
-11
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user