ComputeSystemVK.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. bool ComputeSystemVK::Initialize(VkPhysicalDevice inPhysicalDevice, VkDevice inDevice, uint32 inComputeQueueIndex)
  12. {
  13. mPhysicalDevice = inPhysicalDevice;
  14. mDevice = inDevice;
  15. mComputeQueueIndex = inComputeQueueIndex;
  16. // Get function to set a debug name
  17. mVkSetDebugUtilsObjectNameEXT = reinterpret_cast<PFN_vkSetDebugUtilsObjectNameEXT>(reinterpret_cast<void *>(vkGetDeviceProcAddr(mDevice, "vkSetDebugUtilsObjectNameEXT")));
  18. if (!InitializeMemory())
  19. return false;
  20. // 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).
  21. CreateBuffer(1024, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, mDummyBuffer);
  22. return true;
  23. }
  24. void ComputeSystemVK::Shutdown()
  25. {
  26. if (mDevice != VK_NULL_HANDLE)
  27. vkDeviceWaitIdle(mDevice);
  28. // Free the dummy buffer
  29. FreeBuffer(mDummyBuffer);
  30. ShutdownMemory();
  31. }
  32. Ref<ComputeShader> ComputeSystemVK::CreateComputeShader(const char *inName, uint32 inGroupSizeX, uint32 inGroupSizeY, uint32 inGroupSizeZ)
  33. {
  34. // Read shader source file
  35. Array<uint8> data;
  36. String file_name = String(inName) + ".spv";
  37. if (!mShaderLoader(file_name.c_str(), data))
  38. return nullptr;
  39. Ref<ComputeShaderVK> shader = new ComputeShaderVK(mDevice, inGroupSizeX, inGroupSizeY, inGroupSizeZ);
  40. if (!shader->Initialize(data, mDummyBuffer.mBuffer))
  41. {
  42. Trace("Failed to create compute shader: %s", file_name.c_str());
  43. return nullptr;
  44. }
  45. // Name the pipeline so we can easily find it in a profile
  46. if (mVkSetDebugUtilsObjectNameEXT != nullptr)
  47. {
  48. VkDebugUtilsObjectNameInfoEXT info = {};
  49. info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
  50. info.pNext = nullptr;
  51. info.objectType = VK_OBJECT_TYPE_PIPELINE;
  52. info.objectHandle = (uint64)shader->GetPipeline();
  53. info.pObjectName = inName;
  54. mVkSetDebugUtilsObjectNameEXT(mDevice, &info);
  55. }
  56. return shader.GetPtr();
  57. }
  58. Ref<ComputeBuffer> ComputeSystemVK::CreateComputeBuffer(ComputeBuffer::EType inType, uint64 inSize, uint inStride, const void *inData)
  59. {
  60. return new ComputeBufferVK(this, inType, inSize, inStride, inData);
  61. }
  62. Ref<ComputeQueue> ComputeSystemVK::CreateComputeQueue()
  63. {
  64. Ref<ComputeQueueVK> q = new ComputeQueueVK(this);
  65. if (!q->Initialize(mComputeQueueIndex))
  66. return nullptr;
  67. return q.GetPtr();
  68. }
  69. JPH_NAMESPACE_END
  70. #endif // JPH_USE_VK