ComputeQueueCPU.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2026 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #ifdef JPH_USE_CPU_COMPUTE
  6. #include <Jolt/Compute/CPU/ComputeQueueCPU.h>
  7. #include <Jolt/Compute/CPU/ComputeShaderCPU.h>
  8. #include <Jolt/Compute/CPU/ComputeBufferCPU.h>
  9. #include <Jolt/Compute/CPU/ShaderWrapper.h>
  10. #include <Jolt/Compute/CPU/HLSLToCPP.h>
  11. JPH_NAMESPACE_BEGIN
  12. ComputeQueueCPU::~ComputeQueueCPU()
  13. {
  14. JPH_ASSERT(mShader == nullptr && mWrapper == nullptr);
  15. }
  16. void ComputeQueueCPU::SetShader(const ComputeShader *inShader)
  17. {
  18. JPH_ASSERT(mShader == nullptr && mWrapper == nullptr);
  19. mShader = static_cast<const ComputeShaderCPU *>(inShader);
  20. mWrapper = mShader->CreateWrapper();
  21. }
  22. void ComputeQueueCPU::SetConstantBuffer(const char *inName, const ComputeBuffer *inBuffer)
  23. {
  24. if (inBuffer == nullptr)
  25. return;
  26. JPH_ASSERT(inBuffer->GetType() == ComputeBuffer::EType::ConstantBuffer);
  27. const ComputeBufferCPU *buffer = static_cast<const ComputeBufferCPU *>(inBuffer);
  28. mWrapper->Bind(inName, buffer->GetData(), buffer->GetSize() * buffer->GetStride());
  29. mUsedBuffers.insert(buffer);
  30. }
  31. void ComputeQueueCPU::SetBuffer(const char *inName, const ComputeBuffer *inBuffer)
  32. {
  33. if (inBuffer == nullptr)
  34. return;
  35. JPH_ASSERT(inBuffer->GetType() == ComputeBuffer::EType::UploadBuffer || inBuffer->GetType() == ComputeBuffer::EType::Buffer || inBuffer->GetType() == ComputeBuffer::EType::RWBuffer);
  36. const ComputeBufferCPU *buffer = static_cast<const ComputeBufferCPU *>(inBuffer);
  37. mWrapper->Bind(inName, buffer->GetData(), buffer->GetSize() * buffer->GetStride());
  38. mUsedBuffers.insert(buffer);
  39. }
  40. void ComputeQueueCPU::SetRWBuffer(const char *inName, ComputeBuffer *inBuffer, EBarrier inBarrier)
  41. {
  42. if (inBuffer == nullptr)
  43. return;
  44. JPH_ASSERT(inBuffer->GetType() == ComputeBuffer::EType::RWBuffer);
  45. const ComputeBufferCPU *buffer = static_cast<const ComputeBufferCPU *>(inBuffer);
  46. mWrapper->Bind(inName, buffer->GetData(), buffer->GetSize() * buffer->GetStride());
  47. mUsedBuffers.insert(buffer);
  48. }
  49. void ComputeQueueCPU::ScheduleReadback(ComputeBuffer *inDst, const ComputeBuffer *inSrc)
  50. {
  51. /* Nothing to read back */
  52. }
  53. void ComputeQueueCPU::Dispatch(uint inThreadGroupsX, uint inThreadGroupsY, uint inThreadGroupsZ)
  54. {
  55. uint nx = inThreadGroupsX * mShader->GetGroupSizeX();
  56. uint ny = inThreadGroupsY * mShader->GetGroupSizeY();
  57. uint nz = inThreadGroupsZ * mShader->GetGroupSizeZ();
  58. for (uint z = 0; z < nz; ++z)
  59. for (uint y = 0; y < ny; ++y)
  60. for (uint x = 0; x < nx; ++x)
  61. {
  62. HLSLToCPP::uint3 tid { x, y, z };
  63. mWrapper->Main(tid);
  64. }
  65. delete mWrapper;
  66. mWrapper = nullptr;
  67. mUsedBuffers.clear();
  68. mShader = nullptr;
  69. }
  70. void ComputeQueueCPU::Execute()
  71. {
  72. /* Nothing to do */
  73. }
  74. void ComputeQueueCPU::Wait()
  75. {
  76. /* Nothing to do */
  77. }
  78. JPH_NAMESPACE_END
  79. #endif // JPH_USE_CPU_COMPUTE