完美一版
This commit is contained in:
+44
-7
@@ -113,15 +113,29 @@ public:
|
||||
plot_execution_id,
|
||||
frame.frame_id,
|
||||
Render_Task_Kind::Frame,
|
||||
[job]() {
|
||||
job->owner->execute_frame_job(job);
|
||||
Task{},
|
||||
[job](tf::Taskflow& taskflow, tf::Task entry, tf::Task exit) {
|
||||
auto prepare = taskflow.emplace([job]() {
|
||||
job->owner->prepare_frame_job(job);
|
||||
});
|
||||
auto draw = taskflow.emplace([job]() {
|
||||
job->owner->draw_frame_job(job);
|
||||
});
|
||||
auto finalize = taskflow.emplace([job]() {
|
||||
job->owner->finalize_frame_job(job);
|
||||
});
|
||||
entry.precede(prepare);
|
||||
prepare.precede(draw);
|
||||
draw.precede(finalize);
|
||||
finalize.precede(exit);
|
||||
},
|
||||
[job]() {
|
||||
Task([job]() {
|
||||
Global::instance()->render_scheduler().post([job]() {
|
||||
job->owner->complete_frame_job(job);
|
||||
});
|
||||
},
|
||||
}),
|
||||
job->worker_stat,
|
||||
3,
|
||||
true
|
||||
});
|
||||
if (submitted)
|
||||
@@ -137,8 +151,12 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
void execute_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!job || !job->buffer || !job->lifecycle || !job->render_snapshot.context || job->render_snapshot.destroying())
|
||||
static bool frame_job_valid(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
return job && job->buffer && job->lifecycle && job->render_snapshot.context && !job->render_snapshot.destroying();
|
||||
}
|
||||
|
||||
void prepare_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!frame_job_valid(job))
|
||||
return;
|
||||
Frame_Lifecycle_Record& frame = *job->lifecycle;
|
||||
frame.prepare_begin_ns = steady_now_ns();
|
||||
@@ -150,8 +168,13 @@ public:
|
||||
++frame.prepared_output_count;
|
||||
}
|
||||
frame.prepare_end_ns = steady_now_ns();
|
||||
context->first_prepare_data.store(false, std::memory_order_release);
|
||||
job->render_snapshot.context->first_prepare_data.store(false, std::memory_order_release);
|
||||
}
|
||||
|
||||
void draw_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!frame_job_valid(job) || !job->lifecycle->prepare_end_ns)
|
||||
return;
|
||||
Frame_Lifecycle_Record& frame = *job->lifecycle;
|
||||
job->buffer->image.resize(job->render_snapshot.size.width, job->render_snapshot.size.height);
|
||||
job->buffer->image.fill(job->render_snapshot.background_color);
|
||||
Canvas canvas(job->buffer->image);
|
||||
@@ -161,6 +184,12 @@ public:
|
||||
job->renderables.front().renderable->render_tree_snapshot(canvas, job->render_snapshot, job->renderables, 0);
|
||||
frame.draw_end_ns = steady_now_ns();
|
||||
frame.render_end_ns = steady_now_ns();
|
||||
}
|
||||
|
||||
void finalize_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!frame_job_valid(job) || !job->lifecycle->render_end_ns)
|
||||
return;
|
||||
Frame_Lifecycle_Record& frame = *job->lifecycle;
|
||||
job->buffer->version.store(frame.frame_id, std::memory_order_release);
|
||||
for (const auto& update_state : job->buffer->presented_update_states) {
|
||||
if (update_state)
|
||||
@@ -168,6 +197,14 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void execute_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!job || !job->buffer || !job->lifecycle || !job->render_snapshot.context || job->render_snapshot.destroying())
|
||||
return;
|
||||
prepare_frame_job(job);
|
||||
draw_frame_job(job);
|
||||
finalize_frame_job(job);
|
||||
}
|
||||
|
||||
void complete_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!job || !job->buffer || !job->lifecycle)
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user