2
0

JobSystemTest.cpp 2.2 KB

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