JobSystemTest.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include "UnitTestFramework.h"
  4. #include <Jolt/Core/JobSystemThreadPool.h>
  5. TEST_SUITE("JobSystemTest")
  6. {
  7. TEST_CASE("TestJobSystemRunJobs")
  8. {
  9. // Create job system
  10. const int cMaxJobs = 128;
  11. const int cMaxBarriers = 10;
  12. const int cMaxThreads = 10;
  13. JobSystemThreadPool system(cMaxJobs, cMaxBarriers, cMaxThreads);
  14. // Create array of zeros
  15. atomic<uint32> values[cMaxJobs];
  16. for (int i = 0; i < cMaxJobs; ++i)
  17. values[i] = 0;
  18. // Create a barrier
  19. JobSystem::Barrier *barrier = system.CreateBarrier();
  20. // Create jobs that will increment all values
  21. for (int i = 0; i < cMaxJobs; ++i)
  22. {
  23. JobHandle handle = system.CreateJob("JobTest", Color::sRed, [&values, i] { values[i]++; });
  24. barrier->AddJob(handle);
  25. }
  26. // Wait for the barrier to complete
  27. system.WaitForJobs(barrier);
  28. // Destroy our barrier
  29. system.DestroyBarrier(barrier);
  30. // Test all values are 1
  31. for (int i = 0; i < cMaxJobs; ++i)
  32. CHECK(values[i] == 1);
  33. }
  34. TEST_CASE("TestJobSystemRunChain")
  35. {
  36. // Create job system
  37. const int cMaxJobs = 128;
  38. const int cMaxBarriers = 10;
  39. JobSystemThreadPool system(cMaxJobs, cMaxBarriers);
  40. // Create a barrier
  41. JobSystem::Barrier *barrier = system.CreateBarrier();
  42. // Counter that keeps track of order in which jobs ran
  43. atomic<uint32> counter = 1;
  44. // Create array of zeros
  45. atomic<uint32> values[cMaxJobs];
  46. for (int i = 0; i < cMaxJobs; ++i)
  47. values[i] = 0;
  48. // Create jobs that will set sequence number
  49. JobHandle handles[cMaxJobs];
  50. for (int i = 0; i < cMaxJobs; ++i)
  51. {
  52. handles[i] = system.CreateJob("JobTestChain", Color::sRed, [&values, &counter, &handles, i] {
  53. // Set sequence number
  54. values[i] = counter++;
  55. // Start previous job
  56. if (i > 0)
  57. handles[i - 1].RemoveDependency();
  58. }, 1);
  59. barrier->AddJob(handles[i]);
  60. }
  61. // Start the last job
  62. handles[cMaxJobs - 1].RemoveDependency();
  63. // Wait for the barrier to complete
  64. system.WaitForJobs(barrier);
  65. // Destroy our barrier
  66. system.DestroyBarrier(barrier);
  67. // Test jobs were executed in reverse order
  68. for (int i = cMaxJobs - 1; i >= 0; --i)
  69. CHECK(values[i] == cMaxJobs - i);
  70. }
  71. }