仍然闪烁
This commit is contained in:
+40
-11
@@ -6,6 +6,7 @@
|
||||
#include "../architecture/Update_Completion.h"
|
||||
#include "../base/global.h"
|
||||
#include "../render/Canvas.h"
|
||||
#include "../render/Frame_Prepare_Subflow.h"
|
||||
#include "../render/Render_Frame_Snapshot.h"
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
@@ -21,6 +22,7 @@ struct Frame_Render_Job {
|
||||
Render_Frame_Snapshot render_snapshot;
|
||||
Renderable_Frame_Tree renderables;
|
||||
std::shared_ptr<Frame_Worker_Stats> worker_stat;
|
||||
std::atomic_uint64_t prepared_output_count{0};
|
||||
};
|
||||
class Plot_Core_Private final : public std::enable_shared_from_this<Plot_Core_Private>, public Frame_Flow_Host {
|
||||
public:
|
||||
@@ -92,17 +94,25 @@ public:
|
||||
Render_Task_Kind::Frame,
|
||||
Task{},
|
||||
[job](Render_Task_Graph& graph, Render_Task_Graph_Node entry, Render_Task_Graph_Node exit) {
|
||||
auto prepare = graph.emplace(Task([job]() {
|
||||
job->owner->prepare_frame_job(job);
|
||||
auto prepare_begin = graph.emplace(Render_Task_Kind::Frame, Task([job]() {
|
||||
job->owner->begin_prepare_frame_job(job);
|
||||
}));
|
||||
auto draw = graph.emplace(Task([job]() {
|
||||
auto prepare_dispatch = graph.emplace_subflow(Render_Task_Kind::Frame, [job](Render_Task_Subflow& subflow) {
|
||||
job->owner->dispatch_prepare_subflow(job, subflow);
|
||||
});
|
||||
auto prepare_end = graph.emplace(Render_Task_Kind::Frame, Task([job]() {
|
||||
job->owner->end_prepare_frame_job(job);
|
||||
}));
|
||||
auto draw = graph.emplace(Render_Task_Kind::Primitive, Task([job]() {
|
||||
job->owner->draw_frame_job(job);
|
||||
}));
|
||||
auto finalize = graph.emplace(Task([job]() {
|
||||
auto finalize = graph.emplace(Render_Task_Kind::Frame, Task([job]() {
|
||||
job->owner->finalize_frame_job(job);
|
||||
}));
|
||||
graph.precede(entry, prepare);
|
||||
graph.precede(prepare, draw);
|
||||
graph.precede(entry, prepare_begin);
|
||||
graph.precede(prepare_begin, prepare_dispatch);
|
||||
graph.precede(prepare_dispatch, prepare_end);
|
||||
graph.precede(prepare_end, draw);
|
||||
graph.precede(draw, finalize);
|
||||
graph.precede(finalize, exit);
|
||||
},
|
||||
@@ -112,7 +122,6 @@ public:
|
||||
});
|
||||
}),
|
||||
job->worker_stat,
|
||||
3,
|
||||
true
|
||||
});
|
||||
if (submitted)
|
||||
@@ -128,18 +137,35 @@ public:
|
||||
static bool frame_job_valid(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
return job && job->buffer && job->lifecycle && !job->render_snapshot.destroying();
|
||||
}
|
||||
void prepare_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
void begin_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();
|
||||
job->prepared_output_count.store(0, std::memory_order_release);
|
||||
}
|
||||
void dispatch_prepare_subflow(const std::shared_ptr<Frame_Render_Job>& job, Render_Task_Subflow& subflow) {
|
||||
if (!frame_job_valid(job) || !job->lifecycle->prepare_begin_ns)
|
||||
return;
|
||||
for (const auto& node : job->renderables) {
|
||||
const auto& renderable = node.renderable;
|
||||
if (!renderable || !renderable->should_prepare())
|
||||
continue;
|
||||
renderable->prepare_data(job->render_snapshot, node.frame_view);
|
||||
++frame.prepared_output_count;
|
||||
build_renderable_prepare(*renderable, subflow, job->render_snapshot, node.frame_view);
|
||||
job->prepared_output_count.fetch_add(1, std::memory_order_relaxed);
|
||||
}
|
||||
}
|
||||
void end_prepare_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!frame_job_valid(job) || !job->lifecycle->prepare_begin_ns)
|
||||
return;
|
||||
Frame_Lifecycle_Record& frame = *job->lifecycle;
|
||||
if (job->render_snapshot.frame_update_states) {
|
||||
for (const auto& node : job->renderables) {
|
||||
if (node.renderable)
|
||||
drain_renderable_prepare_updates(*node.renderable, *job->render_snapshot.frame_update_states);
|
||||
}
|
||||
}
|
||||
frame.prepared_output_count = job->prepared_output_count.load(std::memory_order_acquire);
|
||||
frame.prepare_end_ns = steady_now_ns();
|
||||
if (job->owner && job->owner->context)
|
||||
job->owner->context->first_prepare_data.store(false, std::memory_order_release);
|
||||
@@ -169,7 +195,10 @@ public:
|
||||
void execute_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
|
||||
if (!job || !job->buffer || !job->lifecycle || job->render_snapshot.destroying())
|
||||
return;
|
||||
prepare_frame_job(job);
|
||||
begin_prepare_frame_job(job);
|
||||
Render_Task_Subflow no_subflow(nullptr);
|
||||
dispatch_prepare_subflow(job, no_subflow);
|
||||
end_prepare_frame_job(job);
|
||||
draw_frame_job(job);
|
||||
finalize_frame_job(job);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user