JobSystemTest.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. #ifdef JPH_CPU_WASM
  14. // At the moment, the WASM unit tests fail when using multiple threads because the thread pool is not working
  15. const int cMaxThreads = 0;
  16. #else
  17. const int cMaxThreads = 10;
  18. #endif
  19. JobSystemThreadPool system(cMaxJobs, cMaxBarriers, cMaxThreads);
  20. // Create array of zeros
  21. atomic<uint32> values[cMaxJobs];
  22. for (int i = 0; i < cMaxJobs; ++i)
  23. values[i] = 0;
  24. // Create a barrier
  25. JobSystem::Barrier *barrier = system.CreateBarrier();
  26. // Create jobs that will increment all values
  27. for (int i = 0; i < cMaxJobs; ++i)
  28. {
  29. JobHandle handle = system.CreateJob("JobTest", Color::sRed, [&values, i] { values[i]++; });
  30. barrier->AddJob(handle);
  31. }
  32. // Wait for the barrier to complete
  33. system.WaitForJobs(barrier);
  34. // Destroy our barrier
  35. system.DestroyBarrier(barrier);
  36. // Test all values are 1
  37. for (int i = 0; i < cMaxJobs; ++i)
  38. CHECK(values[i] == 1);
  39. }
  40. TEST_CASE("TestJobSystemRunChain")
  41. {
  42. // Create job system
  43. const int cMaxJobs = 128;
  44. const int cMaxBarriers = 10;
  45. JobSystemThreadPool system(cMaxJobs, cMaxBarriers);
  46. // Create a barrier
  47. JobSystem::Barrier *barrier = system.CreateBarrier();
  48. // Counter that keeps track of order in which jobs ran
  49. atomic<uint32> counter = 1;
  50. // Create array of zeros
  51. atomic<uint32> values[cMaxJobs];
  52. for (int i = 0; i < cMaxJobs; ++i)
  53. values[i] = 0;
  54. // Create jobs that will set sequence number
  55. JobHandle handles[cMaxJobs];
  56. for (int i = 0; i < cMaxJobs; ++i)
  57. {
  58. handles[i] = system.CreateJob("JobTestChain", Color::sRed, [&values, &counter, &handles, i] {
  59. // Set sequence number
  60. values[i] = counter++;
  61. // Start previous job
  62. if (i > 0)
  63. handles[i - 1].RemoveDependency();
  64. }, 1);
  65. barrier->AddJob(handles[i]);
  66. }
  67. // Start the last job
  68. handles[cMaxJobs - 1].RemoveDependency();
  69. // Wait for the barrier to complete
  70. system.WaitForJobs(barrier);
  71. // Destroy our barrier
  72. system.DestroyBarrier(barrier);
  73. // Test jobs were executed in reverse order
  74. for (int i = cMaxJobs - 1; i >= 0; --i)
  75. CHECK(values[i] == cMaxJobs - i);
  76. }
  77. }