仍然闪烁
This commit is contained in:
@@ -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([&]() {
|
||||
|
||||
Reference in New Issue
Block a user