Răsfoiți Sursa

Acceleration structures now use other types of memory

Panagiotis Christopoulos Charitos 4 luni în urmă
părinte
comite
6ecabf629a

+ 1 - 1
AnKi/GpuMemory/UnifiedGeometryBuffer.cpp

@@ -23,7 +23,7 @@ void UnifiedGeometryBuffer::init()
 
 
 	if(GrManager::getSingleton().getDeviceCapabilities().m_rayTracingEnabled)
 	if(GrManager::getSingleton().getDeviceCapabilities().m_rayTracingEnabled)
 	{
 	{
-		buffUsage |= BufferUsageBit::kAccelerationStructureBuild;
+		buffUsage |= BufferUsageBit::kAccelerationStructureBuild | BufferUsageBit::kAccelerationStructure;
 	}
 	}
 
 
 	m_pool.init(buffUsage, classes, poolSize, "UnifiedGeometry", false);
 	m_pool.init(buffUsage, classes, poolSize, "UnifiedGeometry", false);

+ 1 - 1
AnKi/Gr/Vulkan/VkAccelerationStructure.cpp

@@ -61,7 +61,7 @@ Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
 	{
 	{
 		const PtrSize alignedOffset = getAlignedRoundUp(getGrManagerImpl().getVulkanCapabilities().m_asBufferAlignment, asBuff.getOffset());
 		const PtrSize alignedOffset = getAlignedRoundUp(getGrManagerImpl().getVulkanCapabilities().m_asBufferAlignment, asBuff.getOffset());
 		asBuff = asBuff.incrementOffset(alignedOffset - asBuff.getOffset());
 		asBuff = asBuff.incrementOffset(alignedOffset - asBuff.getOffset());
-		ANKI_ASSERT(asBuff.getRange() <= asBufferSize);
+		ANKI_ASSERT(asBuff.getRange() >= asBufferSize);
 
 
 		m_asBuffer.reset(&asBuff.getBuffer());
 		m_asBuffer.reset(&asBuff.getBuffer());
 		m_asBufferOffset = asBuff.getOffset();
 		m_asBufferOffset = asBuff.getOffset();

+ 4 - 4
AnKi/Gr/Vulkan/VkGrManager.cpp

@@ -152,9 +152,9 @@ void GrManager::submit(WeakArray<CommandBuffer*> cmdbs, WeakArray<Fence*> waitFe
 PtrSize GrManager::getAccelerationStructureMemoryRequirement(const AccelerationStructureInitInfo& init) const
 PtrSize GrManager::getAccelerationStructureMemoryRequirement(const AccelerationStructureInitInfo& init) const
 {
 {
 	ANKI_VK_SELF_CONST(GrManagerImpl);
 	ANKI_VK_SELF_CONST(GrManagerImpl);
-	PtrSize scratchBufferSize, unused;
-	AccelerationStructureImpl::getMemoryRequirement(init, unused, scratchBufferSize);
-	return scratchBufferSize + self.m_caps.m_asBufferAlignment;
+	PtrSize asSize, unused;
+	AccelerationStructureImpl::getMemoryRequirement(init, asSize, unused);
+	return asSize + self.m_caps.m_asBufferAlignment;
 }
 }
 
 
 GrManagerImpl::~GrManagerImpl()
 GrManagerImpl::~GrManagerImpl()
@@ -1265,7 +1265,7 @@ TexturePtr GrManagerImpl::acquireNextPresentableTexture()
 
 
 	// Create some objets outside the lock
 	// Create some objets outside the lock
 	Array<Char, 16> name;
 	Array<Char, 16> name;
-	snprintf(name.getBegin(), name.getSize(), "Acquire %llu", m_frame);
+	snprintf(name.getBegin(), name.getSize(), "Acquire %" PRIu64, m_frame);
 	MicroFencePtr fence = FenceFactory::getSingleton().newInstance(name.getBegin());
 	MicroFencePtr fence = FenceFactory::getSingleton().newInstance(name.getBegin());
 
 
 	LockGuard<Mutex> lock(m_globalMtx);
 	LockGuard<Mutex> lock(m_globalMtx);

+ 4 - 0
AnKi/Renderer/AccelerationStructureBuilder.cpp

@@ -42,6 +42,10 @@ void AccelerationStructureBuilder::populateRenderGraph(RenderingContext& ctx)
 	initInf.m_type = AccelerationStructureType::kTopLevel;
 	initInf.m_type = AccelerationStructureType::kTopLevel;
 	initInf.m_topLevel.m_instanceCount = GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount();
 	initInf.m_topLevel.m_instanceCount = GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount();
 	initInf.m_topLevel.m_instancesBuffer = visOut.m_instancesBuffer;
 	initInf.m_topLevel.m_instancesBuffer = visOut.m_instancesBuffer;
+
+	const PtrSize memoryReq = GrManager::getSingleton().getAccelerationStructureMemoryRequirement(initInf);
+	initInf.m_accelerationStructureBuffer = GpuVisibleTransientMemoryPool::getSingleton().allocate(memoryReq, 1);
+
 	m_runCtx.m_tlas = GrManager::getSingleton().newAccelerationStructure(initInf);
 	m_runCtx.m_tlas = GrManager::getSingleton().newAccelerationStructure(initInf);
 
 
 	// Build the AS
 	// Build the AS

+ 4 - 0
AnKi/Resource/MeshResource.cpp

@@ -182,6 +182,10 @@ Error MeshResource::load(const ResourceFilename& filename, Bool async)
 				inf.m_bottomLevel.m_positionsFormat = kMeshRelatedVertexStreamFormats[VertexStreamId::kPosition];
 				inf.m_bottomLevel.m_positionsFormat = kMeshRelatedVertexStreamFormats[VertexStreamId::kPosition];
 				inf.m_bottomLevel.m_positionCount = lod.m_vertexCount;
 				inf.m_bottomLevel.m_positionCount = lod.m_vertexCount;
 
 
+				const PtrSize requiredMemory = GrManager::getSingleton().getAccelerationStructureMemoryRequirement(inf);
+				subMesh.m_blasAllocationTokens[lodIdx] = UnifiedGeometryBuffer::getSingleton().allocate(requiredMemory, 1);
+				inf.m_accelerationStructureBuffer = subMesh.m_blasAllocationTokens[lodIdx];
+
 				subMesh.m_blas[lodIdx] = GrManager::getSingleton().newAccelerationStructure(inf);
 				subMesh.m_blas[lodIdx] = GrManager::getSingleton().newAccelerationStructure(inf);
 			}
 			}
 		}
 		}

+ 1 - 0
AnKi/Resource/MeshResource.h

@@ -141,6 +141,7 @@ private:
 		Array<U32, kMaxLodCount> m_firstMeshlet = {};
 		Array<U32, kMaxLodCount> m_firstMeshlet = {};
 		Array<U32, kMaxLodCount> m_meshletCounts = {};
 		Array<U32, kMaxLodCount> m_meshletCounts = {};
 
 
+		Array<UnifiedGeometryBufferAllocation, kMaxLodCount> m_blasAllocationTokens;
 		Array<AccelerationStructurePtr, kMaxLodCount> m_blas;
 		Array<AccelerationStructurePtr, kMaxLodCount> m_blas;
 
 
 		Aabb m_aabb;
 		Aabb m_aabb;