瀏覽代碼

Minor refactoring

Panagiotis Christopoulos Charitos 2 年之前
父節點
當前提交
4e06699296

+ 6 - 60
AnKi/Renderer/Common.h

@@ -102,67 +102,13 @@ public:
 	RenderingContext& operator=(const RenderingContext&) = delete;
 };
 
-/// A convenience function to find empty cache entries. Used for various probes.
-template<typename THashMap, typename TCacheEntryArray, typename TMemPool>
-U32 findBestCacheEntry(U64 uuid, Timestamp crntTimestamp, const TCacheEntryArray& entries, THashMap& map, TMemPool& pool)
+class BufferOffsetRange
 {
-	ANKI_ASSERT(uuid > 0);
-
-	// First, try to see if the UUID is in the cache
-	auto it = map.find(uuid);
-	if(it != map.getEnd()) [[likely]]
-	{
-		const U32 cacheEntryIdx = *it;
-		if(entries[cacheEntryIdx].m_uuid == uuid)
-		{
-			// Found it
-			return cacheEntryIdx;
-		}
-		else
-		{
-			// Cache entry is wrong, remove it
-			map.erase(pool, it);
-		}
-	}
-
-	// 2nd and 3rd choice, find an empty entry or some entry to re-use
-	U32 emptyCacheEntryIdx = kMaxU32;
-	U32 cacheEntryIdxToKick = kMaxU32;
-	Timestamp cacheEntryIdxToKickMinTimestamp = kMaxTimestamp;
-	for(U32 cacheEntryIdx = 0; cacheEntryIdx < entries.getSize(); ++cacheEntryIdx)
-	{
-		if(entries[cacheEntryIdx].m_uuid == 0) [[likely]]
-		{
-			// Found an empty
-			emptyCacheEntryIdx = cacheEntryIdx;
-			break;
-		}
-		else if(entries[cacheEntryIdx].m_lastUsedTimestamp != crntTimestamp
-				&& entries[cacheEntryIdx].m_lastUsedTimestamp < cacheEntryIdxToKickMinTimestamp)
-		{
-			// Found some with low timestamp
-			cacheEntryIdxToKick = cacheEntryIdx;
-			cacheEntryIdxToKickMinTimestamp = entries[cacheEntryIdx].m_lastUsedTimestamp;
-		}
-	}
-
-	U32 outCacheEntryIdx;
-	if(emptyCacheEntryIdx != kMaxU32)
-	{
-		outCacheEntryIdx = emptyCacheEntryIdx;
-	}
-	else if(cacheEntryIdxToKick != kMaxU32)
-	{
-		outCacheEntryIdx = cacheEntryIdxToKick;
-	}
-	else
-	{
-		// We are out of cache entries. Return OOM
-		outCacheEntryIdx = kMaxU32;
-	}
-
-	return outCacheEntryIdx;
-}
+public:
+	Buffer* m_buffer = nullptr;
+	PtrSize m_offset = kMaxPtrSize;
+	PtrSize m_range = 0;
+};
 
 /// Choose the detail of a shadow cascade. 0 means high detail and >0 is progressively lower.
 inline U32 chooseDirectionalLightShadowCascadeDetail(U32 cascade)

+ 3 - 3
AnKi/Renderer/PrimaryNonRenderableVisibility.cpp

@@ -56,9 +56,9 @@ void PrimaryNonRenderableVisibility::populateRenderGraph(RenderingContext& ctx)
 			}
 
 			// Allocate feedback buffer for this frame
-			in.m_cpuFeedback.m_bufferRange = (objCount + 1) * sizeof(U32);
-			getRenderer().getReadbackManager().allocateData(m_readbacks[feedbackType], in.m_cpuFeedback.m_bufferRange, in.m_cpuFeedback.m_buffer,
-															in.m_cpuFeedback.m_bufferOffset);
+			in.m_cpuFeedbackBuffer.m_range = (objCount + 1) * sizeof(U32);
+			getRenderer().getReadbackManager().allocateData(m_readbacks[feedbackType], in.m_cpuFeedbackBuffer.m_range,
+															in.m_cpuFeedbackBuffer.m_buffer, in.m_cpuFeedbackBuffer.m_offset);
 		}
 
 		GpuVisibilityNonRenderablesOutput out;

+ 10 - 11
AnKi/Renderer/Utils/GpuVisibility.cpp

@@ -275,14 +275,14 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 		return;
 	}
 
-	if(in.m_cpuFeedback.m_buffer)
+	if(in.m_cpuFeedbackBuffer.m_buffer)
 	{
-		ANKI_ASSERT(in.m_cpuFeedback.m_bufferRange == sizeof(U32) * (objCount + 1));
+		ANKI_ASSERT(in.m_cpuFeedbackBuffer.m_range == sizeof(U32) * (objCount + 1));
 	}
 
 	// Find the counter buffer required for feedback
 	U32 counterBufferIdx = kMaxU32;
