仍然闪烁

This commit is contained in:
2026-08-02 19:26:50 +08:00
parent 9a39f88427
commit 36d63efc7b
10 changed files with 650 additions and 128 deletions
+92 -14
View File
@@ -1307,7 +1307,6 @@ TEST(Renderive_Render_Executor, ExecutorDoesNotOwnPlotAdmission) {
completed.fetch_add(1, std::memory_order_acq_rel);
}),
first_stat,
1,
true
}));
ASSERT_TRUE(wait_until([&]() {
@@ -1324,7 +1323,6 @@ TEST(Renderive_Render_Executor, ExecutorDoesNotOwnPlotAdmission) {
completed.fetch_add(1, std::memory_order_acq_rel);
}),
second_stat,
1,
true
}));
auto third_stat = std::make_shared<Frame_Worker_Stats>();
@@ -1338,7 +1336,6 @@ TEST(Renderive_Render_Executor, ExecutorDoesNotOwnPlotAdmission) {
completed.fetch_add(1, std::memory_order_acq_rel);
}),
third_stat,
1,
true
}));
auto duplicate_stat = std::make_shared<Frame_Worker_Stats>();
@@ -1352,7 +1349,6 @@ TEST(Renderive_Render_Executor, ExecutorDoesNotOwnPlotAdmission) {
completed.fetch_add(1, std::memory_order_acq_rel);
}),
duplicate_stat,
1,
true
}));
auto overflow_stat = std::make_shared<Frame_Worker_Stats>();
@@ -1366,7 +1362,6 @@ TEST(Renderive_Render_Executor, ExecutorDoesNotOwnPlotAdmission) {
completed.fetch_add(1, std::memory_order_acq_rel);
}),
overflow_stat,
1,
true
}));
release.store(true, std::memory_order_release);
@@ -1386,15 +1381,15 @@ TEST(Renderive_Render_Executor, TaskflowTopologyRunsInFrameOrder) {
Render_Task_Kind::Frame,
Task{},
[&sequence](Render_Task_Graph& graph, Render_Task_Graph_Node entry, Render_Task_Graph_Node exit) {
auto prepare = graph.emplace(Task([&sequence]() {
auto prepare = graph.emplace(Render_Task_Kind::Frame, Task([&sequence]() {
int expected = 0;
sequence.compare_exchange_strong(expected, 1, std::memory_order_acq_rel);
}));
auto draw = graph.emplace(Task([&sequence]() {
auto draw = graph.emplace(Render_Task_Kind::Primitive, Task([&sequence]() {
int expected = 1;
sequence.compare_exchange_strong(expected, 2, std::memory_order_acq_rel);
}));
auto finalize = graph.emplace(Task([&sequence]() {
auto finalize = graph.emplace(Render_Task_Kind::Frame, Task([&sequence]() {
int expected = 2;
sequence.compare_exchange_strong(expected, 3, std::memory_order_acq_rel);
}));
@@ -1407,7 +1402,6 @@ TEST(Renderive_Render_Executor, TaskflowTopologyRunsInFrameOrder) {
completed.store(true, std::memory_order_release);
}),
stat,
3,
true
}));
ASSERT_TRUE(wait_until([&]() {
@@ -1417,6 +1411,95 @@ TEST(Renderive_Render_Executor, TaskflowTopologyRunsInFrameOrder) {
EXPECT_EQ(stat->task_count, 3u);
executor.shutdown();
}
TEST(Renderive_Render_Executor, FrameDrawWaitsForPrepareSubflow) {
Render_Executor executor(Render_Runtime_Config{2});
std::latch child_entered(1);
std::latch release_child(1);
std::latch completed(1);
std::atomic_bool child_finished{false};
std::atomic_bool draw_started{false};
auto stat = std::make_shared<Frame_Worker_Stats>();
ASSERT_TRUE(executor.try_submit(Render_Executor_Task{
1,
1,
Render_Task_Kind::Frame,
Task{},
[&](Render_Task_Graph& graph, Render_Task_Graph_Node entry, Render_Task_Graph_Node exit) {
auto prepare = graph.emplace_subflow(Render_Task_Kind::Frame, [&](Render_Task_Subflow& subflow) {
auto child = subflow.emplace(Render_Task_Kind::Curve, Task([&]() {
child_entered.count_down();
release_child.wait();
child_finished.store(true, std::memory_order_release);
}));
auto merge = subflow.emplace(Render_Task_Kind::Compose, Task([&]() {
EXPECT_TRUE(child_finished.load(std::memory_order_acquire));
}));
subflow.precede(child, merge);
});
auto draw = graph.emplace(Render_Task_Kind::Primitive, Task([&]() {
draw_started.store(true, std::memory_order_release);
EXPECT_TRUE(child_finished.load(std::memory_order_acquire));
}));
graph.precede(entry, prepare);
graph.precede(prepare, draw);
graph.precede(draw, exit);
},
Task([&]() {
completed.count_down();
}),
stat,
true
}));
child_entered.wait();
EXPECT_FALSE(draw_started.load(std::memory_order_acquire));
release_child.count_down();
completed.wait();
EXPECT_TRUE(draw_started.load(std::memory_order_acquire));
EXPECT_GE(stat->task_count, 3u);
EXPECT_GE(stat->peak_parallelism, 1u);
executor.shutdown();
}
TEST(Renderive_Render_Executor, SubflowKindCountersReflectChildren) {
Render_Executor executor(Render_Runtime_Config{4});
std::latch completed(1);
ASSERT_TRUE(executor.try_submit(Render_Executor_Task{
1,
1,
Render_Task_Kind::Frame,
Task{},
[](Render_Task_Graph& graph, Render_Task_Graph_Node entry, Render_Task_Graph_Node exit) {
auto prepare = graph.emplace_subflow(Render_Task_Kind::Frame, [](Render_Task_Subflow& subflow) {
auto curve0 = subflow.emplace(Render_Task_Kind::Curve, Task([]() {}));
auto curve1 = subflow.emplace(Render_Task_Kind::Curve, Task([]() {}));
auto waterfall0 = subflow.emplace(Render_Task_Kind::Waterfall, Task([]() {}));
auto waterfall1 = subflow.emplace(Render_Task_Kind::Waterfall, Task([]() {}));
auto compose = subflow.emplace(Render_Task_Kind::Compose, Task([]() {}));
subflow.precede(curve0, compose);
subflow.precede(curve1, compose);
subflow.precede(waterfall0, compose);
subflow.precede(waterfall1, compose);
});
auto draw = graph.emplace(Render_Task_Kind::Primitive, Task([]() {}));
auto finalize = graph.emplace(Render_Task_Kind::Frame, Task([]() {}));
graph.precede(entry, prepare);
graph.precede(prepare, draw);
graph.precede(draw, finalize);
graph.precede(finalize, exit);
},
Task([&]() {
completed.count_down();
}),
std::make_shared<Frame_Worker_Stats>(),
true
}));
completed.wait();
executor.shutdown();
Render_Executor_Snapshot snapshot = executor.snapshot();
EXPECT_GE(snapshot.curve_tasks, 2u);
EXPECT_GE(snapshot.waterfall_tasks, 2u);
EXPECT_GE(snapshot.compose_tasks, 1u);
EXPECT_GE(snapshot.primitive_tasks, 3u);
}
TEST(Renderive_Render_Executor, SubmittedFramesAllCompleteOnSingleWorker) {
Render_Executor executor(Render_Runtime_Config{1});
std::atomic_bool first_entered{false};
@@ -1436,7 +1519,6 @@ TEST(Renderive_Render_Executor, SubmittedFramesAllCompleteOnSingleWorker) {
{},
Task([]() {}),
std::make_shared<Frame_Worker_Stats>(),
1,
true
}));
ASSERT_TRUE(wait_until([&]() {
@@ -1452,7 +1534,6 @@ TEST(Renderive_Render_Executor, SubmittedFramesAllCompleteOnSingleWorker) {
{},
Task([]() {}),
std::make_shared<Frame_Worker_Stats>(),
1,
true
}));
ASSERT_TRUE(executor.try_submit(Render_Executor_Task{
@@ -1465,7 +1546,6 @@ TEST(Renderive_Render_Executor, SubmittedFramesAllCompleteOnSingleWorker) {
{},
Task([]() {}),
std::make_shared<Frame_Worker_Stats>(),
1,
true
}));
release_first.store(true, std::memory_order_release);
@@ -1493,7 +1573,6 @@ TEST(Renderive_Render_Executor, ShutdownWaitsForAcceptedQueuedFrame) {
{},
Task([]() {}),
std::make_shared<Frame_Worker_Stats>(),
1,
true
}));
ASSERT_TRUE(wait_until([&]() {
@@ -1511,7 +1590,6 @@ TEST(Renderive_Render_Executor, ShutdownWaitsForAcceptedQueuedFrame) {
queued_completed.store(true, std::memory_order_release);
}),
std::make_shared<Frame_Worker_Stats>(),
1,
true
}));
std::thread shutdown_thread([&]() {