Files
LNXSDK/lib/haxejolt/JoltPhysics/Jolt/Compute/VK/ComputeSystemVK.cpp
2026-03-04 00:50:15 -08:00

119 lines
3.3 KiB
C++

// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2025 Jorrit Rouwe
// SPDX-License-Identifier: MIT
#include <Jolt/Jolt.h>
#ifdef JPH_USE_VK
#include <Jolt/Compute/VK/ComputeSystemVK.h>
#include <Jolt/Compute/VK/ComputeShaderVK.h>
#include <Jolt/Compute/VK/ComputeBufferVK.h>
#include <Jolt/Compute/VK/ComputeQueueVK.h>
JPH_NAMESPACE_BEGIN
JPH_IMPLEMENT_RTTI_ABSTRACT(ComputeSystemVK)
{
JPH_ADD_BASE_CLASS(ComputeSystemVK, ComputeSystem)
}
bool ComputeSystemVK::Initialize(VkPhysicalDevice inPhysicalDevice, VkDevice inDevice, uint32 inComputeQueueIndex, ComputeSystemResult &outResult)
{
mPhysicalDevice = inPhysicalDevice;
mDevice = inDevice;
mComputeQueueIndex = inComputeQueueIndex;
// Get function to set a debug name
mVkSetDebugUtilsObjectNameEXT = reinterpret_cast<PFN_vkSetDebugUtilsObjectNameEXT>(reinterpret_cast<void *>(vkGetDeviceProcAddr(mDevice, "vkSetDebugUtilsObjectNameEXT")));
if (!InitializeMemory())
{
outResult.SetError("Failed to initialize memory subsystem");
return false;
}
// 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).
if (!CreateBuffer(1024, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, mDummyBuffer))
{
outResult.SetError("Failed to create dummy buffer");
return false;
}
return true;
}
void ComputeSystemVK::Shutdown()
{
if (mDevice != VK_NULL_HANDLE)
vkDeviceWaitIdle(mDevice);
// Free the dummy buffer
FreeBuffer(mDummyBuffer);
ShutdownMemory();
}
ComputeShaderResult ComputeSystemVK::CreateComputeShader(const char *inName, uint32 inGroupSizeX, uint32 inGroupSizeY, uint32 inGroupSizeZ)
{
ComputeShaderResult result;
// Read shader source file
Array<uint8> data;
String file_name = String(inName) + ".spv";
String error;
if (!mShaderLoader(file_name.c_str(), data, error))
{
result.SetError(error);
return result;
}
Ref<ComputeShaderVK> shader = new ComputeShaderVK(mDevice, inGroupSizeX, inGroupSizeY, inGroupSizeZ);
if (!shader->Initialize(data, mDummyBuffer.mBuffer, result))
return result;
// Name the pipeline so we can easily find it in a profile
if (mVkSetDebugUtilsObjectNameEXT != nullptr)
{
VkDebugUtilsObjectNameInfoEXT info = {};
info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
info.pNext = nullptr;
info.objectType = VK_OBJECT_TYPE_PIPELINE;
info.objectHandle = (uint64)shader->GetPipeline();
info.pObjectName = inName;
mVkSetDebugUtilsObjectNameEXT(mDevice, &info);
}
result.Set(shader.GetPtr());
return result;
}
ComputeBufferResult ComputeSystemVK::CreateComputeBuffer(ComputeBuffer::EType inType, uint64 inSize, uint inStride, const void *inData)
{
ComputeBufferResult result;
Ref<ComputeBufferVK> buffer = new ComputeBufferVK(this, inType, inSize, inStride);
if (!buffer->Initialize(inData))
{
result.SetError("Failed to create compute buffer");
return result;
}
result.Set(buffer.GetPtr());
return result;
}
ComputeQueueResult ComputeSystemVK::CreateComputeQueue()
{
ComputeQueueResult result;
Ref<ComputeQueueVK> q = new ComputeQueueVK(this);
if (!q->Initialize(mComputeQueueIndex, result))
return result;
result.Set(q.GetPtr());
return result;
}
JPH_NAMESPACE_END
#endif // JPH_USE_VK