-	if(in.m_cpuFeedback.m_buffer)
+	if(in.m_cpuFeedbackBuffer.m_buffer)
 	{
 		if(m_lastFrameIdx != getRenderer().getFrameCount())
 		{
@@ -299,14 +299,14 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 	U32* indices = RebarTransientMemoryPool::getSingleton().allocateFrame<U32>(objCount + 1, visibleIndicesAlloc);
 	indices[0] = 0;
 
-	out.m_visibleIndicesBuffer = &RebarTransientMemoryPool::getSingleton().getBuffer();
-	out.m_visibleIndicesBufferOffset = visibleIndicesAlloc.m_offset;
-	out.m_visibleIndicesBufferRange = visibleIndicesAlloc.m_range;
+	out.m_visiblesBuffer.m_buffer = &RebarTransientMemoryPool::getSingleton().getBuffer();
+	out.m_visiblesBuffer.m_offset = visibleIndicesAlloc.m_offset;
+	out.m_visiblesBuffer.m_range = visibleIndicesAlloc.m_range;
 
 	// Import buffers
 	RenderGraphDescription& rgraph = *in.m_rgraph;
 	out.m_bufferHandle =
-		rgraph.importBuffer(out.m_visibleIndicesBuffer, BufferUsageBit::kNone, out.m_visibleIndicesBufferOffset, out.m_visibleIndicesBufferRange);
+		rgraph.importBuffer(out.m_visiblesBuffer.m_buffer, BufferUsageBit::kNone, out.m_visiblesBuffer.m_offset, out.m_visiblesBuffer.m_range);
 
 	// Create the renderpass
 	ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass(in.m_passesName);
@@ -319,15 +319,14 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 		pass.newTextureDependency(*in.m_hzbRt, TextureUsageBit::kSampledCompute);
 	}
 
-	pass.setWork([this, objType = in.m_objectType, feedbackBuffer = in.m_cpuFeedback.m_buffer, feedbackBufferOffset = in.m_cpuFeedback.m_bufferOffset,
-				  feedbackBufferRange = in.m_cpuFeedback.m_bufferRange, viewProjectionMat = in.m_viewProjectionMat,
+	pass.setWork([this, objType = in.m_objectType, feedbackBuffer = in.m_cpuFeedbackBuffer, viewProjectionMat = in.m_viewProjectionMat,
 				  visibleIndicesBuffHandle = out.m_bufferHandle, counterBufferIdx,
 				  counterIdx = m_counterIdx[counterBufferIdx]](RenderPassWorkContext& rgraph) {
 		CommandBuffer& cmdb = *rgraph.m_commandBuffer;
 		const GpuSceneContiguousArrayType arrayType = gpuSceneNonRenderableObjectTypeToGpuSceneContiguousArrayType(objType);
 		const U32 objCount = GpuSceneContiguousArrays::getSingleton().getElementCount(arrayType);
 		const GpuSceneContiguousArrays& cArrays = GpuSceneContiguousArrays::getSingleton();
-		const Bool needsFeedback = feedbackBuffer != nullptr;
+		const Bool needsFeedback = feedbackBuffer.m_buffer != nullptr;
 
 		cmdb.bindShaderProgram(m_grProgs[0][objType][needsFeedback].get());
 
@@ -349,7 +348,7 @@ void GpuVisibilityNonRenderables::populateRenderGraph(GpuVisibilityNonRenderable
 
 		if(needsFeedback)
 		{
-			cmdb.bindStorageBuffer(0, 3, feedbackBuffer, feedbackBufferOffset, feedbackBufferRange);
+			cmdb.bindStorageBuffer(0, 3, feedbackBuffer.m_buffer, feedbackBuffer.m_offset, feedbackBuffer.m_range);
 			cmdb.bindStorageBuffer(0, 4, m_counterBuffers[counterBufferIdx].get(), 0, kMaxPtrSize);
 		}
 

+ 2 - 11
AnKi/Renderer/Utils/GpuVisibility.h

@@ -63,13 +63,7 @@ public:
 	const RenderTargetHandle* m_hzbRt = nullptr;
 	RenderGraphDescription* m_rgraph = nullptr;
 
-	class
-	{
-	public:
-		Buffer* m_buffer = nullptr;
-		PtrSize m_bufferOffset = 0;
-		PtrSize m_bufferRange = 0;
-	} m_cpuFeedback;
+	BufferOffsetRange m_cpuFeedbackBuffer; ///< Optional.
 };
 
 /// @memberof GpuVisibilityNonRenderables
@@ -77,10 +71,7 @@ class GpuVisibilityNonRenderablesOutput
 {
 public:
 	BufferHandle m_bufferHandle; ///< Some buffer handle to be used for tracking. No need to track all buffers.
-
-	Buffer* m_visibleIndicesBuffer = nullptr;
-	PtrSize m_visibleIndicesBufferOffset = 0;
-	PtrSize m_visibleIndicesBufferRange = 0;
+	BufferOffsetRange m_visiblesBuffer;
 };
 
 /// GPU visibility of lights, probes etc.

二進制
ThirdParty/Bin/Linux64/clang-format