You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/Atom/RHI/Code/Source/RHI/RayTracingBufferPools.cpp

125 lines
5.5 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <Atom/RHI/RayTracingBufferPools.h>
#include <Atom/RHI/Factory.h>
#include <Atom/RHI/Device.h>
namespace AZ
{
namespace RHI
{
RHI::Ptr<RHI::RayTracingBufferPools> RayTracingBufferPools::CreateRHIRayTracingBufferPools()
{
RHI::Ptr<RHI::RayTracingBufferPools> rayTracingBufferPools = RHI::Factory::Get().CreateRayTracingBufferPools();
AZ_Error("RayTracingBufferPools", rayTracingBufferPools.get(), "Failed to create RHI::RayTracingBufferPools");
return rayTracingBufferPools;
}
const RHI::Ptr<RHI::BufferPool>& RayTracingBufferPools::GetShaderTableBufferPool() const
{
AZ_Assert(m_initialized, "RayTracingBufferPools was not initialized");
return m_shaderTableBufferPool;
}
const RHI::Ptr<RHI::BufferPool>& RayTracingBufferPools::GetScratchBufferPool() const
{
AZ_Assert(m_initialized, "RayTracingBufferPools was not initialized");
return m_scratchBufferPool;
}
const RHI::Ptr<RHI::BufferPool>& RayTracingBufferPools::GetBlasBufferPool() const
{
AZ_Assert(m_initialized, "RayTracingBufferPools was not initialized");
return m_blasBufferPool;
}
const RHI::Ptr<RHI::BufferPool>& RayTracingBufferPools::GetTlasInstancesBufferPool() const
{
AZ_Assert(m_initialized, "RayTracingBufferPools was not initialized");
return m_tlasInstancesBufferPool;
}
const RHI::Ptr<RHI::BufferPool>& RayTracingBufferPools::GetTlasBufferPool() const
{
AZ_Assert(m_initialized, "RayTracingBufferPools was not initialized");
return m_tlasBufferPool;
}
void RayTracingBufferPools::Init(RHI::Ptr<RHI::Device>& device)
{
if (m_initialized)
{
return;
}
// create shader table buffer pool
{
RHI::BufferPoolDescriptor bufferPoolDesc;
bufferPoolDesc.m_heapMemoryLevel = RHI::HeapMemoryLevel::Host;
bufferPoolDesc.m_bindFlags = GetShaderTableBufferBindFlags();
m_shaderTableBufferPool = RHI::Factory::Get().CreateBufferPool();
m_shaderTableBufferPool->SetName(Name("RayTracingShaderTableBufferPool"));
[[maybe_unused]] RHI::ResultCode resultCode = m_shaderTableBufferPool->Init(*device, bufferPoolDesc);
AZ_Assert(resultCode == RHI::ResultCode::Success, "Failed to initialize ray tracing shader table buffer pool");
}
// create scratch buffer pool
{
RHI::BufferPoolDescriptor bufferPoolDesc;
bufferPoolDesc.m_heapMemoryLevel = RHI::HeapMemoryLevel::Device;
bufferPoolDesc.m_bindFlags = GetScratchBufferBindFlags();
m_scratchBufferPool = RHI::Factory::Get().CreateBufferPool();
m_scratchBufferPool->SetName(Name("RayTracingScratchBufferPool"));
[[maybe_unused]] RHI::ResultCode resultCode = m_scratchBufferPool->Init(*device, bufferPoolDesc);
AZ_Assert(resultCode == RHI::ResultCode::Success, "Failed to initialize ray tracing scratch buffer pool");
}
// create BLAS buffer pool
{
RHI::BufferPoolDescriptor bufferPoolDesc;
bufferPoolDesc.m_heapMemoryLevel = RHI::HeapMemoryLevel::Device;
bufferPoolDesc.m_bindFlags = GetBlasBufferBindFlags();
m_blasBufferPool = RHI::Factory::Get().CreateBufferPool();
m_blasBufferPool->SetName(Name("RayTracingBlasBufferPool"));
[[maybe_unused]] RHI::ResultCode resultCode = m_blasBufferPool->Init(*device, bufferPoolDesc);
AZ_Assert(resultCode == RHI::ResultCode::Success, "Failed to initialize ray tracing BLAS buffer pool");
}
// create TLAS Instances buffer pool
{
RHI::BufferPoolDescriptor bufferPoolDesc;
bufferPoolDesc.m_heapMemoryLevel = RHI::HeapMemoryLevel::Device;
bufferPoolDesc.m_bindFlags = GetTlasInstancesBufferBindFlags();
m_tlasInstancesBufferPool = RHI::Factory::Get().CreateBufferPool();
m_tlasInstancesBufferPool->SetName(Name("RayTracingTlasInstancesBufferPool"));
[[maybe_unused]] RHI::ResultCode resultCode = m_tlasInstancesBufferPool->Init(*device, bufferPoolDesc);
AZ_Assert(resultCode == RHI::ResultCode::Success, "Failed to initialize ray tracing TLAS instances buffer pool");
}
// create TLAS buffer pool
{
RHI::BufferPoolDescriptor bufferPoolDesc;
bufferPoolDesc.m_heapMemoryLevel = RHI::HeapMemoryLevel::Device;
bufferPoolDesc.m_bindFlags = GetTlasBufferBindFlags();
m_tlasBufferPool = RHI::Factory::Get().CreateBufferPool();
m_tlasBufferPool->SetName(Name("RayTracingTLASBufferPool"));
[[maybe_unused]] RHI::ResultCode resultCode = m_tlasBufferPool->Init(*device, bufferPoolDesc);
AZ_Assert(resultCode == RHI::ResultCode::Success, "Failed to initialize ray tracing TLAS buffer pool");
}
m_initialized = true;
}
}
}