Changeset View
Changeset View
Standalone View
Standalone View
source/blender/compositor/tests/work_scheduler_test.cc
- This file was added.
| #include "testing/testing.h" | |||||
| #include "COM_WorkScheduler.h" | |||||
| #include "PIL_time.h" | |||||
| #include "atomic_ops.h" | |||||
| #include <thread> | |||||
| namespace blender::compositor { | |||||
| using ThreadingModel = WorkScheduler::ThreadingModel; | |||||
| class WorkSchedulerBaseTest : public testing::Test { | |||||
| private: | |||||
| ThreadingModel model_; | |||||
| protected: | |||||
| WorkSchedulerBaseTest(ThreadingModel model) : testing::Test(), model_(model) | |||||
| { | |||||
| } | |||||
| void SetUp() | |||||
| { | |||||
| WorkScheduler::initialize(false, BLI_system_thread_count(), model_); | |||||
| CompositorContext context; | |||||
| context.setHasActiveOpenCLDevices(false); | |||||
| WorkScheduler::start(context); | |||||
| } | |||||
| void TearDown() | |||||
| { | |||||
| WorkScheduler::stop(); | |||||
| WorkScheduler::deinitialize(); | |||||
| } | |||||
| }; | |||||
| class WorkSchedulerSingleThreadedTest : public WorkSchedulerBaseTest { | |||||
| protected: | |||||
| WorkSchedulerSingleThreadedTest() : WorkSchedulerBaseTest(ThreadingModel::SingleThreaded) | |||||
| { | |||||
| } | |||||
| }; | |||||
| class WorkSchedulerQueueTest : public WorkSchedulerBaseTest { | |||||
| protected: | |||||
| WorkSchedulerQueueTest() : WorkSchedulerBaseTest(ThreadingModel::Queue) | |||||
| { | |||||
| } | |||||
| }; | |||||
| class WorkSchedulerTaskTest : public WorkSchedulerBaseTest { | |||||
| protected: | |||||
| WorkSchedulerTaskTest() : WorkSchedulerBaseTest(ThreadingModel::Task) | |||||
| { | |||||
| } | |||||
| }; | |||||
| static void test_scheduler_finish() | |||||
| { | |||||
| uint num_works_finished = 0; | |||||
| int num_works = 5; | |||||
| Vector<WorkPackage> works(num_works); | |||||
| for (WorkPackage &work : works) { | |||||
| work.execute_fn = [&] { | |||||
| PIL_sleep_ms(5); | |||||
| atomic_add_and_fetch_u(&num_works_finished, 1); | |||||
| }; | |||||
| WorkScheduler::schedule(&work); | |||||
| } | |||||
| WorkScheduler::finish(); | |||||
| EXPECT_EQ(static_cast<int>(num_works_finished), num_works); | |||||
| /* Ensure wait finish to avoid test crashes. */ | |||||
| while (static_cast<int>(num_works_finished) < num_works) { | |||||
| std::this_thread::yield(); | |||||
| } | |||||
| } | |||||
| TEST_F(WorkSchedulerSingleThreadedTest, finish) | |||||
| { | |||||
| test_scheduler_finish(); | |||||
| } | |||||
| TEST_F(WorkSchedulerQueueTest, finish) | |||||
| { | |||||
| test_scheduler_finish(); | |||||
| } | |||||
| TEST_F(WorkSchedulerTaskTest, finish) | |||||
| { | |||||
| test_scheduler_finish(); | |||||
| } | |||||
| } // namespace blender::compositor | |||||