2
0

ComputeSystemVK.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2025 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #ifdef JPH_USE_VK
  6. #include <Jolt/Compute/VK/ComputeSystemVK.h>
  7. #include <Jolt/Compute/VK/ComputeShaderVK.h>
  8. #include <Jolt/Compute/VK/ComputeBufferVK.h>
  9. #include <Jolt/Compute/VK/ComputeQueueVK.h>
  10. JPH_NAMESPACE_BEGIN
  11. JPH_IMPLEMENT_RTTI_ABSTRACT(ComputeSystemVK)
  12. {
  13. JPH_ADD_BASE_CLASS(ComputeSystemVK, ComputeSystem)
  14. }
  15. bool ComputeSystemVK::Initialize(VkPhysicalDevice inPhysicalDevice, VkDevice inDevice, uint32 inComputeQueueIndex, ComputeSystemResult &outResult)
  16. {
  17. mPhysicalDevice = inPhysicalDevice;
  18. mDevice = inDevice;
  19. mComputeQueueIndex = inComputeQueueIndex;
  20. // Get function to set a debug name
  21. mVkSetDebugUtilsObjectNameEXT = reinterpret_cast<PFN_vkSetDebugUtilsObjectNameEXT>(reinterpret_cast<void *>(vkGetDeviceProcAddr(mDevice, "vkSetDebugUtilsObjectNameEXT")));
  22. if (!InitializeMemory())
  23. {
  24. outResult.SetError("Failed to initialize memory subsystem");
  25. return false;
  26. }
  27. // Create the dummy buffer. This is used to bind to shaders for which we have no buffer. We can't rely on VK_EXT_robustness2 being available to set nullDescriptor = VK_TRUE (it is unavailable on macOS).
  28. if (!CreateBuffer(1024, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, mDummyBuffer))
  29. {
  30. outResult.SetError("Failed to create dummy buffer");
  31. return false;
  32. }
  33. return true;
  34. }
  35. void ComputeSystemVK::Shutdown()
  36. {
  37. if (mDevice != VK_NULL_HANDLE)
  38. vkDeviceWaitIdle(mDevice);
  39. // Free the dummy buffer
  40. FreeBuffer(mDummyBuffer);
  41. ShutdownMemory();
  42. }
  43. ComputeShaderResult ComputeSystemVK::CreateComputeShader(const char *inName, uint32 inGroupSizeX, uint32 inGroupSizeY, uint32 inGroupSizeZ)
  44. {
  45. ComputeShaderResult result;
  46. // Read shader source file
  47. Array<uint8> data;
  48. String file_name = String(inName) + ".spv";
  49. String error;
  50. if (!mShaderLoader(file_name.c_str(), data, error))
  51. {
  52. result.SetError(error);
  53. return result;
  54. }
  55. Ref<ComputeShaderVK> shader = new ComputeShaderVK(mDevice, inGroupSizeX, inGroupSizeY, inGroupSizeZ);
  56. if (!shader->Initialize(data, mDummyBuffer.mBuffer, result))
  57. return result;
  58. // Name the pipeline so we can easily find it in a profile
  59. if (mVkSetDebugUtilsObjectNameEXT != nullptr)
  60. {
  61. VkDebugUtilsObjectNameInfoEXT info = {};
  62. info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
  63. info.pNext = nullptr;
  64. info.objectType = VK_OBJECT_TYPE_PIPELINE;
  65. info.objectHandle = (uint64)shader->GetPipeline();
  66. info.pObjectName = inName;
  67. mVkSetDebugUtilsObjectNameEXT(mDevice, &info);
  68. }
  69. result.Set(shader.GetPtr());
  70. return result;
  71. }
  72. ComputeBufferResult ComputeSystemVK::CreateComputeBuffer(ComputeBuffer::EType inType, uint64 inSize, uint inStride, const void *inData)
  73. {
  74. ComputeBufferResult result;
  75. Ref<ComputeBufferVK> buffer = new ComputeBufferVK(this, inType, inSize, inStride);
  76. if (!buffer->Initialize(inData))
  77. {
  78. result.SetError("Failed to create compute buffer");
  79. return result;
  80. }
  81. result.Set(buffer.GetPtr());
  82. return result;
  83. }
  84. ComputeQueueResult ComputeSystemVK::CreateComputeQueue()
  85. {
  86. ComputeQueueResult result;
  87. Ref<ComputeQueueVK> q = new ComputeQueueVK(this);
  88. if (!q->Initialize(mComputeQueueIndex, result))
  89. return result;
  90. result.Set(q.GetPtr());
  91. return result;
  92. }
  93. JPH_NAMESPACE_END
  94. #endif // JPH_USE_VK